mirror of
https://github.com/twisterarmy/twister-core.git
synced 2025-01-28 15:34:14 +00:00
Further CDBEnv encapsulation work.
This commit is contained in:
parent
94e34fa0ad
commit
ffe8b77a61
24
src/db.cpp
24
src/db.cpp
@ -27,8 +27,6 @@ unsigned int nWalletDBUpdated;
|
|||||||
//
|
//
|
||||||
|
|
||||||
CDBEnv bitdb;
|
CDBEnv bitdb;
|
||||||
map<string, int> mapFileUseCount;
|
|
||||||
static map<string, Db*> mapDb;
|
|
||||||
|
|
||||||
void CDBEnv::EnvShutdown()
|
void CDBEnv::EnvShutdown()
|
||||||
{
|
{
|
||||||
@ -129,8 +127,8 @@ CDB::CDB(const char *pszFile, const char* pszMode) :
|
|||||||
throw runtime_error("env open failed");
|
throw runtime_error("env open failed");
|
||||||
|
|
||||||
strFile = pszFile;
|
strFile = pszFile;
|
||||||
++mapFileUseCount[strFile];
|
++bitdb.mapFileUseCount[strFile];
|
||||||
pdb = mapDb[strFile];
|
pdb = bitdb.mapDb[strFile];
|
||||||
if (pdb == NULL)
|
if (pdb == NULL)
|
||||||
{
|
{
|
||||||
pdb = new Db(&bitdb.dbenv, 0);
|
pdb = new Db(&bitdb.dbenv, 0);
|
||||||
@ -148,7 +146,7 @@ CDB::CDB(const char *pszFile, const char* pszMode) :
|
|||||||
pdb = NULL;
|
pdb = NULL;
|
||||||
{
|
{
|
||||||
LOCK(bitdb.cs_db);
|
LOCK(bitdb.cs_db);
|
||||||
--mapFileUseCount[strFile];
|
--bitdb.mapFileUseCount[strFile];
|
||||||
}
|
}
|
||||||
strFile = "";
|
strFile = "";
|
||||||
throw runtime_error(strprintf("CDB() : can't open database file %s, error %d", pszFile, ret));
|
throw runtime_error(strprintf("CDB() : can't open database file %s, error %d", pszFile, ret));
|
||||||
@ -162,7 +160,7 @@ CDB::CDB(const char *pszFile, const char* pszMode) :
|
|||||||
fReadOnly = fTmp;
|
fReadOnly = fTmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
mapDb[strFile] = pdb;
|
bitdb.mapDb[strFile] = pdb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -189,14 +187,14 @@ void CDB::Close()
|
|||||||
|
|
||||||
{
|
{
|
||||||
LOCK(bitdb.cs_db);
|
LOCK(bitdb.cs_db);
|
||||||
--mapFileUseCount[strFile];
|
--bitdb.mapFileUseCount[strFile];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CloseDb(const string& strFile)
|
void CDBEnv::CloseDb(const string& strFile)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
LOCK(bitdb.cs_db);
|
LOCK(cs_db);
|
||||||
if (mapDb[strFile] != NULL)
|
if (mapDb[strFile] != NULL)
|
||||||
{
|
{
|
||||||
// Close the database handle
|
// Close the database handle
|
||||||
@ -214,12 +212,12 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip)
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
LOCK(bitdb.cs_db);
|
LOCK(bitdb.cs_db);
|
||||||
if (!mapFileUseCount.count(strFile) || mapFileUseCount[strFile] == 0)
|
if (!bitdb.mapFileUseCount.count(strFile) || bitdb.mapFileUseCount[strFile] == 0)
|
||||||
{
|
{
|
||||||
// Flush log data to the dat file
|
// Flush log data to the dat file
|
||||||
CloseDb(strFile);
|
bitdb.CloseDb(strFile);
|
||||||
bitdb.CheckpointLSN(strFile);
|
bitdb.CheckpointLSN(strFile);
|
||||||
mapFileUseCount.erase(strFile);
|
bitdb.mapFileUseCount.erase(strFile);
|
||||||
|
|
||||||
bool fSuccess = true;
|
bool fSuccess = true;
|
||||||
printf("Rewriting %s...\n", strFile.c_str());
|
printf("Rewriting %s...\n", strFile.c_str());
|
||||||
@ -276,7 +274,7 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip)
|
|||||||
if (fSuccess)
|
if (fSuccess)
|
||||||
{
|
{
|
||||||
db.Close();
|
db.Close();
|
||||||
CloseDb(strFile);
|
bitdb.CloseDb(strFile);
|
||||||
if (pdbCopy->close(0))
|
if (pdbCopy->close(0))
|
||||||
fSuccess = false;
|
fSuccess = false;
|
||||||
delete pdbCopy;
|
delete pdbCopy;
|
||||||
|
4
src/db.h
4
src/db.h
@ -42,6 +42,8 @@ private:
|
|||||||
public:
|
public:
|
||||||
mutable CCriticalSection cs_db;
|
mutable CCriticalSection cs_db;
|
||||||
DbEnv dbenv;
|
DbEnv dbenv;
|
||||||
|
std::map<std::string, int> mapFileUseCount;
|
||||||
|
std::map<std::string, Db*> mapDb;
|
||||||
|
|
||||||
CDBEnv();
|
CDBEnv();
|
||||||
~CDBEnv();
|
~CDBEnv();
|
||||||
@ -51,6 +53,8 @@ public:
|
|||||||
void CheckpointLSN(std::string strFile);
|
void CheckpointLSN(std::string strFile);
|
||||||
void SetDetach(bool fDetachDB_) { fDetachDB = fDetachDB_; }
|
void SetDetach(bool fDetachDB_) { fDetachDB = fDetachDB_; }
|
||||||
|
|
||||||
|
void CloseDb(const std::string& strFile);
|
||||||
|
|
||||||
DbTxn *TxnBegin(int flags=DB_TXN_WRITE_NOSYNC)
|
DbTxn *TxnBegin(int flags=DB_TXN_WRITE_NOSYNC)
|
||||||
{
|
{
|
||||||
DbTxn* ptxn = NULL;
|
DbTxn* ptxn = NULL;
|
||||||
|
@ -13,9 +13,6 @@ using namespace boost;
|
|||||||
|
|
||||||
static uint64 nAccountingEntryNumber = 0;
|
static uint64 nAccountingEntryNumber = 0;
|
||||||
|
|
||||||
extern map<string, int> mapFileUseCount;
|
|
||||||
extern void CloseDb(const string& strFile);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// CWalletDB
|
// CWalletDB
|
||||||
//
|
//
|
||||||
@ -354,8 +351,8 @@ void ThreadFlushWalletDB(void* parg)
|
|||||||
{
|
{
|
||||||
// Don't do this if any databases are in use
|
// Don't do this if any databases are in use
|
||||||
int nRefCount = 0;
|
int nRefCount = 0;
|
||||||
map<string, int>::iterator mi = mapFileUseCount.begin();
|
map<string, int>::iterator mi = bitdb.mapFileUseCount.begin();
|
||||||
while (mi != mapFileUseCount.end())
|
while (mi != bitdb.mapFileUseCount.end())
|
||||||
{
|
{
|
||||||
nRefCount += (*mi).second;
|
nRefCount += (*mi).second;
|
||||||
mi++;
|
mi++;
|
||||||
@ -363,18 +360,18 @@ void ThreadFlushWalletDB(void* parg)
|
|||||||
|
|
||||||
if (nRefCount == 0 && !fShutdown)
|
if (nRefCount == 0 && !fShutdown)
|
||||||
{
|
{
|
||||||
map<string, int>::iterator mi = mapFileUseCount.find(strFile);
|
map<string, int>::iterator mi = bitdb.mapFileUseCount.find(strFile);
|
||||||
if (mi != mapFileUseCount.end())
|
if (mi != bitdb.mapFileUseCount.end())
|
||||||
{
|
{
|
||||||
printf("Flushing wallet.dat\n");
|
printf("Flushing wallet.dat\n");
|
||||||
nLastFlushed = nWalletDBUpdated;
|
nLastFlushed = nWalletDBUpdated;
|
||||||
int64 nStart = GetTimeMillis();
|
int64 nStart = GetTimeMillis();
|
||||||
|
|
||||||
// Flush wallet.dat so it's self contained
|
// Flush wallet.dat so it's self contained
|
||||||
CloseDb(strFile);
|
bitdb.CloseDb(strFile);
|
||||||
bitdb.CheckpointLSN(strFile);
|
bitdb.CheckpointLSN(strFile);
|
||||||
|
|
||||||
mapFileUseCount.erase(mi++);
|
bitdb.mapFileUseCount.erase(mi++);
|
||||||
printf("Flushed wallet.dat %"PRI64d"ms\n", GetTimeMillis() - nStart);
|
printf("Flushed wallet.dat %"PRI64d"ms\n", GetTimeMillis() - nStart);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -391,12 +388,12 @@ bool BackupWallet(const CWallet& wallet, const string& strDest)
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
LOCK(bitdb.cs_db);
|
LOCK(bitdb.cs_db);
|
||||||
if (!mapFileUseCount.count(wallet.strWalletFile) || mapFileUseCount[wallet.strWalletFile] == 0)
|
if (!bitdb.mapFileUseCount.count(wallet.strWalletFile) || bitdb.mapFileUseCount[wallet.strWalletFile] == 0)
|
||||||
{
|
{
|
||||||
// Flush log data to the dat file
|
// Flush log data to the dat file
|
||||||
CloseDb(wallet.strWalletFile);
|
bitdb.CloseDb(wallet.strWalletFile);
|
||||||
bitdb.CheckpointLSN(wallet.strWalletFile);
|
bitdb.CheckpointLSN(wallet.strWalletFile);
|
||||||
mapFileUseCount.erase(wallet.strWalletFile);
|
bitdb.mapFileUseCount.erase(wallet.strWalletFile);
|
||||||
|
|
||||||
// Copy wallet.dat
|
// Copy wallet.dat
|
||||||
filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile;
|
filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user