7 "github.com/syndtr/goleveldb/leveldb"
8 "github.com/syndtr/goleveldb/leveldb/errors"
9 "github.com/syndtr/goleveldb/leveldb/iterator"
10 "github.com/syndtr/goleveldb/leveldb/opt"
11 "github.com/syndtr/goleveldb/leveldb/util"
13 . "github.com/tendermint/tmlibs/common"
17 dbCreator := func(name string, dir string) (DB, error) {
18 return NewGoLevelDB(name, dir)
20 registerDBCreator(LevelDBBackendStr, dbCreator, false)
21 registerDBCreator(GoLevelDBBackendStr, dbCreator, false)
24 type GoLevelDB struct {
28 func NewGoLevelDB(name string, dir string) (*GoLevelDB, error) {
29 dbPath := path.Join(dir, name+".db")
30 db, err := leveldb.OpenFile(dbPath, nil)
34 database := &GoLevelDB{db: db}
38 func (db *GoLevelDB) Get(key []byte) []byte {
39 res, err := db.db.Get(key, nil)
41 if err == errors.ErrNotFound {
50 func (db *GoLevelDB) Set(key []byte, value []byte) {
51 err := db.db.Put(key, value, nil)
57 func (db *GoLevelDB) SetSync(key []byte, value []byte) {
58 err := db.db.Put(key, value, &opt.WriteOptions{Sync: true})
64 func (db *GoLevelDB) Delete(key []byte) {
65 err := db.db.Delete(key, nil)
71 func (db *GoLevelDB) DeleteSync(key []byte) {
72 err := db.db.Delete(key, &opt.WriteOptions{Sync: true})
78 func (db *GoLevelDB) DB() *leveldb.DB {
82 func (db *GoLevelDB) Close() {
86 func (db *GoLevelDB) Print() {
87 str, _ := db.db.GetProperty("leveldb.stats")
88 fmt.Printf("%v\n", str)
90 iter := db.db.NewIterator(nil, nil)
94 fmt.Printf("[%X]:\t[%X]\n", key, value)
98 func (db *GoLevelDB) Stats() map[string]string {
100 "leveldb.num-files-at-level{n}",
104 "leveldb.cachedblock",
105 "leveldb.openedtables",
106 "leveldb.alivesnaps",
107 "leveldb.aliveiters",
110 stats := make(map[string]string)
111 for _, key := range keys {
112 str, err := db.db.GetProperty(key)
120 type goLevelDBIterator struct {
121 source iterator.Iterator
125 func newGoLevelDBIterator(source iterator.Iterator, start []byte) *goLevelDBIterator {
130 return &goLevelDBIterator{
136 // Key returns a copy of the current key.
137 func (it *goLevelDBIterator) Key() []byte {
138 key := it.source.Key()
139 k := make([]byte, len(key))
145 // Value returns a copy of the current value.
146 func (it *goLevelDBIterator) Value() []byte {
147 val := it.source.Value()
148 v := make([]byte, len(val))
154 func (it *goLevelDBIterator) Seek(point []byte) bool {
155 return it.source.Seek(point)
158 func (it *goLevelDBIterator) Error() error {
159 return it.source.Error()
162 func (it *goLevelDBIterator) Next() bool {
164 return it.source.Next()
167 func (it *goLevelDBIterator) Release() {
171 func (it *goLevelDBIterator) assertNoError() {
172 if err := it.source.Error(); err != nil {
177 func (db *GoLevelDB) Iterator() Iterator {
178 return &goLevelDBIterator{source: db.db.NewIterator(nil, nil)}
181 func (db *GoLevelDB) IteratorPrefix(prefix []byte) Iterator {
182 return &goLevelDBIterator{source: db.db.NewIterator(util.BytesPrefix(prefix), nil)}
185 func (db *GoLevelDB) IteratorPrefixWithStart(Prefix, start []byte) Iterator {
186 itr := db.db.NewIterator(util.BytesPrefix(Prefix), nil)
187 return newGoLevelDBIterator(itr, start)
190 func (db *GoLevelDB) NewBatch() Batch {
191 batch := new(leveldb.Batch)
192 return &goLevelDBBatch{db, batch}
195 //--------------------------------------------------------------------------------
197 type goLevelDBBatch struct {
202 func (mBatch *goLevelDBBatch) Set(key, value []byte) {
203 mBatch.batch.Put(key, value)
206 func (mBatch *goLevelDBBatch) Delete(key []byte) {
207 mBatch.batch.Delete(key)
210 func (mBatch *goLevelDBBatch) Write() {
211 err := mBatch.db.db.Write(mBatch.batch, nil)