dump.go (1341B)
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 func (gdb *gdbmDb) Dump(ctx context.Context, key []byte) (*db.Dumper, error) { 14 gdb.SetLanguage(nil) 15 lk, err := gdb.ToKey(ctx, key) 16 if err != nil { 17 return nil, err 18 } 19 key = lk.Default 20 21 gdb.it = gdb.conn.Iterator() 22 for true { 23 k, err := gdb.it() 24 if err != nil { 25 if errors.Is(err, gdbm.ErrItemNotFound) { 26 err = db.NewErrNotFound(key) 27 } 28 gdb.it = nil 29 return nil, err 30 } 31 if !bytes.HasPrefix(k, key) { 32 continue 33 } 34 kk, err := gdb.DecodeKey(ctx, k) 35 if err != nil { 36 return nil, err 37 } 38 v, err := gdb.Get(ctx, kk) 39 if err != nil { 40 gdb.it = nil 41 return nil, err 42 } 43 gdb.itBase = key 44 return db.NewDumper(gdb.dumpFunc).WithFirst(kk, v), nil 45 } 46 gdb.it = nil 47 return nil, db.NewErrNotFound(key) 48 } 49 50 func (gdb *gdbmDb) dumpFunc(ctx context.Context) ([]byte, []byte) { 51 var k []byte 52 var match bool 53 var err error 54 55 for true { 56 k, err = gdb.it() 57 if err != nil { 58 gdb.it = nil 59 return nil, nil 60 } 61 if bytes.HasPrefix(k, gdb.itBase) { 62 match = true 63 break 64 } 65 } 66 if !match { 67 gdb.it = nil 68 return nil, nil 69 } 70 kk, err := gdb.DecodeKey(ctx, k) 71 if err != nil { 72 return nil, nil 73 } 74 v, err := gdb.Get(ctx, kk) 75 if err != nil { 76 return nil, nil 77 } 78 return kk, v 79 }