go-vise

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

dump.go (1364B)


      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 // Dump implements Db.
     14 func (gdb *gdbmDb) Dump(ctx context.Context, key []byte) (*db.Dumper, error) {
     15 	gdb.SetLanguage(nil)
     16 	lk, err := gdb.ToKey(ctx, key)
     17 	if err != nil {
     18 		return nil, err
     19 	}
     20 	key = lk.Default
     21 
     22 	gdb.it = gdb.conn.Iterator()
     23 	for true {
     24 		k, err := gdb.it()
     25 		if err != nil {
     26 			if errors.Is(err, gdbm.ErrItemNotFound) {
     27 				err = db.NewErrNotFound(key)
     28 			}
     29 			gdb.it = nil
     30 			return nil, err
     31 		}
     32 		if !bytes.HasPrefix(k, key) {
     33 			continue
     34 		}
     35 		kk, err := gdb.DecodeKey(ctx, k)
     36 		if err != nil {
     37 			return nil, err
     38 		}
     39 		v, err := gdb.Get(ctx, kk)
     40 		if err != nil {
     41 			gdb.it = nil
     42 			return nil, err
     43 		}
     44 		gdb.itBase = key
     45 		return db.NewDumper(gdb.dumpFunc).WithFirst(kk, v), nil
     46 	}
     47 	gdb.it = nil
     48 	return nil, db.NewErrNotFound(key)
     49 }
     50 
     51 func (gdb *gdbmDb) dumpFunc(ctx context.Context) ([]byte, []byte) {
     52 	var k []byte
     53 	var match bool
     54 	var err error
     55 
     56 	for true {
     57 		k, err = gdb.it()
     58 		if err != nil {
     59 			gdb.it = nil
     60 			return nil, nil
     61 		}
     62 		if bytes.HasPrefix(k, gdb.itBase) {
     63 			match = true
     64 			break
     65 		}
     66 	}
     67 	if !match {
     68 		gdb.it = nil
     69 		return nil, nil
     70 	}
     71 	kk, err := gdb.DecodeKey(ctx, k)
     72 	if err != nil {
     73 		return nil, nil
     74 	}
     75 	v, err := gdb.Get(ctx, kk)
     76 	if err != nil {
     77 		return nil, nil
     78 	}
     79 	return kk, v
     80 }