bdb: Be able to make byteswapped databases
Byteswapped databases make it easier to test opening and deserializing other endian databases.
This commit is contained in:
1 parent
d9878903fb
commit
6ace3e953f
4 files changed
+21
-1
No files matched your search
+15
-1
@@ -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.
|
std::map<std::string, std::weak_ptr<BerkeleyEnvironment>> g_dbenvs GUARDED_BY(cs_db); //!< Map from directory name to db environment.
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
static constexpr auto REVERSE_BYTE_ORDER{std::endian::native == std::endian::little ? 4321 : 1234};
|
||||||
|
|
||||||
bool WalletDatabaseFileId::operator==(const WalletDatabaseFileId& rhs) const
|
bool WalletDatabaseFileId::operator==(const WalletDatabaseFileId& rhs) const
|
||||||
{
|
{
|
||||||
return memcmp(value, &rhs.value, sizeof(value)) == 0;
|
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) :
|
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));
|
auto inserted = this->env->m_databases.emplace(m_filename, std::ref(*this));
|
||||||
assert(inserted.second);
|
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
|
ret = pdb_temp->open(nullptr, // Txn pointer
|
||||||
fMockDb ? nullptr : strFile.c_str(), // Filename
|
fMockDb ? nullptr : strFile.c_str(), // Filename
|
||||||
fMockDb ? strFile.c_str() : "main", // Logical db name
|
fMockDb ? strFile.c_str() : "main", // Logical db name
|
||||||
@@ -521,6 +531,10 @@ bool BerkeleyDatabase::Rewrite(const char* pszSkip)
|
|||||||
BerkeleyBatch db(*this, true);
|
BerkeleyBatch db(*this, true);
|
||||||
std::unique_ptr<Db> pdbCopy = std::make_unique<Db>(env->dbenv.get(), 0);
|
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
|
int ret = pdbCopy->open(nullptr, // Txn pointer
|
||||||
strFileRes.c_str(), // Filename
|
strFileRes.c_str(), // Filename
|
||||||
"main", // Logical db name
|
"main", // Logical db name
|
||||||
|
|||||||
@@ -147,6 +147,9 @@ public:
|
|||||||
/** Database pointer. This is initialized lazily and reset during flushes, so it can be null. */
|
/** Database pointer. This is initialized lazily and reset during flushes, so it can be null. */
|
||||||
std::unique_ptr<Db> m_db;
|
std::unique_ptr<Db> m_db;
|
||||||
|
|
||||||
|
// Whether to byteswap
|
||||||
|
bool m_byteswap;
|
||||||
|
|
||||||
fs::path m_filename;
|
fs::path m_filename;
|
||||||
int64_t m_max_log_mb;
|
int64_t m_max_log_mb;
|
||||||
|
|
||||||
|
|||||||
@@ -184,6 +184,7 @@ enum class DatabaseFormat {
|
|||||||
BERKELEY,
|
BERKELEY,
|
||||||
SQLITE,
|
SQLITE,
|
||||||
BERKELEY_RO,
|
BERKELEY_RO,
|
||||||
|
BERKELEY_SWAP,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DatabaseOptions {
|
struct DatabaseOptions {
|
||||||
|
|||||||
@@ -186,6 +186,8 @@ bool CreateFromDump(const ArgsManager& args, const std::string& name, const fs::
|
|||||||
data_format = DatabaseFormat::BERKELEY;
|
data_format = DatabaseFormat::BERKELEY;
|
||||||
} else if (file_format == "sqlite") {
|
} else if (file_format == "sqlite") {
|
||||||
data_format = DatabaseFormat::SQLITE;
|
data_format = DatabaseFormat::SQLITE;
|
||||||
|
} else if (file_format == "bdb_swap") {
|
||||||
|
data_format = DatabaseFormat::BERKELEY_SWAP;
|
||||||
} else {
|
} else {
|
||||||
error = strprintf(_("Unknown wallet file format \"%s\" provided. Please provide one of \"bdb\" or \"sqlite\"."), file_format);
|
error = strprintf(_("Unknown wallet file format \"%s\" provided. Please provide one of \"bdb\" or \"sqlite\"."), file_format);
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in new issue
Block a user