Change getWalletTxs to return a set instead of a vector

For some reason, the primary consumer of getWalletTxs requires the
transactions to be in hash order when it is processing them. std::map
will iterate in hash order so the transactions end up in that order when
placed into the vector. To ensure this order when mapWallet is no longer
ordered, the vector is replaced with a set which will maintain the hash
order.
This commit is contained in:
Andrew Chow 2019-09-17 19:44:19 -04:00
parent 97532867cf
commit 272356024d
2 changed files with 6 additions and 5 deletions

View File

@ -183,7 +183,7 @@ public:
virtual WalletTx getWalletTx(const uint256& txid) = 0;
//! Get list of all wallet transactions.
virtual std::vector<WalletTx> getWalletTxs() = 0;
virtual std::set<WalletTx> getWalletTxs() = 0;
//! Try to get updated status for a particular transaction, if possible without blocking.
virtual bool tryGetTxStatus(const uint256& txid,
@ -395,6 +395,8 @@ struct WalletTx
int64_t time;
std::map<std::string, std::string> value_map;
bool is_coinbase;
bool operator<(const WalletTx& a) const { return tx->GetHash() < a.tx->GetHash(); }
};
//! Updated transaction status.

View File

@ -318,13 +318,12 @@ public:
}
return {};
}
std::vector<WalletTx> getWalletTxs() override
std::set<WalletTx> getWalletTxs() override
{
LOCK(m_wallet->cs_wallet);
std::vector<WalletTx> result;
result.reserve(m_wallet->mapWallet.size());
std::set<WalletTx> result;
for (const auto& entry : m_wallet->mapWallet) {
result.emplace_back(MakeWalletTx(*m_wallet, entry.second));
result.emplace(MakeWalletTx(*m_wallet, entry.second));
}
return result;
}