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) 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