Bitcoin Core  31.0.0
P2P Digital Currency
migrate.h
Go to the documentation of this file.
1 // Copyright (c) 2021-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_WALLET_MIGRATE_H
6 #define BITCOIN_WALLET_MIGRATE_H
7 
8 #include <wallet/db.h>
9 
10 #include <optional>
11 
12 namespace wallet {
13 
14 using BerkeleyROData = std::map<SerializeData, SerializeData, std::less<>>;
15 
21 {
22 private:
24 
25 public:
27  BerkeleyRODatabase(const fs::path& filepath, bool open = true) : WalletDatabase(), m_filepath(filepath)
28  {
29  if (open) Open();
30  }
31  ~BerkeleyRODatabase() = default;
32 
34 
36  void Open() override;
37 
40  bool Rewrite() override { return false; }
41 
44  bool Backup(const std::string& strDest) const override;
45 
49  void Close() override {}
50 
52  std::string Filename() override { return fs::PathToString(m_filepath); }
53  std::vector<fs::path> Files() override { return {m_filepath}; }
54 
55  std::string Format() override { return "bdb_ro"; }
56 
58  std::unique_ptr<DatabaseBatch> MakeBatch() override;
59 };
60 
62 {
63 private:
65  BerkeleyROData::const_iterator m_cursor;
66  BerkeleyROData::const_iterator m_cursor_end;
67 
68 public:
69  explicit BerkeleyROCursor(const BerkeleyRODatabase& database, std::span<const std::byte> prefix = {});
70  ~BerkeleyROCursor() = default;
71 
72  Status Next(DataStream& key, DataStream& value) override;
73 };
74 
77 {
78 private:
80 
81  bool ReadKey(DataStream&& key, DataStream& value) override;
82  // WriteKey returns true since various automatic upgrades for older wallets will expect writing to not fail.
83  // It is okay for this batch type to not actually write anything as those automatic upgrades will occur again after migration.
84  bool WriteKey(DataStream&& key, DataStream&& value, bool overwrite = true) override { return true; }
85  bool EraseKey(DataStream&& key) override { return false; }
86  bool HasKey(DataStream&& key) override;
87  bool ErasePrefix(std::span<const std::byte> prefix) override { return false; }
88 
89 public:
90  explicit BerkeleyROBatch(const BerkeleyRODatabase& database) : m_database(database) {}
91  ~BerkeleyROBatch() = default;
92 
93  BerkeleyROBatch(const BerkeleyROBatch&) = delete;
94  BerkeleyROBatch& operator=(const BerkeleyROBatch&) = delete;
95 
96  void Close() override {}
97 
98  std::unique_ptr<DatabaseCursor> GetNewCursor() override { return std::make_unique<BerkeleyROCursor>(m_database); }
99  std::unique_ptr<DatabaseCursor> GetNewPrefixCursor(std::span<const std::byte> prefix) override;
100  bool TxnBegin() override { return false; }
101  bool TxnCommit() override { return false; }
102  bool TxnAbort() override { return false; }
103  bool HasActiveTxn() override { return false; }
104 };
105 
107 std::unique_ptr<BerkeleyRODatabase> MakeBerkeleyRODatabase(const fs::path& path, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error);
108 } // namespace wallet
109 
110 #endif // BITCOIN_WALLET_MIGRATE_H
std::unique_ptr< DatabaseBatch > MakeBatch() override
Make a DatabaseBatch connected to this database.
Definition: migrate.cpp:706
bool Backup(const std::string &strDest) const override
Back up the entire database to a file.
Definition: migrate.cpp:711
BerkeleyROData::const_iterator m_cursor_end
Definition: migrate.h:66
std::map< SerializeData, SerializeData, std::less<> > BerkeleyROData
Definition: migrate.h:14
BerkeleyROData::const_iterator m_cursor
Definition: migrate.h:65
std::unique_ptr< BerkeleyRODatabase > MakeBerkeleyRODatabase(const fs::path &path, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error)
Return object giving access to Berkeley Read Only database at specified path.
Definition: migrate.cpp:775
bool WriteKey(DataStream &&key, DataStream &&value, bool overwrite=true) override
Definition: migrate.h:84
Bilingual messages:
Definition: translation.h:24
bool TxnCommit() override
Definition: migrate.h:101
std::vector< fs::path > Files() override
Return paths to all database created files.
Definition: migrate.h:53
bool ErasePrefix(std::span< const std::byte > prefix) override
Definition: migrate.h:87
const char * prefix
Definition: rest.cpp:1141
void Open() override
Open the database if it is not already opened.
Definition: migrate.cpp:529
A class representing a BerkeleyDB file from which we can only read records.
Definition: migrate.h:20
BerkeleyROBatch & operator=(const BerkeleyROBatch &)=delete
RAII class that provides access to a WalletDatabase.
Definition: db.h:50
bool EraseKey(DataStream &&key) override
Definition: migrate.h:85
bool TxnBegin() override
Definition: migrate.h:100
void Close() override
Flush to the database file and close the database.
Definition: migrate.h:49
bool Rewrite() override
Rewrite the entire database on disk.
Definition: migrate.h:40
Double ended buffer combining vector and stream-like interfaces.
Definition: streams.h:132
Status Next(DataStream &key, DataStream &value) override
Definition: migrate.cpp:759
RAII class that provides access to a BerkeleyRODatabase.
Definition: migrate.h:76
bool HasKey(DataStream &&key) override
Definition: migrate.cpp:747
BerkeleyROData m_records
Definition: migrate.h:33
std::string Format() override
Definition: migrate.h:55
DatabaseStatus
Definition: db.h:186
std::unique_ptr< DatabaseCursor > GetNewPrefixCursor(std::span< const std::byte > prefix) override
Definition: migrate.cpp:770
bool ReadKey(DataStream &&key, DataStream &value) override
Definition: migrate.cpp:734
void Close() override
Definition: migrate.h:96
bool HasActiveTxn() override
Definition: migrate.h:103
std::unique_ptr< DatabaseCursor > GetNewCursor() override
Definition: migrate.h:98
static std::string PathToString(const path &path)
Convert path object to a byte string.
Definition: fs.h:157
BerkeleyROBatch(const BerkeleyRODatabase &database)
Definition: migrate.h:90
BerkeleyRODatabase(const fs::path &filepath, bool open=true)
Create DB handle.
Definition: migrate.h:27
bool TxnAbort() override
Definition: migrate.h:102
std::string Filename() override
Return path to main database file for logs and error messages.
Definition: migrate.h:52
const BerkeleyRODatabase & m_database
Definition: migrate.h:64
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:33
const fs::path m_filepath
Definition: migrate.h:23
const BerkeleyRODatabase & m_database
Definition: migrate.h:79
An instance of this class represents one database.
Definition: db.h:129
BerkeleyROCursor(const BerkeleyRODatabase &database, std::span< const std::byte > prefix={})
Definition: migrate.cpp:753