diff --git a/handlers/LedgerEntry.cpp b/handlers/LedgerEntry.cpp new file mode 100644 index 00000000..724db6c8 --- /dev/null +++ b/handlers/LedgerEntry.cpp @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include +// { +// ledger_hash : +// ledger_index : +// ... +// } +boost::json::object +doLedgerEntry( + boost::json::object const& request, + BackendInterface const& backend) +{ + boost::json::object response; + bool binary = + request.contains("binary") ? request.at("binary").as_bool() : false; + auto ledgerSequence = ledgerSequenceFromRequest(request, backend); + if (!ledgerSequence) + { + response["error"] = "Empty database"; + return response; + } + ripple::uint256 key; + if (!key.parseHex(request.at("index").as_string().c_str())) + { + response["error"] = "Error parsing index"; + return response; + } + auto start = std::chrono::system_clock::now(); + auto dbResponse = backend.fetchLedgerObject(key, *ledgerSequence); + auto end = std::chrono::system_clock::now(); + auto time = + std::chrono::duration_cast(end - start) + .count(); + if (!dbResponse or dbResponse->size() == 0) + { + response["error"] = "Object not found"; + return response; + } + if (binary) + { + response["object"] = ripple::strHex(*dbResponse); + } + else + { + ripple::STLedgerEntry sle{ + ripple::SerialIter{dbResponse->data(), dbResponse->size()}, key}; + response["object"] = getJson(sle); + } + + return response; +} +