19 typedef std::pair<std::vector<unsigned char>, std::vector<unsigned char> >
KeyValPair;
33 std::unique_ptr<WalletDatabase> database =
MakeDatabase(file_path, options, status,
error);
34 if (!database)
return false;
37 std::string filename = berkeley_database.
Filename();
38 std::shared_ptr<BerkeleyEnvironment> env = berkeley_database.
env;
40 if (!env->Open(
error)) {
52 std::string newFilename =
strprintf(
"%s.%d.bak", filename, now);
54 int result = env->dbenv->dbrename(
nullptr, filename.c_str(),
nullptr,
55 newFilename.c_str(), DB_AUTO_COMMIT);
68 std::vector<KeyValPair> salvagedData;
70 std::stringstream strDump;
72 Db db(env->dbenv.get(), 0);
73 result = db.verify(newFilename.c_str(),
nullptr, &strDump, DB_SALVAGE | DB_AGGRESSIVE);
74 if (result == DB_VERIFY_BAD) {
75 warnings.push_back(
Untranslated(
"Salvage: Database salvage found errors, all data may not be recoverable."));
77 if (result != 0 && result != DB_VERIFY_BAD) {
91 while (!strDump.eof() && strLine !=
HEADER_END)
92 getline(strDump, strLine);
94 std::string keyHex, valueHex;
95 while (!strDump.eof() && keyHex !=
DATA_END) {
96 getline(strDump, keyHex);
100 getline(strDump, valueHex);
102 warnings.push_back(
Untranslated(
"Salvage: WARNING: Number of keys in data does not match number of values."));
111 warnings.push_back(
Untranslated(
"Salvage: WARNING: Unexpected end of file while reading salvage output."));
114 fSuccess = (result == 0);
117 if (salvagedData.empty())
123 std::unique_ptr<Db> pdbCopy = std::make_unique<Db>(env->dbenv.get(), 0);
124 int ret = pdbCopy->open(
nullptr,
136 DbTxn* ptxn = env->TxnBegin();
143 std::string strType, strErr;
155 warnings.push_back(
strprintf(
Untranslated(
"WARNING: WalletBatch::Recover skipping %s: %s"), strType, strErr));
158 Dbt datKey(row.first.data(), row.first.size());
159 Dbt datValue(row.second.data(), row.second.size());
160 int ret2 = pdbCopy->put(ptxn, &datKey, &datValue, DB_NOOVERWRITE);