mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
WriteBatch::Put() overload that gathers key and value from arrays of slices
Summary: In our project, when writing to the database, we want to form the value as the concatenation of a small header and a larger payload. It's a shame to have to copy the payload just so we can give RocksDB API a linear view of the value. Since RocksDB makes a copy internally, it's easy to support gather writes. Test Plan: write_batch_test, new test case Reviewers: dhruba CC: leveldb Differential Revision: https://reviews.facebook.net/D13947
This commit is contained in:
@@ -146,6 +146,13 @@ void WriteBatch::Put(const Slice& key, const Slice& value) {
|
||||
PutLengthPrefixedSlice(&rep_, value);
|
||||
}
|
||||
|
||||
void WriteBatch::Put(const SliceParts& key, const SliceParts& value) {
|
||||
WriteBatchInternal::SetCount(this, WriteBatchInternal::Count(this) + 1);
|
||||
rep_.push_back(static_cast<char>(kTypeValue));
|
||||
PutLengthPrefixedSliceParts(&rep_, key);
|
||||
PutLengthPrefixedSliceParts(&rep_, value);
|
||||
}
|
||||
|
||||
void WriteBatch::Delete(const Slice& key) {
|
||||
WriteBatchInternal::SetCount(this, WriteBatchInternal::Count(this) + 1);
|
||||
rep_.push_back(static_cast<char>(kTypeDeletion));
|
||||
|
||||
@@ -227,6 +227,34 @@ TEST(WriteBatchTest, Continue) {
|
||||
handler.seen);
|
||||
}
|
||||
|
||||
TEST(WriteBatchTest, PutGatherSlices) {
|
||||
WriteBatch batch;
|
||||
batch.Put(Slice("foo"), Slice("bar"));
|
||||
|
||||
{
|
||||
// Try a write where the key is one slice but the value is two
|
||||
Slice key_slice("baz");
|
||||
Slice value_slices[2] = { Slice("header"), Slice("payload") };
|
||||
batch.Put(SliceParts(&key_slice, 1),
|
||||
SliceParts(value_slices, 2));
|
||||
}
|
||||
|
||||
{
|
||||
// One where the key is composite but the value is a single slice
|
||||
Slice key_slices[3] = { Slice("key"), Slice("part2"), Slice("part3") };
|
||||
Slice value_slice("value");
|
||||
batch.Put(SliceParts(key_slices, 3),
|
||||
SliceParts(&value_slice, 1));
|
||||
}
|
||||
|
||||
WriteBatchInternal::SetSequence(&batch, 100);
|
||||
ASSERT_EQ("Put(baz, headerpayload)@101"
|
||||
"Put(foo, bar)@100"
|
||||
"Put(keypart2part3, value)@102",
|
||||
PrintContents(&batch));
|
||||
ASSERT_EQ(3, batch.Count());
|
||||
}
|
||||
|
||||
} // namespace rocksdb
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
|
||||
Reference in New Issue
Block a user