Merge pull request #486 from lionsoul2014/fr_go_binding_with_xdb_stream_input

xdb io.Reader based stream input supports
This commit is contained in:
Leon / 狮子的魂 2026-05-19 11:46:59 +08:00 committed by GitHub
commit c5fb71facb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 30 deletions

View File

@ -14,12 +14,13 @@ package xdb
import ( import (
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"io"
"os" "os"
) )
type Searcher struct { type Searcher struct {
version *Version version *Version
handle *os.File dbReader io.ReadSeekCloser
ioCount int ioCount int
@ -65,14 +66,31 @@ func NewSearcher(version *Version, dbFile string, vIndex []byte, cBuff []byte) (
return &Searcher{ return &Searcher{
version: version, version: version,
handle: handle, dbReader: handle,
vectorIndex: vIndex, vectorIndex: vIndex,
}, nil }, nil
} }
func INewSearcher(version *Version, dbReader io.ReadSeekCloser, vIndex []byte, cBuff []byte) *Searcher {
// content buff first
if cBuff != nil {
return &Searcher{
version: version,
vectorIndex: nil,
contentBuff: cBuff,
}
} else {
return &Searcher{
version: version,
dbReader: dbReader,
vectorIndex: vIndex,
}
}
}
func (s *Searcher) Close() { func (s *Searcher) Close() {
if s.handle != nil { if s.dbReader != nil {
err := s.handle.Close() err := s.dbReader.Close()
if err != nil { if err != nil {
// do error log here ? // do error log here ?
} }
@ -193,13 +211,13 @@ func (s *Searcher) read(offset int64, buff []byte) error {
return fmt.Errorf("incomplete read: readed bytes should be %d", len(buff)) return fmt.Errorf("incomplete read: readed bytes should be %d", len(buff))
} }
} else { } else {
_, err := s.handle.Seek(offset, 0) _, err := s.dbReader.Seek(offset, 0)
if err != nil { if err != nil {
return fmt.Errorf("seek to %d: %w", offset, err) return fmt.Errorf("seek to %d: %w", offset, err)
} }
s.ioCount++ s.ioCount++
rLen, err := s.handle.Read(buff) rLen, err := s.dbReader.Read(buff)
if err != nil { if err != nil {
return fmt.Errorf("handle read: %w", err) return fmt.Errorf("handle read: %w", err)
} }

View File

@ -185,7 +185,7 @@ func VerifyFromFile(dbFile string) error {
} }
// LoadHeader load the header info from the specified handle // LoadHeader load the header info from the specified handle
func LoadHeader(handle *os.File) (*Header, error) { func LoadHeader(handle io.ReadSeeker) (*Header, error) {
_, err := handle.Seek(0, 0) _, err := handle.Seek(0, 0)
if err != nil { if err != nil {
return nil, fmt.Errorf("seek to the header: %w", err) return nil, fmt.Errorf("seek to the header: %w", err)
@ -226,7 +226,7 @@ func LoadHeaderFromBuff(cBuff []byte) (*Header, error) {
} }
// LoadVectorIndex util function to load the vector index from the specified file handle // LoadVectorIndex util function to load the vector index from the specified file handle
func LoadVectorIndex(handle *os.File) ([]byte, error) { func LoadVectorIndex(handle io.ReadSeeker) ([]byte, error) {
// load all the vector index block // load all the vector index block
_, err := handle.Seek(HeaderInfoLength, 0) _, err := handle.Seek(HeaderInfoLength, 0)
if err != nil { if err != nil {
@ -263,32 +263,14 @@ func LoadVectorIndexFromFile(dbFile string) ([]byte, error) {
} }
// LoadContent load the whole xdb content from the specified file handle // LoadContent load the whole xdb content from the specified file handle
func LoadContent(handle *os.File) ([]byte, error) { func LoadContent(handle io.ReadSeeker) ([]byte, error) {
// get file size
fi, err := handle.Stat()
if err != nil {
return nil, fmt.Errorf("stat: %w", err)
}
size := fi.Size()
// seek to the head of the file // seek to the head of the file
_, err = handle.Seek(0, 0) _, err := handle.Seek(0, 0)
if err != nil { if err != nil {
return nil, fmt.Errorf("seek to get xdb file length: %w", err) return nil, fmt.Errorf("seek to get xdb file length: %w", err)
} }
var buff = make([]byte, size) return io.ReadAll(handle)
rLen, err := handle.Read(buff)
if err != nil {
return nil, err
}
if rLen != len(buff) {
return nil, fmt.Errorf("incomplete read: readed bytes should be %d", len(buff))
}
return buff, nil
} }
// LoadContentFromFile load the whole xdb content from the specified db file path // LoadContentFromFile load the whole xdb content from the specified db file path