1#include <xrpld/rpc/GRPCHandlers.h>
2#include <xrpld/rpc/detail/RPCHelpers.h>
9 org::xrpl::rpc::v1::GetLedgerDiffRequest& request = context.
params;
10 org::xrpl::rpc::v1::GetLedgerDiffResponse response;
11 grpc::Status status = grpc::Status::OK;
18 grpc::Status errorStatus{
19 grpc::StatusCode::NOT_FOUND,
"base ledger not found"};
20 return {response, errorStatus};
24 desiredLedgerRv, request.desired_ledger(), context))
26 grpc::Status errorStatus{
27 grpc::StatusCode::NOT_FOUND,
"desired ledger not found"};
28 return {response, errorStatus};
32 std::dynamic_pointer_cast<Ledger const>(baseLedgerRv);
35 grpc::Status errorStatus{
36 grpc::StatusCode::NOT_FOUND,
"base ledger not validated"};
37 return {response, errorStatus};
41 std::dynamic_pointer_cast<Ledger const>(desiredLedgerRv);
44 grpc::Status errorStatus{
45 grpc::StatusCode::NOT_FOUND,
"base ledger not validated"};
46 return {response, errorStatus};
53 bool res = baseLedger->stateMap().compare(
54 desiredLedger->stateMap(), differences, maxDifferences);
57 grpc::Status errorStatus{
58 grpc::StatusCode::RESOURCE_EXHAUSTED,
59 "too many differences between specified ledgers"};
60 return {response, errorStatus};
63 for (
auto& [k, v] : differences)
65 auto diff = response.mutable_ledger_objects()->add_objects();
66 auto inBase = v.first;
67 auto inDesired = v.second;
72 diff->set_key(k.data(), k.size());
77 inDesired->size() > 0,
78 "ripple::doLedgerDiffGrpc : non-empty desired");
79 diff->set_key(k.data(), k.size());
80 if (request.include_blobs())
82 diff->set_data(inDesired->data(), inDesired->size());
86 return {response, status};
Status ledgerFromSpecifier(T &ledger, org::xrpl::rpc::v1::LedgerSpecifier const &specifier, Context &context)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::pair< org::xrpl::rpc::v1::GetLedgerDiffResponse, grpc::Status > doLedgerDiffGrpc(RPC::GRPCContext< org::xrpl::rpc::v1::GetLedgerDiffRequest > &context)