arnaucube
arnaucube/go-dvotePublic Self-hosted repository
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