Bitcoin Core 28.99.0
P2P Digital Currency
db.h
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-2021 The Bitcoin Core developers
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#ifndef BITCOIN_WALLET_DB_H
7#define BITCOIN_WALLET_DB_H
8
9#include <clientversion.h>
10#include <streams.h>
12#include <util/fs.h>
13
14#include <atomic>
15#include <memory>
16#include <optional>
17#include <string>
18
19class ArgsManager;
20struct bilingual_str;
21
22namespace wallet {
23// BytePrefix compares equality with other byte spans that begin with the same prefix.
24struct BytePrefix {
26};
29
31{
32public:
33 explicit DatabaseCursor() = default;
34 virtual ~DatabaseCursor() = default;
35
38
39 enum class Status
40 {
41 FAIL,
42 MORE,
43 DONE,
44 };
45
46 virtual Status Next(DataStream& key, DataStream& value) { return Status::FAIL; }
47};
48
51{
52private:
53 virtual bool ReadKey(DataStream&& key, DataStream& value) = 0;
54 virtual bool WriteKey(DataStream&& key, DataStream&& value, bool overwrite = true) = 0;
55 virtual bool EraseKey(DataStream&& key) = 0;
56 virtual bool HasKey(DataStream&& key) = 0;
57
58public:
59 explicit DatabaseBatch() = default;
60 virtual ~DatabaseBatch() = default;
61
62 DatabaseBatch(const DatabaseBatch&) = delete;
64
65 virtual void Flush() = 0;
66 virtual void Close() = 0;
67
68 template <typename K, typename T>
69 bool Read(const K& key, T& value)
70 {
71 DataStream ssKey{};
72 ssKey.reserve(1000);
73 ssKey << key;
74
75 DataStream ssValue{};
76 if (!ReadKey(std::move(ssKey), ssValue)) return false;
77 try {
78 ssValue >> value;
79 return true;
80 } catch (const std::exception&) {
81 return false;
82 }
83 }
84
85 template <typename K, typename T>
86 bool Write(const K& key, const T& value, bool fOverwrite = true)
87 {
88 DataStream ssKey{};
89 ssKey.reserve(1000);
90 ssKey << key;
91
92 DataStream ssValue{};
93 ssValue.reserve(10000);
94 ssValue << value;
95
96 return WriteKey(std::move(ssKey), std::move(ssValue), fOverwrite);
97 }
98
99 template <typename K>
100 bool Erase(const K& key)
101 {
102 DataStream ssKey{};
103 ssKey.reserve(1000);
104 ssKey << key;
105
106 return EraseKey(std::move(ssKey));
107 }
108
109 template <typename K>
110 bool Exists(const K& key)
111 {
112 DataStream ssKey{};
113 ssKey.reserve(1000);
114 ssKey << key;
115
116 return HasKey(std::move(ssKey));
117 }
119
120 virtual std::unique_ptr<DatabaseCursor> GetNewCursor() = 0;
121 virtual std::unique_ptr<DatabaseCursor> GetNewPrefixCursor(Span<const std::byte> prefix) = 0;
122 virtual bool TxnBegin() = 0;
123 virtual bool TxnCommit() = 0;
124 virtual bool TxnAbort() = 0;
125 virtual bool HasActiveTxn() = 0;
126};
127
131{
132public:
135 virtual ~WalletDatabase() = default;
136
138 virtual void Open() = 0;
139
141 std::atomic<int> m_refcount{0};
143 virtual void AddRef() = 0;
145 virtual void RemoveRef() = 0;
146
149 virtual bool Rewrite(const char* pszSkip=nullptr) = 0;
150
153 virtual bool Backup(const std::string& strDest) const = 0;
154
157 virtual void Flush() = 0;
161 virtual void Close() = 0;
162 /* flush the wallet passively (TRY_LOCK)
163 ideal to be called periodically */
164 virtual bool PeriodicFlush() = 0;
165
166 virtual void IncrementUpdateCounter() = 0;
167
168 virtual void ReloadDbEnv() = 0;
169
171 virtual std::string Filename() = 0;
172
173 virtual std::string Format() = 0;
174
175 std::atomic<unsigned int> nUpdateCounter;
176 unsigned int nLastSeen{0};
177 unsigned int nLastFlushed{0};
179
181 virtual std::unique_ptr<DatabaseBatch> MakeBatch(bool flush_on_close = true) = 0;
182};
183
184enum class DatabaseFormat {
185 BERKELEY,
186 SQLITE,
189};
190
192 bool require_existing = false;
193 bool require_create = false;
194 std::optional<DatabaseFormat> require_format;
195 uint64_t create_flags = 0;
197
198 // Specialized options. Not every option is supported by every backend.
199 bool verify = true;
200 bool use_unsafe_sync = false;
201 bool use_shared_memory = false;
202 int64_t max_log_mb = 100;
203};
204
205enum class DatabaseStatus {
206 SUCCESS,
217};
218
220std::vector<std::pair<fs::path, std::string>> ListDatabases(const fs::path& path);
221
222void ReadDatabaseArgs(const ArgsManager& args, DatabaseOptions& options);
223std::unique_ptr<WalletDatabase> MakeDatabase(const fs::path& path, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error);
224
225fs::path BDBDataFile(const fs::path& path);
226fs::path SQLiteDataFile(const fs::path& path);
227bool IsBDBFile(const fs::path& path);
228bool IsSQLiteFile(const fs::path& path);
229} // namespace wallet
230
231#endif // BITCOIN_WALLET_DB_H
ArgsManager & args
Definition: bitcoind.cpp:277
Double ended buffer combining vector and stream-like interfaces.
Definition: streams.h:147
void reserve(size_type n)
Definition: streams.h:184
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:33
RAII class that provides access to a WalletDatabase.
Definition: db.h:51
bool Erase(const K &key)
Definition: db.h:100
bool Write(const K &key, const T &value, bool fOverwrite=true)
Definition: db.h:86
virtual bool TxnAbort()=0
DatabaseBatch(const DatabaseBatch &)=delete
virtual void Flush()=0
virtual ~DatabaseBatch()=default
virtual void Close()=0
bool Read(const K &key, T &value)
Definition: db.h:69
virtual bool EraseKey(DataStream &&key)=0
virtual bool WriteKey(DataStream &&key, DataStream &&value, bool overwrite=true)=0
virtual bool TxnBegin()=0
DatabaseBatch & operator=(const DatabaseBatch &)=delete
virtual bool ReadKey(DataStream &&key, DataStream &value)=0
virtual std::unique_ptr< DatabaseCursor > GetNewPrefixCursor(Span< const std::byte > prefix)=0
bool Exists(const K &key)
Definition: db.h:110
virtual bool ErasePrefix(Span< const std::byte > prefix)=0
virtual std::unique_ptr< DatabaseCursor > GetNewCursor()=0
virtual bool HasKey(DataStream &&key)=0
virtual bool HasActiveTxn()=0
virtual bool TxnCommit()=0
DatabaseCursor & operator=(const DatabaseCursor &)=delete
virtual ~DatabaseCursor()=default
DatabaseCursor(const DatabaseCursor &)=delete
virtual Status Next(DataStream &key, DataStream &value)
Definition: db.h:46
An instance of this class represents one database.
Definition: db.h:131
virtual bool PeriodicFlush()=0
virtual void AddRef()=0
Indicate the a new database user has began using the database.
virtual std::string Format()=0
virtual ~WalletDatabase()=default
virtual std::unique_ptr< DatabaseBatch > MakeBatch(bool flush_on_close=true)=0
Make a DatabaseBatch connected to this database.
virtual void IncrementUpdateCounter()=0
virtual void Open()=0
Open the database if it is not already opened.
int64_t nLastWalletUpdate
Definition: db.h:178
virtual bool Rewrite(const char *pszSkip=nullptr)=0
Rewrite the entire database on disk, with the exception of key pszSkip if non-zero.
virtual void ReloadDbEnv()=0
virtual void Close()=0
Flush to the database file and close the database.
virtual bool Backup(const std::string &strDest) const =0
Back up the entire database to a file.
std::atomic< unsigned int > nUpdateCounter
Definition: db.h:175
std::atomic< int > m_refcount
Counts the number of active database users to be sure that the database is not closed while someone i...
Definition: db.h:141
virtual void RemoveRef()=0
Indicate that database user has stopped using the database and that it could be flushed or closed.
unsigned int nLastFlushed
Definition: db.h:177
WalletDatabase()
Create dummy DB handle.
Definition: db.h:134
virtual std::string Filename()=0
Return path to main database file for logs and error messages.
unsigned int nLastSeen
Definition: db.h:176
virtual void Flush()=0
Make sure all changes are flushed to database file.
@ FAIL
Just act as if the signature was invalid.
void ReadDatabaseArgs(const ArgsManager &args, DatabaseOptions &options)
Definition: db.cpp:154
std::unique_ptr< WalletDatabase > MakeDatabase(const fs::path &path, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error)
Definition: walletdb.cpp:1380
fs::path SQLiteDataFile(const fs::path &path)
Definition: db.cpp:90
DatabaseFormat
Definition: db.h:184
bool IsBDBFile(const fs::path &path)
Definition: db.cpp:95
fs::path BDBDataFile(const fs::path &wallet_path)
Definition: db.cpp:76
bool operator<(BytePrefix a, Span< const std::byte > b)
Definition: db.cpp:20
bool IsSQLiteFile(const fs::path &path)
Definition: db.cpp:120
std::vector< std::pair< fs::path, std::string > > ListDatabases(const fs::path &wallet_dir)
Recursively list database paths in directory.
Definition: db.cpp:23
DatabaseStatus
Definition: db.h:205
const char * prefix
Definition: rest.cpp:1009
std::basic_string< char, std::char_traits< char >, secure_allocator< char > > SecureString
Definition: secure.h:58
Bilingual messages:
Definition: translation.h:21
Span< const std::byte > prefix
Definition: db.h:25
bool require_existing
Definition: db.h:192
bool verify
Check data integrity on load.
Definition: db.h:199
bool use_shared_memory
Let other processes access the database.
Definition: db.h:201
SecureString create_passphrase
Definition: db.h:196
std::optional< DatabaseFormat > require_format
Definition: db.h:194
bool use_unsafe_sync
Disable file sync for faster performance.
Definition: db.h:200
int64_t max_log_mb
Max log size to allow before consolidating.
Definition: db.h:202
uint64_t create_flags
Definition: db.h:195