From cc6052d29421f62976b27e57a6f46ab0adebef6e Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 25 Jun 2012 23:16:20 -0700 Subject: [PATCH] Give Arthur a way to get all the accounts changed by a ledger. --- src/DBInit.cpp | 2 ++ src/NetworkOPs.cpp | 40 ++++++++++++++++++++++++++++++++-------- src/NetworkOPs.h | 1 + 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/DBInit.cpp b/src/DBInit.cpp index bc1b71217b..2d390564ed 100644 --- a/src/DBInit.cpp +++ b/src/DBInit.cpp @@ -24,6 +24,8 @@ const char *TxnDBInit[] = { );", "CREATE INDEX AcctTxindex ON \ AccountTransactions(Account, LedgerSeq, TransID);", + "CREATE INDEX AcctLgrIndex ON \ + AccountTransactions(LedgerSeq, Account, TransID);", "END TRANSACTION;" }; diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index cecc6bb5cb..02f033754b 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -629,22 +629,46 @@ std::vector< std::pair > std::string sql = str(boost::format("SELECT LedgerSeq,TransID FROM AccountTransactions INDEXED BY AcctTxIndex " - " WHERE Account = '%s' AND LedgerSeq <= '%d' AND LedgerSeq >= '%d' ORDER BY LedgerSeq LIMIT 1000") + " WHERE Account = '%s' AND LedgerSeq <= '%d' AND LedgerSeq >= '%d' ORDER BY LedgerSeq LIMIT 1000;") % account.humanAccountID() % maxLedger % minLedger); - Database *db = theApp->getTxnDB()->getDB(); - ScopedLock dbLock = theApp->getTxnDB()->getDBLock(); - - SQL_FOREACH(db, sql) { - std::string txID; - db->getStr("TransID", txID); - affectedAccounts.push_back(std::make_pair(db->getInt("LedgerSeq"), uint256(txID))); + Database* db = theApp->getTxnDB()->getDB(); + ScopedLock dbLock = theApp->getTxnDB()->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; } +std::vector + NetworkOPs::getAffectedAccounts(uint32 ledgerSeq) +{ + std::vector accounts; + std::string sql = str(boost::format + ("SELECT DISTINCT Account FROM AccountTransactions INDEXED BY AcctLgrIndex WHERE LedgerSeq = '%d';") + % ledgerSeq); + NewcoinAddress acct; + { + Database* db = theApp->getTxnDB()->getDB(); + ScopedLock dblock = theApp->getTxnDB()->getDBLock(); + SQL_FOREACH(db, sql) + { + std::string str; + db->getStr("Account", str); + if (acct.setAccountID(str)) + accounts.push_back(acct); + } + } + return accounts; +} + bool NetworkOPs::recvValidation(SerializedValidation::pointer val) { Log(lsINFO) << "recvValidation " << val->getLedgerHash().GetHex(); diff --git a/src/NetworkOPs.h b/src/NetworkOPs.h index 278808b799..f4a7c8e2d5 100644 --- a/src/NetworkOPs.h +++ b/src/NetworkOPs.h @@ -148,6 +148,7 @@ public: // client information retrieval functions std::vector< std::pair > getAffectedAccounts(const NewcoinAddress& account, uint32 minLedger, uint32 maxLedger); + std::vector getAffectedAccounts(uint32 ledgerSeq); // // Monitoring: publisher side