xdb io.Reader based stream input supports
This commit is contained in:
parent
2af5ee176c
commit
62e1f98497
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue