|
|
@ -0,0 +1,97 @@ |
|
|
|
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) Info() string { |
|
|
|
|
|
|
|
keycount := 0 |
|
|
|
iter := l.ldb.NewIterator(nil, 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 |
|
|
|
} |
|
|
|
|