Ejemplo n.º 1
0
// 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;
}
Ejemplo n.º 2
0
// 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;
}