go-dvote/db/leveldb.go
db/leveldb.goRaw
1package db
2
3// modified from https://github.com/iden3/go-iden3/blob/master/db/leveldb.go
4
5import (
6 "encoding/json"
7
8 "github.com/syndtr/goleveldb/leveldb"
9// "github.com/syndtr/goleveldb/leveldb/errors"
10 "github.com/syndtr/goleveldb/leveldb/opt"
11 "github.com/syndtr/goleveldb/leveldb/util"
12 "github.com/syndtr/goleveldb/leveldb/iterator"
13)
14
15
16type LevelDbStorage struct {
17 ldb *leveldb.DB
18 prefix []byte
19}
20
21func NewLevelDbStorage(path string, errorIfMissing bool) (*LevelDbStorage, error) {
22 o := &opt.Options{
23 ErrorIfMissing: errorIfMissing,
24 }
25 ldb, err := leveldb.OpenFile(path, o)
26 if err != nil {
27 return nil, err
28 }
29 return &LevelDbStorage{ldb, []byte{}}, nil
30}
31
32type storageInfo struct {
33 KeyCount int
34}
35
36func (l *LevelDbStorage) Info() string {
37
38 keycount := 0
39 iter := l.ldb.NewIterator(nil, nil)
40 for iter.Next() {
41 keycount++
42 }
43 iter.Release()
44 if err := iter.Error(); err != nil {
45 return err.Error()
46 }
47 json, _ := json.MarshalIndent(
48 storageInfo{keycount},
49 "", " ",
50 )
51 return string(json)
52}
53
54func (l *LevelDbStorage) WithPrefix(prefix []byte) *LevelDbStorage {
55 return &LevelDbStorage{l.ldb, append(l.prefix, prefix...)}
56}
57
58func (l *LevelDbStorage) Get(key []byte) ([]byte, error) {
59 v, err := l.ldb.Get(append(l.prefix, key[:]...), nil)
60 if err != nil {
61 return nil, err
62 }
63 return v, err
64}
65
66func (l *LevelDbStorage) Put(key []byte, value []byte) error {
67 err := l.ldb.Put(append(l.prefix, key[:]...), value, nil)
68 if err != nil {
69 return err
70 }
71 return nil
72}
73
74func (l *LevelDbStorage) Delete(key []byte) error {
75 err := l.ldb.Delete(append(l.prefix, key[:]...), nil)
76 if err != nil {
77 return err
78 }
79 return nil
80}
81
82func (l *LevelDbStorage) Close() {
83 if err := l.ldb.Close(); err != nil {
84 panic(err)
85 }
86}
87
88func (l *LevelDbStorage) Iter() iterator.Iterator {
89 db := l.ldb
90 i := db.NewIterator(util.BytesPrefix(l.prefix), nil)
91 return i
92}
93
94func (l *LevelDbStorage) LevelDB() *leveldb.DB {
95 return l.ldb
96}
97