diff --git a/db/write_batch.cc b/db/write_batch.cc index 7f8f3e8..40eed2e 100644 --- a/db/write_batch.cc +++ b/db/write_batch.cc @@ -112,6 +112,10 @@ void WriteBatch::Delete(const Slice& key) { PutLengthPrefixedSlice(&rep_, key); } +void WriteBatch::Append(const WriteBatch &source) { + WriteBatchInternal::Append(this, &source); +} + namespace { class MemTableInserter : public WriteBatch::Handler { public: diff --git a/db/write_batch_test.cc b/db/write_batch_test.cc index 8d38023..49c178d 100644 --- a/db/write_batch_test.cc +++ b/db/write_batch_test.cc @@ -91,21 +91,21 @@ TEST(WriteBatchTest, Append) { WriteBatch b1, b2; WriteBatchInternal::SetSequence(&b1, 200); WriteBatchInternal::SetSequence(&b2, 300); - WriteBatchInternal::Append(&b1, &b2); + b1.Append(b2); ASSERT_EQ("", PrintContents(&b1)); b2.Put("a", "va"); - WriteBatchInternal::Append(&b1, &b2); + b1.Append(b2); ASSERT_EQ("Put(a, va)@200", PrintContents(&b1)); b2.Clear(); b2.Put("b", "vb"); - WriteBatchInternal::Append(&b1, &b2); + b1.Append(b2); ASSERT_EQ("Put(a, va)@200" "Put(b, vb)@201", PrintContents(&b1)); b2.Delete("foo"); - WriteBatchInternal::Append(&b1, &b2); + b1.Append(b2); ASSERT_EQ("Put(a, va)@200" "Put(b, vb)@202" "Put(b, vb)@201" diff --git a/include/leveldb/write_batch.h b/include/leveldb/write_batch.h index b6d72cb..9386ace 100644 --- a/include/leveldb/write_batch.h +++ b/include/leveldb/write_batch.h @@ -54,6 +54,13 @@ class LEVELDB_EXPORT WriteBatch { // releases. It is intended for LevelDB usage metrics. size_t ApproximateSize(); + // Copies the operations in "source" to this batch. + // + // This runs in O(source size) time. However, the constant factor is better + // than calling Iterate() over the source batch with a Handler that replicates + // the operations into this batch. + void Append(const WriteBatch& source); + // Support for iterating over the contents of a batch. class Handler { public: