aboutsummaryrefslogtreecommitdiff
path: root/src/wallet/bdb.cpp
diff options
context:
space:
mode:
authorAva Chow <github@achow101.com>2024-04-22 15:21:58 -0400
committerAva Chow <github@achow101.com>2024-05-16 15:03:13 -0400
commit6ace3e953f0864bd7818f040c59a1bc70aa47512 (patch)
tree0e7a61a16252335339f8c1045942f4b7b69bb4db /src/wallet/bdb.cpp
parentd9878903fb34939dee8e1462f079acc68110253d (diff)
downloadbitcoin-6ace3e953f0864bd7818f040c59a1bc70aa47512.tar.xz
bdb: Be able to make byteswapped databases
Byteswapped databases make it easier to test opening and deserializing other endian databases.
Diffstat (limited to 'src/wallet/bdb.cpp')
-rw-r--r--src/wallet/bdb.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/wallet/bdb.cpp b/src/wallet/bdb.cpp
index 38cca32f80..d82d8d4513 100644
--- a/src/wallet/bdb.cpp
+++ b/src/wallet/bdb.cpp
@@ -65,6 +65,8 @@ RecursiveMutex cs_db;
std::map<std::string, std::weak_ptr<BerkeleyEnvironment>> g_dbenvs GUARDED_BY(cs_db); //!< Map from directory name to db environment.
} // namespace
+static constexpr auto REVERSE_BYTE_ORDER{std::endian::native == std::endian::little ? 4321 : 1234};
+
bool WalletDatabaseFileId::operator==(const WalletDatabaseFileId& rhs) const
{
return memcmp(value, &rhs.value, sizeof(value)) == 0;
@@ -300,7 +302,11 @@ static Span<const std::byte> SpanFromDbt(const SafeDbt& dbt)
}
BerkeleyDatabase::BerkeleyDatabase(std::shared_ptr<BerkeleyEnvironment> env, fs::path filename, const DatabaseOptions& options) :
- WalletDatabase(), env(std::move(env)), m_filename(std::move(filename)), m_max_log_mb(options.max_log_mb)
+ WalletDatabase(),
+ env(std::move(env)),
+ m_byteswap(options.require_format == DatabaseFormat::BERKELEY_SWAP),
+ m_filename(std::move(filename)),
+ m_max_log_mb(options.max_log_mb)
{
auto inserted = this->env->m_databases.emplace(m_filename, std::ref(*this));
assert(inserted.second);
@@ -389,6 +395,10 @@ void BerkeleyDatabase::Open()
}
}
+ if (m_byteswap) {
+ pdb_temp->set_lorder(REVERSE_BYTE_ORDER);
+ }
+
ret = pdb_temp->open(nullptr, // Txn pointer
fMockDb ? nullptr : strFile.c_str(), // Filename
fMockDb ? strFile.c_str() : "main", // Logical db name
@@ -521,6 +531,10 @@ bool BerkeleyDatabase::Rewrite(const char* pszSkip)
BerkeleyBatch db(*this, true);
std::unique_ptr<Db> pdbCopy = std::make_unique<Db>(env->dbenv.get(), 0);
+ if (m_byteswap) {
+ pdbCopy->set_lorder(REVERSE_BYTE_ORDER);
+ }
+
int ret = pdbCopy->open(nullptr, // Txn pointer
strFileRes.c_str(), // Filename
"main", // Logical db name