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