|
|
@ -165,6 +165,11 @@ CDBEnv::VerifyResult CDBEnv::Verify(const std::string& strFile, bool (*recoverFu |
|
|
|
return (fRecovered ? RECOVER_OK : RECOVER_FAIL); |
|
|
|
return (fRecovered ? RECOVER_OK : RECOVER_FAIL); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* End of headers, beginning of key/value data */ |
|
|
|
|
|
|
|
static const char *HEADER_END = "HEADER=END"; |
|
|
|
|
|
|
|
/* End of key/value data */ |
|
|
|
|
|
|
|
static const char *DATA_END = "DATA=END"; |
|
|
|
|
|
|
|
|
|
|
|
bool CDBEnv::Salvage(const std::string& strFile, bool fAggressive, std::vector<CDBEnv::KeyValPair>& vResult) |
|
|
|
bool CDBEnv::Salvage(const std::string& strFile, bool fAggressive, std::vector<CDBEnv::KeyValPair>& vResult) |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(cs_db); |
|
|
|
LOCK(cs_db); |
|
|
@ -199,18 +204,29 @@ bool CDBEnv::Salvage(const std::string& strFile, bool fAggressive, std::vector<C |
|
|
|
// DATA=END
|
|
|
|
// DATA=END
|
|
|
|
|
|
|
|
|
|
|
|
string strLine; |
|
|
|
string strLine; |
|
|
|
while (!strDump.eof() && strLine != "HEADER=END") |
|
|
|
while (!strDump.eof() && strLine != HEADER_END) |
|
|
|
getline(strDump, strLine); // Skip past header
|
|
|
|
getline(strDump, strLine); // Skip past header
|
|
|
|
|
|
|
|
|
|
|
|
std::string keyHex, valueHex; |
|
|
|
std::string keyHex, valueHex; |
|
|
|
while (!strDump.eof() && keyHex != "DATA=END") { |
|
|
|
while (!strDump.eof() && keyHex != DATA_END) { |
|
|
|
getline(strDump, keyHex); |
|
|
|
getline(strDump, keyHex); |
|
|
|
if (keyHex != "DATA=END") { |
|
|
|
if (keyHex != DATA_END) { |
|
|
|
|
|
|
|
if (strDump.eof()) |
|
|
|
|
|
|
|
break; |
|
|
|
getline(strDump, valueHex); |
|
|
|
getline(strDump, valueHex); |
|
|
|
|
|
|
|
if (valueHex == DATA_END) { |
|
|
|
|
|
|
|
LogPrintf("CDBEnv::Salvage: WARNING: Number of keys in data does not match number of values.\n"); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
vResult.push_back(make_pair(ParseHex(keyHex), ParseHex(valueHex))); |
|
|
|
vResult.push_back(make_pair(ParseHex(keyHex), ParseHex(valueHex))); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (keyHex != DATA_END) { |
|
|
|
|
|
|
|
LogPrintf("CDBEnv::Salvage: WARNING: Unexpected end of file while reading salvage output.\n"); |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return (result == 0); |
|
|
|
return (result == 0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|