// Get state nodes from a ledger // Inputs: // limit: integer, maximum number of entries // marker: opaque, resume point // binary: boolean, format // Outputs: // ledger_hash: chosen ledger's hash // ledger_index: chosen ledger's index // state: array of state nodes // marker: resume point, if any Json::Value doLedgerData (RPC::Context& context) { static int const BINARY_PAGE_LENGTH = 2048; static int const JSON_PAGE_LENGTH = 256; std::shared_ptr<ReadView const> lpLedger; auto const& params = context.params; auto jvResult = RPC::lookupLedger(lpLedger, context); if (!lpLedger) return jvResult; uint256 resumePoint; if (params.isMember (jss::marker)) { Json::Value const& jMarker = params[jss::marker]; if (! (jMarker.isString () && resumePoint.SetHex (jMarker.asString ()))) return RPC::expected_field_error (jss::marker, "valid"); } bool isBinary = params[jss::binary].asBool(); int limit = -1; int maxLimit = isBinary ? BINARY_PAGE_LENGTH : JSON_PAGE_LENGTH; if (params.isMember (jss::limit)) { Json::Value const& jLimit = params[jss::limit]; if (!jLimit.isIntegral ()) return RPC::expected_field_error (jss::limit, "integer"); limit = jLimit.asInt (); } if ((limit < 0) || ((limit > maxLimit) && (context.role != Role::ADMIN))) limit = maxLimit; jvResult[jss::ledger_hash] = to_string (lpLedger->info().hash); jvResult[jss::ledger_index] = std::to_string(lpLedger->info().seq); Json::Value& nodes = (jvResult[jss::state] = Json::arrayValue); forEachSLE(*lpLedger, [&] (SLE const& sle) { if (limit-- <= 0) { auto marker = sle.key(); jvResult[jss::marker] = to_string (--marker); return false; } if (isBinary) { Json::Value& entry = nodes.append (Json::objectValue); entry[jss::data] = serializeHex(sle); entry[jss::index] = to_string (sle.key()); } else { Json::Value& entry = nodes.append (sle.getJson (0)); entry[jss::index] = to_string (sle.key()); } return true; }); return jvResult; }
// Get state nodes from a ledger // Inputs: // limit: integer, maximum number of entries // marker: opaque, resume point // binary: boolean, format // Outputs: // ledger_hash: chosen ledger's hash // ledger_index: chosen ledger's index // state: array of state nodes // marker: resume point, if any Json::Value doLedgerData (RPC::Context& context) { std::shared_ptr<ReadView const> lpLedger; auto const& params = context.params; auto jvResult = RPC::lookupLedger(lpLedger, context); if (!lpLedger) return jvResult; boost::optional<ReadView::key_type> key = ReadView::key_type(); if (params.isMember (jss::marker)) { Json::Value const& jMarker = params[jss::marker]; if (! (jMarker.isString () && key->SetHex (jMarker.asString ()))) return RPC::expected_field_error (jss::marker, "valid"); } bool isBinary = params[jss::binary].asBool(); int limit = -1; if (params.isMember (jss::limit)) { Json::Value const& jLimit = params[jss::limit]; if (!jLimit.isIntegral ()) return RPC::expected_field_error (jss::limit, "integer"); limit = jLimit.asInt (); } auto maxLimit = RPC::Tuning::pageLength(isBinary); if ((limit < 0) || ((limit > maxLimit) && (context.role != Role::ADMIN))) limit = maxLimit; jvResult[jss::ledger_hash] = to_string (lpLedger->info().hash); jvResult[jss::ledger_index] = lpLedger->info().seq; Json::Value& nodes = jvResult[jss::state]; auto e = lpLedger->sles.end(); for (auto i = lpLedger->sles.upper_bound(*key); i != e; ++i) { auto sle = lpLedger->read(keylet::unchecked((*i)->key())); if (limit-- <= 0) { // Stop processing before the current key. auto k = sle->key(); jvResult[jss::marker] = to_string(--k); break; } if (isBinary) { Json::Value& entry = nodes.append (Json::objectValue); entry[jss::data] = serializeHex(*sle); entry[jss::index] = to_string(sle->key()); } else { Json::Value& entry = nodes.append (sle->getJson (0)); entry[jss::index] = to_string(sle->key()); } } return jvResult; }