aboutsummaryrefslogtreecommitdiff
path: root/src/wallet
diff options
context:
space:
mode:
Diffstat (limited to 'src/wallet')
-rw-r--r--src/wallet/db.h1
-rw-r--r--src/wallet/migrate.cpp15
-rw-r--r--src/wallet/migrate.h3
-rw-r--r--src/wallet/walletdb.cpp10
4 files changed, 29 insertions, 0 deletions
diff --git a/src/wallet/db.h b/src/wallet/db.h
index 648adff5fe..5751bba2e9 100644
--- a/src/wallet/db.h
+++ b/src/wallet/db.h
@@ -183,6 +183,7 @@ public:
enum class DatabaseFormat {
BERKELEY,
SQLITE,
+ BERKELEY_RO,
};
struct DatabaseOptions {
diff --git a/src/wallet/migrate.cpp b/src/wallet/migrate.cpp
index 44e8b26be5..895cee9e14 100644
--- a/src/wallet/migrate.cpp
+++ b/src/wallet/migrate.cpp
@@ -5,6 +5,7 @@
#include <crypto/common.h> // For ReadBE32
#include <logging.h>
#include <streams.h>
+#include <util/translation.h>
#include <wallet/migrate.h>
#include <optional>
@@ -748,4 +749,18 @@ std::unique_ptr<DatabaseCursor> BerkeleyROBatch::GetNewPrefixCursor(Span<const s
{
return std::make_unique<BerkeleyROCursor>(m_database, prefix);
}
+
+std::unique_ptr<BerkeleyRODatabase> MakeBerkeleyRODatabase(const fs::path& path, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error)
+{
+ fs::path data_file = BDBDataFile(path);
+ try {
+ std::unique_ptr<BerkeleyRODatabase> db = std::make_unique<BerkeleyRODatabase>(data_file);
+ status = DatabaseStatus::SUCCESS;
+ return db;
+ } catch (const std::runtime_error& e) {
+ error.original = e.what();
+ status = DatabaseStatus::FAILED_LOAD;
+ return nullptr;
+ }
+}
} // namespace wallet
diff --git a/src/wallet/migrate.h b/src/wallet/migrate.h
index a3b0d78d02..e4826450af 100644
--- a/src/wallet/migrate.h
+++ b/src/wallet/migrate.h
@@ -116,6 +116,9 @@ public:
bool TxnCommit() override { return false; }
bool TxnAbort() override { return false; }
};
+
+//! Return object giving access to Berkeley Read Only database at specified path.
+std::unique_ptr<BerkeleyRODatabase> MakeBerkeleyRODatabase(const fs::path& path, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error);
} // namespace wallet
#endif // BITCOIN_WALLET_MIGRATE_H
diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp
index b1ce7ee4e7..ddd90939bf 100644
--- a/src/wallet/walletdb.cpp
+++ b/src/wallet/walletdb.cpp
@@ -23,6 +23,7 @@
#ifdef USE_BDB
#include <wallet/bdb.h>
#endif
+#include <wallet/migrate.h>
#ifdef USE_SQLITE
#include <wallet/sqlite.h>
#endif
@@ -1389,6 +1390,11 @@ std::unique_ptr<WalletDatabase> MakeDatabase(const fs::path& path, const Databas
return nullptr;
}
+ // If BERKELEY was the format, then change the format from BERKELEY to BERKELEY_RO
+ if (format && options.require_format && format == DatabaseFormat::BERKELEY && options.require_format == DatabaseFormat::BERKELEY_RO) {
+ format = DatabaseFormat::BERKELEY_RO;
+ }
+
// A db already exists so format is set, but options also specifies the format, so make sure they agree
if (format && options.require_format && format != options.require_format) {
error = Untranslated(strprintf("Failed to load database path '%s'. Data is not in required format.", fs::PathToString(path)));
@@ -1422,6 +1428,10 @@ std::unique_ptr<WalletDatabase> MakeDatabase(const fs::path& path, const Databas
}
}
+ if (format == DatabaseFormat::BERKELEY_RO) {
+ return MakeBerkeleyRODatabase(path, options, status, error);
+ }
+
#ifdef USE_BDB
if constexpr (true) {
return MakeBerkeleyDatabase(path, options, status, error);