102 org::xrpl::rpc::v1::GetLedgerRequest& request = context.
params;
103 org::xrpl::rpc::v1::GetLedgerResponse response;
104 grpc::Status status = grpc::Status::OK;
109 grpc::Status errorStatus;
112 errorStatus = grpc::Status(
113 grpc::StatusCode::INVALID_ARGUMENT, status.message());
118 grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
120 return {response, errorStatus};
124 addRaw(ledger->info(), s,
true);
128 if (request.transactions())
132 for (
auto& i : ledger->txs)
135 i.first,
"ripple::doLedgerGrpc : non-null transaction");
136 if (request.expand())
138 auto txn = response.mutable_transactions_list()
139 ->add_transactions();
150 auto const& hash = i.first->getTransactionID();
151 response.mutable_hashes_list()->add_hashes(
152 hash.data(), hash.size());
159 << __func__ <<
" - Error deserializing transaction in ledger "
160 << ledger->info().seq
161 <<
" . skipping transaction and following transactions. You "
162 "should look into this further";
166 if (request.get_objects())
175 grpc::Status errorStatus{
176 grpc::StatusCode::NOT_FOUND,
"parent ledger not validated"};
177 return {response, errorStatus};
184 grpc::Status errorStatus{
185 grpc::StatusCode::NOT_FOUND,
"ledger not validated"};
186 return {response, errorStatus};
192 bool res = base->stateMap().compare(
193 desired->stateMap(), differences, maxDifferences);
196 grpc::Status errorStatus{
197 grpc::StatusCode::RESOURCE_EXHAUSTED,
198 "too many differences between specified ledgers"};
199 return {response, errorStatus};
202 for (
auto& [k, v] : differences)
204 auto obj = response.mutable_ledger_objects()->add_objects();
205 auto inBase = v.first;
206 auto inDesired = v.second;
208 obj->set_key(k.data(), k.size());
212 inDesired->size() > 0,
213 "ripple::doLedgerGrpc : non-empty desired");
214 obj->set_data(inDesired->data(), inDesired->size());
216 if (inBase && inDesired)
218 org::xrpl::rpc::v1::RawLedgerObject::MODIFIED);
219 else if (inBase && !inDesired)
220 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::DELETED);
222 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::CREATED);
223 auto const blob = inDesired ? inDesired->slice() : inBase->slice();
224 auto const objectType =
227 if (request.get_object_neighbors())
229 if (!(inBase && inDesired))
231 auto lb = desired->stateMap().lower_bound(k);
232 auto ub = desired->stateMap().upper_bound(k);
233 if (lb != desired->stateMap().end())
234 obj->set_predecessor(
235 lb->key().data(), lb->key().size());
236 if (ub != desired->stateMap().end())
237 obj->set_successor(ub->key().data(), ub->key().size());
238 if (objectType == ltDIR_NODE)
241 if (!sle->isFieldPresent(sfOwner))
244 if (!inBase && inDesired)
247 desired->stateMap().upper_bound(
249 if (firstBook != desired->stateMap().end() &&
252 firstBook->key() == k)
254 auto succ = response.add_book_successors();
257 bookBase.key.size());
258 succ->set_first_book(
259 firstBook->key().data(),
260 firstBook->key().size());
263 if (inBase && !inDesired)
266 base->stateMap().upper_bound(bookBase.key);
267 if (oldFirstBook != base->stateMap().end() &&
268 oldFirstBook->key() <
270 oldFirstBook->key() == k)
272 auto succ = response.add_book_successors();
275 bookBase.key.size());
277 desired->stateMap().upper_bound(
281 desired->stateMap().end() &&
282 newFirstBook->key() <
285 succ->set_first_book(
286 newFirstBook->key().data(),
287 newFirstBook->key().size());
296 response.set_objects_included(
true);
297 response.set_object_neighbors_included(request.get_object_neighbors());
298 response.set_skiplist_included(
true);
305 std::chrono::duration_cast<std::chrono::milliseconds>(end - begin)
308 JLOG(context.
j.
warn())
309 << __func__ <<
" - Extract time = " << duration
310 <<
" - num objects = " << response.ledger_objects().objects_size()
311 <<
" - num txns = " << response.transactions_list().transactions_size()
313 << duration / response.ledger_objects().objects_size()
315 << duration / response.transactions_list().transactions_size();
317 return {response, status};
Resource::Charge & loadType