43 std::shared_ptr<BackendInterface> backend_;
49 : backend_{backend}, numDiffs_{numDiffs}
53 [[nodiscard]] std::vector<CursorPair>
54 getCursors(uint32_t
const seq)
const override
56 namespace rg = std::ranges;
57 namespace vs = std::views;
59 auto diffs = std::vector<data::LedgerObject>{};
61 auto const append = [](
auto&& a,
auto&& b) { a.insert(std::end(a), std::begin(b), std::end(b)); };
62 auto const fetchDiff = [
this, seq](uint32_t offset) {
64 return backend_->fetchLedgerDiff(seq - offset, yield);
68 rg::for_each(vs::iota(0u, numDiffs_), [&](
auto i) { append(diffs, fetchDiff(i)); });
69 rg::sort(diffs, [](
auto const& a,
auto const& b) {
70 return a.key < b.key or (a.key == b.key and std::size(a.blob) < std::size(b.blob));
73 auto const [removalCursor, last] =
74 rg::unique(diffs, [](
auto const& a,
auto const& b) {
return a.key == b.key; });
75 diffs.erase(removalCursor, last);
77 std::vector<ripple::uint256> cursors{data::kFIRST_KEY};
80 | vs::filter([](
auto const& obj) {
return not obj.blob.empty(); })
81 | vs::transform([](
auto const& obj) {
return obj.key; }),
82 std::back_inserter(cursors)
84 cursors.push_back(data::kLAST_KEY);
86 std::vector<CursorPair> pairs;
87 pairs.reserve(cursors.size());
92 std::prev(std::end(cursors)),
93 std::next(std::begin(cursors)),
94 std::back_inserter(pairs),
95 [](
auto&& a,
auto&& b) ->
CursorPair {
return {a, b}; }
auto synchronousAndRetryOnTimeout(FnType &&func)
Synchronously execute the given function object and retry until no DatabaseTimeout is thrown.
Definition BackendInterface.hpp:130