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) Count() int {
37
38 keycount := 0
39 db := l.ldb
40 iter := db.NewIterator(util.BytesPrefix(l.prefix), nil)
41 for iter.Next() {
42 keycount++
43 }
44 iter.Release()
45 if err := iter.Error(); err != nil {
46 panic(err)
47 }
48 return keycount
49}
50
51func (l *LevelDbStorage) Info() string {
52
53 keycount := 0
54 db := l.ldb
55 iter := db.NewIterator(util.BytesPrefix(l.prefix), nil)
56 for iter.Next() {
57 keycount++
58 }
59 iter.Release()
60 if err := iter.Error(); err != nil {
61 return err.Error()
62 }
63 json, _ := json.MarshalIndent(
64 storageInfo{keycount},
65 "", " ",
66 )
67 return string(json)
68}
69
70func (l *LevelDbStorage) WithPrefix(prefix []byte) *LevelDbStorage {
71 return &LevelDbStorage{l.ldb, append(l.prefix, prefix...)}
72}
73
74func (l *LevelDbStorage) Get(key []byte) ([]byte, error) {
75 v, err := l.ldb.Get(append(l.prefix, key[:]...), nil)
76 if err != nil {
77 return nil, err
78 }
79 return v, err
80}
81
82func (l *LevelDbStorage) Put(key []byte, value []byte) error {
83 err := l.ldb.Put(append(l.prefix, key[:]...), value, nil)
84 if err != nil {
85 return err
86 }
87 return nil
88}
89
90func (l *LevelDbStorage) Delete(key []byte) error {
91 err := l.ldb.Delete(append(l.prefix, key[:]...), nil)
92 if err != nil {
93 return err
94 }
95 return nil
96}
97
98func (l *LevelDbStorage) Close() {
99 if err := l.ldb.Close(); err != nil {
100 panic(err)
101 }
102}
103
104func (l *LevelDbStorage) Iter() iterator.Iterator {
105 db := l.ldb
106 i := db.NewIterator(util.BytesPrefix(l.prefix), nil)
107 return i
108}
109
110func (l *LevelDbStorage) LevelDB() *leveldb.DB {
111 return l.ldb
112}
113