dump.go (1589B)
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 func (fdb *fsDb) Dump(ctx context.Context, key []byte) (*db.Dumper, error) { 21 var err error 22 key = append([]byte{fdb.Prefix()}, key...) 23 fdb.matchPrefix = key 24 fdb.elements, err = os.ReadDir(fdb.dir) 25 if err != nil { 26 return nil, err 27 } 28 29 if len(fdb.elements) > 0 { 30 if len(key) == 0 { 31 k := fdb.nextElement() 32 kk, err := fdb.DecodeKey(ctx, k) 33 if err != nil { 34 return nil, err 35 } 36 vv, err := fdb.Get(ctx, kk) 37 if err != nil { 38 return nil, err 39 } 40 return db.NewDumper(fdb.dumpFunc).WithFirst(kk, vv), nil 41 } 42 } 43 for len(fdb.elements) > 0 { 44 k := fdb.nextElement() 45 if len(key) > len(k) { 46 continue 47 } 48 kk, err := fdb.DecodeKey(ctx, k) 49 if err != nil { 50 continue 51 } 52 kkk := append([]byte{k[0]}, kk...) 53 if bytes.HasPrefix(kkk, key) { 54 vv, err := fdb.Get(ctx, kk) 55 if err != nil { 56 return nil, err 57 } 58 return db.NewDumper(fdb.dumpFunc).WithFirst(kk, vv), nil 59 } 60 } 61 return nil, db.NewErrNotFound(key) 62 } 63 64 func (fdb *fsDb) dumpFunc(ctx context.Context) ([]byte, []byte) { 65 if len(fdb.elements) == 0 { 66 return nil, nil 67 } 68 k := fdb.nextElement() 69 kk, err := fdb.DecodeKey(ctx, k) 70 if err != nil { 71 return nil, nil 72 } 73 kkk := append([]byte{k[0]}, kk...) 74 if bytes.HasPrefix(kkk, fdb.matchPrefix) { 75 vv, err := fdb.Get(ctx, kk) 76 if err != nil { 77 return nil, nil 78 } 79 return kk, vv 80 } 81 return nil, nil 82 }