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)