go-vise

Constrained Size Output Virtual Machine
Info | Log | Files | Refs | README | LICENSE

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 }