github.com/status-im/status-go@v1.1.0/db/storage.go (about) 1 package db 2 3 import ( 4 "github.com/syndtr/goleveldb/leveldb" 5 "github.com/syndtr/goleveldb/leveldb/iterator" 6 "github.com/syndtr/goleveldb/leveldb/storage" 7 "github.com/syndtr/goleveldb/leveldb/util" 8 ) 9 10 // Storage is an interface for common db operations. 11 type Storage interface { 12 Put([]byte, []byte) error 13 Delete([]byte) error 14 Get([]byte) ([]byte, error) 15 NewIterator(*util.Range) iterator.Iterator 16 } 17 18 // CommitStorage allows to write all tx/batched values atomically. 19 type CommitStorage interface { 20 Storage 21 Commit() error 22 } 23 24 // TransactionalStorage adds transaction features on top of regular storage. 25 type TransactionalStorage interface { 26 Storage 27 NewTx() CommitStorage 28 } 29 30 // NewMemoryLevelDBStorage returns LevelDBStorage instance with in memory leveldb backend. 31 func NewMemoryLevelDBStorage() (LevelDBStorage, error) { 32 mdb, err := leveldb.Open(storage.NewMemStorage(), nil) 33 if err != nil { 34 return LevelDBStorage{}, err 35 } 36 return NewLevelDBStorage(mdb), nil 37 } 38 39 // NewLevelDBStorage creates new LevelDBStorage instance. 40 func NewLevelDBStorage(db *leveldb.DB) LevelDBStorage { 41 return LevelDBStorage{db: db} 42 } 43 44 // LevelDBStorage wrapper around leveldb.DB. 45 type LevelDBStorage struct { 46 db *leveldb.DB 47 } 48 49 // Put upserts given key/value pair. 50 func (db LevelDBStorage) Put(key, buf []byte) error { 51 return db.db.Put(key, buf, nil) 52 } 53 54 // Delete removes given key from database.. 55 func (db LevelDBStorage) Delete(key []byte) error { 56 return db.db.Delete(key, nil) 57 } 58 59 // Get returns value for a given key. 60 func (db LevelDBStorage) Get(key []byte) ([]byte, error) { 61 return db.db.Get(key, nil) 62 } 63 64 // NewIterator returns new leveldb iterator.Iterator instance for a given range. 65 func (db LevelDBStorage) NewIterator(slice *util.Range) iterator.Iterator { 66 return db.db.NewIterator(slice, nil) 67 } 68 69 // NewTx is a wrapper around leveldb.Batch that allows to write atomically. 70 func (db LevelDBStorage) NewTx() CommitStorage { 71 return LevelDBTx{ 72 batch: &leveldb.Batch{}, 73 db: db, 74 } 75 }