@@ -39,22 +39,31 @@ void CDBEnv::EnvShutdown()
3939 return ;
4040
4141 fDbEnvInit = false ;
42- int ret = dbenv. close (0 );
42+ int ret = dbenv-> close (0 );
4343 if (ret != 0 )
4444 LogPrintf (" CDBEnv::EnvShutdown: Error %d shutting down database environment: %s\n " , ret, DbEnv::strerror (ret));
4545 if (!fMockDb )
4646 DbEnv (0 ).remove (path.string ().c_str (), 0 );
4747}
4848
49- CDBEnv::CDBEnv () : dbenv(DB_CXX_NO_EXCEPTIONS )
49+ void CDBEnv::Reset ( )
5050{
51+ delete dbenv;
52+ dbenv = new DbEnv (DB_CXX_NO_EXCEPTIONS);
5153 fDbEnvInit = false ;
5254 fMockDb = false ;
5355}
5456
57+ CDBEnv::CDBEnv () : dbenv(NULL )
58+ {
59+ Reset ();
60+ }
61+
5562CDBEnv::~CDBEnv ()
5663{
5764 EnvShutdown ();
65+ delete dbenv;
66+ dbenv = NULL ;
5867}
5968
6069void CDBEnv::Close ()
@@ -79,17 +88,17 @@ bool CDBEnv::Open(const boost::filesystem::path& pathIn)
7988 if (GetBoolArg (" -privdb" , true ))
8089 nEnvFlags |= DB_PRIVATE;
8190
82- dbenv. set_lg_dir (pathLogDir.string ().c_str ());
83- dbenv. set_cachesize (0 , 0x100000 , 1 ); // 1 MiB should be enough for just the wallet
84- dbenv. set_lg_bsize (0x10000 );
85- dbenv. set_lg_max (1048576 );
86- dbenv. set_lk_max_locks (40000 );
87- dbenv. set_lk_max_objects (40000 );
88- dbenv. set_errfile (fopen (pathErrorFile.string ().c_str (), " a" )); // / debug
89- dbenv. set_flags (DB_AUTO_COMMIT, 1 );
90- dbenv. set_flags (DB_TXN_WRITE_NOSYNC, 1 );
91- dbenv. log_set_config (DB_LOG_AUTO_REMOVE, 1 );
92- int ret = dbenv. open (path.string ().c_str (),
91+ dbenv-> set_lg_dir (pathLogDir.string ().c_str ());
92+ dbenv-> set_cachesize (0 , 0x100000 , 1 ); // 1 MiB should be enough for just the wallet
93+ dbenv-> set_lg_bsize (0x10000 );
94+ dbenv-> set_lg_max (1048576 );
95+ dbenv-> set_lk_max_locks (40000 );
96+ dbenv-> set_lk_max_objects (40000 );
97+ dbenv-> set_errfile (fopen (pathErrorFile.string ().c_str (), " a" )); // / debug
98+ dbenv-> set_flags (DB_AUTO_COMMIT, 1 );
99+ dbenv-> set_flags (DB_TXN_WRITE_NOSYNC, 1 );
100+ dbenv-> log_set_config (DB_LOG_AUTO_REMOVE, 1 );
101+ int ret = dbenv-> open (path.string ().c_str (),
93102 DB_CREATE |
94103 DB_INIT_LOCK |
95104 DB_INIT_LOG |
@@ -116,14 +125,14 @@ void CDBEnv::MakeMock()
116125
117126 LogPrint (" db" , " CDBEnv::MakeMock\n " );
118127
119- dbenv. set_cachesize (1 , 0 , 1 );
120- dbenv. set_lg_bsize (10485760 * 4 );
121- dbenv. set_lg_max (10485760 );
122- dbenv. set_lk_max_locks (10000 );
123- dbenv. set_lk_max_objects (10000 );
124- dbenv. set_flags (DB_AUTO_COMMIT, 1 );
125- dbenv. log_set_config (DB_LOG_IN_MEMORY, 1 );
126- int ret = dbenv. open (NULL ,
128+ dbenv-> set_cachesize (1 , 0 , 1 );
129+ dbenv-> set_lg_bsize (10485760 * 4 );
130+ dbenv-> set_lg_max (10485760 );
131+ dbenv-> set_lk_max_locks (10000 );
132+ dbenv-> set_lk_max_objects (10000 );
133+ dbenv-> set_flags (DB_AUTO_COMMIT, 1 );
134+ dbenv-> log_set_config (DB_LOG_IN_MEMORY, 1 );
135+ int ret = dbenv-> open (NULL ,
127136 DB_CREATE |
128137 DB_INIT_LOCK |
129138 DB_INIT_LOG |
@@ -144,7 +153,7 @@ CDBEnv::VerifyResult CDBEnv::Verify(std::string strFile, bool (*recoverFunc)(CDB
144153 LOCK (cs_db);
145154 assert (mapFileUseCount.count (strFile) == 0 );
146155
147- Db db (& dbenv, 0 );
156+ Db db (dbenv, 0 );
148157 int result = db.verify (strFile.c_str (), NULL , NULL , 0 );
149158 if (result == 0 )
150159 return VERIFY_OK;
@@ -167,7 +176,7 @@ bool CDBEnv::Salvage(std::string strFile, bool fAggressive, std::vector<CDBEnv::
167176
168177 stringstream strDump;
169178
170- Db db (& dbenv, 0 );
179+ Db db (dbenv, 0 );
171180 int result = db.verify (strFile.c_str (), NULL , &strDump, flags);
172181 if (result == DB_VERIFY_BAD) {
173182 LogPrintf (" CDBEnv::Salvage: Database salvage found errors, all data may not be recoverable.\n " );
@@ -208,10 +217,10 @@ bool CDBEnv::Salvage(std::string strFile, bool fAggressive, std::vector<CDBEnv::
208217
209218void CDBEnv::CheckpointLSN (const std::string& strFile)
210219{
211- dbenv. txn_checkpoint (0 , 0 , 0 );
220+ dbenv-> txn_checkpoint (0 , 0 , 0 );
212221 if (fMockDb )
213222 return ;
214- dbenv. lsn_reset (strFile.c_str (), 0 );
223+ dbenv-> lsn_reset (strFile.c_str (), 0 );
215224}
216225
217226
@@ -237,7 +246,7 @@ CDB::CDB(const std::string& strFilename, const char* pszMode, bool fFlushOnClose
237246 ++bitdb.mapFileUseCount [strFile];
238247 pdb = bitdb.mapDb [strFile];
239248 if (pdb == NULL ) {
240- pdb = new Db (& bitdb.dbenv , 0 );
249+ pdb = new Db (bitdb.dbenv , 0 );
241250
242251 bool fMockDb = bitdb.IsMock ();
243252 if (fMockDb ) {
@@ -284,7 +293,7 @@ void CDB::Flush()
284293 if (fReadOnly )
285294 nMinutes = 1 ;
286295
287- bitdb.dbenv . txn_checkpoint (nMinutes ? GetArg (" -dblogsize" , 100 ) * 1024 : 0 , nMinutes, 0 );
296+ bitdb.dbenv -> txn_checkpoint (nMinutes ? GetArg (" -dblogsize" , 100 ) * 1024 : 0 , nMinutes, 0 );
288297}
289298
290299void CDB::Close ()
@@ -324,7 +333,7 @@ bool CDBEnv::RemoveDb(const string& strFile)
324333 this ->CloseDb (strFile);
325334
326335 LOCK (cs_db);
327- int rc = dbenv. dbremove (NULL , strFile.c_str (), NULL , DB_AUTO_COMMIT);
336+ int rc = dbenv-> dbremove (NULL , strFile.c_str (), NULL , DB_AUTO_COMMIT);
328337 return (rc == 0 );
329338}
330339
@@ -344,7 +353,7 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip)
344353 string strFileRes = strFile + " .rewrite" ;
345354 { // surround usage of db with extra {}
346355 CDB db (strFile.c_str (), " r" );
347- Db* pdbCopy = new Db (& bitdb.dbenv , 0 );
356+ Db* pdbCopy = new Db (bitdb.dbenv , 0 );
348357
349358 int ret = pdbCopy->open (NULL , // Txn pointer
350359 strFileRes.c_str (), // Filename
@@ -394,10 +403,10 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip)
394403 }
395404 }
396405 if (fSuccess ) {
397- Db dbA (& bitdb.dbenv , 0 );
406+ Db dbA (bitdb.dbenv , 0 );
398407 if (dbA.remove (strFile.c_str (), NULL , 0 ))
399408 fSuccess = false ;
400- Db dbB (& bitdb.dbenv , 0 );
409+ Db dbB (bitdb.dbenv , 0 );
401410 if (dbB.rename (strFileRes.c_str (), NULL , strFile.c_str (), 0 ))
402411 fSuccess = false ;
403412 }
@@ -430,10 +439,10 @@ void CDBEnv::Flush(bool fShutdown)
430439 // Move log data to the dat file
431440 CloseDb (strFile);
432441 LogPrint (" db" , " CDBEnv::Flush: %s checkpoint\n " , strFile);
433- dbenv. txn_checkpoint (0 , 0 , 0 );
442+ dbenv-> txn_checkpoint (0 , 0 , 0 );
434443 LogPrint (" db" , " CDBEnv::Flush: %s detach\n " , strFile);
435444 if (!fMockDb )
436- dbenv. lsn_reset (strFile.c_str (), 0 );
445+ dbenv-> lsn_reset (strFile.c_str (), 0 );
437446 LogPrint (" db" , " CDBEnv::Flush: %s closed\n " , strFile);
438447 mapFileUseCount.erase (mi++);
439448 } else
@@ -443,7 +452,7 @@ void CDBEnv::Flush(bool fShutdown)
443452 if (fShutdown ) {
444453 char ** listp;
445454 if (mapFileUseCount.empty ()) {
446- dbenv. log_archive (&listp, DB_ARCH_REMOVE);
455+ dbenv-> log_archive (&listp, DB_ARCH_REMOVE);
447456 Close ();
448457 if (!fMockDb )
449458 boost::filesystem::remove_all (path / " database" );
0 commit comments