84 org::xrpl::rpc::v1::GetLedgerRequest& request = context.
params;
85 org::xrpl::rpc::v1::GetLedgerResponse response;
86 grpc::Status status = grpc::Status::OK;
91 grpc::Status errorStatus;
94 errorStatus = grpc::Status(
95 grpc::StatusCode::INVALID_ARGUMENT, status.message());
100 grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
102 return {response, errorStatus};
106 addRaw(ledger->info(), s,
true);
110 if (request.transactions())
114 for (
auto& i : ledger->txs)
117 i.first,
"ripple::doLedgerGrpc : non-null transaction");
118 if (request.expand())
120 auto txn = response.mutable_transactions_list()
121 ->add_transactions();
132 auto const& hash = i.first->getTransactionID();
133 response.mutable_hashes_list()->add_hashes(
134 hash.data(), hash.size());
141 << __func__ <<
" - Error deserializing transaction in ledger "
142 << ledger->info().seq
143 <<
" . skipping transaction and following transactions. You "
144 "should look into this further";
148 if (request.get_objects())
157 grpc::Status errorStatus{
158 grpc::StatusCode::NOT_FOUND,
"parent ledger not validated"};
159 return {response, errorStatus};
166 grpc::Status errorStatus{
167 grpc::StatusCode::NOT_FOUND,
"ledger not validated"};
168 return {response, errorStatus};
174 bool res = base->stateMap().compare(
175 desired->stateMap(), differences, maxDifferences);
178 grpc::Status errorStatus{
179 grpc::StatusCode::RESOURCE_EXHAUSTED,
180 "too many differences between specified ledgers"};
181 return {response, errorStatus};
184 for (
auto& [k, v] : differences)
186 auto obj = response.mutable_ledger_objects()->add_objects();
187 auto inBase = v.first;
188 auto inDesired = v.second;
190 obj->set_key(k.data(), k.size());
194 inDesired->size() > 0,
195 "ripple::doLedgerGrpc : non-empty desired");
196 obj->set_data(inDesired->data(), inDesired->size());
198 if (inBase && inDesired)
200 org::xrpl::rpc::v1::RawLedgerObject::MODIFIED);
201 else if (inBase && !inDesired)
202 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::DELETED);
204 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::CREATED);
205 auto const blob = inDesired ? inDesired->slice() : inBase->slice();
206 auto const objectType =
209 if (request.get_object_neighbors())
211 if (!(inBase && inDesired))
213 auto lb = desired->stateMap().lower_bound(k);
214 auto ub = desired->stateMap().upper_bound(k);
215 if (lb != desired->stateMap().end())
216 obj->set_predecessor(
217 lb->key().data(), lb->key().size());
218 if (ub != desired->stateMap().end())
219 obj->set_successor(ub->key().data(), ub->key().size());
220 if (objectType == ltDIR_NODE)
223 if (!sle->isFieldPresent(sfOwner))
226 if (!inBase && inDesired)
229 desired->stateMap().upper_bound(
231 if (firstBook != desired->stateMap().end() &&
234 firstBook->key() == k)
236 auto succ = response.add_book_successors();
239 bookBase.key.size());
240 succ->set_first_book(
241 firstBook->key().data(),
242 firstBook->key().size());
245 if (inBase && !inDesired)
248 base->stateMap().upper_bound(bookBase.key);
249 if (oldFirstBook != base->stateMap().end() &&
250 oldFirstBook->key() <
252 oldFirstBook->key() == k)
254 auto succ = response.add_book_successors();
257 bookBase.key.size());
259 desired->stateMap().upper_bound(
263 desired->stateMap().end() &&
264 newFirstBook->key() <
267 succ->set_first_book(
268 newFirstBook->key().data(),
269 newFirstBook->key().size());
278 response.set_objects_included(
true);
279 response.set_object_neighbors_included(request.get_object_neighbors());
280 response.set_skiplist_included(
true);
287 std::chrono::duration_cast<std::chrono::milliseconds>(end - begin)
290 JLOG(context.
j.
warn())
291 << __func__ <<
" - Extract time = " << duration
292 <<
" - num objects = " << response.ledger_objects().objects_size()
293 <<
" - num txns = " << response.transactions_list().transactions_size()
295 << duration / response.ledger_objects().objects_size()
297 << duration / response.transactions_list().transactions_size();
299 return {response, status};
Resource::Charge & loadType