go-vise

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

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 }