You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
2.2 KiB

package db
// modified from https://github.com/iden3/go-iden3/blob/master/db/leveldb.go
import (
"encoding/json"
"github.com/syndtr/goleveldb/leveldb"
// "github.com/syndtr/goleveldb/leveldb/errors"
"github.com/syndtr/goleveldb/leveldb/opt"
"github.com/syndtr/goleveldb/leveldb/util"
"github.com/syndtr/goleveldb/leveldb/iterator"
)
type LevelDbStorage struct {
ldb *leveldb.DB
prefix []byte
}
func NewLevelDbStorage(path string, errorIfMissing bool) (*LevelDbStorage, error) {
o := &opt.Options{
ErrorIfMissing: errorIfMissing,
}
ldb, err := leveldb.OpenFile(path, o)
if err != nil {
return nil, err
}
return &LevelDbStorage{ldb, []byte{}}, nil
}
type storageInfo struct {
KeyCount int
}
func (l *LevelDbStorage) Count() int {
keycount := 0
db := l.ldb
iter := db.NewIterator(util.BytesPrefix(l.prefix), nil)
for iter.Next() {
keycount++
}
iter.Release()
if err := iter.Error(); err != nil {
panic(err)
}
return keycount
}
func (l *LevelDbStorage) Info() string {
keycount := 0
db := l.ldb
iter := db.NewIterator(util.BytesPrefix(l.prefix), nil)
for iter.Next() {
keycount++
}
iter.Release()
if err := iter.Error(); err != nil {
return err.Error()
}
json, _ := json.MarshalIndent(
storageInfo{keycount},
"", " ",
)
return string(json)
}
func (l *LevelDbStorage) WithPrefix(prefix []byte) *LevelDbStorage {
return &LevelDbStorage{l.ldb, append(l.prefix, prefix...)}
}
func (l *LevelDbStorage) Get(key []byte) ([]byte, error) {
v, err := l.ldb.Get(append(l.prefix, key[:]...), nil)
if err != nil {
return nil, err
}
return v, err
}
func (l *LevelDbStorage) Put(key []byte, value []byte) error {
err := l.ldb.Put(append(l.prefix, key[:]...), value, nil)
if err != nil {
return err
}
return nil
}
func (l *LevelDbStorage) Delete(key []byte) error {
err := l.ldb.Delete(append(l.prefix, key[:]...), nil)
if err != nil {
return err
}
return nil
}
func (l *LevelDbStorage) Close() {
if err := l.ldb.Close(); err != nil {
panic(err)
}
}
func (l *LevelDbStorage) Iter() iterator.Iterator {
db := l.ldb
i := db.NewIterator(util.BytesPrefix(l.prefix), nil)
return i
}
func (l *LevelDbStorage) LevelDB() *leveldb.DB {
return l.ldb
}