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