From 62e1f98497236be0f4ed7d1e74f84b8896ed3e26 Mon Sep 17 00:00:00 2001 From: lionsoul2014 Date: Tue, 19 May 2026 11:45:11 +0800 Subject: [PATCH] xdb io.Reader based stream input supports --- binding/golang/xdb/searcher.go | 32 +++++++++++++++++++++++++------- binding/golang/xdb/util.go | 28 +++++----------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/binding/golang/xdb/searcher.go b/binding/golang/xdb/searcher.go index 4c5172b..87f0f40 100644 --- a/binding/golang/xdb/searcher.go +++ b/binding/golang/xdb/searcher.go @@ -14,12 +14,13 @@ package xdb import ( "encoding/binary" "fmt" + "io" "os" ) type Searcher struct { - version *Version - handle *os.File + version *Version + dbReader io.ReadSeekCloser ioCount int @@ -65,14 +66,31 @@ func NewSearcher(version *Version, dbFile string, vIndex []byte, cBuff []byte) ( return &Searcher{ version: version, - handle: handle, + dbReader: handle, vectorIndex: vIndex, }, 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() { - if s.handle != nil { - err := s.handle.Close() + if s.dbReader != nil { + err := s.dbReader.Close() if err != nil { // 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)) } } else { - _, err := s.handle.Seek(offset, 0) + _, err := s.dbReader.Seek(offset, 0) if err != nil { return fmt.Errorf("seek to %d: %w", offset, err) } s.ioCount++ - rLen, err := s.handle.Read(buff) + rLen, err := s.dbReader.Read(buff) if err != nil { return fmt.Errorf("handle read: %w", err) } diff --git a/binding/golang/xdb/util.go b/binding/golang/xdb/util.go index 6df4813..cdcfd0c 100644 --- a/binding/golang/xdb/util.go +++ b/binding/golang/xdb/util.go @@ -185,7 +185,7 @@ func VerifyFromFile(dbFile string) error { } // 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) if err != nil { 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 -func LoadVectorIndex(handle *os.File) ([]byte, error) { +func LoadVectorIndex(handle io.ReadSeeker) ([]byte, error) { // load all the vector index block _, err := handle.Seek(HeaderInfoLength, 0) if err != nil { @@ -263,32 +263,14 @@ func LoadVectorIndexFromFile(dbFile string) ([]byte, error) { } // LoadContent load the whole xdb content from the specified file handle -func LoadContent(handle *os.File) ([]byte, error) { - // get file size - fi, err := handle.Stat() - if err != nil { - return nil, fmt.Errorf("stat: %w", err) - } - - size := fi.Size() - +func LoadContent(handle io.ReadSeeker) ([]byte, error) { // seek to the head of the file - _, err = handle.Seek(0, 0) + _, err := handle.Seek(0, 0) if err != nil { return nil, fmt.Errorf("seek to get xdb file length: %w", err) } - var buff = make([]byte, size) - 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 + return io.ReadAll(handle) } // LoadContentFromFile load the whole xdb content from the specified db file path