From dc69a419797d0f1796229518b4f74ede4bf2c3af Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Sat, 9 Mar 2013 18:28:08 -0800 Subject: [PATCH] Renumber special ledger_indexes and move RPC ledger to new format. --- src/cpp/ripple/RPCHandler.cpp | 88 +++++++++++++++++++++++------------ src/cpp/ripple/RPCHandler.h | 4 ++ src/js/remote.js | 10 ++-- 3 files changed, 67 insertions(+), 35 deletions(-) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 6b121d68e..3a2c8c2fb 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -25,7 +25,7 @@ SETUP_LOG(); -static const int rpcCOST_DEFAULT = 10; +static const int rpcCOST_DEFAULT = 10; static const int rpcCOST_EXCEPTION = 20; static const int rpcCOST_EXPENSIVE = 50; @@ -1617,7 +1617,7 @@ Json::Value RPCHandler::doLedgerCurrent(Json::Value, int& cost) // } Json::Value RPCHandler::doLedger(Json::Value jvRequest, int& cost) { - if (!jvRequest.isMember("ledger")) + if (!jvRequest.isMember("ledger") && !jvRequest.isMember("ledger_hash") && !jvRequest.isMember("ledger_index")) { Json::Value ret(Json::objectValue), current(Json::objectValue), closed(Json::objectValue); @@ -1630,27 +1630,18 @@ Json::Value RPCHandler::doLedger(Json::Value jvRequest, int& cost) return ret; } - std::string strLedger = jvRequest["ledger"].asString(); - Ledger::pointer ledger; + Ledger::pointer lpLedger; + Json::Value jvResult = lookupLedger(jvRequest, lpLedger); - if (strLedger == "current") - ledger = theApp->getLedgerMaster().getCurrentLedger(); - else if (strLedger == "closed") - ledger = theApp->getLedgerMaster().getClosedLedger(); - else if (strLedger.size() > 12) - ledger = theApp->getLedgerMaster().getLedgerByHash(uint256(strLedger)); - else - ledger = theApp->getOPs().getLedgerBySeq(jvRequest["ledger"].asUInt()); - - if (!ledger) - return rpcError(rpcLGR_NOT_FOUND); + if (!lpLedger) + return jvResult; bool full = jvRequest.isMember("full") && jvRequest["full"].asBool(); Json::Value ret(Json::objectValue); ScopedUnlock(theApp->getMasterLock()); - ledger->addJson(ret, full ? LEDGER_JSON_FULL : 0); + lpLedger->addJson(ret, full ? LEDGER_JSON_FULL : 0); return ret; } @@ -2260,8 +2251,44 @@ Json::Value RPCHandler::lookupLedger(Json::Value jvRequest, Ledger::pointer& lpL { Json::Value jvResult; - uint256 uLedger = jvRequest.isMember("ledger_hash") ? uint256(jvRequest["ledger_hash"].asString()) : 0; - int32 iLedgerIndex = jvRequest.isMember("ledger_index") && jvRequest["ledger_index"].isNumeric() ? jvRequest["ledger_index"].asInt() : -2; + uint256 uLedger = jvRequest.isMember("ledger_hash") ? uint256(jvRequest["ledger_hash"].asString()) : 0; + int32 iLedgerIndex = jvRequest.isMember("ledger_index") && jvRequest["ledger_index"].isNumeric() ? jvRequest["ledger_index"].asInt() : LEDGER_CURRENT; + + std::string strLedger; + + if (jvRequest.isMember("ledger_index") && !jvRequest["ledger_index"].isNumeric()) + strLedger = jvRequest["ledger_index"].asString(); + + // Support for DEPRECATED "ledger". + if (!jvRequest.isMember("ledger")) + { + nothing(); + } + else if (jvRequest["ledger"].size() > 12) + { + uLedger = uint256(jvRequest["ledger"].asString()); + } + else if (jvRequest["ledger"].isNumeric()) + { + iLedgerIndex = jvRequest["ledger"].asInt(); + } + else + { + strLedger = jvRequest["ledger"].asString(); + } + + if (strLedger == "current") + { + iLedgerIndex = LEDGER_CURRENT; + } + else if (strLedger == "closed") + { + iLedgerIndex = LEDGER_CLOSED; + } + else if (strLedger == "validated") + { + iLedgerIndex = LEDGER_VALIDATED; + } if (!!uLedger) { @@ -2277,21 +2304,22 @@ Json::Value RPCHandler::lookupLedger(Json::Value jvRequest, Ledger::pointer& lpL iLedgerIndex = lpLedger->getLedgerSeq(); // Set the current index, override if needed. } - if (-1 == iLedgerIndex) - { - lpLedger = theApp->getLedgerMaster().getClosedLedger(); - iLedgerIndex = lpLedger->getLedgerSeq(); - } - if (-2 == iLedgerIndex) - { - // Default to current ledger. + + switch (iLedgerIndex) { + case LEDGER_CURRENT: lpLedger = mNetOps->getCurrentLedger(); iLedgerIndex = lpLedger->getLedgerSeq(); - } - if (-3 == iLedgerIndex) - { // Last fully-validated ledger + break; + + case LEDGER_CLOSED: + lpLedger = theApp->getLedgerMaster().getClosedLedger(); + iLedgerIndex = lpLedger->getLedgerSeq(); + break; + + case LEDGER_VALIDATED: lpLedger = mNetOps->getValidatedLedger(); - iLedgerIndex = lpLedger->getLedgerSeq(); + iLedgerIndex = lpLedger->getLedgerSeq(); + break; } if (iLedgerIndex <= 0) diff --git a/src/cpp/ripple/RPCHandler.h b/src/cpp/ripple/RPCHandler.h index 641687ccf..63ba7b556 100644 --- a/src/cpp/ripple/RPCHandler.h +++ b/src/cpp/ripple/RPCHandler.h @@ -9,6 +9,10 @@ #include "SerializedTypes.h" #include "Ledger.h" +#define LEDGER_CURRENT -1 +#define LEDGER_CLOSED -2 +#define LEDGER_VALIDATED -3 + // used by the RPCServer or WSDoor to carry out these RPC commands class NetworkOPs; class InfoSub; diff --git a/src/js/remote.js b/src/js/remote.js index 9b6bd4b5d..eea5b4c3e 100644 --- a/src/js/remote.js +++ b/src/js/remote.js @@ -93,14 +93,14 @@ Request.prototype.ledger_index = function (ledger_index) { }; Request.prototype.ledger_select = function (ledger_spec) { - if (ledger_spec === 'closed') { - this.message.ledger_index = -1; + if (ledger_spec === 'current') { + this.message.ledger_index = ledger_spec; - } else if (ledger_spec === 'current') { - this.message.ledger_index = -2; + } else if (ledger_spec === 'closed') { + this.message.ledger_index = ledger_spec; } else if (ledger_spec === 'verified') { - this.message.ledger_index = -3; + this.message.ledger_index = ledger_spec; } else if (String(ledger_spec).length > 12) { // XXX Better test needed this.message.ledger_hash = ledger_spec;