// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root 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 #include namespace rocksdb { class Slice; class Status; 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 Status Put(ColumnFamilyHandle* column_family, const Slice& key, const Slice& value) = 0; virtual Status 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 concatenations of arrays of // slices. virtual Status Put(ColumnFamilyHandle* column_family, const SliceParts& key, const SliceParts& value); virtual Status Put(const SliceParts& key, const SliceParts& value); // Merge "value" with the existing value of "key" in the database. // "key->merge(existing, value)" virtual Status Merge(ColumnFamilyHandle* column_family, const Slice& key, const Slice& value) = 0; virtual Status Merge(const Slice& key, const Slice& value) = 0; // variant that takes SliceParts virtual Status Merge(ColumnFamilyHandle* column_family, const SliceParts& key, const SliceParts& value); virtual Status Merge(const SliceParts& key, const SliceParts& value); // If the database contains a mapping for "key", erase it. Else do nothing. virtual Status Delete(ColumnFamilyHandle* column_family, const Slice& key) = 0; virtual Status Delete(const Slice& key) = 0; // variant that takes SliceParts virtual Status Delete(ColumnFamilyHandle* column_family, const SliceParts& key); virtual Status Delete(const SliceParts& key); // If the database contains a mapping for "key", erase it. Expects that the // key was not overwritten. Else do nothing. virtual Status SingleDelete(ColumnFamilyHandle* column_family, const Slice& key) = 0; virtual Status SingleDelete(const Slice& key) = 0; // variant that takes SliceParts virtual Status SingleDelete(ColumnFamilyHandle* column_family, const SliceParts& key); virtual Status SingleDelete(const SliceParts& key); // If the database contains mappings in the range ["begin_key", "end_key"], // erase them. Else do nothing. virtual Status DeleteRange(ColumnFamilyHandle* column_family, const Slice& begin_key, const Slice& end_key) = 0; virtual Status DeleteRange(const Slice& begin_key, const Slice& end_key) = 0; // variant that takes SliceParts virtual Status DeleteRange(ColumnFamilyHandle* column_family, const SliceParts& begin_key, const SliceParts& end_key); virtual Status DeleteRange(const SliceParts& begin_key, const SliceParts& end_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 which 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 Status 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; // Records the state of the batch for future calls to RollbackToSavePoint(). // May be called multiple times to set multiple save points. virtual void SetSavePoint() = 0; // Remove all entries in this batch (Put, Merge, Delete, PutLogData) since the // most recent call to SetSavePoint() and removes the most recent save point. // If there is no previous call to SetSavePoint(), behaves the same as // Clear(). virtual Status RollbackToSavePoint() = 0; // Pop the most recent save point. // If there is no previous call to SetSavePoint(), Status::NotFound() // will be returned. // Otherwise returns Status::OK(). virtual Status PopSavePoint() = 0; // Sets the maximum size of the write batch in bytes. 0 means no limit. virtual void SetMaxBytes(size_t max_bytes) = 0; }; } // namespace rocksdb