go-vise

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

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 }