dump.go (1364B)
1 package gdbm 2 3 import ( 4 "bytes" 5 "context" 6 "errors" 7 8 gdbm "github.com/graygnuorg/go-gdbm" 9 10 "git.defalsify.org/vise.git/db" 11 ) 12 13 // Dump implements Db. 14 func (gdb *gdbmDb) Dump(ctx context.Context, key []byte) (*db.Dumper, error) { 15 gdb.SetLanguage(nil) 16 lk, err := gdb.ToKey(ctx, key) 17 if err != nil { 18 return nil, err 19 } 20 key = lk.Default 21 22 gdb.it = gdb.conn.Iterator() 23 for true { 24 k, err := gdb.it() 25 if err != nil { 26 if errors.Is(err, gdbm.ErrItemNotFound) { 27 err = db.NewErrNotFound(key) 28 } 29 gdb.it = nil 30 return nil, err 31 } 32 if !bytes.HasPrefix(k, key) { 33 continue 34 } 35 kk, err := gdb.DecodeKey(ctx, k) 36 if err != nil { 37 return nil, err 38 } 39 v, err := gdb.Get(ctx, kk) 40 if err != nil { 41 gdb.it = nil 42 return nil, err 43 } 44 gdb.itBase = key 45 return db.NewDumper(gdb.dumpFunc).WithFirst(kk, v), nil 46 } 47 gdb.it = nil 48 return nil, db.NewErrNotFound(key) 49 } 50 51 func (gdb *gdbmDb) dumpFunc(ctx context.Context) ([]byte, []byte) { 52 var k []byte 53 var match bool 54 var err error 55 56 for true { 57 k, err = gdb.it() 58 if err != nil { 59 gdb.it = nil 60 return nil, nil 61 } 62 if bytes.HasPrefix(k, gdb.itBase) { 63 match = true 64 break 65 } 66 } 67 if !match { 68 gdb.it = nil 69 return nil, nil 70 } 71 kk, err := gdb.DecodeKey(ctx, k) 72 if err != nil { 73 return nil, nil 74 } 75 v, err := gdb.Get(ctx, kk) 76 if err != nil { 77 return nil, nil 78 } 79 return kk, v 80 }