Browse Source

close old db when rewriting

miguelfreitas
Pieter Wuille 13 years ago committed by Gavin Andresen
parent
commit
f53c5ede73
  1. 102
      src/db.cpp

102
src/db.cpp

@ -195,61 +195,63 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip)
bool fSuccess = true; bool fSuccess = true;
printf("Rewriting %s...\n", strFile.c_str()); printf("Rewriting %s...\n", strFile.c_str());
string strFileRes = strFile + ".rewrite"; string strFileRes = strFile + ".rewrite";
CDB db(strFile.c_str(), "r"); { // surround usage of db with extra {}
Db* pdbCopy = new Db(&dbenv, 0); CDB db(strFile.c_str(), "r");
Db* pdbCopy = new Db(&dbenv, 0);
int ret = pdbCopy->open(NULL, // Txn pointer
strFileRes.c_str(), // Filename int ret = pdbCopy->open(NULL, // Txn pointer
"main", // Logical db name strFileRes.c_str(), // Filename
DB_BTREE, // Database type "main", // Logical db name
DB_CREATE, // Flags DB_BTREE, // Database type
0); DB_CREATE, // Flags
if (ret > 0) 0);
{ if (ret > 0)
printf("Cannot create database file %s\n", strFileRes.c_str());
fSuccess = false;
}
Dbc* pcursor = db.GetCursor();
if (pcursor)
while (fSuccess)
{ {
CDataStream ssKey; printf("Cannot create database file %s\n", strFileRes.c_str());
CDataStream ssValue; fSuccess = false;
int ret = db.ReadAtCursor(pcursor, ssKey, ssValue, DB_NEXT); }
if (ret == DB_NOTFOUND)
{ Dbc* pcursor = db.GetCursor();
pcursor->close(); if (pcursor)
break; while (fSuccess)
}
else if (ret != 0)
{
pcursor->close();
fSuccess = false;
break;
}
if (pszSkip &&
strncmp(&ssKey[0], pszSkip, std::min(ssKey.size(), strlen(pszSkip))) == 0)
continue;
if (strncmp(&ssKey[0], "\x07version", 8) == 0)
{ {
// Update version: CDataStream ssKey;
ssValue.clear(); CDataStream ssValue;
ssValue << VERSION; int ret = db.ReadAtCursor(pcursor, ssKey, ssValue, DB_NEXT);
if (ret == DB_NOTFOUND)
{
pcursor->close();
break;
}
else if (ret != 0)
{
pcursor->close();
fSuccess = false;
break;
}
if (pszSkip &&
strncmp(&ssKey[0], pszSkip, std::min(ssKey.size(), strlen(pszSkip))) == 0)
continue;
if (strncmp(&ssKey[0], "\x07version", 8) == 0)
{
// Update version:
ssValue.clear();
ssValue << VERSION;
}
Dbt datKey(&ssKey[0], ssKey.size());
Dbt datValue(&ssValue[0], ssValue.size());
int ret2 = pdbCopy->put(NULL, &datKey, &datValue, DB_NOOVERWRITE);
if (ret2 > 0)
fSuccess = false;
} }
Dbt datKey(&ssKey[0], ssKey.size()); if (fSuccess)
Dbt datValue(&ssValue[0], ssValue.size()); {
int ret2 = pdbCopy->put(NULL, &datKey, &datValue, DB_NOOVERWRITE); db.Close();
if (ret2 > 0) CloseDb(strFile);
if (pdbCopy->close(0))
fSuccess = false; fSuccess = false;
delete pdbCopy;
} }
if (fSuccess)
{
db.Close();
CloseDb(strFile);
if (pdbCopy->close(0))
fSuccess = false;
delete pdbCopy;
} }
if (fSuccess) if (fSuccess)
{ {

Loading…
Cancel
Save