2011-03-18 23:37:00 +01:00
|
|
|
// 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.
|
|
|
|
//
|
|
|
|
// WriteBatch holds a collection of updates to apply atomically to a DB.
|
|
|
|
//
|
|
|
|
// The updates are applied in the order in which they are added
|
|
|
|
// to the WriteBatch. For example, the value of "key" will be "v3"
|
|
|
|
// after the following batch is written:
|
|
|
|
//
|
|
|
|
// batch.Put("key", "v1");
|
|
|
|
// batch.Delete("key");
|
|
|
|
// batch.Put("key", "v2");
|
|
|
|
// batch.Put("key", "v3");
|
2011-05-21 04:17:43 +02:00
|
|
|
//
|
|
|
|
// Multiple threads can invoke const methods on a WriteBatch without
|
|
|
|
// external synchronization, but if any of the threads may call a
|
|
|
|
// non-const method, all threads accessing the same WriteBatch must use
|
|
|
|
// external synchronization.
|
2011-03-18 23:37:00 +01:00
|
|
|
|
|
|
|
#ifndef STORAGE_LEVELDB_INCLUDE_WRITE_BATCH_H_
|
|
|
|
#define STORAGE_LEVELDB_INCLUDE_WRITE_BATCH_H_
|
|
|
|
|
|
|
|
#include <string>
|
2011-05-21 04:17:43 +02:00
|
|
|
#include "leveldb/status.h"
|
2011-03-18 23:37:00 +01:00
|
|
|
|
|
|
|
namespace leveldb {
|
|
|
|
|
|
|
|
class Slice;
|
|
|
|
|
|
|
|
class WriteBatch {
|
|
|
|
public:
|
|
|
|
WriteBatch();
|
|
|
|
~WriteBatch();
|
|
|
|
|
|
|
|
// Store the mapping "key->value" in the database.
|
|
|
|
void Put(const Slice& key, const Slice& value);
|
|
|
|
|
2013-03-21 23:59:47 +01:00
|
|
|
// Merge "value" with the existing value of "key" in the database.
|
|
|
|
// "key->merge(existing, value)"
|
|
|
|
void Merge(const Slice& key, const Slice& value);
|
|
|
|
|
2011-03-18 23:37:00 +01:00
|
|
|
// If the database contains a mapping for "key", erase it. Else do nothing.
|
|
|
|
void Delete(const Slice& key);
|
|
|
|
|
2013-08-15 01:32:46 +02:00
|
|
|
// Append a blob of arbitrary 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.
|
|
|
|
//
|
|
|
|
// Example application: add timestamps to the transaction log for use in
|
|
|
|
// replication.
|
|
|
|
void PutLogData(const Slice& blob);
|
|
|
|
|
2011-03-18 23:37:00 +01:00
|
|
|
// Clear all updates buffered in this batch.
|
|
|
|
void Clear();
|
|
|
|
|
2011-05-21 04:17:43 +02:00
|
|
|
// Support for iterating over the contents of a batch.
|
|
|
|
class Handler {
|
|
|
|
public:
|
|
|
|
virtual ~Handler();
|
|
|
|
virtual void Put(const Slice& key, const Slice& value) = 0;
|
2013-08-15 01:32:46 +02:00
|
|
|
// Merge and LogData are not pure virtual. Otherwise, we would break
|
|
|
|
// existing clients of Handler on a source code level. The default
|
|
|
|
// implementation of Merge simply throws a runtime exception.
|
2013-03-21 23:59:47 +01:00
|
|
|
virtual void Merge(const Slice& key, const Slice& value);
|
2013-08-15 01:32:46 +02:00
|
|
|
// The default implementation of LogData does nothing.
|
|
|
|
virtual void LogData(const Slice& blob);
|
2011-05-21 04:17:43 +02:00
|
|
|
virtual void Delete(const Slice& key) = 0;
|
|
|
|
};
|
|
|
|
Status Iterate(Handler* handler) const;
|
|
|
|
|
2013-06-26 19:50:58 +02:00
|
|
|
// Retrieve the serialized version of this batch.
|
2012-12-12 08:54:03 +01:00
|
|
|
std::string Data() { return rep_; }
|
|
|
|
|
2013-06-26 19:50:58 +02:00
|
|
|
// Returns the number of updates in the batch
|
|
|
|
int Count() const;
|
|
|
|
|
2012-12-17 06:01:02 +01:00
|
|
|
// Constructor with a serialized string object
|
2013-08-15 01:32:46 +02:00
|
|
|
explicit WriteBatch(std::string rep): rep_(rep) {}
|
2012-12-17 06:01:02 +01:00
|
|
|
|
2011-03-18 23:37:00 +01:00
|
|
|
private:
|
|
|
|
friend class WriteBatchInternal;
|
|
|
|
|
|
|
|
std::string rep_; // See comment in write_batch.cc for the format of rep_
|
|
|
|
|
|
|
|
// Intentionally copyable
|
|
|
|
};
|
|
|
|
|
2011-10-31 18:22:06 +01:00
|
|
|
} // namespace leveldb
|
2011-03-18 23:37:00 +01:00
|
|
|
|
|
|
|
#endif // STORAGE_LEVELDB_INCLUDE_WRITE_BATCH_H_
|