Changeset View
Changeset View
Standalone View
Standalone View
src/wallet/db.cpp
Show First 20 Lines • Show All 292 Lines • ▼ Show 20 Lines | if (ret > 0) { | ||||
"database environment.", | "database environment.", | ||||
ret)); | ret)); | ||||
} | } | ||||
fDbEnvInit = true; | fDbEnvInit = true; | ||||
fMockDb = true; | fMockDb = true; | ||||
} | } | ||||
BerkeleyEnvironment::VerifyResult | bool BerkeleyEnvironment::Verify(const std::string &strFile) { | ||||
BerkeleyEnvironment::Verify(const std::string &strFile, | |||||
recoverFunc_type recoverFunc, | |||||
std::string &out_backup_filename) { | |||||
LOCK(cs_db); | LOCK(cs_db); | ||||
assert(mapFileUseCount.count(strFile) == 0); | assert(mapFileUseCount.count(strFile) == 0); | ||||
Db db(dbenv.get(), 0); | Db db(dbenv.get(), 0); | ||||
int result = db.verify(strFile.c_str(), nullptr, nullptr, 0); | int result = db.verify(strFile.c_str(), nullptr, nullptr, 0); | ||||
if (result == 0) { | return result == 0; | ||||
return VerifyResult::VERIFY_OK; | |||||
} else if (recoverFunc == nullptr) { | |||||
return VerifyResult::RECOVER_FAIL; | |||||
} | |||||
// Try to recover: | |||||
bool fRecovered = | |||||
(*recoverFunc)(fs::path(strPath) / strFile, out_backup_filename); | |||||
return (fRecovered ? VerifyResult::RECOVER_OK : VerifyResult::RECOVER_FAIL); | |||||
} | } | ||||
BerkeleyBatch::SafeDbt::SafeDbt() { | BerkeleyBatch::SafeDbt::SafeDbt() { | ||||
m_dbt.set_flags(DB_DBT_MALLOC); | m_dbt.set_flags(DB_DBT_MALLOC); | ||||
} | } | ||||
BerkeleyBatch::SafeDbt::SafeDbt(void *data, size_t size) : m_dbt(data, size) {} | BerkeleyBatch::SafeDbt::SafeDbt(void *data, size_t size) : m_dbt(data, size) {} | ||||
▲ Show 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | if (!env->Open(true /* retry */)) { | ||||
errorStr = strprintf( | errorStr = strprintf( | ||||
_("Error initializing wallet database environment %s!"), walletDir); | _("Error initializing wallet database environment %s!"), walletDir); | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
bool BerkeleyBatch::VerifyDatabaseFile( | bool BerkeleyBatch::VerifyDatabaseFile(const fs::path &file_path, | ||||
const fs::path &file_path, std::vector<bilingual_str> &warnings, | bilingual_str &errorStr) { | ||||
bilingual_str &errorStr, | |||||
BerkeleyEnvironment::recoverFunc_type recoverFunc) { | |||||
std::string walletFile; | std::string walletFile; | ||||
std::shared_ptr<BerkeleyEnvironment> env = | std::shared_ptr<BerkeleyEnvironment> env = | ||||
GetWalletEnv(file_path, walletFile); | GetWalletEnv(file_path, walletFile); | ||||
fs::path walletDir = env->Directory(); | fs::path walletDir = env->Directory(); | ||||
if (fs::exists(walletDir / walletFile)) { | if (fs::exists(walletDir / walletFile)) { | ||||
std::string backup_filename; | if (!env->Verify(walletFile)) { | ||||
BerkeleyEnvironment::VerifyResult r = | errorStr = | ||||
env->Verify(walletFile, recoverFunc, backup_filename); | strprintf(_("%s corrupt. Try using the wallet tool " | ||||
if (r == BerkeleyEnvironment::VerifyResult::RECOVER_OK) { | "bitcoin-wallet to salvage or restoring a backup."), | ||||
warnings.push_back( | walletFile); | ||||
strprintf(_("Warning: Wallet file corrupt, data salvaged!" | |||||
" Original %s saved as %s in %s; if your balance " | |||||
"or transactions are incorrect you should restore " | |||||
"from a backup."), | |||||
walletFile, backup_filename, walletDir)); | |||||
} | |||||
if (r == BerkeleyEnvironment::VerifyResult::RECOVER_FAIL) { | |||||
errorStr = strprintf(_("%s corrupt, salvage failed"), walletFile); | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
// also return true if files does not exists | // also return true if files does not exists | ||||
return true; | return true; | ||||
} | } | ||||
/* End of headers, beginning of key/value data */ | /* End of headers, beginning of key/value data */ | ||||
▲ Show 20 Lines • Show All 536 Lines • Show Last 20 Lines |