|
|
@ -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) |
|
|
|
{ |
|
|
|
{ |
|
|
|