|
|
@ -1285,14 +1285,21 @@ Value listtransactions(const Array& params, bool fHelp) |
|
|
|
if (params.size() > 2) |
|
|
|
if (params.size() > 2) |
|
|
|
nFrom = params[2].get_int(); |
|
|
|
nFrom = params[2].get_int(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (nCount < 0) |
|
|
|
|
|
|
|
throw JSONRPCError(-8, "Negative count"); |
|
|
|
|
|
|
|
if (nFrom < 0) |
|
|
|
|
|
|
|
throw JSONRPCError(-8, "Negative from"); |
|
|
|
|
|
|
|
|
|
|
|
Array ret; |
|
|
|
Array ret; |
|
|
|
CWalletDB walletdb(pwalletMain->strWalletFile); |
|
|
|
CWalletDB walletdb(pwalletMain->strWalletFile); |
|
|
|
|
|
|
|
|
|
|
|
// Firs: get all CWalletTx and CAccountingEntry into a sorted-by-time multimap:
|
|
|
|
// First: get all CWalletTx and CAccountingEntry into a sorted-by-time multimap.
|
|
|
|
typedef pair<CWalletTx*, CAccountingEntry*> TxPair; |
|
|
|
typedef pair<CWalletTx*, CAccountingEntry*> TxPair; |
|
|
|
typedef multimap<int64, TxPair > TxItems; |
|
|
|
typedef multimap<int64, TxPair > TxItems; |
|
|
|
TxItems txByTime; |
|
|
|
TxItems txByTime; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Note: maintaining indices in the database of (account,time) --> txid and (account, time) --> acentry
|
|
|
|
|
|
|
|
// would make this much faster for applications that do this a lot.
|
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
{ |
|
|
|
{ |
|
|
|
CWalletTx* wtx = &((*it).second); |
|
|
|
CWalletTx* wtx = &((*it).second); |
|
|
@ -1305,10 +1312,8 @@ Value listtransactions(const Array& params, bool fHelp) |
|
|
|
txByTime.insert(make_pair(entry.nTime, TxPair((CWalletTx*)0, &entry))); |
|
|
|
txByTime.insert(make_pair(entry.nTime, TxPair((CWalletTx*)0, &entry))); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Now: iterate backwards until we have nCount items to return:
|
|
|
|
// iterate backwards until we have nCount items to return:
|
|
|
|
TxItems::reverse_iterator it = txByTime.rbegin(); |
|
|
|
for (TxItems::reverse_iterator it = txByTime.rbegin(); it != txByTime.rend(); ++it) |
|
|
|
if (txByTime.size() > nFrom) std::advance(it, nFrom); |
|
|
|
|
|
|
|
for (; it != txByTime.rend(); ++it) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
CWalletTx *const pwtx = (*it).second.first; |
|
|
|
CWalletTx *const pwtx = (*it).second.first; |
|
|
|
if (pwtx != 0) |
|
|
|
if (pwtx != 0) |
|
|
@ -1317,18 +1322,21 @@ Value listtransactions(const Array& params, bool fHelp) |
|
|
|
if (pacentry != 0) |
|
|
|
if (pacentry != 0) |
|
|
|
AcentryToJSON(*pacentry, strAccount, ret); |
|
|
|
AcentryToJSON(*pacentry, strAccount, ret); |
|
|
|
|
|
|
|
|
|
|
|
if (ret.size() >= nCount) break; |
|
|
|
if (ret.size() >= (nCount+nFrom)) break; |
|
|
|
} |
|
|
|
} |
|
|
|
// ret is now newest to oldest
|
|
|
|
// ret is newest to oldest
|
|
|
|
|
|
|
|
|
|
|
|
// Make sure we return only last nCount items (sends-to-self might give us an extra):
|
|
|
|
if (nFrom > ret.size()) nFrom = ret.size(); |
|
|
|
if (ret.size() > nCount) |
|
|
|
if (nFrom+nCount > ret.size()) nCount = ret.size()-nFrom; |
|
|
|
{ |
|
|
|
Array::iterator first = ret.begin(); |
|
|
|
|
|
|
|
std::advance(first, nFrom); |
|
|
|
Array::iterator last = ret.begin(); |
|
|
|
Array::iterator last = ret.begin(); |
|
|
|
std::advance(last, nCount); |
|
|
|
std::advance(last, nFrom+nCount); |
|
|
|
ret.erase(last, ret.end()); |
|
|
|
|
|
|
|
} |
|
|
|
if (last != ret.end()) ret.erase(last, ret.end()); |
|
|
|
std::reverse(ret.begin(), ret.end()); // oldest to newest
|
|
|
|
if (first != ret.begin()) ret.erase(ret.begin(), first); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::reverse(ret.begin(), ret.end()); // Return oldest to newest
|
|
|
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|