/Users/eugenesiegel/btc/bitcoin/src/dbwrapper.h
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | // Copyright (c) 2012-present The Bitcoin Core developers | 
| 2 |  | // Distributed under the MIT software license, see the accompanying | 
| 3 |  | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | 
| 4 |  |  | 
| 5 |  | #ifndef BITCOIN_DBWRAPPER_H | 
| 6 |  | #define BITCOIN_DBWRAPPER_H | 
| 7 |  |  | 
| 8 |  | #include <attributes.h> | 
| 9 |  | #include <serialize.h> | 
| 10 |  | #include <span.h> | 
| 11 |  | #include <streams.h> | 
| 12 |  | #include <util/check.h> | 
| 13 |  | #include <util/fs.h> | 
| 14 |  |  | 
| 15 |  | #include <cstddef> | 
| 16 |  | #include <exception> | 
| 17 |  | #include <memory> | 
| 18 |  | #include <optional> | 
| 19 |  | #include <stdexcept> | 
| 20 |  | #include <string> | 
| 21 |  |  | 
| 22 |  | static const size_t DBWRAPPER_PREALLOC_KEY_SIZE = 64; | 
| 23 |  | static const size_t DBWRAPPER_PREALLOC_VALUE_SIZE = 1024; | 
| 24 |  | static const size_t DBWRAPPER_MAX_FILE_SIZE = 32 << 20; // 32 MiB | 
| 25 |  |  | 
| 26 |  | //! User-controlled performance and debug options. | 
| 27 |  | struct DBOptions { | 
| 28 |  |     //! Compact database on startup. | 
| 29 |  |     bool force_compact = false; | 
| 30 |  | }; | 
| 31 |  |  | 
| 32 |  | //! Application-specific storage settings. | 
| 33 |  | struct DBParams { | 
| 34 |  |     //! Location in the filesystem where leveldb data will be stored. | 
| 35 |  |     fs::path path; | 
| 36 |  |     //! Configures various leveldb cache settings. | 
| 37 |  |     size_t cache_bytes; | 
| 38 |  |     //! If true, use leveldb's memory environment. | 
| 39 |  |     bool memory_only = false; | 
| 40 |  |     //! If true, remove all existing data. | 
| 41 |  |     bool wipe_data = false; | 
| 42 |  |     //! If true, store data obfuscated via simple XOR. If false, XOR with a | 
| 43 |  |     //! zero'd byte array. | 
| 44 |  |     bool obfuscate = false; | 
| 45 |  |     //! Passed-through options. | 
| 46 |  |     DBOptions options{}; | 
| 47 |  | }; | 
| 48 |  |  | 
| 49 |  | class dbwrapper_error : public std::runtime_error | 
| 50 |  | { | 
| 51 |  | public: | 
| 52 | 0 |     explicit dbwrapper_error(const std::string& msg) : std::runtime_error(msg) {} | 
| 53 |  | }; | 
| 54 |  |  | 
| 55 |  | class CDBWrapper; | 
| 56 |  |  | 
| 57 |  | /** These should be considered an implementation detail of the specific database. | 
| 58 |  |  */ | 
| 59 |  | namespace dbwrapper_private { | 
| 60 |  |  | 
| 61 |  | /** Work around circular dependency, as well as for testing in dbwrapper_tests. | 
| 62 |  |  * Database obfuscation should be considered an implementation detail of the | 
| 63 |  |  * specific database. | 
| 64 |  |  */ | 
| 65 |  | const Obfuscation& GetObfuscation(const CDBWrapper&); | 
| 66 |  | }; // namespace dbwrapper_private | 
| 67 |  |  | 
| 68 |  | bool DestroyDB(const std::string& path_str); | 
| 69 |  |  | 
| 70 |  | /** Batch of changes queued to be written to a CDBWrapper */ | 
| 71 |  | class CDBBatch | 
| 72 |  | { | 
| 73 |  |     friend class CDBWrapper; | 
| 74 |  |  | 
| 75 |  | private: | 
| 76 |  |     const CDBWrapper &parent; | 
| 77 |  |  | 
| 78 |  |     struct WriteBatchImpl; | 
| 79 |  |     const std::unique_ptr<WriteBatchImpl> m_impl_batch; | 
| 80 |  |  | 
| 81 |  |     DataStream ssKey{}; | 
| 82 |  |     DataStream ssValue{}; | 
| 83 |  |  | 
| 84 |  |     void WriteImpl(std::span<const std::byte> key, DataStream& ssValue); | 
| 85 |  |     void EraseImpl(std::span<const std::byte> key); | 
| 86 |  |  | 
| 87 |  | public: | 
| 88 |  |     /** | 
| 89 |  |      * @param[in] _parent   CDBWrapper that this batch is to be submitted to | 
| 90 |  |      */ | 
| 91 |  |     explicit CDBBatch(const CDBWrapper& _parent); | 
| 92 |  |     ~CDBBatch(); | 
| 93 |  |     void Clear(); | 
| 94 |  |  | 
| 95 |  |     template <typename K, typename V> | 
| 96 |  |     void Write(const K& key, const V& value) | 
| 97 | 36.2k |     { | 
| 98 | 36.2k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); | 
| 99 | 36.2k |         ssValue.reserve(DBWRAPPER_PREALLOC_VALUE_SIZE); | 
| 100 | 36.2k |         ssKey << key; | 
| 101 | 36.2k |         ssValue << value; | 
| 102 | 36.2k |         WriteImpl(ssKey, ssValue); | 
| 103 | 36.2k |         ssKey.clear(); | 
| 104 | 36.2k |         ssValue.clear(); | 
| 105 | 36.2k |     } Unexecuted instantiation: _ZN8CDBBatch5WriteINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11ObfuscationEEvRKT_RKT0_Unexecuted instantiation: _ZN8CDBBatch5WriteIh13CBlockLocatorEEvRKT_RKT0_Unexecuted instantiation: blockfilterindex.cpp:_ZN8CDBBatch5WriteIN12_GLOBAL__N_19DBHashKeyENS1_5DBValEEEvRKT_RKT0_Unexecuted instantiation: _ZN8CDBBatch5WriteIh11FlatFilePosEEvRKT_RKT0_Unexecuted instantiation: blockfilterindex.cpp:_ZN8CDBBatch5WriteIN12_GLOBAL__N_111DBHeightKeyENSt3__14pairI7uint256NS1_5DBValEEEEEvRKT_RKT0_Unexecuted instantiation: coinstatsindex.cpp:_ZN8CDBBatch5WriteIN12_GLOBAL__N_19DBHashKeyENS1_5DBValEEEvRKT_RKT0_Unexecuted instantiation: coinstatsindex.cpp:_ZN8CDBBatch5WriteIN12_GLOBAL__N_111DBHeightKeyENSt3__14pairI7uint256NS1_5DBValEEEEEvRKT_RKT0_Unexecuted instantiation: _ZN8CDBBatch5WriteIh10MuHash3072EEvRKT_RKT0_Unexecuted instantiation: _ZN8CDBBatch5WriteINSt3__14pairIh7uint256EE10CDiskTxPosEEvRKT_RKT0_Unexecuted instantiation: _ZN8CDBBatch5WriteIhhEEvRKT_RKT0__ZN8CDBBatch5WriteINSt3__14pairIhiEE14CBlockFileInfoEEvRKT_RKT0_| Line | Count | Source |  | 97 | 1.89k |     { |  | 98 | 1.89k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 99 | 1.89k |         ssValue.reserve(DBWRAPPER_PREALLOC_VALUE_SIZE); |  | 100 | 1.89k |         ssKey << key; |  | 101 | 1.89k |         ssValue << value; |  | 102 | 1.89k |         WriteImpl(ssKey, ssValue); |  | 103 | 1.89k |         ssKey.clear(); |  | 104 | 1.89k |         ssValue.clear(); |  | 105 | 1.89k |     } | 
_ZN8CDBBatch5WriteIhiEEvRKT_RKT0_| Line | Count | Source |  | 97 | 4.58k |     { |  | 98 | 4.58k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 99 | 4.58k |         ssValue.reserve(DBWRAPPER_PREALLOC_VALUE_SIZE); |  | 100 | 4.58k |         ssKey << key; |  | 101 | 4.58k |         ssValue << value; |  | 102 | 4.58k |         WriteImpl(ssKey, ssValue); |  | 103 | 4.58k |         ssKey.clear(); |  | 104 | 4.58k |         ssValue.clear(); |  | 105 | 4.58k |     } | 
_ZN8CDBBatch5WriteINSt3__14pairIh7uint256EE15CDiskBlockIndexEEvRKT_RKT0_| Line | Count | Source |  | 97 | 10.4k |     { |  | 98 | 10.4k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 99 | 10.4k |         ssValue.reserve(DBWRAPPER_PREALLOC_VALUE_SIZE); |  | 100 | 10.4k |         ssKey << key; |  | 101 | 10.4k |         ssValue << value; |  | 102 | 10.4k |         WriteImpl(ssKey, ssValue); |  | 103 | 10.4k |         ssKey.clear(); |  | 104 | 10.4k |         ssValue.clear(); |  | 105 | 10.4k |     } | 
Unexecuted instantiation: _ZN8CDBBatch5WriteINSt3__14pairIhNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEEhEEvRKT_RKT0__ZN8CDBBatch5WriteIhNSt3__16vectorI7uint256NS1_9allocatorIS3_EEEEEEvRKT_RKT0_| Line | Count | Source |  | 97 | 4.58k |     { |  | 98 | 4.58k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 99 | 4.58k |         ssValue.reserve(DBWRAPPER_PREALLOC_VALUE_SIZE); |  | 100 | 4.58k |         ssKey << key; |  | 101 | 4.58k |         ssValue << value; |  | 102 | 4.58k |         WriteImpl(ssKey, ssValue); |  | 103 | 4.58k |         ssKey.clear(); |  | 104 | 4.58k |         ssValue.clear(); |  | 105 | 4.58k |     } | 
txdb.cpp:_ZN8CDBBatch5WriteIN12_GLOBAL__N_19CoinEntryE4CoinEEvRKT_RKT0_| Line | Count | Source |  | 97 | 10.1k |     { |  | 98 | 10.1k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 99 | 10.1k |         ssValue.reserve(DBWRAPPER_PREALLOC_VALUE_SIZE); |  | 100 | 10.1k |         ssKey << key; |  | 101 | 10.1k |         ssValue << value; |  | 102 | 10.1k |         WriteImpl(ssKey, ssValue); |  | 103 | 10.1k |         ssKey.clear(); |  | 104 | 10.1k |         ssValue.clear(); |  | 105 | 10.1k |     } | 
_ZN8CDBBatch5WriteIh7uint256EEvRKT_RKT0_| Line | Count | Source |  | 97 | 4.58k |     { |  | 98 | 4.58k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 99 | 4.58k |         ssValue.reserve(DBWRAPPER_PREALLOC_VALUE_SIZE); |  | 100 | 4.58k |         ssKey << key; |  | 101 | 4.58k |         ssValue << value; |  | 102 | 4.58k |         WriteImpl(ssKey, ssValue); |  | 103 | 4.58k |         ssKey.clear(); |  | 104 | 4.58k |         ssValue.clear(); |  | 105 | 4.58k |     } | 
 | 
| 106 |  |  | 
| 107 |  |     template <typename K> | 
| 108 |  |     void Erase(const K& key) | 
| 109 | 16.5k |     { | 
| 110 | 16.5k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); | 
| 111 | 16.5k |         ssKey << key; | 
| 112 | 16.5k |         EraseImpl(ssKey); | 
| 113 | 16.5k |         ssKey.clear(); | 
| 114 | 16.5k |     } _ZN8CDBBatch5EraseIhEEvRKT_| Line | Count | Source |  | 109 | 9.16k |     { |  | 110 | 9.16k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 111 | 9.16k |         ssKey << key; |  | 112 | 9.16k |         EraseImpl(ssKey); |  | 113 | 9.16k |         ssKey.clear(); |  | 114 | 9.16k |     } | 
txdb.cpp:_ZN8CDBBatch5EraseIN12_GLOBAL__N_19CoinEntryEEEvRKT_| Line | Count | Source |  | 109 | 7.36k |     { |  | 110 | 7.36k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 111 | 7.36k |         ssKey << key; |  | 112 | 7.36k |         EraseImpl(ssKey); |  | 113 | 7.36k |         ssKey.clear(); |  | 114 | 7.36k |     } | 
 | 
| 115 |  |  | 
| 116 |  |     size_t ApproximateSize() const; | 
| 117 |  | }; | 
| 118 |  |  | 
| 119 |  | class CDBIterator | 
| 120 |  | { | 
| 121 |  | public: | 
| 122 |  |     struct IteratorImpl; | 
| 123 |  |  | 
| 124 |  | private: | 
| 125 |  |     const CDBWrapper &parent; | 
| 126 |  |     const std::unique_ptr<IteratorImpl> m_impl_iter; | 
| 127 |  |  | 
| 128 |  |     void SeekImpl(std::span<const std::byte> key); | 
| 129 |  |     std::span<const std::byte> GetKeyImpl() const; | 
| 130 |  |     std::span<const std::byte> GetValueImpl() const; | 
| 131 |  |  | 
| 132 |  | public: | 
| 133 |  |  | 
| 134 |  |     /** | 
| 135 |  |      * @param[in] _parent          Parent CDBWrapper instance. | 
| 136 |  |      * @param[in] _piter           The original leveldb iterator. | 
| 137 |  |      */ | 
| 138 |  |     CDBIterator(const CDBWrapper& _parent, std::unique_ptr<IteratorImpl> _piter); | 
| 139 |  |     ~CDBIterator(); | 
| 140 |  |  | 
| 141 |  |     bool Valid() const; | 
| 142 |  |  | 
| 143 |  |     void SeekToFirst(); | 
| 144 |  |  | 
| 145 | 102k |     template<typename K> void Seek(const K& key) { | 
| 146 | 102k |         DataStream ssKey{}; | 
| 147 | 102k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); | 
| 148 | 102k |         ssKey << key; | 
| 149 | 102k |         SeekImpl(ssKey); | 
| 150 | 102k |     } Unexecuted instantiation: blockfilterindex.cpp:_ZN11CDBIterator4SeekIN12_GLOBAL__N_111DBHeightKeyEEEvRKT_Unexecuted instantiation: coinstatsindex.cpp:_ZN11CDBIterator4SeekIN12_GLOBAL__N_111DBHeightKeyEEEvRKT__ZN11CDBIterator4SeekINSt3__14pairIh7uint256EEEEvRKT_| Line | Count | Source |  | 145 | 102k |     template<typename K> void Seek(const K& key) { |  | 146 | 102k |         DataStream ssKey{}; |  | 147 | 102k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 148 | 102k |         ssKey << key; |  | 149 | 102k |         SeekImpl(ssKey); |  | 150 | 102k |     } | 
Unexecuted instantiation: _ZN11CDBIterator4SeekIhEEvRKT_ | 
| 151 |  |  | 
| 152 |  |     void Next(); | 
| 153 |  |  | 
| 154 | 10.3M |     template<typename K> bool GetKey(K& key) { | 
| 155 | 10.3M |         try { | 
| 156 | 10.3M |             DataStream ssKey{GetKeyImpl()}; | 
| 157 | 10.3M |             ssKey >> key; | 
| 158 | 10.3M |         } catch (const std::exception&) { | 
| 159 | 51.2k |             return false; | 
| 160 | 51.2k |         } | 
| 161 | 10.3M |         return true; | 
| 162 | 10.3M |     } Unexecuted instantiation: blockfilterindex.cpp:_ZN11CDBIterator6GetKeyIN12_GLOBAL__N_111DBHeightKeyEEEbRT_Unexecuted instantiation: coinstatsindex.cpp:_ZN11CDBIterator6GetKeyIN12_GLOBAL__N_111DBHeightKeyEEEbRT__ZN11CDBIterator6GetKeyINSt3__14pairIh7uint256EEEEbRT_| Line | Count | Source |  | 154 | 10.3M |     template<typename K> bool GetKey(K& key) { |  | 155 | 10.3M |         try { |  | 156 | 10.3M |             DataStream ssKey{GetKeyImpl()}; |  | 157 | 10.3M |             ssKey >> key; |  | 158 | 10.3M |         } catch (const std::exception&) { |  | 159 | 51.2k |             return false; |  | 160 | 51.2k |         } |  | 161 | 10.3M |         return true; |  | 162 | 10.3M |     } | 
Unexecuted instantiation: txdb.cpp:_ZN11CDBIterator6GetKeyIN12_GLOBAL__N_19CoinEntryEEEbRT_ | 
| 163 |  |  | 
| 164 | 10.3M |     template<typename V> bool GetValue(V& value) { | 
| 165 | 10.3M |         try { | 
| 166 | 10.3M |             DataStream ssValue{GetValueImpl()}; | 
| 167 | 10.3M |             dbwrapper_private::GetObfuscation(parent)(ssValue); | 
| 168 | 10.3M |             ssValue >> value; | 
| 169 | 10.3M |         } catch (const std::exception&) { | 
| 170 | 0 |             return false; | 
| 171 | 0 |         } | 
| 172 | 10.3M |         return true; | 
| 173 | 10.3M |     } Unexecuted instantiation: blockfilterindex.cpp:_ZN11CDBIterator8GetValueINSt3__14pairI7uint256N12_GLOBAL__N_15DBValEEEEEbRT_Unexecuted instantiation: coinstatsindex.cpp:_ZN11CDBIterator8GetValueINSt3__14pairI7uint256N12_GLOBAL__N_15DBValEEEEEbRT__ZN11CDBIterator8GetValueI15CDiskBlockIndexEEbRT_| Line | Count | Source |  | 164 | 10.3M |     template<typename V> bool GetValue(V& value) { |  | 165 | 10.3M |         try { |  | 166 | 10.3M |             DataStream ssValue{GetValueImpl()}; |  | 167 | 10.3M |             dbwrapper_private::GetObfuscation(parent)(ssValue); |  | 168 | 10.3M |             ssValue >> value; |  | 169 | 10.3M |         } catch (const std::exception&) { |  | 170 | 0 |             return false; |  | 171 | 0 |         } |  | 172 | 10.3M |         return true; |  | 173 | 10.3M |     } | 
Unexecuted instantiation: _ZN11CDBIterator8GetValueI4CoinEEbRT_ | 
| 174 |  | }; | 
| 175 |  |  | 
| 176 |  | struct LevelDBContext; | 
| 177 |  |  | 
| 178 |  | class CDBWrapper | 
| 179 |  | { | 
| 180 |  |     friend const Obfuscation& dbwrapper_private::GetObfuscation(const CDBWrapper&); | 
| 181 |  | private: | 
| 182 |  |     //! holds all leveldb-specific fields of this class | 
| 183 |  |     std::unique_ptr<LevelDBContext> m_db_context; | 
| 184 |  |  | 
| 185 |  |     //! the name of this database | 
| 186 |  |     std::string m_name; | 
| 187 |  |  | 
| 188 |  |     //! optional XOR-obfuscation of the database | 
| 189 |  |     Obfuscation m_obfuscation; | 
| 190 |  |  | 
| 191 |  |     //! obfuscation key storage key, null-prefixed to avoid collisions | 
| 192 |  |     inline static const std::string OBFUSCATION_KEY{"\000obfuscate_key", 14}; // explicit size to avoid truncation at leading \0 | 
| 193 |  |  | 
| 194 |  |     //! path to filesystem storage | 
| 195 |  |     const fs::path m_path; | 
| 196 |  |  | 
| 197 |  |     //! whether or not the database resides in memory | 
| 198 |  |     bool m_is_memory; | 
| 199 |  |  | 
| 200 |  |     std::optional<std::string> ReadImpl(std::span<const std::byte> key) const; | 
| 201 |  |     bool ExistsImpl(std::span<const std::byte> key) const; | 
| 202 |  |     size_t EstimateSizeImpl(std::span<const std::byte> key1, std::span<const std::byte> key2) const; | 
| 203 | 6.25M |     auto& DBContext() const LIFETIMEBOUND { return *Assert(m_db_context); }| Line | Count | Source |  | 106 | 6.25M | #define Assert(val) inline_assertion_check<true>(val, __FILE__, __LINE__, __func__, #val) | 
 | 
| 204 |  |  | 
| 205 |  | public: | 
| 206 |  |     CDBWrapper(const DBParams& params); | 
| 207 |  |     ~CDBWrapper(); | 
| 208 |  |  | 
| 209 |  |     CDBWrapper(const CDBWrapper&) = delete; | 
| 210 |  |     CDBWrapper& operator=(const CDBWrapper&) = delete; | 
| 211 |  |  | 
| 212 |  |     template <typename K, typename V> | 
| 213 |  |     bool Read(const K& key, V& value) const | 
| 214 | 1.99M |     { | 
| 215 | 1.99M |         DataStream ssKey{}; | 
| 216 | 1.99M |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); | 
| 217 | 1.99M |         ssKey << key; | 
| 218 | 1.99M |         std::optional<std::string> strValue{ReadImpl(ssKey)}; | 
| 219 | 1.99M |         if (!strValue) { | 
| 220 | 389k |             return false; | 
| 221 | 389k |         } | 
| 222 | 1.60M |         try { | 
| 223 | 1.60M |             DataStream ssValue{MakeByteSpan(*strValue)}; | 
| 224 | 1.60M |             m_obfuscation(ssValue); | 
| 225 | 1.60M |             ssValue >> value; | 
| 226 | 1.60M |         } catch (const std::exception&) { | 
| 227 | 0 |             return false; | 
| 228 | 0 |         } | 
| 229 | 1.60M |         return true; | 
| 230 | 1.60M |     } _ZNK10CDBWrapper4ReadINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11ObfuscationEEbRKT_RT0_| Line | Count | Source |  | 214 | 102k |     { |  | 215 | 102k |         DataStream ssKey{}; |  | 216 | 102k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 217 | 102k |         ssKey << key; |  | 218 | 102k |         std::optional<std::string> strValue{ReadImpl(ssKey)}; |  | 219 | 102k |         if (!strValue) { |  | 220 | 51.2k |             return false; |  | 221 | 51.2k |         } |  | 222 | 51.2k |         try { |  | 223 | 51.2k |             DataStream ssValue{MakeByteSpan(*strValue)}; |  | 224 | 51.2k |             m_obfuscation(ssValue); |  | 225 | 51.2k |             ssValue >> value; |  | 226 | 51.2k |         } catch (const std::exception&) { |  | 227 | 0 |             return false; |  | 228 | 0 |         } |  | 229 | 51.2k |         return true; |  | 230 | 51.2k |     } | 
Unexecuted instantiation: _ZNK10CDBWrapper4ReadIh13CBlockLocatorEEbRKT_RT0_Unexecuted instantiation: blockfilterindex.cpp:_ZNK10CDBWrapper4ReadIN12_GLOBAL__N_19DBHashKeyENS1_5DBValEEEbRKT_RT0_Unexecuted instantiation: _ZNK10CDBWrapper4ReadIh11FlatFilePosEEbRKT_RT0_Unexecuted instantiation: blockfilterindex.cpp:_ZNK10CDBWrapper4ReadIN12_GLOBAL__N_111DBHeightKeyENSt3__14pairI7uint256NS1_5DBValEEEEEbRKT_RT0_Unexecuted instantiation: coinstatsindex.cpp:_ZNK10CDBWrapper4ReadIN12_GLOBAL__N_19DBHashKeyENS1_5DBValEEEbRKT_RT0_Unexecuted instantiation: coinstatsindex.cpp:_ZNK10CDBWrapper4ReadIN12_GLOBAL__N_111DBHeightKeyENSt3__14pairI7uint256NS1_5DBValEEEEEbRKT_RT0_Unexecuted instantiation: _ZNK10CDBWrapper4ReadIh10MuHash3072EEbRKT_RT0_Unexecuted instantiation: coinstatsindex.cpp:_ZNK10CDBWrapper4ReadIN12_GLOBAL__N_19DBHashKeyENSt3__14pairI7uint256NS1_5DBValEEEEEbRKT_RT0_Unexecuted instantiation: _ZNK10CDBWrapper4ReadINSt3__14pairIh7uint256EE10CDiskTxPosEEbRKT_RT0__ZNK10CDBWrapper4ReadINSt3__14pairIhiEE14CBlockFileInfoEEbRKT_RT0_| Line | Count | Source |  | 214 | 102k |     { |  | 215 | 102k |         DataStream ssKey{}; |  | 216 | 102k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 217 | 102k |         ssKey << key; |  | 218 | 102k |         std::optional<std::string> strValue{ReadImpl(ssKey)}; |  | 219 | 102k |         if (!strValue) { |  | 220 | 51.2k |             return false; |  | 221 | 51.2k |         } |  | 222 | 51.2k |         try { |  | 223 | 51.2k |             DataStream ssValue{MakeByteSpan(*strValue)}; |  | 224 | 51.2k |             m_obfuscation(ssValue); |  | 225 | 51.2k |             ssValue >> value; |  | 226 | 51.2k |         } catch (const std::exception&) { |  | 227 | 0 |             return false; |  | 228 | 0 |         } |  | 229 | 51.2k |         return true; |  | 230 | 51.2k |     } | 
_ZNK10CDBWrapper4ReadIhiEEbRKT_RT0_| Line | Count | Source |  | 214 | 51.2k |     { |  | 215 | 51.2k |         DataStream ssKey{}; |  | 216 | 51.2k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 217 | 51.2k |         ssKey << key; |  | 218 | 51.2k |         std::optional<std::string> strValue{ReadImpl(ssKey)}; |  | 219 | 51.2k |         if (!strValue) { |  | 220 | 0 |             return false; |  | 221 | 0 |         } |  | 222 | 51.2k |         try { |  | 223 | 51.2k |             DataStream ssValue{MakeByteSpan(*strValue)}; |  | 224 | 51.2k |             m_obfuscation(ssValue); |  | 225 | 51.2k |             ssValue >> value; |  | 226 | 51.2k |         } catch (const std::exception&) { |  | 227 | 0 |             return false; |  | 228 | 0 |         } |  | 229 | 51.2k |         return true; |  | 230 | 51.2k |     } | 
_ZNK10CDBWrapper4ReadINSt3__14pairIhNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEEhEEbRKT_RT0_| Line | Count | Source |  | 214 | 51.2k |     { |  | 215 | 51.2k |         DataStream ssKey{}; |  | 216 | 51.2k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 217 | 51.2k |         ssKey << key; |  | 218 | 51.2k |         std::optional<std::string> strValue{ReadImpl(ssKey)}; |  | 219 | 51.2k |         if (!strValue) { |  | 220 | 51.2k |             return false; |  | 221 | 51.2k |         } |  | 222 | 0 |         try { |  | 223 | 0 |             DataStream ssValue{MakeByteSpan(*strValue)}; |  | 224 | 0 |             m_obfuscation(ssValue); |  | 225 | 0 |             ssValue >> value; |  | 226 | 0 |         } catch (const std::exception&) { |  | 227 | 0 |             return false; |  | 228 | 0 |         } |  | 229 | 0 |         return true; |  | 230 | 0 |     } | 
txdb.cpp:_ZNK10CDBWrapper4ReadIN12_GLOBAL__N_19CoinEntryE4CoinEEbRKT_RT0_| Line | Count | Source |  | 214 | 1.52M |     { |  | 215 | 1.52M |         DataStream ssKey{}; |  | 216 | 1.52M |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 217 | 1.52M |         ssKey << key; |  | 218 | 1.52M |         std::optional<std::string> strValue{ReadImpl(ssKey)}; |  | 219 | 1.52M |         if (!strValue) { |  | 220 | 184k |             return false; |  | 221 | 184k |         } |  | 222 | 1.34M |         try { |  | 223 | 1.34M |             DataStream ssValue{MakeByteSpan(*strValue)}; |  | 224 | 1.34M |             m_obfuscation(ssValue); |  | 225 | 1.34M |             ssValue >> value; |  | 226 | 1.34M |         } catch (const std::exception&) { |  | 227 | 0 |             return false; |  | 228 | 0 |         } |  | 229 | 1.34M |         return true; |  | 230 | 1.34M |     } | 
_ZNK10CDBWrapper4ReadIh7uint256EEbRKT_RT0_| Line | Count | Source |  | 214 | 107k |     { |  | 215 | 107k |         DataStream ssKey{}; |  | 216 | 107k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 217 | 107k |         ssKey << key; |  | 218 | 107k |         std::optional<std::string> strValue{ReadImpl(ssKey)}; |  | 219 | 107k |         if (!strValue) { |  | 220 | 0 |             return false; |  | 221 | 0 |         } |  | 222 | 107k |         try { |  | 223 | 107k |             DataStream ssValue{MakeByteSpan(*strValue)}; |  | 224 | 107k |             m_obfuscation(ssValue); |  | 225 | 107k |             ssValue >> value; |  | 226 | 107k |         } catch (const std::exception&) { |  | 227 | 0 |             return false; |  | 228 | 0 |         } |  | 229 | 107k |         return true; |  | 230 | 107k |     } | 
_ZNK10CDBWrapper4ReadIhNSt3__16vectorI7uint256NS1_9allocatorIS3_EEEEEEbRKT_RT0_| Line | Count | Source |  | 214 | 51.2k |     { |  | 215 | 51.2k |         DataStream ssKey{}; |  | 216 | 51.2k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 217 | 51.2k |         ssKey << key; |  | 218 | 51.2k |         std::optional<std::string> strValue{ReadImpl(ssKey)}; |  | 219 | 51.2k |         if (!strValue) { |  | 220 | 51.2k |             return false; |  | 221 | 51.2k |         } |  | 222 | 0 |         try { |  | 223 | 0 |             DataStream ssValue{MakeByteSpan(*strValue)}; |  | 224 | 0 |             m_obfuscation(ssValue); |  | 225 | 0 |             ssValue >> value; |  | 226 | 0 |         } catch (const std::exception&) { |  | 227 | 0 |             return false; |  | 228 | 0 |         } |  | 229 | 0 |         return true; |  | 230 | 0 |     } | 
 | 
| 231 |  |  | 
| 232 |  |     template <typename K, typename V> | 
| 233 |  |     bool Write(const K& key, const V& value, bool fSync = false) | 
| 234 | 0 |     { | 
| 235 | 0 |         CDBBatch batch(*this); | 
| 236 | 0 |         batch.Write(key, value); | 
| 237 | 0 |         return WriteBatch(batch, fSync); | 
| 238 | 0 |     } Unexecuted instantiation: _ZN10CDBWrapper5WriteINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11ObfuscationEEbRKT_RKT0_bUnexecuted instantiation: blockfilterindex.cpp:_ZN10CDBWrapper5WriteIN12_GLOBAL__N_111DBHeightKeyENSt3__14pairI7uint256NS1_5DBValEEEEEbRKT_RKT0_bUnexecuted instantiation: coinstatsindex.cpp:_ZN10CDBWrapper5WriteIN12_GLOBAL__N_111DBHeightKeyENSt3__14pairI7uint256NS1_5DBValEEEEEbRKT_RKT0_bUnexecuted instantiation: _ZN10CDBWrapper5WriteIhhEEbRKT_RKT0_bUnexecuted instantiation: _ZN10CDBWrapper5WriteINSt3__14pairIhNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEEhEEbRKT_RKT0_b | 
| 239 |  |  | 
| 240 |  |     //! @returns filesystem path to the on-disk data. | 
| 241 | 0 |     std::optional<fs::path> StoragePath() { | 
| 242 | 0 |         if (m_is_memory) { | 
| 243 | 0 |             return {}; | 
| 244 | 0 |         } | 
| 245 | 0 |         return m_path; | 
| 246 | 0 |     } | 
| 247 |  |  | 
| 248 |  |     template <typename K> | 
| 249 |  |     bool Exists(const K& key) const | 
| 250 | 51.2k |     { | 
| 251 | 51.2k |         DataStream ssKey{}; | 
| 252 | 51.2k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); | 
| 253 | 51.2k |         ssKey << key; | 
| 254 | 51.2k |         return ExistsImpl(ssKey); | 
| 255 | 51.2k |     } _ZNK10CDBWrapper6ExistsIhEEbRKT_| Line | Count | Source |  | 250 | 51.2k |     { |  | 251 | 51.2k |         DataStream ssKey{}; |  | 252 | 51.2k |         ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); |  | 253 | 51.2k |         ssKey << key; |  | 254 | 51.2k |         return ExistsImpl(ssKey); |  | 255 | 51.2k |     } | 
Unexecuted instantiation: txdb.cpp:_ZNK10CDBWrapper6ExistsIN12_GLOBAL__N_19CoinEntryEEEbRKT_ | 
| 256 |  |  | 
| 257 |  |     template <typename K> | 
| 258 |  |     bool Erase(const K& key, bool fSync = false) | 
| 259 | 0 |     { | 
| 260 | 0 |         CDBBatch batch(*this); | 
| 261 | 0 |         batch.Erase(key); | 
| 262 | 0 |         return WriteBatch(batch, fSync); | 
| 263 | 0 |     } | 
| 264 |  |  | 
| 265 |  |     bool WriteBatch(CDBBatch& batch, bool fSync = false); | 
| 266 |  |  | 
| 267 |  |     // Get an estimate of LevelDB memory usage (in bytes). | 
| 268 |  |     size_t DynamicMemoryUsage() const; | 
| 269 |  |  | 
| 270 |  |     CDBIterator* NewIterator(); | 
| 271 |  |  | 
| 272 |  |     /** | 
| 273 |  |      * Return true if the database managed by this class contains no entries. | 
| 274 |  |      */ | 
| 275 |  |     bool IsEmpty(); | 
| 276 |  |  | 
| 277 |  |     template<typename K> | 
| 278 |  |     size_t EstimateSize(const K& key_begin, const K& key_end) const | 
| 279 | 0 |     { | 
| 280 | 0 |         DataStream ssKey1{}, ssKey2{}; | 
| 281 | 0 |         ssKey1.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); | 
| 282 | 0 |         ssKey2.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); | 
| 283 | 0 |         ssKey1 << key_begin; | 
| 284 | 0 |         ssKey2 << key_end; | 
| 285 | 0 |         return EstimateSizeImpl(ssKey1, ssKey2); | 
| 286 | 0 |     } | 
| 287 |  | }; | 
| 288 |  |  | 
| 289 |  | #endif // BITCOIN_DBWRAPPER_H |