From ea8135de7e617259cda3fc7b1c8e7569d454fd57 Mon Sep 17 00:00:00 2001 From: TheCharlatan Date: Thu, 13 Jul 2023 21:55:07 +0200 Subject: [PATCH] refactor: Pimpl leveldb::batch for CDBBatch Hide the leveldb::WriteBatch member variable with a pimpl in order not to expose it directly in the header. Also move CDBBatch::Clear to the dbwrapper implementation to use the new impl_batch. The context of this commit is an effort to decouple the dbwrapper header file from leveldb includes. To this end, the includes are moved to the dbwrapper implementation file. This is done as part of the kernel project to reduce the number of required includes for users of the kernel. --- src/dbwrapper.cpp | 24 +++++++++++++++++++++--- src/dbwrapper.h | 16 +++++++--------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/dbwrapper.cpp b/src/dbwrapper.cpp index b74c645b8f..ff2bc8b4e8 100644 --- a/src/dbwrapper.cpp +++ b/src/dbwrapper.cpp @@ -4,8 +4,10 @@ #include +#include #include #include +#include #include #include #include @@ -136,12 +138,28 @@ static leveldb::Options GetOptions(size_t nCacheSize) return options; } +struct CDBBatch::WriteBatchImpl { + leveldb::WriteBatch batch; +}; + +CDBBatch::CDBBatch(const CDBWrapper& _parent) : parent(_parent), + m_impl_batch{std::make_unique()}, + ssValue(SER_DISK, CLIENT_VERSION){}; + +CDBBatch::~CDBBatch() = default; + +void CDBBatch::Clear() +{ + m_impl_batch->batch.Clear(); + size_estimate = 0; +} + void CDBBatch::WriteImpl(Span 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); + m_impl_batch->batch.Put(slKey, slValue); // LevelDB serializes writes as: // - byte: header // - varint: key length (1 byte up to 127B, 2 bytes up to 16383B, ...) @@ -155,7 +173,7 @@ void CDBBatch::WriteImpl(Span ssKey, CDataStream& ssValue) void CDBBatch::EraseImpl(Span ssKey) { leveldb::Slice slKey(CharCast(ssKey.data()), ssKey.size()); - batch.Delete(slKey); + m_impl_batch->batch.Delete(slKey); // LevelDB serializes erases as: // - byte: header // - varint: key length @@ -241,7 +259,7 @@ bool CDBWrapper::WriteBatch(CDBBatch& batch, bool fSync) if (log_memory) { mem_before = DynamicMemoryUsage() / 1024.0 / 1024; } - leveldb::Status status = pdb->Write(fSync ? syncoptions : writeoptions, &batch.batch); + leveldb::Status status = pdb->Write(fSync ? syncoptions : writeoptions, &batch.m_impl_batch->batch); dbwrapper_private::HandleError(status); if (log_memory) { double mem_after = DynamicMemoryUsage() / 1024.0 / 1024; diff --git a/src/dbwrapper.h b/src/dbwrapper.h index 61f5003db7..9016111209 100644 --- a/src/dbwrapper.h +++ b/src/dbwrapper.h @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include #include @@ -90,7 +90,9 @@ class CDBBatch private: const CDBWrapper &parent; - leveldb::WriteBatch batch; + + struct WriteBatchImpl; + const std::unique_ptr m_impl_batch; DataStream ssKey{}; CDataStream ssValue; @@ -104,13 +106,9 @@ public: /** * @param[in] _parent CDBWrapper that this batch is to be submitted to */ - explicit CDBBatch(const CDBWrapper& _parent) : parent(_parent), ssValue(SER_DISK, CLIENT_VERSION){}; - - void Clear() - { - batch.Clear(); - size_estimate = 0; - } + explicit CDBBatch(const CDBWrapper& _parent); + ~CDBBatch(); + void Clear(); template void Write(const K& key, const V& value)