mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-12 10:30:08 +01:00
Move RecoverKeysOnlyFilter into RecoverDataBaseFile
This commit is contained in:
parent
9ea2d258b4
commit
ea337f2d03
3 changed files with 21 additions and 36 deletions
|
@ -15,7 +15,7 @@ static const char *HEADER_END = "HEADER=END";
|
||||||
static const char *DATA_END = "DATA=END";
|
static const char *DATA_END = "DATA=END";
|
||||||
typedef std::pair<std::vector<unsigned char>, std::vector<unsigned char> > KeyValPair;
|
typedef std::pair<std::vector<unsigned char>, std::vector<unsigned char> > KeyValPair;
|
||||||
|
|
||||||
bool RecoverDatabaseFile(const fs::path& file_path, void *callbackDataIn, bool (*recoverKVcallback)(void* callbackData, CDataStream ssKey, CDataStream ssValue), std::string& newFilename)
|
bool RecoverDatabaseFile(const fs::path& file_path)
|
||||||
{
|
{
|
||||||
std::string filename;
|
std::string filename;
|
||||||
std::shared_ptr<BerkeleyEnvironment> env = GetWalletEnv(file_path, filename);
|
std::shared_ptr<BerkeleyEnvironment> env = GetWalletEnv(file_path, filename);
|
||||||
|
@ -28,7 +28,7 @@ bool RecoverDatabaseFile(const fs::path& file_path, void *callbackDataIn, bool (
|
||||||
// Set -rescan so any missing transactions will be
|
// Set -rescan so any missing transactions will be
|
||||||
// found.
|
// found.
|
||||||
int64_t now = GetTime();
|
int64_t now = GetTime();
|
||||||
newFilename = strprintf("%s.%d.bak", filename, now);
|
std::string newFilename = strprintf("%s.%d.bak", filename, now);
|
||||||
|
|
||||||
int result = env->dbenv->dbrename(nullptr, filename.c_str(), nullptr,
|
int result = env->dbenv->dbrename(nullptr, filename.c_str(), nullptr,
|
||||||
newFilename.c_str(), DB_AUTO_COMMIT);
|
newFilename.c_str(), DB_AUTO_COMMIT);
|
||||||
|
@ -116,13 +116,25 @@ bool RecoverDatabaseFile(const fs::path& file_path, void *callbackDataIn, bool (
|
||||||
}
|
}
|
||||||
|
|
||||||
DbTxn* ptxn = env->TxnBegin();
|
DbTxn* ptxn = env->TxnBegin();
|
||||||
|
CWallet dummyWallet(nullptr, WalletLocation(), WalletDatabase::CreateDummy());
|
||||||
for (KeyValPair& row : salvagedData)
|
for (KeyValPair& row : salvagedData)
|
||||||
{
|
{
|
||||||
if (recoverKVcallback)
|
/* Filter for only private key type KV pairs to be added to the salvaged wallet */
|
||||||
{
|
|
||||||
CDataStream ssKey(row.first, SER_DISK, CLIENT_VERSION);
|
CDataStream ssKey(row.first, SER_DISK, CLIENT_VERSION);
|
||||||
CDataStream ssValue(row.second, SER_DISK, CLIENT_VERSION);
|
CDataStream ssValue(row.second, SER_DISK, CLIENT_VERSION);
|
||||||
if (!(*recoverKVcallback)(callbackDataIn, ssKey, ssValue))
|
std::string strType, strErr;
|
||||||
|
bool fReadOK;
|
||||||
|
{
|
||||||
|
// Required in LoadKeyMetadata():
|
||||||
|
LOCK(dummyWallet.cs_wallet);
|
||||||
|
fReadOK = ReadKeyValue(&dummyWallet, ssKey, ssValue, strType, strErr);
|
||||||
|
}
|
||||||
|
if (!WalletBatch::IsKeyType(strType) && strType != DBKeys::HDCHAIN) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!fReadOK)
|
||||||
|
{
|
||||||
|
LogPrintf("WARNING: WalletBatch::Recover skipping %s: %s\n", strType, strErr);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Dbt datKey(&row.first[0], row.first.size());
|
Dbt datKey(&row.first[0], row.first.size());
|
||||||
|
@ -136,25 +148,3 @@ bool RecoverDatabaseFile(const fs::path& file_path, void *callbackDataIn, bool (
|
||||||
|
|
||||||
return fSuccess;
|
return fSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RecoverKeysOnlyFilter(void *callbackData, CDataStream ssKey, CDataStream ssValue)
|
|
||||||
{
|
|
||||||
CWallet *dummyWallet = reinterpret_cast<CWallet*>(callbackData);
|
|
||||||
std::string strType, strErr;
|
|
||||||
bool fReadOK;
|
|
||||||
{
|
|
||||||
// Required in LoadKeyMetadata():
|
|
||||||
LOCK(dummyWallet->cs_wallet);
|
|
||||||
fReadOK = ReadKeyValue(dummyWallet, ssKey, ssValue, strType, strErr);
|
|
||||||
}
|
|
||||||
if (!WalletBatch::IsKeyType(strType) && strType != DBKeys::HDCHAIN) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!fReadOK)
|
|
||||||
{
|
|
||||||
LogPrintf("WARNING: WalletBatch::Recover skipping %s: %s\n", strType, strErr);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
|
@ -9,9 +9,6 @@
|
||||||
#include <fs.h>
|
#include <fs.h>
|
||||||
#include <streams.h>
|
#include <streams.h>
|
||||||
|
|
||||||
bool RecoverDatabaseFile(const fs::path& file_path, void *callbackDataIn, bool (*recoverKVcallback)(void* callbackData, CDataStream ssKey, CDataStream ssValue), std::string& out_backup_filename);
|
bool RecoverDatabaseFile(const fs::path& file_path);
|
||||||
|
|
||||||
/* Recover filter (used as callback), will only let keys (cryptographical keys) as KV/key-type pass through */
|
|
||||||
bool RecoverKeysOnlyFilter(void *callbackData, CDataStream ssKey, CDataStream ssValue);
|
|
||||||
|
|
||||||
#endif // BITCOIN_WALLET_SALVAGE_H
|
#endif // BITCOIN_WALLET_SALVAGE_H
|
||||||
|
|
|
@ -122,9 +122,7 @@ static bool SalvageWallet(const fs::path& path)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perform the recovery
|
// Perform the recovery
|
||||||
CWallet dummy_wallet(nullptr, WalletLocation(), WalletDatabase::CreateDummy());
|
return RecoverDatabaseFile(path);
|
||||||
std::string backup_filename;
|
|
||||||
return RecoverDatabaseFile(path, (void*)&dummy_wallet, RecoverKeysOnlyFilter, backup_filename);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ExecuteWalletToolFunc(const std::string& command, const std::string& name)
|
bool ExecuteWalletToolFunc(const std::string& command, const std::string& name)
|
||||||
|
|
Loading…
Add table
Reference in a new issue