Summary: WriteBatch and WriteBatchWithIndex now both inherit from a common abstract base class. This makes it easier to write code that is agnostic toward the implementation of the particular write batch. In particular, I plan on utilizing this abstraction to allow transactions to support using either implementation of a write batch. Test Plan: modified existing WriteBatchWithIndex tests to test new functions. Running all tests. Reviewers: igor, rven, yhchiang, sdong Reviewed By: sdong Subscribers: dhruba, leveldb Differential Revision: https://reviews.facebook.net/D34017main
parent
46214df4a1
commit
81345b90f9
@ -0,0 +1,24 @@ |
|||||||
|
// Copyright (c) 2015, Facebook, Inc. All rights reserved.
|
||||||
|
// This source code is licensed under the BSD-style license found in the
|
||||||
|
// LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
// of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
|
||||||
|
#include "rocksdb/slice.h" |
||||||
|
|
||||||
|
namespace rocksdb { |
||||||
|
|
||||||
|
Slice::Slice(const SliceParts& parts, std::string* buf) { |
||||||
|
size_t length = 0; |
||||||
|
for (int i = 0; i < parts.num_parts; ++i) { |
||||||
|
length += parts.parts[i].size(); |
||||||
|
} |
||||||
|
buf->reserve(length); |
||||||
|
|
||||||
|
for (int i = 0; i < parts.num_parts; ++i) { |
||||||
|
buf->append(parts.parts[i].data(), parts.parts[i].size()); |
||||||
|
} |
||||||
|
data_ = buf->data(); |
||||||
|
size_ = buf->size(); |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace rocksdb
|
@ -0,0 +1,46 @@ |
|||||||
|
// Copyright (c) 2015, Facebook, Inc. All rights reserved.
|
||||||
|
// This source code is licensed under the BSD-style license found in the
|
||||||
|
// LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
// of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
|
||||||
|
#include "rocksdb/write_batch_base.h" |
||||||
|
|
||||||
|
#include <string> |
||||||
|
|
||||||
|
#include "rocksdb/slice.h" |
||||||
|
|
||||||
|
namespace rocksdb { |
||||||
|
|
||||||
|
// Simple implementation of SlicePart variants of Put(). Child classes
|
||||||
|
// can override these method with more performant solutions if they choose.
|
||||||
|
void WriteBatchBase::Put(ColumnFamilyHandle* column_family, |
||||||
|
const SliceParts& key, const SliceParts& value) { |
||||||
|
std::string key_buf, value_buf; |
||||||
|
Slice key_slice(key, &key_buf); |
||||||
|
Slice value_slice(value, &value_buf); |
||||||
|
|
||||||
|
Put(column_family, key_slice, value_slice); |
||||||
|
} |
||||||
|
|
||||||
|
void WriteBatchBase::Put(const SliceParts& key, const SliceParts& value) { |
||||||
|
std::string key_buf, value_buf; |
||||||
|
Slice key_slice(key, &key_buf); |
||||||
|
Slice value_slice(value, &value_buf); |
||||||
|
|
||||||
|
Put(key_slice, value_slice); |
||||||
|
} |
||||||
|
|
||||||
|
void WriteBatchBase::Delete(ColumnFamilyHandle* column_family, |
||||||
|
const SliceParts& key) { |
||||||
|
std::string key_buf; |
||||||
|
Slice key_slice(key, &key_buf); |
||||||
|
Delete(column_family, key_slice); |
||||||
|
} |
||||||
|
|
||||||
|
void WriteBatchBase::Delete(const SliceParts& key) { |
||||||
|
std::string key_buf; |
||||||
|
Slice key_slice(key, &key_buf); |
||||||
|
Delete(key_slice); |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace rocksdb
|
@ -0,0 +1,72 @@ |
|||||||
|
// Copyright (c) 2015, Facebook, Inc. All rights reserved.
|
||||||
|
// This source code is licensed under the BSD-style license found in the
|
||||||
|
// LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
// of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
namespace rocksdb { |
||||||
|
|
||||||
|
class Slice; |
||||||
|
class ColumnFamilyHandle; |
||||||
|
class WriteBatch; |
||||||
|
struct SliceParts; |
||||||
|
|
||||||
|
// Abstract base class that defines the basic interface for a write batch.
|
||||||
|
// See WriteBatch for a basic implementation and WrithBatchWithIndex for an
|
||||||
|
// indexed implemenation.
|
||||||
|
class WriteBatchBase { |
||||||
|
public: |
||||||
|
virtual ~WriteBatchBase() {} |
||||||
|
|
||||||
|
// Store the mapping "key->value" in the database.
|
||||||
|
virtual void Put(ColumnFamilyHandle* column_family, const Slice& key, |
||||||
|
const Slice& value) = 0; |
||||||
|
virtual void Put(const Slice& key, const Slice& value) = 0; |
||||||
|
|
||||||
|
// Variant of Put() that gathers output like writev(2). The key and value
|
||||||
|
// that will be written to the database are concatentations of arrays of
|
||||||
|
// slices.
|
||||||
|
virtual void Put(ColumnFamilyHandle* column_family, const SliceParts& key, |
||||||
|
const SliceParts& value); |
||||||
|
virtual void Put(const SliceParts& key, const SliceParts& value); |
||||||
|
|
||||||
|
// Merge "value" with the existing value of "key" in the database.
|
||||||
|
// "key->merge(existing, value)"
|
||||||
|
virtual void Merge(ColumnFamilyHandle* column_family, const Slice& key, |
||||||
|
const Slice& value) = 0; |
||||||
|
virtual void Merge(const Slice& key, const Slice& value) = 0; |
||||||
|
|
||||||
|
// If the database contains a mapping for "key", erase it. Else do nothing.
|
||||||
|
virtual void Delete(ColumnFamilyHandle* column_family, const Slice& key) = 0; |
||||||
|
virtual void Delete(const Slice& key) = 0; |
||||||
|
|
||||||
|
// variant that takes SliceParts
|
||||||
|
virtual void Delete(ColumnFamilyHandle* column_family, const SliceParts& key); |
||||||
|
virtual void Delete(const SliceParts& key); |
||||||
|
|
||||||
|
// Append a blob of arbitrary size to the records in this batch. The blob will
|
||||||
|
// be stored in the transaction log but not in any other file. In particular,
|
||||||
|
// it will not be persisted to the SST files. When iterating over this
|
||||||
|
// WriteBatch, WriteBatch::Handler::LogData will be called with the contents
|
||||||
|
// of the blob as it is encountered. Blobs, puts, deletes, and merges will be
|
||||||
|
// encountered in the same order in thich they were inserted. The blob will
|
||||||
|
// NOT consume sequence number(s) and will NOT increase the count of the batch
|
||||||
|
//
|
||||||
|
// Example application: add timestamps to the transaction log for use in
|
||||||
|
// replication.
|
||||||
|
virtual void PutLogData(const Slice& blob) = 0; |
||||||
|
|
||||||
|
// Clear all updates buffered in this batch.
|
||||||
|
virtual void Clear() = 0; |
||||||
|
|
||||||
|
// Covert this batch into a WriteBatch. This is an abstracted way of
|
||||||
|
// converting any WriteBatchBase(eg WriteBatchWithIndex) into a basic
|
||||||
|
// WriteBatch.
|
||||||
|
virtual WriteBatch* GetWriteBatch() = 0; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace rocksdb
|
Loading…
Reference in new issue