From e2288acfd1100211d3867a32a16b2e8798d474ec Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 9 Jun 2012 17:59:24 -0700 Subject: [PATCH] More work on account_tx command. --- src/NetworkOPs.cpp | 25 ++++++++++++++++++++++--- src/NetworkOPs.h | 2 +- src/RPCServer.cpp | 33 ++++++++++++++++++++++++++------- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index 624145d92a..0e7c6c5ff2 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -528,11 +528,30 @@ void NetworkOPs::setMode(OperatingMode om) mMode = om; } -std::vector< std::pair > +#define SQL_FOREACH(_db, _strQuery) \ + if ((_db)->executeSQL(_strQuery)) \ + for (bool _bMore = (db)->startIterRows(); _bMore; _bMore = (_db)->getNextRow()) + +std::vector< std::pair > NetworkOPs::getAffectedAccounts(const NewcoinAddress& account, uint32 minLedger, uint32 maxLedger) { - // WRITEME - std::vector< std::pair > affectedAccounts; + std::vector< std::pair > affectedAccounts; + + std::string sql = + str(boost::format("SELECT LedgerSeq,TransID FROM AccountTransactions INDEXED BY AcctTxIndex " + " WHERE Account = % AND LedgerSeq <= % AND LedgerSeq >= % ORDER BY LedgerSeq LIMIT 1000") + % account.humanAccountID() % minLedger % maxLedger); + + Database *db = theApp->getAcctTxnDB()->getDB(); + ScopedLock dbLock = theApp->getAcctTxnDB()->getDBLock(); + + SQL_FOREACH(db, sql) + { + std::string txID; + db->getStr("TransID", txID); + affectedAccounts.push_back(std::make_pair(db->getInt("LedgerSeq"), uint256(txID))); + } + return affectedAccounts; } diff --git a/src/NetworkOPs.h b/src/NetworkOPs.h index 1dddca15e4..0514a0902a 100644 --- a/src/NetworkOPs.h +++ b/src/NetworkOPs.h @@ -127,7 +127,7 @@ public: void setStateTimer(int seconds); // client information retrieval functions - std::vector< std::pair > + std::vector< std::pair > getAffectedAccounts(const NewcoinAddress& account, uint32 minLedger, uint32 maxLedger); }; diff --git a/src/RPCServer.cpp b/src/RPCServer.cpp index b09f4d987f..49812e0e72 100644 --- a/src/RPCServer.cpp +++ b/src/RPCServer.cpp @@ -1496,19 +1496,38 @@ Json::Value RPCServer::doAccountTransactions(Json::Value& params) try { - std::vector< std::pair > txns = + std::vector< std::pair > txns = mNetOps->getAffectedAccounts(account, minLedger, maxLedger); Json::Value ret(Json::objectValue); ret["Account"] = account.humanAccountID(); - Json::Value jtxns(Json::arrayValue); - for (std::vector< std::pair >::iterator it = txns.begin(), + Json::Value ledgers(Json::arrayValue); + + uint32 currentLedger = 0; + Json::Value ledger, jtxns; + for (std::vector< std::pair >::iterator it = txns.begin(), end = txns.end(); it != end; ++it) { - Json::Value txn = it->second->getJson(0); - txn["InLedger"] = it->first; - jtxns.append(txn); + if (it->first != currentLedger) + { // new ledger + if (currentLedger != 0) // add old ledger + { + ledger["Transactions"] = jtxns; + ledgers.append(ledger); + ledger = Json::objectValue; + } + currentLedger = it->first; + ledger["ID"] = currentLedger; + jtxns = Json::arrayValue; + } + jtxns.append(it->second.GetHex()); } - ret["Transactions"] = jtxns; + if (currentLedger != 0) + { + ledger["Transactions"] = jtxns; + ledgers.append(ledger); + } + + ret["Ledgers"] = ledgers; return ret; } catch (...)