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  }