xref: /aosp_15_r20/external/leveldb/db/memtable.h (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
1*9507f98cSAndroid Build Coastguard Worker // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2*9507f98cSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*9507f98cSAndroid Build Coastguard Worker // found in the LICENSE file. See the AUTHORS file for names of contributors.
4*9507f98cSAndroid Build Coastguard Worker 
5*9507f98cSAndroid Build Coastguard Worker #ifndef STORAGE_LEVELDB_DB_MEMTABLE_H_
6*9507f98cSAndroid Build Coastguard Worker #define STORAGE_LEVELDB_DB_MEMTABLE_H_
7*9507f98cSAndroid Build Coastguard Worker 
8*9507f98cSAndroid Build Coastguard Worker #include <string>
9*9507f98cSAndroid Build Coastguard Worker 
10*9507f98cSAndroid Build Coastguard Worker #include "db/dbformat.h"
11*9507f98cSAndroid Build Coastguard Worker #include "db/skiplist.h"
12*9507f98cSAndroid Build Coastguard Worker #include "leveldb/db.h"
13*9507f98cSAndroid Build Coastguard Worker #include "util/arena.h"
14*9507f98cSAndroid Build Coastguard Worker 
15*9507f98cSAndroid Build Coastguard Worker namespace leveldb {
16*9507f98cSAndroid Build Coastguard Worker 
17*9507f98cSAndroid Build Coastguard Worker class InternalKeyComparator;
18*9507f98cSAndroid Build Coastguard Worker class MemTableIterator;
19*9507f98cSAndroid Build Coastguard Worker 
20*9507f98cSAndroid Build Coastguard Worker class MemTable {
21*9507f98cSAndroid Build Coastguard Worker  public:
22*9507f98cSAndroid Build Coastguard Worker   // MemTables are reference counted.  The initial reference count
23*9507f98cSAndroid Build Coastguard Worker   // is zero and the caller must call Ref() at least once.
24*9507f98cSAndroid Build Coastguard Worker   explicit MemTable(const InternalKeyComparator& comparator);
25*9507f98cSAndroid Build Coastguard Worker 
26*9507f98cSAndroid Build Coastguard Worker   MemTable(const MemTable&) = delete;
27*9507f98cSAndroid Build Coastguard Worker   MemTable& operator=(const MemTable&) = delete;
28*9507f98cSAndroid Build Coastguard Worker 
29*9507f98cSAndroid Build Coastguard Worker   // Increase reference count.
Ref()30*9507f98cSAndroid Build Coastguard Worker   void Ref() { ++refs_; }
31*9507f98cSAndroid Build Coastguard Worker 
32*9507f98cSAndroid Build Coastguard Worker   // Drop reference count.  Delete if no more references exist.
Unref()33*9507f98cSAndroid Build Coastguard Worker   void Unref() {
34*9507f98cSAndroid Build Coastguard Worker     --refs_;
35*9507f98cSAndroid Build Coastguard Worker     assert(refs_ >= 0);
36*9507f98cSAndroid Build Coastguard Worker     if (refs_ <= 0) {
37*9507f98cSAndroid Build Coastguard Worker       delete this;
38*9507f98cSAndroid Build Coastguard Worker     }
39*9507f98cSAndroid Build Coastguard Worker   }
40*9507f98cSAndroid Build Coastguard Worker 
41*9507f98cSAndroid Build Coastguard Worker   // Returns an estimate of the number of bytes of data in use by this
42*9507f98cSAndroid Build Coastguard Worker   // data structure. It is safe to call when MemTable is being modified.
43*9507f98cSAndroid Build Coastguard Worker   size_t ApproximateMemoryUsage();
44*9507f98cSAndroid Build Coastguard Worker 
45*9507f98cSAndroid Build Coastguard Worker   // Return an iterator that yields the contents of the memtable.
46*9507f98cSAndroid Build Coastguard Worker   //
47*9507f98cSAndroid Build Coastguard Worker   // The caller must ensure that the underlying MemTable remains live
48*9507f98cSAndroid Build Coastguard Worker   // while the returned iterator is live.  The keys returned by this
49*9507f98cSAndroid Build Coastguard Worker   // iterator are internal keys encoded by AppendInternalKey in the
50*9507f98cSAndroid Build Coastguard Worker   // db/format.{h,cc} module.
51*9507f98cSAndroid Build Coastguard Worker   Iterator* NewIterator();
52*9507f98cSAndroid Build Coastguard Worker 
53*9507f98cSAndroid Build Coastguard Worker   // Add an entry into memtable that maps key to value at the
54*9507f98cSAndroid Build Coastguard Worker   // specified sequence number and with the specified type.
55*9507f98cSAndroid Build Coastguard Worker   // Typically value will be empty if type==kTypeDeletion.
56*9507f98cSAndroid Build Coastguard Worker   void Add(SequenceNumber seq, ValueType type, const Slice& key,
57*9507f98cSAndroid Build Coastguard Worker            const Slice& value);
58*9507f98cSAndroid Build Coastguard Worker 
59*9507f98cSAndroid Build Coastguard Worker   // If memtable contains a value for key, store it in *value and return true.
60*9507f98cSAndroid Build Coastguard Worker   // If memtable contains a deletion for key, store a NotFound() error
61*9507f98cSAndroid Build Coastguard Worker   // in *status and return true.
62*9507f98cSAndroid Build Coastguard Worker   // Else, return false.
63*9507f98cSAndroid Build Coastguard Worker   bool Get(const LookupKey& key, std::string* value, Status* s);
64*9507f98cSAndroid Build Coastguard Worker 
65*9507f98cSAndroid Build Coastguard Worker  private:
66*9507f98cSAndroid Build Coastguard Worker   friend class MemTableIterator;
67*9507f98cSAndroid Build Coastguard Worker   friend class MemTableBackwardIterator;
68*9507f98cSAndroid Build Coastguard Worker 
69*9507f98cSAndroid Build Coastguard Worker   struct KeyComparator {
70*9507f98cSAndroid Build Coastguard Worker     const InternalKeyComparator comparator;
KeyComparatorKeyComparator71*9507f98cSAndroid Build Coastguard Worker     explicit KeyComparator(const InternalKeyComparator& c) : comparator(c) {}
72*9507f98cSAndroid Build Coastguard Worker     int operator()(const char* a, const char* b) const;
73*9507f98cSAndroid Build Coastguard Worker   };
74*9507f98cSAndroid Build Coastguard Worker 
75*9507f98cSAndroid Build Coastguard Worker   typedef SkipList<const char*, KeyComparator> Table;
76*9507f98cSAndroid Build Coastguard Worker 
77*9507f98cSAndroid Build Coastguard Worker   ~MemTable();  // Private since only Unref() should be used to delete it
78*9507f98cSAndroid Build Coastguard Worker 
79*9507f98cSAndroid Build Coastguard Worker   KeyComparator comparator_;
80*9507f98cSAndroid Build Coastguard Worker   int refs_;
81*9507f98cSAndroid Build Coastguard Worker   Arena arena_;
82*9507f98cSAndroid Build Coastguard Worker   Table table_;
83*9507f98cSAndroid Build Coastguard Worker };
84*9507f98cSAndroid Build Coastguard Worker 
85*9507f98cSAndroid Build Coastguard Worker }  // namespace leveldb
86*9507f98cSAndroid Build Coastguard Worker 
87*9507f98cSAndroid Build Coastguard Worker #endif  // STORAGE_LEVELDB_DB_MEMTABLE_H_
88