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"
12 . "github.com/tendermint/tmlibs/common"
14 "github.com/vapor/database/db"
18 dbCreator := func(name string, dir string) (db.DB, error) {
19 return NewGoLevelDB(name, dir)
21 db.RegisterDBCreator(db.LevelDBBackendStr, dbCreator, false)
22 db.RegisterDBCreator(db.GoLevelDBBackendStr, dbCreator, false)
25 type GoLevelDB struct {
29 func NewGoLevelDB(name string, dir string) (*GoLevelDB, error) {
30 dbPath := path.Join(dir, name+".db")
31 db, err := leveldb.OpenFile(dbPath, nil)
35 database := &GoLevelDB{db: db}
39 func (db *GoLevelDB) Get(key []byte) []byte {
40 res, err := db.db.Get(key, nil)
42 if err == errors.ErrNotFound {
51 func (db *GoLevelDB) Set(key []byte, value []byte) {
52 err := db.db.Put(key, value, nil)
58 func (db *GoLevelDB) SetSync(key []byte, value []byte) {
59 err := db.db.Put(key, value, &opt.WriteOptions{Sync: true})
65 func (db *GoLevelDB) Delete(key []byte) {
66 err := db.db.Delete(key, nil)
72 func (db *GoLevelDB) DeleteSync(key []byte) {
73 err := db.db.Delete(key, &opt.WriteOptions{Sync: true})
79 func (db *GoLevelDB) DB() *leveldb.DB {
83 func (db *GoLevelDB) Close() {
87 func (db *GoLevelDB) Print() {
88 str, _ := db.db.GetProperty("leveldb.stats")
89 fmt.Printf("%v\n", str)
91 iter := db.db.NewIterator(nil, nil)
95 fmt.Printf("[%X]:\t[%X]\n", key, value)
99 func (db *GoLevelDB) Stats() map[string]string {
101 "leveldb.num-files-at-level{n}",
105 "leveldb.cachedblock",
106 "leveldb.openedtables",
107 "leveldb.alivesnaps",
108 "leveldb.aliveiters",
111 stats := make(map[string]string)
112 for _, key := range keys {
113 str, err := db.db.GetProperty(key)
121 type goLevelDBIterator struct {
122 source iterator.Iterator
125 // Key returns a copy of the current key.
126 func (it *goLevelDBIterator) Key() []byte {
127 key := it.source.Key()
128 k := make([]byte, len(key))
134 // Value returns a copy of the current value.
135 func (it *goLevelDBIterator) Value() []byte {
136 val := it.source.Value()
137 v := make([]byte, len(val))
143 func (it *goLevelDBIterator) Seek(point []byte) bool {
144 return it.source.Seek(point)
147 func (it *goLevelDBIterator) Error() error {
148 return it.source.Error()
151 func (it *goLevelDBIterator) Next() bool {
152 return it.source.Next()
155 func (it *goLevelDBIterator) Release() {
159 func (db *GoLevelDB) Iterator() db.Iterator {
160 return &goLevelDBIterator{db.db.NewIterator(nil, nil)}
163 func (db *GoLevelDB) IteratorPrefix(prefix []byte) db.Iterator {
164 return &goLevelDBIterator{db.db.NewIterator(util.BytesPrefix(prefix), nil)}
167 func (db *GoLevelDB) NewBatch() db.Batch {
168 batch := new(leveldb.Batch)
169 return &goLevelDBBatch{db, batch}
172 //--------------------------------------------------------------------------------
174 type goLevelDBBatch struct {
179 func (mBatch *goLevelDBBatch) Set(key, value []byte) {
180 mBatch.batch.Put(key, value)
183 func (mBatch *goLevelDBBatch) Delete(key []byte) {
184 mBatch.batch.Delete(key)
187 func (mBatch *goLevelDBBatch) Write() {
188 err := mBatch.db.db.Write(mBatch.batch, nil)