121 org::xrpl::rpc::v1::GetLedgerRequest& request = context.
params;
122 org::xrpl::rpc::v1::GetLedgerResponse response;
123 grpc::Status status = grpc::Status::OK;
128 grpc::Status errorStatus;
131 errorStatus = grpc::Status(
132 grpc::StatusCode::INVALID_ARGUMENT, status.message());
137 grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
139 return {response, errorStatus};
143 addRaw(ledger->header(), s,
true);
147 if (request.transactions())
151 for (
auto& i : ledger->txs)
154 i.first,
"xrpl::doLedgerGrpc : non-null transaction");
155 if (request.expand())
157 auto txn = response.mutable_transactions_list()
158 ->add_transactions();
169 auto const& hash = i.first->getTransactionID();
170 response.mutable_hashes_list()->add_hashes(
171 hash.data(), hash.size());
178 << __func__ <<
" - Error deserializing transaction in ledger "
179 << ledger->header().seq
180 <<
" . skipping transaction and following transactions. You "
181 "should look into this further";
185 if (request.get_objects())
194 grpc::Status errorStatus{
195 grpc::StatusCode::NOT_FOUND,
"parent ledger not validated"};
196 return {response, errorStatus};
203 grpc::Status errorStatus{
204 grpc::StatusCode::NOT_FOUND,
"ledger not validated"};
205 return {response, errorStatus};
211 bool res = base->stateMap().compare(
212 desired->stateMap(), differences, maxDifferences);
215 grpc::Status errorStatus{
216 grpc::StatusCode::RESOURCE_EXHAUSTED,
217 "too many differences between specified ledgers"};
218 return {response, errorStatus};
221 for (
auto& [k, v] : differences)
223 auto obj = response.mutable_ledger_objects()->add_objects();
224 auto inBase = v.first;
225 auto inDesired = v.second;
227 obj->set_key(k.data(), k.size());
231 inDesired->size() > 0,
232 "xrpl::doLedgerGrpc : non-empty desired");
233 obj->set_data(inDesired->data(), inDesired->size());
235 if (inBase && inDesired)
237 org::xrpl::rpc::v1::RawLedgerObject::MODIFIED);
238 else if (inBase && !inDesired)
239 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::DELETED);
241 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::CREATED);
242 auto const blob = inDesired ? inDesired->slice() : inBase->slice();
243 auto const objectType =
246 if (request.get_object_neighbors())
248 if (!(inBase && inDesired))
250 auto lb = desired->stateMap().lower_bound(k);
251 auto ub = desired->stateMap().upper_bound(k);
252 if (lb != desired->stateMap().end())
253 obj->set_predecessor(
254 lb->key().data(), lb->key().size());
255 if (ub != desired->stateMap().end())
256 obj->set_successor(ub->key().data(), ub->key().size());
257 if (objectType == ltDIR_NODE)
260 if (!sle->isFieldPresent(sfOwner))
263 if (!inBase && inDesired)
266 desired->stateMap().upper_bound(
268 if (firstBook != desired->stateMap().end() &&
271 firstBook->key() == k)
273 auto succ = response.add_book_successors();
276 bookBase.key.size());
277 succ->set_first_book(
278 firstBook->key().data(),
279 firstBook->key().size());
282 if (inBase && !inDesired)
285 base->stateMap().upper_bound(bookBase.key);
286 if (oldFirstBook != base->stateMap().end() &&
287 oldFirstBook->key() <
289 oldFirstBook->key() == k)
291 auto succ = response.add_book_successors();
294 bookBase.key.size());
296 desired->stateMap().upper_bound(
300 desired->stateMap().end() &&
301 newFirstBook->key() <
304 succ->set_first_book(
305 newFirstBook->key().data(),
306 newFirstBook->key().size());
315 response.set_objects_included(
true);
316 response.set_object_neighbors_included(request.get_object_neighbors());
317 response.set_skiplist_included(
true);
324 std::chrono::duration_cast<std::chrono::milliseconds>(end - begin)
327 JLOG(context.
j.
warn())
328 << __func__ <<
" - Extract time = " << duration
329 <<
" - num objects = " << response.ledger_objects().objects_size()
330 <<
" - num txns = " << response.transactions_list().transactions_size()
332 << duration / response.ledger_objects().objects_size()
334 << duration / response.transactions_list().transactions_size();
336 return {response, status};
Resource::Charge & loadType