5#include <userver/storages/mysql/statement_result_set.hpp>
9namespace storages::
mysql {
16class CursorResultSet final {
18 explicit CursorResultSet(StatementResultSet&& result_set);
21 CursorResultSet(
const CursorResultSet& other) =
delete;
22 CursorResultSet(CursorResultSet&& other)
noexcept;
30 template <
typename RowCallback>
31 void ForEach(RowCallback&& row_callback, engine::Deadline deadline) &&;
34 StatementResultSet result_set_;
38CursorResultSet<T>::CursorResultSet(StatementResultSet&& result_set)
39 : result_set_{std::move(result_set)}
43CursorResultSet<T>::~CursorResultSet() =
default;
46CursorResultSet<T>::CursorResultSet(CursorResultSet<T>&& other)
noexcept =
default;
49template <
typename RowCallback>
51 RowCallback&& row_callback,
55 using IntermediateStorage = std::vector<T>;
57 bool keep_going =
true;
58 auto extractor = impl::io::TypedExtractor<IntermediateStorage, T,
RowTag>{};
61 tracing::ScopeTime fetch{impl::tracing::kFetchScope};
62 keep_going = result_set_.FetchResult(extractor);
64 fetch.Reset(impl::tracing::kForEachScope);
65 IntermediateStorage data{extractor.ExtractData()};
66 for (
auto&& row : data) {
67 row_callback(std::move(row));