dump.go (1743B)
1 package fs 2 3 import ( 4 "bytes" 5 "context" 6 "os" 7 8 "git.defalsify.org/vise.git/db" 9 ) 10 11 func (fdb *fsDb) nextElement() []byte { 12 v := fdb.elements[0] 13 fdb.elements = fdb.elements[1:] 14 s := v.Name() 15 k := []byte(s) 16 k[0] -= 0x30 17 return k 18 } 19 20 // Dump implements Db. 21 func (fdb *fsDb) Dump(ctx context.Context, key []byte) (*db.Dumper, error) { 22 var err error 23 key = append([]byte{fdb.Prefix()}, key...) 24 fdb.matchPrefix = key 25 fdb.elements, err = os.ReadDir(fdb.dir) 26 if err != nil { 27 return nil, err 28 } 29 30 logg.TraceCtxf(ctx, "have elements in dir", "n", len(fdb.elements)) 31 32 if len(fdb.elements) > 0 { 33 if len(key) == 0 { 34 k := fdb.nextElement() 35 kk, err := fdb.DecodeKey(ctx, k) 36 if err != nil { 37 return nil, err 38 } 39 vv, err := fdb.Get(ctx, kk) 40 if err != nil { 41 return nil, err 42 } 43 return db.NewDumper(fdb.dumpFunc).WithFirst(kk, vv), nil 44 } 45 } 46 for len(fdb.elements) > 0 { 47 k := fdb.nextElement() 48 logg.DebugCtxf(ctx, "processing element", "e", string(k)) 49 if len(key) > len(k) { 50 51 continue 52 } 53 kk, err := fdb.DecodeKey(ctx, k) 54 if err != nil { 55 continue 56 } 57 kkk := append([]byte{k[0]}, kk...) 58 if bytes.HasPrefix(kkk, key) { 59 vv, err := fdb.Get(ctx, kk) 60 if err != nil { 61 return nil, err 62 } 63 return db.NewDumper(fdb.dumpFunc).WithFirst(kk, vv), nil 64 } 65 } 66 return nil, db.NewErrNotFound(key) 67 } 68 69 func (fdb *fsDb) dumpFunc(ctx context.Context) ([]byte, []byte) { 70 if len(fdb.elements) == 0 { 71 return nil, nil 72 } 73 k := fdb.nextElement() 74 kk, err := fdb.DecodeKey(ctx, k) 75 if err != nil { 76 return nil, nil 77 } 78 kkk := append([]byte{k[0]}, kk...) 79 if bytes.HasPrefix(kkk, fdb.matchPrefix) { 80 vv, err := fdb.Get(ctx, kk) 81 if err != nil { 82 return nil, nil 83 } 84 return kk, vv 85 } 86 return nil, nil 87 }