13 #ifndef PQXX_H_STREAM_FROM 14 #define PQXX_H_STREAM_FROM 16 #include "pqxx/compiler-public.hxx" 17 #include "pqxx/internal/compiler-internal-pre.hxx" 19 #include "pqxx/separated_list.hxx" 20 #include "pqxx/transaction_base.hxx" 30 stream_from(transaction_base &, std::string_view table_name);
31 template<
typename Columns>
33 transaction_base &, std::string_view table_name, Columns
const &columns);
34 template<
typename Iter>
36 transaction_base &, std::string_view table_name, Iter columns_begin,
41 [[nodiscard]]
operator bool() const noexcept {
return not m_finished; }
42 [[nodiscard]]
bool operator!() const noexcept {
return m_finished; }
53 bool get_raw_line(std::string &);
54 template<
typename Tuple>
stream_from &operator>>(Tuple &);
57 template<
typename... Vs>
58 stream_from &operator>>(std::variant<Vs...> &) =
delete;
61 internal::encoding_group m_copy_encoding =
62 internal::encoding_group::MONOBYTE;
63 std::string m_current_line;
64 bool m_finished =
false;
65 bool m_retry_line =
false;
67 void set_up(transaction_base &, std::string_view table_name);
69 transaction_base &, std::string_view table_name,
70 std::string
const &columns);
75 std::string
const &, std::string::size_type &, std::string &)
const;
79 std::string
const &line, T &t, std::string::size_type &here,
80 std::string &workspace)
const;
82 template<
typename Tuple, std::size_t... I>
84 const std::string &line, Tuple &t, std::string &workspace,
85 std::index_sequence<I...>)
87 std::string::size_type here{};
88 (extract_value(line, std::get<I>(t), here, workspace), ...);
90 here < line.size() and
91 not(here == line.size() - 1 and line[here] ==
'\n'))
92 throw usage_error{
"Not all fields extracted from stream_from line"};
97 template<
typename Columns>
99 transaction_base &tb, std::string_view table_name, Columns
const &columns) :
100 stream_from{tb, table_name, std::begin(columns), std::end(columns)}
104 template<
typename Iter>
106 transaction_base &tb, std::string_view table_name, Iter columns_begin,
108 namedclass{
"stream_from", table_name}, transactionfocus{tb}
110 set_up(tb, table_name,
separated_list(
",", columns_begin, columns_end));
118 std::string workspace;
121 constexpr
auto tsize = std::tuple_size_v<Tuple>;
122 using indexes = std::make_index_sequence<tsize>;
123 do_extract(m_current_line, t, workspace, indexes{});
124 m_retry_line =
false;
137 void stream_from::extract_value(
138 std::string
const &line, T &t, std::string::size_type &here,
139 std::string &workspace)
const 141 if (extract_field(line, here, workspace))
142 t = from_string<T>(workspace);
143 else if constexpr (nullness<T>::has_null)
144 t = nullness<T>::null();
146 internal::throw_null_conversion(type_name<T>);
150 void PQXX_LIBEXPORT stream_from::extract_value<std::nullptr_t>(
151 std::string
const &line, std::nullptr_t &, std::string::size_type &here,
152 std::string &workspace)
const;
155 #include "pqxx/internal/compiler-internal-post.hxx" stream_from(transaction_base &, std::string_view table_name)
Definition: stream_from.cxx:58
Definition: transaction_base.hxx:42
std::string separated_list(std::string_view sep, ITER begin, ITER end, ACCESS access)
Represent sequence of values as a string, joined by a given separator.
Definition: separated_list.hxx:40
bool operator!() const noexcept
Definition: stream_from.hxx:42
Dedicated namespace for helper types related to prepared statements.
Definition: array.hxx:25
Efficiently pull data directly out of a table.
Definition: stream_from.hxx:27
bool get_raw_line(std::string &)
Definition: stream_from.cxx:80
stream_from & operator>>(Tuple &)
Definition: stream_from.hxx:114