18 typedef std::pair<std::vector<unsigned char>, std::vector<unsigned char> >
KeyValPair;
32 std::unique_ptr<WalletDatabase> database =
MakeDatabase(file_path, options, status, error);
33 if (!database)
return false;
36 std::string filename = berkeley_database.
Filename();
37 std::shared_ptr<BerkeleyEnvironment> env = berkeley_database.
env;
39 if (!env->Open(error)) {
51 std::string newFilename =
strprintf(
"%s.%d.bak", filename, now);
53 int result = env->dbenv->dbrename(
nullptr, filename.c_str(),
nullptr,
54 newFilename.c_str(), DB_AUTO_COMMIT);
67 std::vector<KeyValPair> salvagedData;
69 std::stringstream strDump;
71 Db db(env->dbenv.get(), 0);
72 result = db.verify(newFilename.c_str(),
nullptr, &strDump, DB_SALVAGE | DB_AGGRESSIVE);
73 if (result == DB_VERIFY_BAD) {
74 warnings.push_back(
Untranslated(
"Salvage: Database salvage found errors, all data may not be recoverable."));
76 if (result != 0 && result != DB_VERIFY_BAD) {
90 while (!strDump.eof() && strLine !=
HEADER_END)
91 getline(strDump, strLine);
93 std::string keyHex, valueHex;
94 while (!strDump.eof() && keyHex !=
DATA_END) {
95 getline(strDump, keyHex);
99 getline(strDump, valueHex);
101 warnings.push_back(
Untranslated(
"Salvage: WARNING: Number of keys in data does not match number of values."));
110 warnings.push_back(
Untranslated(
"Salvage: WARNING: Unexpected end of file while reading salvage output."));
113 fSuccess = (result == 0);
116 if (salvagedData.empty())
122 std::unique_ptr<Db> pdbCopy = MakeUnique<Db>(env->dbenv.get(), 0);
123 int ret = pdbCopy->open(
nullptr,
135 DbTxn* ptxn = env->TxnBegin();
142 std::string strType, strErr;
154 warnings.push_back(
strprintf(
Untranslated(
"WARNING: WalletBatch::Recover skipping %s: %s"), strType, strErr));
157 Dbt datKey(&row.first[0], row.first.size());
158 Dbt datValue(&row.second[0], row.second.size());
159 int ret2 = pdbCopy->put(ptxn, &datKey, &datValue, DB_NOOVERWRITE);
const std::chrono::seconds now
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
std::vector< unsigned char > ParseHex(const char *psz)
An instance of this class represents one database.
Double ended buffer combining vector and stream-like interfaces.
std::pair< std::vector< unsigned char >, std::vector< unsigned char > > KeyValPair
std::shared_ptr< BerkeleyEnvironment > env
Pointer to shared database environment.
const std::string HDCHAIN
static bool IsKeyType(const std::string &strType)
std::unique_ptr< WalletDatabase > CreateDummyWalletDatabase()
Return object for accessing dummy database with no read/write capabilities.
static const char * HEADER_END
static bool KeyFilter(const std::string &type)
std::string Filename() override
Return path to main database filename.
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
bool RecoverDatabaseFile(const fs::path &file_path, bilingual_str &error, std::vector< bilingual_str > &warnings)
static bool ReadKeyValue(CWallet *pwallet, CDataStream &ssKey, CDataStream &ssValue, CWalletScanState &wss, std::string &strType, std::string &strErr, const KeyFilterFn &filter_fn=nullptr) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
Optional< DatabaseFormat > require_format
int64_t GetTime()
Return system time (or mocked time, if set)
static const int CLIENT_VERSION
bitcoind-res.rc includes this file, but it cannot cope with real c++ code.
bool error(const char *fmt, const Args &... args)
std::unique_ptr< WalletDatabase > MakeDatabase(const fs::path &path, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error)
static const char * DATA_END