diff --git a/ethdb/database.go b/ethdb/database.go index e397c079f3f3d..4ff8ed6d568ef 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -22,12 +22,19 @@ import ( "io" ) +var ( + // ErrKVNotFound is returned if a key is requested that is not found in + // the KeyValueStore. + ErrKVNotFound = errors.New("not found") +) + // KeyValueReader wraps the Has and Get method of a backing data store. type KeyValueReader interface { // Has retrieves if a key is present in the key-value data store. Has(key []byte) (bool, error) // Get retrieves the given key if it's present in the key-value data store. + // Returns ErrKVNotFound if the key is not found. Get(key []byte) ([]byte, error) } @@ -37,6 +44,7 @@ type KeyValueWriter interface { Put(key []byte, value []byte) error // Delete removes the key from the key-value data store. + // If the key doesn't exist, this method returns no error. Delete(key []byte) error } diff --git a/ethdb/dbtest/testsuite.go b/ethdb/dbtest/testsuite.go index d78db7926bc28..7581a8ffd840a 100644 --- a/ethdb/dbtest/testsuite.go +++ b/ethdb/dbtest/testsuite.go @@ -216,6 +216,10 @@ func TestKeyValueStoreSuite(t *testing.T, New func() ethdb.KeyValueStore) { t.Errorf("wrong value: %t", got) } + if _, err := db.Get(key); err != ethdb.ErrKVNotFound { + t.Errorf("expected ethdb.ErrKVNotFound") + } + value := []byte("hello world") if err := db.Put(key, value); err != nil { t.Error(err) diff --git a/ethdb/leveldb/leveldb.go b/ethdb/leveldb/leveldb.go index 9ff1a2ce1d684..e3dc5da96dbc2 100644 --- a/ethdb/leveldb/leveldb.go +++ b/ethdb/leveldb/leveldb.go @@ -188,6 +188,9 @@ func (db *Database) Has(key []byte) (bool, error) { // Get retrieves the given key if it's present in the key-value store. func (db *Database) Get(key []byte) ([]byte, error) { dat, err := db.db.Get(key, nil) + if err == leveldb.ErrNotFound { + return nil, ethdb.ErrKVNotFound + } if err != nil { return nil, err } diff --git a/ethdb/memorydb/memorydb.go b/ethdb/memorydb/memorydb.go index fedc9e326cf85..4f93898081c1d 100644 --- a/ethdb/memorydb/memorydb.go +++ b/ethdb/memorydb/memorydb.go @@ -31,10 +31,6 @@ var ( // errMemorydbClosed is returned if a memory database was already closed at the // invocation of a data access operation. errMemorydbClosed = errors.New("database closed") - - // errMemorydbNotFound is returned if a key is requested that is not found in - // the provided memory database. - errMemorydbNotFound = errors.New("not found") ) // Database is an ephemeral key-value store. Apart from basic data storage @@ -62,7 +58,7 @@ func NewWithCap(size int) *Database { } // Close deallocates the internal map and ensures any consecutive data access op -// failes with an error. +// fails with an error. func (db *Database) Close() error { db.lock.Lock() defer db.lock.Unlock() @@ -94,7 +90,7 @@ func (db *Database) Get(key []byte) ([]byte, error) { if entry, ok := db.db[string(key)]; ok { return common.CopyBytes(entry), nil } - return nil, errMemorydbNotFound + return nil, ethdb.ErrKVNotFound } // Put inserts the given value into the key-value store.