24 std::shared_ptr<BackendInterface> backend_;
29 CursorFromFixDiffNumProvider(std::shared_ptr<BackendInterface> backend,
size_t numDiffs)
30 : backend_{std::move(backend)}, numDiffs_{numDiffs}
34 [[nodiscard]] std::vector<CursorPair>
35 getCursors(uint32_t
const seq)
const override
37 namespace rg = std::ranges;
38 namespace vs = std::views;
40 auto diffs = std::vector<data::LedgerObject>{};
42 auto const append = [](
auto&& a,
auto&& b) {
43 a.insert(std::end(a), std::begin(b), std::end(b));
45 auto const fetchDiff = [
this, seq](uint32_t offset) {
47 return backend_->fetchLedgerDiff(seq - offset, yield);
51 rg::for_each(vs::iota(0u, numDiffs_), [&](
auto i) { append(diffs, fetchDiff(i)); });
52 rg::sort(diffs, [](
auto const& a,
auto const& b) {
53 return a.key < b.key or (a.key == b.key and std::size(a.blob) < std::size(b.blob));
56 auto const [removalCursor, last] =
57 rg::unique(diffs, [](
auto const& a,
auto const& b) {
return a.key == b.key; });
58 diffs.erase(removalCursor, last);
60 std::vector<ripple::uint256> cursors{data::kFIRST_KEY};
63 | vs::filter([](
auto const& obj) {
return not obj.blob.empty(); })
64 | vs::transform([](
auto const& obj) {
return obj.key; }),
65 std::back_inserter(cursors)
67 cursors.push_back(data::kLAST_KEY);
69 std::vector<CursorPair> pairs;
70 pairs.reserve(cursors.size());
75 std::prev(std::end(cursors)),
76 std::next(std::begin(cursors)),
77 std::back_inserter(pairs),
78 [](
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:117