1// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file. See the AUTHORS file for names of contributors.
4//
5// WriteBatch holds a collection of updates to apply atomically to a DB.
6//
7// The updates are applied in the order in which they are added
8// to the WriteBatch. For example, the value of "key" will be "v3"
9// after the following batch is written:
10//
11// batch.Put("key", "v1");
12// batch.Delete("key");
13// batch.Put("key", "v2");
14// batch.Put("key", "v3");
15//
16// Multiple threads can invoke const methods on a WriteBatch without
17// external synchronization, but if any of the threads may call a
18// non-const method, all threads accessing the same WriteBatch must use
19// external synchronization.
20
21#ifndef STORAGE_LEVELDB_INCLUDE_WRITE_BATCH_H_
22#define STORAGE_LEVELDB_INCLUDE_WRITE_BATCH_H_
23
24#include <string>
25
26#include "leveldb/export.h"
27#include "leveldb/status.h"
28
29namespace leveldb {
30
31class Slice;
32
33class LEVELDB_EXPORT WriteBatch {
34 public:
35 class LEVELDB_EXPORT Handler {
36 public:
37 virtual ~Handler();
38 virtual void Put(const Slice& key, const Slice& value) = 0;
39 virtual void Delete(const Slice& key) = 0;
40 };
41
42 WriteBatch();
43
44 // Intentionally copyable.
45 WriteBatch(const WriteBatch&) = default;
46 WriteBatch& operator=(const WriteBatch&) = default;
47
48 ~WriteBatch();
49
50 // Store the mapping "key->value" in the database.
51 void Put(const Slice& key, const Slice& value);
52
53 // If the database contains a mapping for "key", erase it. Else do nothing.
54 void Delete(const Slice& key);
55
56 // Clear all updates buffered in this batch.
57 void Clear();
58
59 // The size of the database changes caused by this batch.
60 //
61 // This number is tied to implementation details, and may change across
62 // releases. It is intended for LevelDB usage metrics.
63 size_t ApproximateSize() const;
64
65 // Copies the operations in "source" to this batch.
66 //
67 // This runs in O(source size) time. However, the constant factor is better
68 // than calling Iterate() over the source batch with a Handler that replicates
69 // the operations into this batch.
70 void Append(const WriteBatch& source);
71
72 // Support for iterating over the contents of a batch.
73 Status Iterate(Handler* handler) const;
74
75 private:
76 friend class WriteBatchInternal;
77
78 std::string rep_; // See comment in write_batch.cc for the format of rep_
79};
80
81} // namespace leveldb
82
83#endif // STORAGE_LEVELDB_INCLUDE_WRITE_BATCH_H_
84