aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dbwrapper.cpp20
-rw-r--r--src/dbwrapper.h19
2 files changed, 24 insertions, 15 deletions
diff --git a/src/dbwrapper.cpp b/src/dbwrapper.cpp
index 05d24f7507..b909ce75b5 100644
--- a/src/dbwrapper.cpp
+++ b/src/dbwrapper.cpp
@@ -6,6 +6,8 @@
#include <logging.h>
#include <random.h>
+#include <span.h>
+#include <streams.h>
#include <tinyformat.h>
#include <util/fs.h>
#include <util/fs_helpers.h>
@@ -23,7 +25,9 @@
#include <leveldb/helpers/memenv/memenv.h>
#include <leveldb/iterator.h>
#include <leveldb/options.h>
+#include <leveldb/slice.h>
#include <leveldb/status.h>
+#include <leveldb/write_batch.h>
#include <memory>
#include <optional>
@@ -132,6 +136,22 @@ static leveldb::Options GetOptions(size_t nCacheSize)
return options;
}
+void CDBBatch::WriteImpl(Span<const std::byte> ssKey, CDataStream& ssValue)
+{
+ leveldb::Slice slKey(CharCast(ssKey.data()), ssKey.size());
+ ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent));
+ leveldb::Slice slValue(CharCast(ssValue.data()), ssValue.size());
+ batch.Put(slKey, slValue);
+ // LevelDB serializes writes as:
+ // - byte: header
+ // - varint: key length (1 byte up to 127B, 2 bytes up to 16383B, ...)
+ // - byte[]: key
+ // - varint: value length
+ // - byte[]: value
+ // The formula below assumes the key and value are both less than 16k.
+ size_estimate += 3 + (slKey.size() > 127) + slKey.size() + (slValue.size() > 127) + slValue.size();
+}
+
CDBWrapper::CDBWrapper(const DBParams& params)
: m_name{fs::PathToString(params.path.stem())}, m_path{params.path}, m_is_memory{params.memory_only}
{
diff --git a/src/dbwrapper.h b/src/dbwrapper.h
index 478b73d56f..81c75f651e 100644
--- a/src/dbwrapper.h
+++ b/src/dbwrapper.h
@@ -97,6 +97,8 @@ private:
size_t size_estimate{0};
+ void WriteImpl(Span<const std::byte> ssKey, CDataStream& ssValue);
+
public:
/**
* @param[in] _parent CDBWrapper that this batch is to be submitted to
@@ -113,23 +115,10 @@ public:
void Write(const K& key, const V& value)
{
ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE);
- ssKey << key;
- leveldb::Slice slKey(CharCast(ssKey.data()), ssKey.size());
-
ssValue.reserve(DBWRAPPER_PREALLOC_VALUE_SIZE);
+ ssKey << key;
ssValue << value;
- ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent));
- leveldb::Slice slValue(CharCast(ssValue.data()), ssValue.size());
-
- batch.Put(slKey, slValue);
- // LevelDB serializes writes as:
- // - byte: header
- // - varint: key length (1 byte up to 127B, 2 bytes up to 16383B, ...)
- // - byte[]: key
- // - varint: value length
- // - byte[]: value
- // The formula below assumes the key and value are both less than 16k.
- size_estimate += 3 + (slKey.size() > 127) + slKey.size() + (slValue.size() > 127) + slValue.size();
+ WriteImpl(ssKey, ssValue);
ssKey.clear();
ssValue.clear();
}