xref: /aosp_15_r20/external/leveldb/include/leveldb/db.h (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
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_INCLUDE_DB_H_
6 #define STORAGE_LEVELDB_INCLUDE_DB_H_
7 
8 #include <cstdint>
9 #include <cstdio>
10 
11 #include "leveldb/export.h"
12 #include "leveldb/iterator.h"
13 #include "leveldb/options.h"
14 
15 namespace leveldb {
16 
17 // Update CMakeLists.txt if you change these
18 static const int kMajorVersion = 1;
19 static const int kMinorVersion = 23;
20 
21 struct Options;
22 struct ReadOptions;
23 struct WriteOptions;
24 class WriteBatch;
25 
26 // Abstract handle to particular state of a DB.
27 // A Snapshot is an immutable object and can therefore be safely
28 // accessed from multiple threads without any external synchronization.
29 class LEVELDB_EXPORT Snapshot {
30  protected:
31   virtual ~Snapshot();
32 };
33 
34 // A range of keys
35 struct LEVELDB_EXPORT Range {
36   Range() = default;
RangeRange37   Range(const Slice& s, const Slice& l) : start(s), limit(l) {}
38 
39   Slice start;  // Included in the range
40   Slice limit;  // Not included in the range
41 };
42 
43 // A DB is a persistent ordered map from keys to values.
44 // A DB is safe for concurrent access from multiple threads without
45 // any external synchronization.
46 class LEVELDB_EXPORT DB {
47  public:
48   // Open the database with the specified "name".
49   // Stores a pointer to a heap-allocated database in *dbptr and returns
50   // OK on success.
51   // Stores nullptr in *dbptr and returns a non-OK status on error.
52   // Caller should delete *dbptr when it is no longer needed.
53   static Status Open(const Options& options, const std::string& name,
54                      DB** dbptr);
55 
56   DB() = default;
57 
58   DB(const DB&) = delete;
59   DB& operator=(const DB&) = delete;
60 
61   virtual ~DB();
62 
63   // Set the database entry for "key" to "value".  Returns OK on success,
64   // and a non-OK status on error.
65   // Note: consider setting options.sync = true.
66   virtual Status Put(const WriteOptions& options, const Slice& key,
67                      const Slice& value) = 0;
68 
69   // Remove the database entry (if any) for "key".  Returns OK on
70   // success, and a non-OK status on error.  It is not an error if "key"
71   // did not exist in the database.
72   // Note: consider setting options.sync = true.
73   virtual Status Delete(const WriteOptions& options, const Slice& key) = 0;
74 
75   // Apply the specified updates to the database.
76   // Returns OK on success, non-OK on failure.
77   // Note: consider setting options.sync = true.
78   virtual Status Write(const WriteOptions& options, WriteBatch* updates) = 0;
79 
80   // If the database contains an entry for "key" store the
81   // corresponding value in *value and return OK.
82   //
83   // If there is no entry for "key" leave *value unchanged and return
84   // a status for which Status::IsNotFound() returns true.
85   //
86   // May return some other Status on an error.
87   virtual Status Get(const ReadOptions& options, const Slice& key,
88                      std::string* value) = 0;
89 
90   // Return a heap-allocated iterator over the contents of the database.
91   // The result of NewIterator() is initially invalid (caller must
92   // call one of the Seek methods on the iterator before using it).
93   //
94   // Caller should delete the iterator when it is no longer needed.
95   // The returned iterator should be deleted before this db is deleted.
96   virtual Iterator* NewIterator(const ReadOptions& options) = 0;
97 
98   // Return a handle to the current DB state.  Iterators created with
99   // this handle will all observe a stable snapshot of the current DB
100   // state.  The caller must call ReleaseSnapshot(result) when the
101   // snapshot is no longer needed.
102   virtual const Snapshot* GetSnapshot() = 0;
103 
104   // Release a previously acquired snapshot.  The caller must not
105   // use "snapshot" after this call.
106   virtual void ReleaseSnapshot(const Snapshot* snapshot) = 0;
107 
108   // DB implementations can export properties about their state
109   // via this method.  If "property" is a valid property understood by this
110   // DB implementation, fills "*value" with its current value and returns
111   // true.  Otherwise returns false.
112   //
113   //
114   // Valid property names include:
115   //
116   //  "leveldb.num-files-at-level<N>" - return the number of files at level <N>,
117   //     where <N> is an ASCII representation of a level number (e.g. "0").
118   //  "leveldb.stats" - returns a multi-line string that describes statistics
119   //     about the internal operation of the DB.
120   //  "leveldb.sstables" - returns a multi-line string that describes all
121   //     of the sstables that make up the db contents.
122   //  "leveldb.approximate-memory-usage" - returns the approximate number of
123   //     bytes of memory in use by the DB.
124   virtual bool GetProperty(const Slice& property, std::string* value) = 0;
125 
126   // For each i in [0,n-1], store in "sizes[i]", the approximate
127   // file system space used by keys in "[range[i].start .. range[i].limit)".
128   //
129   // Note that the returned sizes measure file system space usage, so
130   // if the user data compresses by a factor of ten, the returned
131   // sizes will be one-tenth the size of the corresponding user data size.
132   //
133   // The results may not include the sizes of recently written data.
134   virtual void GetApproximateSizes(const Range* range, int n,
135                                    uint64_t* sizes) = 0;
136 
137   // Compact the underlying storage for the key range [*begin,*end].
138   // In particular, deleted and overwritten versions are discarded,
139   // and the data is rearranged to reduce the cost of operations
140   // needed to access the data.  This operation should typically only
141   // be invoked by users who understand the underlying implementation.
142   //
143   // begin==nullptr is treated as a key before all keys in the database.
144   // end==nullptr is treated as a key after all keys in the database.
145   // Therefore the following call will compact the entire database:
146   //    db->CompactRange(nullptr, nullptr);
147   virtual void CompactRange(const Slice* begin, const Slice* end) = 0;
148 };
149 
150 // Destroy the contents of the specified database.
151 // Be very careful using this method.
152 //
153 // Note: For backwards compatibility, if DestroyDB is unable to list the
154 // database files, Status::OK() will still be returned masking this failure.
155 LEVELDB_EXPORT Status DestroyDB(const std::string& name,
156                                 const Options& options);
157 
158 // If a DB cannot be opened, you may attempt to call this method to
159 // resurrect as much of the contents of the database as possible.
160 // Some data may be lost, so be careful when calling this function
161 // on a database that contains important information.
162 LEVELDB_EXPORT Status RepairDB(const std::string& dbname,
163                                const Options& options);
164 
165 }  // namespace leveldb
166 
167 #endif  // STORAGE_LEVELDB_INCLUDE_DB_H_
168