129 org::xrpl::rpc::v1::GetLedgerRequest
const& request = context.
params;
130 org::xrpl::rpc::v1::GetLedgerResponse response;
131 grpc::Status
const status = grpc::Status::OK;
136 grpc::Status errorStatus;
139 errorStatus = grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, status.message());
143 errorStatus = grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
145 return {response, errorStatus};
149 addRaw(ledger->header(), s,
true);
153 if (request.transactions())
157 for (
auto& i : ledger->txs)
159 XRPL_ASSERT(i.first,
"xrpl::doLedgerGrpc : non-null transaction");
160 if (request.expand())
162 auto txn = response.mutable_transactions_list()->add_transactions();
163 Serializer const sTxn = i.first->getSerializer();
167 Serializer const sMeta = i.second->getSerializer();
173 auto const& hash = i.first->getTransactionID();
174 response.mutable_hashes_list()->add_hashes(hash.data(), hash.size());
180 JLOG(context.
j.
error()) << __func__ <<
" - Error deserializing transaction in ledger "
181 << ledger->header().seq
182 <<
" . skipping transaction and following transactions. You "
183 "should look into this further";
187 if (request.get_objects())
195 grpc::Status
const errorStatus{
196 grpc::StatusCode::NOT_FOUND,
"parent ledger not validated"};
197 return {response, errorStatus};
204 grpc::Status
const errorStatus{grpc::StatusCode::NOT_FOUND,
"ledger not validated"};
205 return {response, errorStatus};
211 bool const res = base->stateMap().compare(desired->stateMap(), differences, maxDifferences);
214 grpc::Status
const errorStatus{
215 grpc::StatusCode::RESOURCE_EXHAUSTED,
216 "too many differences between specified ledgers"};
217 return {response, errorStatus};
220 for (
auto& [k, v] : differences)
222 auto obj = response.mutable_ledger_objects()->add_objects();
223 auto inBase = v.first;
224 auto inDesired = v.second;
226 obj->set_key(k.data(), k.size());
229 XRPL_ASSERT(inDesired->size() > 0,
"xrpl::doLedgerGrpc : non-empty desired");
230 obj->set_data(inDesired->data(), inDesired->size());
232 if (inBase && inDesired)
234 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::MODIFIED);
236 else if (inBase && !inDesired)
238 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::DELETED);
242 obj->set_mod_type(org::xrpl::rpc::v1::RawLedgerObject::CREATED);
244 auto const blob = inDesired ? inDesired->slice() : inBase->slice();
245 auto const objectType =
static_cast<LedgerEntryType>(blob[1] << 8 | blob[2]);
247 if (request.get_object_neighbors())
249 if (!(inBase && inDesired))
251 auto lb = desired->stateMap().lowerBound(k);
252 auto ub = desired->stateMap().upperBound(k);
253 if (lb != desired->stateMap().end())
254 obj->set_predecessor(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)
265 auto firstBook = desired->stateMap().upperBound(bookBase.key);
266 if (firstBook != desired->stateMap().end() &&
268 firstBook->key() == k)
270 auto succ = response.add_book_successors();
271 succ->set_book_base(bookBase.key.data(), bookBase.key.size());
272 succ->set_first_book(
273 firstBook->key().data(), firstBook->key().size());
276 if (inBase && !inDesired)
278 auto oldFirstBook = base->stateMap().upperBound(bookBase.key);
279 if (oldFirstBook != base->stateMap().end() &&
281 oldFirstBook->key() == k)
283 auto succ = response.add_book_successors();
284 succ->set_book_base(bookBase.key.data(), bookBase.key.size());
286 desired->stateMap().upperBound(bookBase.key);
288 if (newFirstBook != desired->stateMap().end() &&
291 succ->set_first_book(
292 newFirstBook->key().data(), newFirstBook->key().size());
301 response.set_objects_included(
true);
302 response.set_object_neighbors_included(request.get_object_neighbors());
303 response.set_skiplist_included(
true);
313 auto const numObjects = response.ledger_objects().objects_size();
314 auto const numTxns = response.transactions_list().transactions_size();
317 JLOG(context.
j.
warn()) << __func__ <<
" - Extract time = " << duration
318 <<
" - num objects = " << numObjects <<
" - num txns = " << numTxns
319 <<
" - ms per obj " << msPerObj <<
" - ms per txn " << msPerTxn;
321 return {response, status};
LedgerMaster & ledgerMaster