Merge #19738: wallet: Avoid multiple BerkeleyBatch in DelAddressBook

abac436760 wallet: Avoid multiple BerkeleyBatch in DelAddressBook (João Barbosa)

Pull request description:

ACKs for top commit:
  achow101:
    ACK abac436760
  jonatack:
    ACK abac436760
  meshcollider:
    re-utACK abac436760

Tree-SHA512: 92309fb74c48694160807326c0fe9793044a75cd77ed19400cceab54a7eefeb54ffc9334535e6021b3af7b9a364dbbeda3a9173540fff8144dfd437e96d76b5c
This commit is contained in:
Samuel Dobson 2020-09-07 15:44:02 +12:00
commit 78cb45d722
No known key found for this signature in database
GPG key ID: D300116E1C875A3D

View file

@ -2350,6 +2350,7 @@ std::map<CTxDestination, std::vector<COutput>> CWallet::ListCoins() const
const CTxOut& CWallet::FindNonChangeParentOutput(const CTransaction& tx, int output) const const CTxOut& CWallet::FindNonChangeParentOutput(const CTransaction& tx, int output) const
{ {
AssertLockHeld(cs_wallet);
const CTransaction* ptx = &tx; const CTransaction* ptx = &tx;
int n = output; int n = output;
while (IsChange(ptx->vout[n]) && ptx->vin.size() > 0) { while (IsChange(ptx->vout[n]) && ptx->vin.size() > 0) {
@ -3268,6 +3269,7 @@ bool CWallet::SetAddressBook(const CTxDestination& address, const std::string& s
bool CWallet::DelAddressBook(const CTxDestination& address) bool CWallet::DelAddressBook(const CTxDestination& address)
{ {
bool is_mine; bool is_mine;
WalletBatch batch(*database);
{ {
LOCK(cs_wallet); LOCK(cs_wallet);
// If we want to delete receiving addresses, we need to take care that DestData "used" (and possibly newer DestData) gets preserved (and the "deleted" address transformed into a change entry instead of actually being deleted) // If we want to delete receiving addresses, we need to take care that DestData "used" (and possibly newer DestData) gets preserved (and the "deleted" address transformed into a change entry instead of actually being deleted)
@ -3281,7 +3283,7 @@ bool CWallet::DelAddressBook(const CTxDestination& address)
std::string strAddress = EncodeDestination(address); std::string strAddress = EncodeDestination(address);
for (const std::pair<const std::string, std::string> &item : m_address_book[address].destdata) for (const std::pair<const std::string, std::string> &item : m_address_book[address].destdata)
{ {
WalletBatch(*database).EraseDestData(strAddress, item.first); batch.EraseDestData(strAddress, item.first);
} }
m_address_book.erase(address); m_address_book.erase(address);
is_mine = IsMine(address) != ISMINE_NO; is_mine = IsMine(address) != ISMINE_NO;
@ -3289,8 +3291,8 @@ bool CWallet::DelAddressBook(const CTxDestination& address)
NotifyAddressBookChanged(this, address, "", is_mine, "", CT_DELETED); NotifyAddressBookChanged(this, address, "", is_mine, "", CT_DELETED);
WalletBatch(*database).ErasePurpose(EncodeDestination(address)); batch.ErasePurpose(EncodeDestination(address));
return WalletBatch(*database).EraseName(EncodeDestination(address)); return batch.EraseName(EncodeDestination(address));
} }
size_t CWallet::KeypoolCountExternalKeys() const size_t CWallet::KeypoolCountExternalKeys() const