Merge #5758: refactor: move BDB (bitdb / db.h) interaction from init.cpp to wallet.cpp
2bb1c87
refactor: move bdb (bitdb) interaction from init.cpp to wallet.cpp (Jonas Schnelli)
This commit is contained in:
commit
f3948a30cd
51
src/init.cpp
51
src/init.cpp
|
@ -24,7 +24,6 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "utilmoneystr.h"
|
#include "utilmoneystr.h"
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
#include "wallet/db.h"
|
|
||||||
#include "wallet/wallet.h"
|
#include "wallet/wallet.h"
|
||||||
#include "wallet/walletdb.h"
|
#include "wallet/walletdb.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -151,7 +150,7 @@ void Shutdown()
|
||||||
StopRPCThreads();
|
StopRPCThreads();
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
if (pwalletMain)
|
if (pwalletMain)
|
||||||
bitdb.Flush(false);
|
pwalletMain->Flush(false);
|
||||||
GenerateBitcoins(false, NULL, 0);
|
GenerateBitcoins(false, NULL, 0);
|
||||||
#endif
|
#endif
|
||||||
StopNode();
|
StopNode();
|
||||||
|
@ -184,7 +183,7 @@ void Shutdown()
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
if (pwalletMain)
|
if (pwalletMain)
|
||||||
bitdb.Flush(true);
|
pwalletMain->Flush(true);
|
||||||
#endif
|
#endif
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
boost::filesystem::remove(GetPidFile());
|
boost::filesystem::remove(GetPidFile());
|
||||||
|
@ -852,47 +851,17 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
LogPrintf("Using wallet %s\n", strWalletFile);
|
LogPrintf("Using wallet %s\n", strWalletFile);
|
||||||
uiInterface.InitMessage(_("Verifying wallet..."));
|
uiInterface.InitMessage(_("Verifying wallet..."));
|
||||||
|
|
||||||
if (!bitdb.Open(GetDataDir()))
|
std::string warningString;
|
||||||
{
|
std::string errorString;
|
||||||
// try moving the database env out of the way
|
|
||||||
boost::filesystem::path pathDatabase = GetDataDir() / "database";
|
|
||||||
boost::filesystem::path pathDatabaseBak = GetDataDir() / strprintf("database.%d.bak", GetTime());
|
|
||||||
try {
|
|
||||||
boost::filesystem::rename(pathDatabase, pathDatabaseBak);
|
|
||||||
LogPrintf("Moved old %s to %s. Retrying.\n", pathDatabase.string(), pathDatabaseBak.string());
|
|
||||||
} catch (const boost::filesystem::filesystem_error&) {
|
|
||||||
// failure is ok (well, not really, but it's not worse than what we started with)
|
|
||||||
}
|
|
||||||
|
|
||||||
// try again
|
if (!CWallet::Verify(strWalletFile, warningString, errorString))
|
||||||
if (!bitdb.Open(GetDataDir())) {
|
|
||||||
// if it still fails, it probably means we can't even create the database env
|
|
||||||
string msg = strprintf(_("Error initializing wallet database environment %s!"), strDataDir);
|
|
||||||
return InitError(msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetBoolArg("-salvagewallet", false))
|
|
||||||
{
|
|
||||||
// Recover readable keypairs:
|
|
||||||
if (!CWalletDB::Recover(bitdb, strWalletFile, true))
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
if (boost::filesystem::exists(GetDataDir() / strWalletFile))
|
if (!warningString.empty())
|
||||||
{
|
InitWarning(warningString);
|
||||||
CDBEnv::VerifyResult r = bitdb.Verify(strWalletFile, CWalletDB::Recover);
|
if (!errorString.empty())
|
||||||
if (r == CDBEnv::RECOVER_OK)
|
return InitError(warningString);
|
||||||
{
|
|
||||||
string msg = strprintf(_("Warning: wallet.dat corrupt, data salvaged!"
|
|
||||||
" Original wallet.dat saved as wallet.{timestamp}.bak in %s; if"
|
|
||||||
" your balance or transactions are incorrect you should"
|
|
||||||
" restore from a backup."), strDataDir);
|
|
||||||
InitWarning(msg);
|
|
||||||
}
|
|
||||||
if (r == CDBEnv::RECOVER_FAIL)
|
|
||||||
return InitError(_("wallet.dat corrupt, salvage failed"));
|
|
||||||
}
|
|
||||||
} // (!fDisableWallet)
|
} // (!fDisableWallet)
|
||||||
#endif // ENABLE_WALLET
|
#endif // ENABLE_WALLET
|
||||||
// ********************************************************* Step 6: network initialization
|
// ********************************************************* Step 6: network initialization
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include <boost/algorithm/string/replace.hpp>
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
|
#include <boost/filesystem.hpp>
|
||||||
#include <boost/thread.hpp>
|
#include <boost/thread.hpp>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -339,6 +340,58 @@ set<uint256> CWallet::GetConflicts(const uint256& txid) const
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CWallet::Flush(bool shutdown)
|
||||||
|
{
|
||||||
|
bitdb.Flush(shutdown);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWallet::Verify(const string walletFile, string& warningString, string& errorString)
|
||||||
|
{
|
||||||
|
if (!bitdb.Open(GetDataDir()))
|
||||||
|
{
|
||||||
|
// try moving the database env out of the way
|
||||||
|
boost::filesystem::path pathDatabase = GetDataDir() / "database";
|
||||||
|
boost::filesystem::path pathDatabaseBak = GetDataDir() / strprintf("database.%d.bak", GetTime());
|
||||||
|
try {
|
||||||
|
boost::filesystem::rename(pathDatabase, pathDatabaseBak);
|
||||||
|
LogPrintf("Moved old %s to %s. Retrying.\n", pathDatabase.string(), pathDatabaseBak.string());
|
||||||
|
} catch (const boost::filesystem::filesystem_error&) {
|
||||||
|
// failure is ok (well, not really, but it's not worse than what we started with)
|
||||||
|
}
|
||||||
|
|
||||||
|
// try again
|
||||||
|
if (!bitdb.Open(GetDataDir())) {
|
||||||
|
// if it still fails, it probably means we can't even create the database env
|
||||||
|
string msg = strprintf(_("Error initializing wallet database environment %s!"), GetDataDir());
|
||||||
|
errorString += msg;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetBoolArg("-salvagewallet", false))
|
||||||
|
{
|
||||||
|
// Recover readable keypairs:
|
||||||
|
if (!CWalletDB::Recover(bitdb, walletFile, true))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (boost::filesystem::exists(GetDataDir() / walletFile))
|
||||||
|
{
|
||||||
|
CDBEnv::VerifyResult r = bitdb.Verify(walletFile, CWalletDB::Recover);
|
||||||
|
if (r == CDBEnv::RECOVER_OK)
|
||||||
|
{
|
||||||
|
warningString += strprintf(_("Warning: wallet.dat corrupt, data salvaged!"
|
||||||
|
" Original wallet.dat saved as wallet.{timestamp}.bak in %s; if"
|
||||||
|
" your balance or transactions are incorrect you should"
|
||||||
|
" restore from a backup."), GetDataDir());
|
||||||
|
}
|
||||||
|
if (r == CDBEnv::RECOVER_FAIL)
|
||||||
|
errorString += _("wallet.dat corrupt, salvage failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void CWallet::SyncMetaData(pair<TxSpends::iterator, TxSpends::iterator> range)
|
void CWallet::SyncMetaData(pair<TxSpends::iterator, TxSpends::iterator> range)
|
||||||
{
|
{
|
||||||
// We want all the wallet transactions in range to have the same metadata as
|
// We want all the wallet transactions in range to have the same metadata as
|
||||||
|
|
|
@ -743,6 +743,12 @@ public:
|
||||||
//! Get wallet transactions that conflict with given transaction (spend same outputs)
|
//! Get wallet transactions that conflict with given transaction (spend same outputs)
|
||||||
std::set<uint256> GetConflicts(const uint256& txid) const;
|
std::set<uint256> GetConflicts(const uint256& txid) const;
|
||||||
|
|
||||||
|
//! Flush wallet (bitdb flush)
|
||||||
|
void Flush(bool shutdown=false);
|
||||||
|
|
||||||
|
//! Verify the wallet database and perform salvage if required
|
||||||
|
static bool Verify(const std::string walletFile, std::string& warningString, std::string& errorString);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Address book entry changed.
|
* Address book entry changed.
|
||||||
* @note called with lock cs_wallet held.
|
* @note called with lock cs_wallet held.
|
||||||
|
|
Loading…
Reference in New Issue