Browse Source

Merge #8028: Fix insanity of CWalletDB::WriteTx and CWalletTx::WriteToDisk

0fd5997 Fix insanity of CWalletDB::WriteTx and CWalletTx::WriteToDisk (Patrick Strateman)
0.13
Wladimir J. van der Laan 9 years ago
parent
commit
373b50deba
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
  1. 14
      src/wallet/wallet.cpp
  2. 2
      src/wallet/wallet.h
  3. 10
      src/wallet/walletdb.cpp
  4. 2
      src/wallet/walletdb.h

14
src/wallet/wallet.cpp

@ -730,7 +730,7 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn, bool fFromLoadWallet, CWalletD
// Write to disk // Write to disk
if (fInsertedNew || fUpdated) if (fInsertedNew || fUpdated)
if (!wtx.WriteToDisk(pwalletdb)) if (!pwalletdb->WriteTx(wtx))
return false; return false;
// Break debit/credit balance caches: // Break debit/credit balance caches:
@ -830,7 +830,7 @@ bool CWallet::AbandonTransaction(const uint256& hashTx)
wtx.nIndex = -1; wtx.nIndex = -1;
wtx.setAbandoned(); wtx.setAbandoned();
wtx.MarkDirty(); wtx.MarkDirty();
wtx.WriteToDisk(&walletdb); walletdb.WriteTx(wtx);
NotifyTransactionChanged(this, wtx.GetHash(), CT_UPDATED); NotifyTransactionChanged(this, wtx.GetHash(), CT_UPDATED);
// Iterate over all its outputs, and mark transactions in the wallet that spend them abandoned too // Iterate over all its outputs, and mark transactions in the wallet that spend them abandoned too
TxSpends::const_iterator iter = mapTxSpends.lower_bound(COutPoint(hashTx, 0)); TxSpends::const_iterator iter = mapTxSpends.lower_bound(COutPoint(hashTx, 0));
@ -892,7 +892,7 @@ void CWallet::MarkConflicted(const uint256& hashBlock, const uint256& hashTx)
wtx.nIndex = -1; wtx.nIndex = -1;
wtx.hashBlock = hashBlock; wtx.hashBlock = hashBlock;
wtx.MarkDirty(); wtx.MarkDirty();
wtx.WriteToDisk(&walletdb); walletdb.WriteTx(wtx);
// Iterate over all its outputs, and mark transactions in the wallet that spend them conflicted too // Iterate over all its outputs, and mark transactions in the wallet that spend them conflicted too
TxSpends::const_iterator iter = mapTxSpends.lower_bound(COutPoint(now, 0)); TxSpends::const_iterator iter = mapTxSpends.lower_bound(COutPoint(now, 0));
while (iter != mapTxSpends.end() && iter->first.hash == now) { while (iter != mapTxSpends.end() && iter->first.hash == now) {
@ -1187,12 +1187,6 @@ void CWalletTx::GetAccountAmounts(const string& strAccount, CAmount& nReceived,
} }
} }
bool CWalletTx::WriteToDisk(CWalletDB *pwalletdb)
{
return pwalletdb->WriteTx(GetHash(), *this);
}
/** /**
* Scan the block chain (starting in pindexStart) for transactions * Scan the block chain (starting in pindexStart) for transactions
* from or to us. If fUpdate is true, found transactions that already * from or to us. If fUpdate is true, found transactions that already
@ -3195,7 +3189,7 @@ bool CWallet::InitLoadWallet()
copyTo->fFromMe = copyFrom->fFromMe; copyTo->fFromMe = copyFrom->fFromMe;
copyTo->strFromAccount = copyFrom->strFromAccount; copyTo->strFromAccount = copyFrom->strFromAccount;
copyTo->nOrderPos = copyFrom->nOrderPos; copyTo->nOrderPos = copyFrom->nOrderPos;
copyTo->WriteToDisk(&walletdb); walletdb.WriteTx(*copyTo);
} }
} }
} }

2
src/wallet/wallet.h

@ -394,8 +394,6 @@ public:
bool InMempool() const; bool InMempool() const;
bool IsTrusted() const; bool IsTrusted() const;
bool WriteToDisk(CWalletDB *pwalletdb);
int64_t GetTxTime() const; int64_t GetTxTime() const;
int GetRequestCount() const; int GetRequestCount() const;

10
src/wallet/walletdb.cpp

@ -55,10 +55,10 @@ bool CWalletDB::ErasePurpose(const string& strPurpose)
return Erase(make_pair(string("purpose"), strPurpose)); return Erase(make_pair(string("purpose"), strPurpose));
} }
bool CWalletDB::WriteTx(uint256 hash, const CWalletTx& wtx) bool CWalletDB::WriteTx(const CWalletTx& wtx)
{ {
nWalletDBUpdated++; nWalletDBUpdated++;
return Write(std::make_pair(std::string("tx"), hash), wtx); return Write(std::make_pair(std::string("tx"), wtx.GetHash()), wtx);
} }
bool CWalletDB::EraseTx(uint256 hash) bool CWalletDB::EraseTx(uint256 hash)
@ -291,7 +291,7 @@ DBErrors CWalletDB::ReorderTransactions(CWallet* pwallet)
if (pwtx) if (pwtx)
{ {
if (!WriteTx(pwtx->GetHash(), *pwtx)) if (!WriteTx(*pwtx))
return DB_LOAD_FAIL; return DB_LOAD_FAIL;
} }
else else
@ -315,7 +315,7 @@ DBErrors CWalletDB::ReorderTransactions(CWallet* pwallet)
// Since we're changing the order, write it back // Since we're changing the order, write it back
if (pwtx) if (pwtx)
{ {
if (!WriteTx(pwtx->GetHash(), *pwtx)) if (!WriteTx(*pwtx))
return DB_LOAD_FAIL; return DB_LOAD_FAIL;
} }
else else
@ -698,7 +698,7 @@ DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
pwallet->nTimeFirstKey = 1; // 0 would be considered 'no value' pwallet->nTimeFirstKey = 1; // 0 would be considered 'no value'
BOOST_FOREACH(uint256 hash, wss.vWalletUpgrade) BOOST_FOREACH(uint256 hash, wss.vWalletUpgrade)
WriteTx(hash, pwallet->mapWallet[hash]); WriteTx(pwallet->mapWallet[hash]);
// Rewrite encrypted wallets of versions 0.4.0 and 0.5.0rc: // Rewrite encrypted wallets of versions 0.4.0 and 0.5.0rc:
if (wss.fIsEncrypted && (wss.nFileVersion == 40000 || wss.nFileVersion == 50000)) if (wss.fIsEncrypted && (wss.nFileVersion == 40000 || wss.nFileVersion == 50000))

2
src/wallet/walletdb.h

@ -87,7 +87,7 @@ public:
bool WritePurpose(const std::string& strAddress, const std::string& purpose); bool WritePurpose(const std::string& strAddress, const std::string& purpose);
bool ErasePurpose(const std::string& strAddress); bool ErasePurpose(const std::string& strAddress);
bool WriteTx(uint256 hash, const CWalletTx& wtx); bool WriteTx(const CWalletTx& wtx);
bool EraseTx(uint256 hash); bool EraseTx(uint256 hash);
bool WriteKey(const CPubKey& vchPubKey, const CPrivKey& vchPrivKey, const CKeyMetadata &keyMeta); bool WriteKey(const CPubKey& vchPubKey, const CPrivKey& vchPrivKey, const CKeyMetadata &keyMeta);

Loading…
Cancel
Save