diff options
Diffstat (limited to 'ethdb')
-rw-r--r-- | ethdb/batch.go | 6 | ||||
-rw-r--r-- | ethdb/database.go | 7 | ||||
-rw-r--r-- | ethdb/leveldb/leveldb.go | 29 | ||||
-rw-r--r-- | ethdb/memorydb/memorydb.go | 16 |
4 files changed, 50 insertions, 8 deletions
diff --git a/ethdb/batch.go b/ethdb/batch.go index a6f015821..a9c406354 100644 --- a/ethdb/batch.go +++ b/ethdb/batch.go @@ -24,7 +24,6 @@ const IdealBatchSize = 100 * 1024 // when Write is called. A batch cannot be used concurrently. type Batch interface { Writer - Deleter // ValueSize retrieves the amount of data queued up for writing. ValueSize() int @@ -32,8 +31,11 @@ type Batch interface { // Write flushes any accumulated data to disk. Write() error - // Reset resets the batch for reuse + // Reset resets the batch for reuse. Reset() + + // Replay replays the batch contents. + Replay(w Writer) error } // Batcher wraps the NewBatch method of a backing data store. diff --git a/ethdb/database.go b/ethdb/database.go index 30208e146..bab99aed1 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. -// Package database defines the interfaces for an Ethereum data store. +// Package ethdb defines the interfaces for an Ethereum data store. package ethdb import "io" @@ -32,10 +32,7 @@ type Reader interface { type Writer interface { // Put inserts the given value into the key-value data store. Put(key []byte, value []byte) error -} -// Deleter wraps the Delete method of a backing data store. -type Deleter interface { // Delete removes the key from the key-value data store. Delete(key []byte) error } @@ -63,7 +60,6 @@ type Compacter interface { type KeyValueStore interface { Reader Writer - Deleter Batcher Iteratee Stater @@ -76,7 +72,6 @@ type KeyValueStore interface { type Database interface { Reader Writer - Deleter Batcher Iteratee Stater diff --git a/ethdb/leveldb/leveldb.go b/ethdb/leveldb/leveldb.go index f730887d2..f437cb974 100644 --- a/ethdb/leveldb/leveldb.go +++ b/ethdb/leveldb/leveldb.go @@ -416,3 +416,32 @@ func (b *batch) Reset() { b.b.Reset() b.size = 0 } + +// Replay replays the batch contents. +func (b *batch) Replay(w ethdb.Writer) error { + return b.b.Replay(&replayer{writer: w}) +} + +// replayer is a small wrapper to implement the correct replay methods. +type replayer struct { + writer ethdb.Writer + failure error +} + +// Put inserts the given value into the key-value data store. +func (r *replayer) Put(key, value []byte) { + // If the replay already failed, stop executing ops + if r.failure != nil { + return + } + r.failure = r.writer.Put(key, value) +} + +// Delete removes the key from the key-value data store. +func (r *replayer) Delete(key []byte) { + // If the replay already failed, stop executing ops + if r.failure != nil { + return + } + r.failure = r.writer.Delete(key) +} diff --git a/ethdb/memorydb/memorydb.go b/ethdb/memorydb/memorydb.go index cc2490ba2..5c3f7e22a 100644 --- a/ethdb/memorydb/memorydb.go +++ b/ethdb/memorydb/memorydb.go @@ -240,6 +240,22 @@ func (b *batch) Reset() { b.size = 0 } +// Replay replays the batch contents. +func (b *batch) Replay(w ethdb.Writer) error { + for _, keyvalue := range b.writes { + if keyvalue.delete { + if err := w.Delete(keyvalue.key); err != nil { + return err + } + continue + } + if err := w.Put(keyvalue.key, keyvalue.value); err != nil { + return err + } + } + return nil +} + // iterator can walk over the (potentially partial) keyspace of a memory key // value store. Internally it is a deep copy of the entire iterated state, // sorted by keys. |