go-vise

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

dump.go (1341B)


      1 package gdbm
      2 
      3 import (
      4 	"bytes"
      5 	"context"
      6 	"errors"
      7 
      8 	gdbm "github.com/graygnuorg/go-gdbm"
      9 
     10 	"git.defalsify.org/vise.git/db"
     11 )
     12 
     13 func (gdb *gdbmDb) Dump(ctx context.Context, key []byte) (*db.Dumper, error) {
     14 	gdb.SetLanguage(nil)
     15 	lk, err := gdb.ToKey(ctx, key)
     16 	if err != nil {
     17 		return nil, err
     18 	}
     19 	key = lk.Default
     20 
     21 	gdb.it = gdb.conn.Iterator()
     22 	for true {
     23 		k, err := gdb.it()
     24 		if err != nil {
     25 			if errors.Is(err, gdbm.ErrItemNotFound) {
     26 				err = db.NewErrNotFound(key)
     27 			}
     28 			gdb.it = nil
     29 			return nil, err
     30 		}
     31 		if !bytes.HasPrefix(k, key) {
     32 			continue
     33 		}
     34 		kk, err := gdb.DecodeKey(ctx, k)
     35 		if err != nil {
     36 			return nil, err
     37 		}
     38 		v, err := gdb.Get(ctx, kk)
     39 		if err != nil {
     40 			gdb.it = nil
     41 			return nil, err
     42 		}
     43 		gdb.itBase = key
     44 		return db.NewDumper(gdb.dumpFunc).WithFirst(kk, v), nil
     45 	}
     46 	gdb.it = nil
     47 	return nil, db.NewErrNotFound(key)
     48 }
     49 
     50 func (gdb *gdbmDb) dumpFunc(ctx context.Context) ([]byte, []byte) {
     51 	var k []byte
     52 	var match bool
     53 	var err error
     54 
     55 	for true {
     56 		k, err = gdb.it()
     57 		if err != nil {
     58 			gdb.it = nil
     59 			return nil, nil
     60 		}
     61 		if bytes.HasPrefix(k, gdb.itBase) {
     62 			match = true
     63 			break
     64 		}
     65 	}
     66 	if !match {
     67 		gdb.it = nil
     68 		return nil, nil
     69 	}
     70 	kk, err := gdb.DecodeKey(ctx, k)
     71 	if err != nil {
     72 		return nil, nil
     73 	}
     74 	v, err := gdb.Get(ctx, kk)
     75 	if err != nil {
     76 		return nil, nil
     77 	}
     78 	return kk, v
     79 }