@ -31,6 +31,8 @@ struct WalletDatabaseFileId {
bool operator = = ( const WalletDatabaseFileId & rhs ) const ;
bool operator = = ( const WalletDatabaseFileId & rhs ) const ;
} ;
} ;
class BerkeleyDatabase ;
class BerkeleyEnvironment
class BerkeleyEnvironment
{
{
private :
private :
@ -43,7 +45,7 @@ private:
public :
public :
std : : unique_ptr < DbEnv > dbenv ;
std : : unique_ptr < DbEnv > dbenv ;
std : : map < std : : string , int > mapFileUseCount ;
std : : map < std : : string , int > mapFileUseCount ;
std : : map < std : : string , Db* > mapDb ;
std : : map < std : : string , std: : reference_wrapper < BerkeleyDatabase > > m_databases ;
std : : unordered_map < std : : string , WalletDatabaseFileId > m_fileids ;
std : : unordered_map < std : : string , WalletDatabaseFileId > m_fileids ;
std : : condition_variable_any m_db_in_use ;
std : : condition_variable_any m_db_in_use ;
@ -115,6 +117,8 @@ public:
nUpdateCounter ( 0 ) , nLastSeen ( 0 ) , nLastFlushed ( 0 ) , nLastWalletUpdate ( 0 )
nUpdateCounter ( 0 ) , nLastSeen ( 0 ) , nLastFlushed ( 0 ) , nLastWalletUpdate ( 0 )
{
{
env = GetWalletEnv ( wallet_path , strFile ) ;
env = GetWalletEnv ( wallet_path , strFile ) ;
auto inserted = env - > m_databases . emplace ( strFile , std : : ref ( * this ) ) ;
assert ( inserted . second ) ;
if ( mock ) {
if ( mock ) {
env - > Close ( ) ;
env - > Close ( ) ;
env - > Reset ( ) ;
env - > Reset ( ) ;
@ -122,6 +126,13 @@ public:
}
}
}
}
~ BerkeleyDatabase ( ) {
if ( env ) {
size_t erased = env - > m_databases . erase ( strFile ) ;
assert ( erased = = 1 ) ;
}
}
/** Return object for accessing database at specified path. */
/** Return object for accessing database at specified path. */
static std : : unique_ptr < BerkeleyDatabase > Create ( const fs : : path & path )
static std : : unique_ptr < BerkeleyDatabase > Create ( const fs : : path & path )
{
{
@ -161,6 +172,9 @@ public:
unsigned int nLastFlushed ;
unsigned int nLastFlushed ;
int64_t nLastWalletUpdate ;
int64_t nLastWalletUpdate ;
/** Database pointer. This is initialized lazily and reset during flushes, so it can be null. */
std : : unique_ptr < Db > m_db ;
private :
private :
/** BerkeleyDB specific */
/** BerkeleyDB specific */
BerkeleyEnvironment * env ;
BerkeleyEnvironment * env ;