116 org::xrpl::rpc::v1::GetLedgerRequest
const& request = context.
params;
117 org::xrpl::rpc::v1::GetLedgerResponse response;
118 grpc::Status
const status = grpc::Status::OK;
123 grpc::Status errorStatus;
126 errorStatus = grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, status.message());
130 errorStatus = grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
132 return {response, errorStatus};
136 addRaw(ledger->header(), s,
true);
140 if (request.transactions())
144 for (
auto& i : ledger->txs)
146 XRPL_ASSERT(i.first,
"xrpl::doLedgerGrpc : non-null transaction");
147 if (request.expand())
149 auto txn = response.mutable_transactions_list()->add_transactions();
150 Serializer const sTxn = i.first->getSerializer();
154 Serializer const sMeta = i.second->getSerializer();
160 auto const& hash = i.first->getTransactionID();
161 response.mutable_hashes_list()->add_hashes(hash.data(), hash.size());
167 JLOG(context.
j.
error()) << __func__ <<
" - Error deserializing transaction in ledger "
168 << ledger->header().seq
169 <<
" . skipping transaction and following transactions. You "
170 "should look into this further";
174 if (request.get_objects())
182 grpc::Status
const errorStatus{
183 grpc::StatusCode::NOT_FOUND,
"parent ledger not validated"};
184 return {response, errorStatus};
191 grpc::Status
const errorStatus{grpc::StatusCode::NOT_FOUND,
"ledger not validated"};
192 return {response, errorStatus};
198 bool const res = base->stateMap().compare(desired->stateMap(), differences, maxDifferences);
201 grpc::Status
const errorStatus{
202 grpc::StatusCode::RESOURCE_EXHAUSTED,
203 "too many differences between specified ledgers"};
204 return {response, errorStatus};
207 for (
auto& [k, v] : differences)
209 auto obj = response.mutable_ledger_objects()->add_objects();
210 auto inBase = v.first;
211 auto inDesired = v.second;
213 obj->set_key(k.data(), k.size());
216 XRPL_ASSERT(inDesired->size() > 0,
"xrpl::doLedgerGrpc : non-empty desired");
217 obj->set_data(inDesired->data(), inDesired->size());
219 if (inBase && inDesired)
221 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::MODIFIED);
223 else if (inBase && !inDesired)
225 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::DELETED);
229 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::CREATED);
231 auto const blob = inDesired ? inDesired->slice() : inBase->slice();
232 auto const objectType =
static_cast<LedgerEntryType>(blob[1] << 8 | blob[2]);
234 if (request.get_object_neighbors())
236 if (!(inBase && inDesired))
238 auto lb = desired->stateMap().lower_bound(k);
239 auto ub = desired->stateMap().upper_bound(k);
240 if (lb != desired->stateMap().end())
241 obj->set_predecessor(lb->key().data(), lb->key().size());
242 if (ub != desired->stateMap().end())
243 obj->set_successor(ub->key().data(), ub->key().size());
244 if (objectType == ltDIR_NODE)
247 if (!sle->isFieldPresent(sfOwner))
250 if (!inBase && inDesired)
252 auto firstBook = desired->stateMap().upper_bound(bookBase.key);
253 if (firstBook != desired->stateMap().end() &&
255 firstBook->key() == k)
257 auto succ = response.add_book_successors();
258 succ->set_book_base(bookBase.key.data(), bookBase.key.size());
259 succ->set_first_book(
260 firstBook->key().data(), firstBook->key().size());
263 if (inBase && !inDesired)
265 auto oldFirstBook = base->stateMap().upper_bound(bookBase.key);
266 if (oldFirstBook != base->stateMap().end() &&
268 oldFirstBook->key() == k)
270 auto succ = response.add_book_successors();
271 succ->set_book_base(bookBase.key.data(), bookBase.key.size());
273 desired->stateMap().upper_bound(bookBase.key);
275 if (newFirstBook != desired->stateMap().end() &&
278 succ->set_first_book(
279 newFirstBook->key().data(), newFirstBook->key().size());
288 response.set_objects_included(
true);
289 response.set_object_neighbors_included(request.get_object_neighbors());
290 response.set_skiplist_included(
true);
297 std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count() * 1.0;
298 JLOG(context.
j.
warn()) << __func__ <<
" - Extract time = " << duration
299 <<
" - num objects = " << response.ledger_objects().objects_size()
300 <<
" - num txns = " << response.transactions_list().transactions_size()
302 << duration / response.ledger_objects().objects_size()
304 << duration / response.transactions_list().transactions_size();
306 return {response, status};
Resource::Charge & loadType