dump.go (1361B)
1 package mem 2 3 import ( 4 "bytes" 5 "context" 6 "encoding/hex" 7 "fmt" 8 "maps" 9 "slices" 10 11 "git.defalsify.org/vise.git/db" 12 ) 13 14 // Dump implements Db. 15 func (mdb *memDb) Dump(ctx context.Context, key []byte) (*db.Dumper, error) { 16 mdb.dumpKeys = slices.Sorted(maps.Keys(mdb.store)) 17 mdb.dumpIdx = -1 18 for i := 0; i < len(mdb.dumpKeys); i++ { 19 s := mdb.dumpKeys[i] 20 k, err := hex.DecodeString(s) 21 if err != nil { 22 return nil, err 23 } 24 if bytes.HasPrefix(k, key) { 25 logg.DebugCtxf(ctx, "starting dump", "key", k) 26 mdb.dumpIdx = i 27 kk, err := mdb.Base().FromSessionKey(k[1:]) 28 if err != nil { 29 return nil, fmt.Errorf("invalid dump key %x: %v", k, err) 30 } 31 v, err := mdb.Get(ctx, kk[:]) 32 if err != nil { 33 return nil, fmt.Errorf("value err for key %x: %v", k, err) 34 } 35 return db.NewDumper(mdb.dumpFunc).WithFirst(k, v), nil 36 } 37 } 38 return nil, db.NewErrNotFound(key) 39 } 40 41 func (mdb *memDb) dumpFunc(ctx context.Context) ([]byte, []byte) { 42 if mdb.dumpIdx == -1 { 43 return nil, nil 44 } 45 if mdb.dumpIdx >= len(mdb.dumpKeys) { 46 mdb.dumpIdx = -1 47 return nil, nil 48 } 49 s := mdb.dumpKeys[mdb.dumpIdx] 50 k, err := hex.DecodeString(s) 51 if err != nil { 52 mdb.dumpIdx = -1 53 return nil, nil 54 } 55 kk, err := mdb.Base().FromSessionKey(k[1:]) 56 if err != nil { 57 return nil, nil 58 } 59 v, err := mdb.Get(ctx, kk) 60 if err != nil { 61 return nil, nil 62 } 63 return k, v 64 }