|
|
|
@ -6,18 +6,18 @@ import (
|
|
|
|
|
"path/filepath"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// MultiScanner is a scanner for multiple recordio files.
|
|
|
|
|
type MultiScanner struct {
|
|
|
|
|
// Scanner is a scanner for multiple recordio files.
|
|
|
|
|
type Scanner struct {
|
|
|
|
|
paths []string
|
|
|
|
|
curFile *os.File
|
|
|
|
|
curScanner *Scanner
|
|
|
|
|
curScanner *RangeScanner
|
|
|
|
|
pathIdx int
|
|
|
|
|
end bool
|
|
|
|
|
err error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NewMultiScanner creates a new MultiScanner.
|
|
|
|
|
func NewMultiScanner(paths []string) (*MultiScanner, error) {
|
|
|
|
|
// NewScanner creates a new Scanner.
|
|
|
|
|
func NewScanner(paths ...string) (*Scanner, error) {
|
|
|
|
|
var ps []string
|
|
|
|
|
for _, s := range paths {
|
|
|
|
|
match, err := filepath.Glob(s)
|
|
|
|
@ -32,12 +32,12 @@ func NewMultiScanner(paths []string) (*MultiScanner, error) {
|
|
|
|
|
return nil, fmt.Errorf("no valid path provided: %v", paths)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &MultiScanner{paths: ps}, nil
|
|
|
|
|
return &Scanner{paths: ps}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scan moves the cursor forward for one record and loads the chunk
|
|
|
|
|
// containing the record if not yet.
|
|
|
|
|
func (s *MultiScanner) Scan() bool {
|
|
|
|
|
func (s *Scanner) Scan() bool {
|
|
|
|
|
if s.err != nil {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
@ -92,12 +92,12 @@ func (s *MultiScanner) Scan() bool {
|
|
|
|
|
|
|
|
|
|
// Err returns the first non-EOF error that was encountered by the
|
|
|
|
|
// Scanner.
|
|
|
|
|
func (s *MultiScanner) Err() error {
|
|
|
|
|
func (s *Scanner) Err() error {
|
|
|
|
|
return s.err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Record returns the record under the current cursor.
|
|
|
|
|
func (s *MultiScanner) Record() []byte {
|
|
|
|
|
func (s *Scanner) Record() []byte {
|
|
|
|
|
if s.curScanner == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
@ -106,7 +106,7 @@ func (s *MultiScanner) Record() []byte {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Close release the resources.
|
|
|
|
|
func (s *MultiScanner) Close() error {
|
|
|
|
|
func (s *Scanner) Close() error {
|
|
|
|
|
s.curScanner = nil
|
|
|
|
|
if s.curFile != nil {
|
|
|
|
|
err := s.curFile.Close()
|
|
|
|
@ -116,7 +116,7 @@ func (s *MultiScanner) Close() error {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *MultiScanner) nextFile() (bool, error) {
|
|
|
|
|
func (s *Scanner) nextFile() (bool, error) {
|
|
|
|
|
if s.pathIdx >= len(s.paths) {
|
|
|
|
|
return false, nil
|
|
|
|
|
}
|
|
|
|
@ -135,6 +135,6 @@ func (s *MultiScanner) nextFile() (bool, error) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s.curFile = f
|
|
|
|
|
s.curScanner = NewScanner(f, idx, 0, -1)
|
|
|
|
|
s.curScanner = NewRangeScanner(f, idx, 0, -1)
|
|
|
|
|
return true, nil
|
|
|
|
|
}
|