@ -33,7 +33,7 @@ static std::atomic<unsigned int> nWalletDBUpdateCounter;
bool CWalletDB : : WriteName ( const std : : string & strAddress , const std : : string & strName )
bool CWalletDB : : WriteName ( const std : : string & strAddress , const std : : string & strName )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Write ( make_pair ( std : : string ( " name " ) , strAddress ) , strName ) ;
return batch . Write ( std : : make_pair ( std : : string ( " name " ) , strAddress ) , strName ) ;
}
}
bool CWalletDB : : EraseName ( const std : : string & strAddress )
bool CWalletDB : : EraseName ( const std : : string & strAddress )
@ -41,38 +41,38 @@ bool CWalletDB::EraseName(const std::string& strAddress)
// This should only be used for sending addresses, never for receiving addresses,
// This should only be used for sending addresses, never for receiving addresses,
// receiving addresses must always have an address book entry if they're not change return.
// receiving addresses must always have an address book entry if they're not change return.
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Erase ( make_pair ( std : : string ( " name " ) , strAddress ) ) ;
return batch . Erase ( std : : make_pair ( std : : string ( " name " ) , strAddress ) ) ;
}
}
bool CWalletDB : : WritePurpose ( const std : : string & strAddress , const std : : string & strPurpose )
bool CWalletDB : : WritePurpose ( const std : : string & strAddress , const std : : string & strPurpose )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Write ( make_pair ( std : : string ( " purpose " ) , strAddress ) , strPurpose ) ;
return batch . Write ( std : : make_pair ( std : : string ( " purpose " ) , strAddress ) , strPurpose ) ;
}
}
bool CWalletDB : : ErasePurpose ( const std : : string & strPurpose )
bool CWalletDB : : ErasePurpose ( const std : : string & strPurpose )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Erase ( make_pair ( std : : string ( " purpose " ) , strPurpose ) ) ;
return batch . Erase ( std : : make_pair ( std : : string ( " purpose " ) , strPurpose ) ) ;
}
}
bool CWalletDB : : WriteTx ( const CWalletTx & wtx )
bool CWalletDB : : WriteTx ( const CWalletTx & wtx )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Write ( std : : make_pair ( std : : string ( " tx " ) , wtx . GetHash ( ) ) , wtx ) ;
return batch . Write ( std : : make_pair ( std : : string ( " tx " ) , wtx . GetHash ( ) ) , wtx ) ;
}
}
bool CWalletDB : : EraseTx ( uint256 hash )
bool CWalletDB : : EraseTx ( uint256 hash )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Erase ( std : : make_pair ( std : : string ( " tx " ) , hash ) ) ;
return batch . Erase ( std : : make_pair ( std : : string ( " tx " ) , hash ) ) ;
}
}
bool CWalletDB : : WriteKey ( const CPubKey & vchPubKey , const CPrivKey & vchPrivKey , const CKeyMetadata & keyMeta )
bool CWalletDB : : WriteKey ( const CPubKey & vchPubKey , const CPrivKey & vchPrivKey , const CKeyMetadata & keyMeta )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
if ( ! Write ( std : : make_pair ( std : : string ( " keymeta " ) , vchPubKey ) ,
if ( ! batch . Write ( std : : make_pair ( std : : string ( " keymeta " ) , vchPubKey ) ,
keyMeta , false ) )
keyMeta , false ) )
return false ;
return false ;
@ -82,7 +82,7 @@ bool CWalletDB::WriteKey(const CPubKey& vchPubKey, const CPrivKey& vchPrivKey, c
vchKey . insert ( vchKey . end ( ) , vchPubKey . begin ( ) , vchPubKey . end ( ) ) ;
vchKey . insert ( vchKey . end ( ) , vchPubKey . begin ( ) , vchPubKey . end ( ) ) ;
vchKey . insert ( vchKey . end ( ) , vchPrivKey . begin ( ) , vchPrivKey . end ( ) ) ;
vchKey . insert ( vchKey . end ( ) , vchPrivKey . begin ( ) , vchPrivKey . end ( ) ) ;
return Write ( std : : make_pair ( std : : string ( " key " ) , vchPubKey ) , std : : make_pair ( vchPrivKey , Hash ( vchKey . begin ( ) , vchKey . end ( ) ) ) , false ) ;
return batch . Write ( std : : make_pair ( std : : string ( " key " ) , vchPubKey ) , std : : make_pair ( vchPrivKey , Hash ( vchKey . begin ( ) , vchKey . end ( ) ) ) , false ) ;
}
}
bool CWalletDB : : WriteCryptedKey ( const CPubKey & vchPubKey ,
bool CWalletDB : : WriteCryptedKey ( const CPubKey & vchPubKey ,
@ -92,16 +92,16 @@ bool CWalletDB::WriteCryptedKey(const CPubKey& vchPubKey,
const bool fEraseUnencryptedKey = true ;
const bool fEraseUnencryptedKey = true ;
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
if ( ! Write ( std : : make_pair ( std : : string ( " keymeta " ) , vchPubKey ) ,
if ( ! batch . Write ( std : : make_pair ( std : : string ( " keymeta " ) , vchPubKey ) ,
keyMeta ) )
keyMeta ) )
return false ;
return false ;
if ( ! Write ( std : : make_pair ( std : : string ( " ckey " ) , vchPubKey ) , vchCryptedSecret , false ) )
if ( ! batch . Write ( std : : make_pair ( std : : string ( " ckey " ) , vchPubKey ) , vchCryptedSecret , false ) )
return false ;
return false ;
if ( fEraseUnencryptedKey )
if ( fEraseUnencryptedKey )
{
{
Erase ( std : : make_pair ( std : : string ( " key " ) , vchPubKey ) ) ;
batch . Erase ( std : : make_pair ( std : : string ( " key " ) , vchPubKey ) ) ;
Erase ( std : : make_pair ( std : : string ( " wkey " ) , vchPubKey ) ) ;
batch . Erase ( std : : make_pair ( std : : string ( " wkey " ) , vchPubKey ) ) ;
}
}
return true ;
return true ;
}
}
@ -109,92 +109,92 @@ bool CWalletDB::WriteCryptedKey(const CPubKey& vchPubKey,
bool CWalletDB : : WriteMasterKey ( unsigned int nID , const CMasterKey & kMasterKey )
bool CWalletDB : : WriteMasterKey ( unsigned int nID , const CMasterKey & kMasterKey )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Write ( std : : make_pair ( std : : string ( " mkey " ) , nID ) , kMasterKey , true ) ;
return batch . Write ( std : : make_pair ( std : : string ( " mkey " ) , nID ) , kMasterKey , true ) ;
}
}
bool CWalletDB : : WriteCScript ( const uint160 & hash , const CScript & redeemScript )
bool CWalletDB : : WriteCScript ( const uint160 & hash , const CScript & redeemScript )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Write ( std : : make_pair ( std : : string ( " cscript " ) , hash ) , * ( const CScriptBase * ) ( & redeemScript ) , false ) ;
return batch . Write ( std : : make_pair ( std : : string ( " cscript " ) , hash ) , * ( const CScriptBase * ) ( & redeemScript ) , false ) ;
}
}
bool CWalletDB : : WriteWatchOnly ( const CScript & dest , const CKeyMetadata & keyMeta )
bool CWalletDB : : WriteWatchOnly ( const CScript & dest , const CKeyMetadata & keyMeta )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
if ( ! Write ( std : : make_pair ( std : : string ( " watchmeta " ) , * ( const CScriptBase * ) ( & dest ) ) , keyMeta ) )
if ( ! batch . Write ( std : : make_pair ( std : : string ( " watchmeta " ) , * ( const CScriptBase * ) ( & dest ) ) , keyMeta ) )
return false ;
return false ;
return Write ( std : : make_pair ( std : : string ( " watchs " ) , * ( const CScriptBase * ) ( & dest ) ) , ' 1 ' ) ;
return batch . Write ( std : : make_pair ( std : : string ( " watchs " ) , * ( const CScriptBase * ) ( & dest ) ) , ' 1 ' ) ;
}
}
bool CWalletDB : : EraseWatchOnly ( const CScript & dest )
bool CWalletDB : : EraseWatchOnly ( const CScript & dest )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
if ( ! Erase ( std : : make_pair ( std : : string ( " watchmeta " ) , * ( const CScriptBase * ) ( & dest ) ) ) )
if ( ! batch . Erase ( std : : make_pair ( std : : string ( " watchmeta " ) , * ( const CScriptBase * ) ( & dest ) ) ) )
return false ;
return false ;
return Erase ( std : : make_pair ( std : : string ( " watchs " ) , * ( const CScriptBase * ) ( & dest ) ) ) ;
return batch . Erase ( std : : make_pair ( std : : string ( " watchs " ) , * ( const CScriptBase * ) ( & dest ) ) ) ;
}
}
bool CWalletDB : : WriteBestBlock ( const CBlockLocator & locator )
bool CWalletDB : : WriteBestBlock ( const CBlockLocator & locator )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
Write ( std : : string ( " bestblock " ) , CBlockLocator ( ) ) ; // Write empty block locator so versions that require a merkle branch automatically rescan
batch . Write ( std : : string ( " bestblock " ) , CBlockLocator ( ) ) ; // Write empty block locator so versions that require a merkle branch automatically rescan
return Write ( std : : string ( " bestblock_nomerkle " ) , locator ) ;
return batch . Write ( std : : string ( " bestblock_nomerkle " ) , locator ) ;
}
}
bool CWalletDB : : ReadBestBlock ( CBlockLocator & locator )
bool CWalletDB : : ReadBestBlock ( CBlockLocator & locator )
{
{
if ( Read ( std : : string ( " bestblock " ) , locator ) & & ! locator . vHave . empty ( ) ) return true ;
if ( batch . Read ( std : : string ( " bestblock " ) , locator ) & & ! locator . vHave . empty ( ) ) return true ;
return Read ( std : : string ( " bestblock_nomerkle " ) , locator ) ;
return batch . Read ( std : : string ( " bestblock_nomerkle " ) , locator ) ;
}
}
bool CWalletDB : : WriteOrderPosNext ( int64_t nOrderPosNext )
bool CWalletDB : : WriteOrderPosNext ( int64_t nOrderPosNext )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Write ( std : : string ( " orderposnext " ) , nOrderPosNext ) ;
return batch . Write ( std : : string ( " orderposnext " ) , nOrderPosNext ) ;
}
}
bool CWalletDB : : WriteDefaultKey ( const CPubKey & vchPubKey )
bool CWalletDB : : WriteDefaultKey ( const CPubKey & vchPubKey )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Write ( std : : string ( " defaultkey " ) , vchPubKey ) ;
return batch . Write ( std : : string ( " defaultkey " ) , vchPubKey ) ;
}
}
bool CWalletDB : : ReadPool ( int64_t nPool , CKeyPool & keypool )
bool CWalletDB : : ReadPool ( int64_t nPool , CKeyPool & keypool )
{
{
return Read ( std : : make_pair ( std : : string ( " pool " ) , nPool ) , keypool ) ;
return batch . Read ( std : : make_pair ( std : : string ( " pool " ) , nPool ) , keypool ) ;
}
}
bool CWalletDB : : WritePool ( int64_t nPool , const CKeyPool & keypool )
bool CWalletDB : : WritePool ( int64_t nPool , const CKeyPool & keypool )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Write ( std : : make_pair ( std : : string ( " pool " ) , nPool ) , keypool ) ;
return batch . Write ( std : : make_pair ( std : : string ( " pool " ) , nPool ) , keypool ) ;
}
}
bool CWalletDB : : ErasePool ( int64_t nPool )
bool CWalletDB : : ErasePool ( int64_t nPool )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Erase ( std : : make_pair ( std : : string ( " pool " ) , nPool ) ) ;
return batch . Erase ( std : : make_pair ( std : : string ( " pool " ) , nPool ) ) ;
}
}
bool CWalletDB : : WriteMinVersion ( int nVersion )
bool CWalletDB : : WriteMinVersion ( int nVersion )
{
{
return Write ( std : : string ( " minversion " ) , nVersion ) ;
return batch . Write ( std : : string ( " minversion " ) , nVersion ) ;
}
}
bool CWalletDB : : ReadAccount ( const std : : string & strAccount , CAccount & account )
bool CWalletDB : : ReadAccount ( const std : : string & strAccount , CAccount & account )
{
{
account . SetNull ( ) ;
account . SetNull ( ) ;
return Read ( make_pair ( std : : string ( " acc " ) , strAccount ) , account ) ;
return batch . Read ( std : : make_pair ( std : : string ( " acc " ) , strAccount ) , account ) ;
}
}
bool CWalletDB : : WriteAccount ( const std : : string & strAccount , const CAccount & account )
bool CWalletDB : : WriteAccount ( const std : : string & strAccount , const CAccount & account )
{
{
return Write ( make_pair ( std : : string ( " acc " ) , strAccount ) , account ) ;
return batch . Write ( std : : make_pair ( std : : string ( " acc " ) , strAccount ) , account ) ;
}
}
bool CWalletDB : : WriteAccountingEntry ( const uint64_t nAccEntryNum , const CAccountingEntry & acentry )
bool CWalletDB : : WriteAccountingEntry ( const uint64_t nAccEntryNum , const CAccountingEntry & acentry )
{
{
return Write ( std : : make_pair ( std : : string ( " acentry " ) , std : : make_pair ( acentry . strAccount , nAccEntryNum ) ) , acentry ) ;
return batch . Write ( std : : make_pair ( std : : string ( " acentry " ) , std : : make_pair ( acentry . strAccount , nAccEntryNum ) ) , acentry ) ;
}
}
bool CWalletDB : : WriteAccountingEntry_Backend ( const CAccountingEntry & acentry )
bool CWalletDB : : WriteAccountingEntry_Backend ( const CAccountingEntry & acentry )
@ -218,7 +218,7 @@ void CWalletDB::ListAccountCreditDebit(const std::string& strAccount, std::list<
{
{
bool fAllAccounts = ( strAccount = = " * " ) ;
bool fAllAccounts = ( strAccount = = " * " ) ;
Dbc * pcursor = GetCursor ( ) ;
Dbc * pcursor = batch . GetCursor ( ) ;
if ( ! pcursor )
if ( ! pcursor )
throw std : : runtime_error ( std : : string ( __func__ ) + " : cannot create DB cursor " ) ;
throw std : : runtime_error ( std : : string ( __func__ ) + " : cannot create DB cursor " ) ;
bool setRange = true ;
bool setRange = true ;
@ -229,7 +229,7 @@ void CWalletDB::ListAccountCreditDebit(const std::string& strAccount, std::list<
if ( setRange )
if ( setRange )
ssKey < < std : : make_pair ( std : : string ( " acentry " ) , std : : make_pair ( ( fAllAccounts ? std : : string ( " " ) : strAccount ) , uint64_t ( 0 ) ) ) ;
ssKey < < std : : make_pair ( std : : string ( " acentry " ) , std : : make_pair ( ( fAllAccounts ? std : : string ( " " ) : strAccount ) , uint64_t ( 0 ) ) ) ;
CDataStream ssValue ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssValue ( SER_DISK , CLIENT_VERSION ) ;
int ret = ReadAtCursor ( pcursor , ssKey , ssValue , setRange ) ;
int ret = batch . ReadAtCursor ( pcursor , ssKey , ssValue , setRange ) ;
setRange = false ;
setRange = false ;
if ( ret = = DB_NOTFOUND )
if ( ret = = DB_NOTFOUND )
break ;
break ;
@ -560,7 +560,7 @@ DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
LOCK ( pwallet - > cs_wallet ) ;
LOCK ( pwallet - > cs_wallet ) ;
try {
try {
int nMinVersion = 0 ;
int nMinVersion = 0 ;
if ( Read ( ( std : : string ) " minversion " , nMinVersion ) )
if ( batch . Read ( ( std : : string ) " minversion " , nMinVersion ) )
{
{
if ( nMinVersion > CLIENT_VERSION )
if ( nMinVersion > CLIENT_VERSION )
return DB_TOO_NEW ;
return DB_TOO_NEW ;
@ -568,7 +568,7 @@ DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
}
}
// Get cursor
// Get cursor
Dbc * pcursor = GetCursor ( ) ;
Dbc * pcursor = batch . GetCursor ( ) ;
if ( ! pcursor )
if ( ! pcursor )
{
{
LogPrintf ( " Error getting wallet database cursor \n " ) ;
LogPrintf ( " Error getting wallet database cursor \n " ) ;
@ -580,7 +580,7 @@ DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
// Read next record
// Read next record
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssValue ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssValue ( SER_DISK , CLIENT_VERSION ) ;
int ret = ReadAtCursor ( pcursor , ssKey , ssValue ) ;
int ret = batch . ReadAtCursor ( pcursor , ssKey , ssValue ) ;
if ( ret = = DB_NOTFOUND )
if ( ret = = DB_NOTFOUND )
break ;
break ;
else if ( ret ! = 0 )
else if ( ret ! = 0 )
@ -664,14 +664,14 @@ DBErrors CWalletDB::FindWalletTx(std::vector<uint256>& vTxHash, std::vector<CWal
try {
try {
int nMinVersion = 0 ;
int nMinVersion = 0 ;
if ( Read ( ( std : : string ) " minversion " , nMinVersion ) )
if ( batch . Read ( ( std : : string ) " minversion " , nMinVersion ) )
{
{
if ( nMinVersion > CLIENT_VERSION )
if ( nMinVersion > CLIENT_VERSION )
return DB_TOO_NEW ;
return DB_TOO_NEW ;
}
}
// Get cursor
// Get cursor
Dbc * pcursor = GetCursor ( ) ;
Dbc * pcursor = batch . GetCursor ( ) ;
if ( ! pcursor )
if ( ! pcursor )
{
{
LogPrintf ( " Error getting wallet database cursor \n " ) ;
LogPrintf ( " Error getting wallet database cursor \n " ) ;
@ -683,7 +683,7 @@ DBErrors CWalletDB::FindWalletTx(std::vector<uint256>& vTxHash, std::vector<CWal
// Read next record
// Read next record
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssValue ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssValue ( SER_DISK , CLIENT_VERSION ) ;
int ret = ReadAtCursor ( pcursor , ssKey , ssValue ) ;
int ret = batch . ReadAtCursor ( pcursor , ssKey , ssValue ) ;
if ( ret = = DB_NOTFOUND )
if ( ret = = DB_NOTFOUND )
break ;
break ;
else if ( ret ! = 0 )
else if ( ret ! = 0 )
@ -855,20 +855,20 @@ bool CWalletDB::VerifyDatabaseFile(const std::string& walletFile, const fs::path
bool CWalletDB : : WriteDestData ( const std : : string & address , const std : : string & key , const std : : string & value )
bool CWalletDB : : WriteDestData ( const std : : string & address , const std : : string & key , const std : : string & value )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Write ( std : : make_pair ( std : : string ( " destdata " ) , std : : make_pair ( address , key ) ) , value ) ;
return batch . Write ( std : : make_pair ( std : : string ( " destdata " ) , std : : make_pair ( address , key ) ) , value ) ;
}
}
bool CWalletDB : : EraseDestData ( const std : : string & address , const std : : string & key )
bool CWalletDB : : EraseDestData ( const std : : string & address , const std : : string & key )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Erase ( std : : make_pair ( std : : string ( " destdata " ) , std : : make_pair ( address , key ) ) ) ;
return batch . Erase ( std : : make_pair ( std : : string ( " destdata " ) , std : : make_pair ( address , key ) ) ) ;
}
}
bool CWalletDB : : WriteHDChain ( const CHDChain & chain )
bool CWalletDB : : WriteHDChain ( const CHDChain & chain )
{
{
nWalletDBUpdateCounter + + ;
nWalletDBUpdateCounter + + ;
return Write ( std : : string ( " hdchain " ) , chain ) ;
return batch . Write ( std : : string ( " hdchain " ) , chain ) ;
}
}
void CWalletDB : : IncrementUpdateCounter ( )
void CWalletDB : : IncrementUpdateCounter ( )
@ -881,3 +881,27 @@ unsigned int CWalletDB::GetUpdateCounter()
return nWalletDBUpdateCounter ;
return nWalletDBUpdateCounter ;
}
}
bool CWalletDB : : TxnBegin ( )
{
return batch . TxnBegin ( ) ;
}
bool CWalletDB : : TxnCommit ( )
{
return batch . TxnCommit ( ) ;
}
bool CWalletDB : : TxnAbort ( )
{
return batch . TxnAbort ( ) ;
}
bool CWalletDB : : ReadVersion ( int & nVersion )
{
return batch . ReadVersion ( nVersion ) ;
}
bool CWalletDB : : WriteVersion ( int nVersion )
{
return batch . WriteVersion ( nVersion ) ;
}