• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "leveldb/db.h"
10 #include "db/dbformat.h"
11 #include "db/skiplist.h"
12 #include "util/arena.h"
13 
14 namespace leveldb {
15 
16 class InternalKeyComparator;
17 class Mutex;
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   // Increase reference count.
Ref()27   void Ref() { ++refs_; }
28 
29   // Drop reference count.  Delete if no more references exist.
Unref()30   void Unref() {
31     --refs_;
32     assert(refs_ >= 0);
33     if (refs_ <= 0) {
34       delete this;
35     }
36   }
37 
38   // Returns an estimate of the number of bytes of data in use by this
39   // data structure.
40   //
41   // REQUIRES: external synchronization to prevent simultaneous
42   // operations on the same MemTable.
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,
57            const Slice& key,
58            const Slice& value);
59 
60   // If memtable contains a value for key, store it in *value and return true.
61   // If memtable contains a deletion for key, store a NotFound() error
62   // in *status and return true.
63   // Else, return false.
64   bool Get(const LookupKey& key, std::string* value, Status* s);
65 
66  private:
67   ~MemTable();  // Private since only Unref() should be used to delete it
68 
69   struct KeyComparator {
70     const InternalKeyComparator comparator;
KeyComparatorKeyComparator71     explicit KeyComparator(const InternalKeyComparator& c) : comparator(c) { }
72     int operator()(const char* a, const char* b) const;
73   };
74   friend class MemTableIterator;
75   friend class MemTableBackwardIterator;
76 
77   typedef SkipList<const char*, KeyComparator> Table;
78 
79   KeyComparator comparator_;
80   int refs_;
81   Arena arena_;
82   Table table_;
83 
84   // No copying allowed
85   MemTable(const MemTable&);
86   void operator=(const MemTable&);
87 };
88 
89 }  // namespace leveldb
90 
91 #endif  // STORAGE_LEVELDB_DB_MEMTABLE_H_
92