5#ifndef BITCOIN_DBWRAPPER_H
6#define BITCOIN_DBWRAPPER_H
17#include <leveldb/db.h>
18#include <leveldb/write_batch.h>
51 :
std::runtime_error(msg) {}
57using leveldb::DestroyDB;
103 template <
typename K,
typename V>
void Write(
const K &key,
const V &value) {
113 batch.Put(slKey, slValue);
122 (slValue.size() > 127) + slValue.size();
127 template <
typename K>
void Erase(
const K &key) {
163 template <
typename K>
void Seek(
const K &key) {
167 leveldb::Slice slKey((
const char *)ssKey.
data(), ssKey.
size());
173 template <
typename K>
bool GetKey(K &key) {
174 leveldb::Slice slKey =
piter->key();
178 }
catch (
const std::exception &) {
185 leveldb::Slice slValue =
piter->value();
191 }
catch (
const std::exception &) {
201 friend const std::vector<uint8_t> &
254 template <
typename K,
typename V>
bool Read(
const K &key, V &value)
const {
258 leveldb::Slice slKey((
const char *)ssKey.
data(), ssKey.
size());
260 std::string strValue;
263 if (status.IsNotFound())
return false;
264 LogPrintf(
"LevelDB read failure: %s\n", status.ToString());
272 }
catch (
const std::exception &) {
278 template <
typename K,
typename V>
279 bool Write(
const K &key,
const V &value,
bool fSync =
false) {
281 batch.
Write(key, value);
293 template <
typename K>
bool Exists(
const K &key)
const {
297 leveldb::Slice slKey((
const char *)ssKey.
data(), ssKey.
size());
299 std::string strValue;
302 if (status.IsNotFound())
return false;
303 LogPrintf(
"LevelDB read failure: %s\n", status.ToString());
309 template <
typename K>
bool Erase(
const K &key,
bool fSync =
false) {
329 template <
typename K>
337 leveldb::Slice slKey1((
const char *)ssKey1.data(), ssKey1.size());
338 leveldb::Slice slKey2((
const char *)ssKey2.
data(), ssKey2.
size());
340 leveldb::Range range(slKey1, slKey2);
341 pdb->GetApproximateSizes(&range, 1, &size);
348 template <
typename K>
356 leveldb::Slice slKey1((
const char *)ssKey1.data(), ssKey1.size());
357 leveldb::Slice slKey2((
const char *)ssKey2.
data(), ssKey2.
size());
358 pdb->CompactRange(&slKey1, &slKey2);
Batch of changes queued to be written to a CDBWrapper.
size_t SizeEstimate() const
void Write(const K &key, const V &value)
CDBBatch(const CDBWrapper &_parent)
leveldb::WriteBatch batch
const CDBWrapper & parent
unsigned int GetValueSize()
leveldb::Iterator * piter
const CDBWrapper & parent
CDBIterator(const CDBWrapper &_parent, leveldb::Iterator *_piter)
CDBWrapper(const CDBWrapper &)=delete
size_t DynamicMemoryUsage() const
leveldb::Env * penv
custom environment this database is using (may be nullptr in case of default environment)
bool WriteBatch(CDBBatch &batch, bool fSync=false)
bool Read(const K &key, V &value) const
std::vector< uint8_t > CreateObfuscateKey() const
Returns a string (consisting of 8 random bytes) suitable for use as an obfuscating XOR key.
CDBIterator * NewIterator()
std::string m_name
the name of this database
bool Erase(const K &key, bool fSync=false)
bool Write(const K &key, const V &value, bool fSync=false)
bool Exists(const K &key) const
std::vector< uint8_t > obfuscate_key
a key used for optional XOR-obfuscation of the database
CDBWrapper(const DBParams ¶ms)
leveldb::Options options
database options used
static const unsigned int OBFUSCATE_KEY_NUM_BYTES
the length of the obfuscate key in number of bytes
static const std::string OBFUSCATE_KEY_KEY
the key under which the obfuscation key is stored
leveldb::WriteOptions writeoptions
options used when writing to the database
const fs::path m_path
path to filesystem storage
leveldb::WriteOptions syncoptions
options used when sync writing to the database
CDBWrapper & operator=(const CDBWrapper &)=delete
bool m_is_memory
whether or not the database resides in memory
leveldb::DB * pdb
the database itself
leveldb::ReadOptions iteroptions
options used when iterating over values of the database
void CompactRange(const K &key_begin, const K &key_end) const
Compact a certain range of keys in the database.
bool IsEmpty()
Return true if the database managed by this class contains no entries.
std::optional< fs::path > StoragePath()
leveldb::ReadOptions readoptions
options used when reading from the database
size_t EstimateSize(const K &key_begin, const K &key_end) const
Double ended buffer combining vector and stream-like interfaces.
void reserve(size_type n)
void Xor(const std::vector< uint8_t > &key)
XOR the contents of this stream with a certain key.
dbwrapper_error(const std::string &msg)
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
static constexpr int CLIENT_VERSION
bitcoind-res.rc includes this file, but it cannot cope with real c++ code.
static const size_t DBWRAPPER_PREALLOC_KEY_SIZE
static const size_t DBWRAPPER_PREALLOC_VALUE_SIZE
These should be considered an implementation detail of the specific database.
void HandleError(const leveldb::Status &status)
Handle database error by throwing dbwrapper_error exception.
const std::vector< uint8_t > & GetObfuscateKey(const CDBWrapper &w)
Work around circular dependency, as well as for testing in dbwrapper_tests.
Implement std::hash so RCUPtr can be used as a key for maps or sets.
Span< const std::byte > MakeByteSpan(V &&v) noexcept
User-controlled performance and debug options.
bool force_compact
Compact database on startup.
Application-specific storage settings.
DBOptions options
Passed-through options.
bool obfuscate
If true, store data obfuscated via simple XOR.
bool wipe_data
If true, remove all existing data.
size_t cache_bytes
Configures various leveldb cache settings.
fs::path path
Location in the filesystem where leveldb data will be stored.
bool memory_only
If true, use leveldb's memory environment.