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