Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
CursorFromAccountProvider.hpp
1#pragma once
2
3#include "data/BackendInterface.hpp"
4#include "data/Types.hpp"
5#include "etl/impl/BaseCursorProvider.hpp"
6
7#include <xrpl/basics/base_uint.h>
8
9#include <algorithm>
10#include <cstddef>
11#include <cstdint>
12#include <iterator>
13#include <memory>
14#include <set>
15#include <vector>
16
17namespace etl::impl {
18
19class CursorFromAccountProvider : public BaseCursorProvider {
20 std::shared_ptr<BackendInterface> backend_;
21 size_t numCursors_;
22 size_t pageSize_;
23
24public:
25 CursorFromAccountProvider(
26 std::shared_ptr<BackendInterface> backend,
27 size_t numCursors,
28 size_t pageSize
29 )
30 : backend_{std::move(backend)}, numCursors_{numCursors}, pageSize_{pageSize}
31 {
32 }
33
34 [[nodiscard]] std::vector<CursorPair>
35 getCursors(uint32_t const seq) const override
36 {
37 namespace rg = std::ranges;
38
39 auto accountRoots = [this, seq]() {
40 return data::synchronousAndRetryOnTimeout([this, seq](auto yield) {
41 return backend_->fetchAccountRoots(numCursors_, pageSize_, seq, yield);
42 });
43 }();
44
45 rg::sort(accountRoots);
46 std::vector<ripple::uint256> cursors{data::kFIRST_KEY};
47 rg::copy(accountRoots.begin(), accountRoots.end(), std::back_inserter(cursors));
48 rg::sort(cursors);
49 cursors.push_back(data::kLAST_KEY);
50
51 std::vector<CursorPair> pairs;
52 pairs.reserve(cursors.size());
53
54 // FIXME: this should be `cursors | vs::pairwise` (C++23)
55 std::transform(
56 std::begin(cursors),
57 std::prev(std::end(cursors)),
58 std::next(std::begin(cursors)),
59 std::back_inserter(pairs),
60 [](auto&& a, auto&& b) -> CursorPair { return {a, b}; }
61 );
62
63 return pairs;
64 }
65};
66
67} // namespace etl::impl
auto synchronousAndRetryOnTimeout(FnType &&func)
Synchronously execute the given function object and retry until no DatabaseTimeout is thrown.
Definition BackendInterface.hpp:117
Definition BaseCursorProvider.hpp:14
Definition BaseCursorProvider.hpp:9