From c4a73444de805e55c0bd083dc17cb4441722c386 Mon Sep 17 00:00:00 2001 From: Duke Leto Date: Fri, 20 Jul 2018 03:58:05 +0000 Subject: [PATCH] Fix bug where some addresses are lost in sorting by using a vector instead of set and avoiding custom comparison function --- src/txdb.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/txdb.cpp b/src/txdb.cpp index 8ae2caa7b..ab3397049 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -405,6 +405,7 @@ extern UniValue CBlockTreeDB::Snapshot() int64_t utxos = 0; boost::scoped_ptr iter(NewIterator()); std::map addressAmounts; + std::vector > vaddr; UniValue result(UniValue::VOBJ); result.push_back(Pair("start_time", time(NULL))); @@ -461,22 +462,18 @@ extern UniValue CBlockTreeDB::Snapshot() UniValue addresses(UniValue::VARR); fprintf(stderr, "total=%f, totalAddresses=%li, utxos=%li\n", (double) total / COIN, totalAddresses, utxos); - typedef std::function, std::pair)> Comparator; - Comparator compFunctor = [](std::pair elem1 ,std::pair elem2) { - return elem1.second > elem2.second; /* descending */ - }; - // This is our intermediate data structure that allows us to calculate addressSorted - std::set, Comparator> sortedSnapshot(addressAmounts.begin(), addressAmounts.end(), compFunctor); - - //fprintf(stderr, "sortedSnapshot.size=%li\n", sortedSnapshot.size() ); + for (std::pair element : addressAmounts) { + vaddr.push_back( make_pair(element.second, element.first) ); + } + std::sort(vaddr.begin(), vaddr.end()); UniValue obj(UniValue::VOBJ); UniValue addressesSorted(UniValue::VARR); - for (std::pair element : sortedSnapshot) { + for (std::vector>::iterator it = vaddr.begin(); it!=vaddr.end(); ++it) { UniValue obj(UniValue::VOBJ); - obj.push_back( make_pair("addr", element.first.c_str() ) ); + obj.push_back( make_pair("addr", it->second.c_str() ) ); char amount[32]; - sprintf(amount, "%.8f", (double) element.second / COIN); + sprintf(amount, "%.8f", (double) it->first / COIN); obj.push_back( make_pair("amount", amount) ); addressesSorted.push_back(obj); }