mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-12 04:42:36 -03:00
walletdb: refactor Read, Write, Erase, and Exists into non-template func
In order to override these later, the specific details of how the Read, Write, Erase, and Exists functions interact with the actual database file need to go into functions that are not templated.
This commit is contained in:
parent
39bd9ddb87
commit
a389ed52e8
2 changed files with 77 additions and 33 deletions
|
@ -803,3 +803,67 @@ std::string BerkeleyDatabaseVersion()
|
||||||
{
|
{
|
||||||
return DbEnv::version(nullptr, nullptr, nullptr);
|
return DbEnv::version(nullptr, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BerkeleyBatch::ReadKey(CDataStream& key, CDataStream& value)
|
||||||
|
{
|
||||||
|
if (!pdb)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Key
|
||||||
|
SafeDbt datKey(key.data(), key.size());
|
||||||
|
|
||||||
|
// Read
|
||||||
|
SafeDbt datValue;
|
||||||
|
int ret = pdb->get(activeTxn, datKey, datValue, 0);
|
||||||
|
if (ret == 0 && datValue.get_data() != nullptr) {
|
||||||
|
value.write((char*)datValue.get_data(), datValue.get_size());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BerkeleyBatch::WriteKey(CDataStream& key, CDataStream& value, bool overwrite)
|
||||||
|
{
|
||||||
|
if (!pdb)
|
||||||
|
return true;
|
||||||
|
if (fReadOnly)
|
||||||
|
assert(!"Write called on database in read-only mode");
|
||||||
|
|
||||||
|
// Key
|
||||||
|
SafeDbt datKey(key.data(), key.size());
|
||||||
|
|
||||||
|
// Value
|
||||||
|
SafeDbt datValue(value.data(), value.size());
|
||||||
|
|
||||||
|
// Write
|
||||||
|
int ret = pdb->put(activeTxn, datKey, datValue, (overwrite ? 0 : DB_NOOVERWRITE));
|
||||||
|
return (ret == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BerkeleyBatch::EraseKey(CDataStream& key)
|
||||||
|
{
|
||||||
|
if (!pdb)
|
||||||
|
return false;
|
||||||
|
if (fReadOnly)
|
||||||
|
assert(!"Erase called on database in read-only mode");
|
||||||
|
|
||||||
|
// Key
|
||||||
|
SafeDbt datKey(key.data(), key.size());
|
||||||
|
|
||||||
|
// Erase
|
||||||
|
int ret = pdb->del(activeTxn, datKey, 0);
|
||||||
|
return (ret == 0 || ret == DB_NOTFOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BerkeleyBatch::HasKey(CDataStream& key)
|
||||||
|
{
|
||||||
|
if (!pdb)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Key
|
||||||
|
SafeDbt datKey(key.data(), key.size());
|
||||||
|
|
||||||
|
// Exists
|
||||||
|
int ret = pdb->exists(activeTxn, datKey, 0);
|
||||||
|
return ret == 0;
|
||||||
|
}
|
||||||
|
|
|
@ -207,6 +207,12 @@ class BerkeleyBatch
|
||||||
operator Dbt*();
|
operator Dbt*();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool ReadKey(CDataStream& key, CDataStream& value);
|
||||||
|
bool WriteKey(CDataStream& key, CDataStream& value, bool overwrite=true);
|
||||||
|
bool EraseKey(CDataStream& key);
|
||||||
|
bool HasKey(CDataStream& key);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Db* pdb;
|
Db* pdb;
|
||||||
std::string strFile;
|
std::string strFile;
|
||||||
|
@ -236,91 +242,65 @@ public:
|
||||||
template <typename K, typename T>
|
template <typename K, typename T>
|
||||||
bool Read(const K& key, T& value)
|
bool Read(const K& key, T& value)
|
||||||
{
|
{
|
||||||
if (!pdb)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Key
|
// Key
|
||||||
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
|
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
|
||||||
ssKey.reserve(1000);
|
ssKey.reserve(1000);
|
||||||
ssKey << key;
|
ssKey << key;
|
||||||
SafeDbt datKey(ssKey.data(), ssKey.size());
|
|
||||||
|
|
||||||
// Read
|
CDataStream ssValue(SER_DISK, CLIENT_VERSION);
|
||||||
SafeDbt datValue;
|
|
||||||
int ret = pdb->get(activeTxn, datKey, datValue, 0);
|
|
||||||
bool success = false;
|
bool success = false;
|
||||||
if (datValue.get_data() != nullptr) {
|
bool ret = ReadKey(ssKey, ssValue);
|
||||||
|
if (ret) {
|
||||||
// Unserialize value
|
// Unserialize value
|
||||||
try {
|
try {
|
||||||
CDataStream ssValue((char*)datValue.get_data(), (char*)datValue.get_data() + datValue.get_size(), SER_DISK, CLIENT_VERSION);
|
|
||||||
ssValue >> value;
|
ssValue >> value;
|
||||||
success = true;
|
success = true;
|
||||||
} catch (const std::exception&) {
|
} catch (const std::exception&) {
|
||||||
// In this case success remains 'false'
|
// In this case success remains 'false'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret == 0 && success;
|
return ret && success;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename K, typename T>
|
template <typename K, typename T>
|
||||||
bool Write(const K& key, const T& value, bool fOverwrite = true)
|
bool Write(const K& key, const T& value, bool fOverwrite = true)
|
||||||
{
|
{
|
||||||
if (!pdb)
|
|
||||||
return true;
|
|
||||||
if (fReadOnly)
|
|
||||||
assert(!"Write called on database in read-only mode");
|
|
||||||
|
|
||||||
// Key
|
// Key
|
||||||
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
|
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
|
||||||
ssKey.reserve(1000);
|
ssKey.reserve(1000);
|
||||||
ssKey << key;
|
ssKey << key;
|
||||||
SafeDbt datKey(ssKey.data(), ssKey.size());
|
|
||||||
|
|
||||||
// Value
|
// Value
|
||||||
CDataStream ssValue(SER_DISK, CLIENT_VERSION);
|
CDataStream ssValue(SER_DISK, CLIENT_VERSION);
|
||||||
ssValue.reserve(10000);
|
ssValue.reserve(10000);
|
||||||
ssValue << value;
|
ssValue << value;
|
||||||
SafeDbt datValue(ssValue.data(), ssValue.size());
|
|
||||||
|
|
||||||
// Write
|
// Write
|
||||||
int ret = pdb->put(activeTxn, datKey, datValue, (fOverwrite ? 0 : DB_NOOVERWRITE));
|
return WriteKey(ssKey, ssValue, fOverwrite);
|
||||||
return (ret == 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename K>
|
template <typename K>
|
||||||
bool Erase(const K& key)
|
bool Erase(const K& key)
|
||||||
{
|
{
|
||||||
if (!pdb)
|
|
||||||
return false;
|
|
||||||
if (fReadOnly)
|
|
||||||
assert(!"Erase called on database in read-only mode");
|
|
||||||
|
|
||||||
// Key
|
// Key
|
||||||
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
|
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
|
||||||
ssKey.reserve(1000);
|
ssKey.reserve(1000);
|
||||||
ssKey << key;
|
ssKey << key;
|
||||||
SafeDbt datKey(ssKey.data(), ssKey.size());
|
|
||||||
|
|
||||||
// Erase
|
// Erase
|
||||||
int ret = pdb->del(activeTxn, datKey, 0);
|
return EraseKey(ssKey);
|
||||||
return (ret == 0 || ret == DB_NOTFOUND);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename K>
|
template <typename K>
|
||||||
bool Exists(const K& key)
|
bool Exists(const K& key)
|
||||||
{
|
{
|
||||||
if (!pdb)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Key
|
// Key
|
||||||
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
|
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
|
||||||
ssKey.reserve(1000);
|
ssKey.reserve(1000);
|
||||||
ssKey << key;
|
ssKey << key;
|
||||||
SafeDbt datKey(ssKey.data(), ssKey.size());
|
|
||||||
|
|
||||||
// Exists
|
// Exists
|
||||||
int ret = pdb->exists(activeTxn, datKey, 0);
|
return HasKey(ssKey);
|
||||||
return (ret == 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Dbc* GetCursor();
|
Dbc* GetCursor();
|
||||||
|
|
Loading…
Reference in a new issue