From eac9200814fa01da6522625be01dded730b26751 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Thu, 18 Jun 2020 16:15:33 -0400 Subject: walletdb: Refactor DatabaseBatch abstract class from BerkeleyBatch --- src/wallet/bdb.h | 79 ++++++++++---------------------------------------------- 1 file changed, 14 insertions(+), 65 deletions(-) (limited to 'src/wallet/bdb.h') diff --git a/src/wallet/bdb.h b/src/wallet/bdb.h index 599319482b..f3b1e5d0a3 100644 --- a/src/wallet/bdb.h +++ b/src/wallet/bdb.h @@ -172,7 +172,7 @@ private: }; /** RAII class that provides access to a Berkeley database */ -class BerkeleyBatch +class BerkeleyBatch : public DatabaseBatch { /** RAII class that automatically cleanses its data on destruction */ class SafeDbt final @@ -195,10 +195,10 @@ class BerkeleyBatch }; private: - bool ReadKey(CDataStream&& key, CDataStream& value); - bool WriteKey(CDataStream&& key, CDataStream&& value, bool overwrite = true); - bool EraseKey(CDataStream&& key); - bool HasKey(CDataStream&& key); + bool ReadKey(CDataStream&& key, CDataStream& value) override; + bool WriteKey(CDataStream&& key, CDataStream&& value, bool overwrite = true) override; + bool EraseKey(CDataStream&& key) override; + bool HasKey(CDataStream&& key) override; protected: Db* pdb; @@ -211,71 +211,20 @@ protected: public: explicit BerkeleyBatch(BerkeleyDatabase& database, const char* pszMode = "r+", bool fFlushOnCloseIn=true); - ~BerkeleyBatch() { Close(); } + ~BerkeleyBatch() override { Close(); } BerkeleyBatch(const BerkeleyBatch&) = delete; BerkeleyBatch& operator=(const BerkeleyBatch&) = delete; - void Flush(); - void Close(); - - template - bool Read(const K& key, T& value) - { - CDataStream ssKey(SER_DISK, CLIENT_VERSION); - ssKey.reserve(1000); - ssKey << key; - - CDataStream ssValue(SER_DISK, CLIENT_VERSION); - if (!ReadKey(std::move(ssKey), ssValue)) return false; - try { - ssValue >> value; - return true; - } catch (const std::exception&) { - return false; - } - } - - template - bool Write(const K& key, const T& value, bool fOverwrite = true) - { - CDataStream ssKey(SER_DISK, CLIENT_VERSION); - ssKey.reserve(1000); - ssKey << key; - - CDataStream ssValue(SER_DISK, CLIENT_VERSION); - ssValue.reserve(10000); - ssValue << value; - - return WriteKey(std::move(ssKey), std::move(ssValue), fOverwrite); - } - - template - bool Erase(const K& key) - { - CDataStream ssKey(SER_DISK, CLIENT_VERSION); - ssKey.reserve(1000); - ssKey << key; - - return EraseKey(std::move(ssKey)); - } - - template - bool Exists(const K& key) - { - CDataStream ssKey(SER_DISK, CLIENT_VERSION); - ssKey.reserve(1000); - ssKey << key; - - return HasKey(std::move(ssKey)); - } + void Flush() override; + void Close() override; - bool StartCursor(); - bool ReadAtCursor(CDataStream& ssKey, CDataStream& ssValue, bool& complete); - void CloseCursor(); - bool TxnBegin(); - bool TxnCommit(); - bool TxnAbort(); + bool StartCursor() override; + bool ReadAtCursor(CDataStream& ssKey, CDataStream& ssValue, bool& complete) override; + void CloseCursor() override; + bool TxnBegin() override; + bool TxnCommit() override; + bool TxnAbort() override; }; std::string BerkeleyDatabaseVersion(); -- cgit v1.2.3 From b82f0ca4d5465b36debb6c57f335bdccf4899c49 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Mon, 15 Jun 2020 16:54:58 -0400 Subject: walletdb: Add MakeBatch function to BerkeleyDatabase and use it Instead of having WalletBatch construct the BerkeleyBatch, have BerkeleyDatabase do it and return a std::unique_ptr --- src/wallet/bdb.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/wallet/bdb.h') diff --git a/src/wallet/bdb.h b/src/wallet/bdb.h index f3b1e5d0a3..b565bfc680 100644 --- a/src/wallet/bdb.h +++ b/src/wallet/bdb.h @@ -93,6 +93,8 @@ std::shared_ptr GetWalletEnv(const fs::path& wallet_path, s /** Return wheter a BDB wallet database is currently loaded. */ bool IsBDBWalletLoaded(const fs::path& wallet_path); +class BerkeleyBatch; + /** An instance of this class represents one database. * For BerkeleyDB this is just a (env, strFile) tuple. **/ @@ -161,6 +163,9 @@ public: /** Database pointer. This is initialized lazily and reset during flushes, so it can be null. */ std::unique_ptr m_db; + /** Make a BerkeleyBatch connected to this database */ + std::unique_ptr MakeBatch(const char* mode, bool flush_on_close); + private: std::string strFile; -- cgit v1.2.3