13 #ifndef PQXX_H_STREAM_FROM 14 #define PQXX_H_STREAM_FROM 16 #if !defined(PQXX_HEADER_PRE) 17 # error "Include libpqxx headers as <pqxx/header>, not <pqxx/header.hxx>." 24 #include "pqxx/connection.hxx" 25 #include "pqxx/except.hxx" 26 #include "pqxx/internal/concat.hxx" 27 #include "pqxx/internal/encoding_group.hxx" 28 #include "pqxx/internal/stream_iterator.hxx" 29 #include "pqxx/separated_list.hxx" 30 #include "pqxx/transaction_focus.hxx" 81 std::pair<std::unique_ptr<char, std::function<void(char *)>>, std::size_t>;
95 #include "pqxx/internal/ignore-deprecated-pre.hxx" 97 #include "pqxx/internal/ignore-deprecated-post.hxx" 130 std::string_view columns =
""sv);
137 std::initializer_list<std::string_view> columns = {});
143 [[deprecated(
"Use query() factory instead.")]] stream_from(
144 transaction_base &, from_query_t, std::string_view query);
149 [[deprecated(
"Use table() or raw_table() factory instead.")]] stream_from(
150 transaction_base &, from_table_t, std::string_view table);
155 template<
typename Iter>
156 [[deprecated(
"Use table() or raw_table() factory instead.")]] stream_from(
157 transaction_base &, from_table_t, std::string_view table,
158 Iter columns_begin, Iter columns_end);
163 template<
typename Columns>
164 [[deprecated(
"Use table() or raw_table() factory instead.")]] stream_from(
165 transaction_base &tx, from_table_t, std::string_view table,
166 Columns
const &columns);
168 #include "pqxx/internal/ignore-deprecated-pre.hxx" 170 [[deprecated(
"Use the from_table_t overload instead.")]]
stream_from(
174 #include "pqxx/internal/ignore-deprecated-post.hxx" 177 template<
typename Columns>
178 [[deprecated(
"Use the from_table_t overload instead.")]]
stream_from(
184 template<
typename Iter>
185 [[deprecated(
"Use the from_table_t overload instead.")]] stream_from(
186 transaction_base &, std::string_view table, Iter columns_begin,
189 ~stream_from() noexcept;
192 [[nodiscard]] constexpr operator
bool() const noexcept
194 return not m_finished;
219 template<
typename Tuple>
stream_from &operator>>(Tuple &);
222 template<
typename... Vs>
223 stream_from &operator>>(std::variant<Vs...> &) =
delete;
230 template<
typename... TYPE> [[nodiscard]]
auto iter() &
232 return pqxx::internal::stream_input_iteration<TYPE...>{*
this};
252 std::vector<zview>
const *read_row() &;
256 raw_line get_raw_line();
271 template<
typename Tuple, std::size_t... indexes>
272 void extract_fields(Tuple &t, std::index_sequence<indexes...>)
const 274 (extract_value<Tuple, indexes>(t), ...);
277 pqxx::internal::glyph_scanner_func *m_glyph_scanner;
283 std::vector<zview> m_fields;
285 bool m_finished =
false;
289 template<
typename Tuple, std::
size_t index>
290 void extract_value(Tuple &)
const;
297 template<
typename Columns>
300 Columns
const &columns) :
302 tx,
from_table, table_name, std::begin(columns), std::end(columns)}
306 template<
typename Iter>
309 Iter columns_begin, Iter columns_end) :
320 static constexpr
auto tup_size{std::tuple_size_v<Tuple>};
321 m_fields.reserve(tup_size);
326 if (std::size(m_fields) != tup_size)
328 "Tried to extract ", tup_size,
" field(s) from a stream of ",
329 std::size(m_fields),
".")};
331 extract_fields(t, std::make_index_sequence<tup_size>{});
336 template<
typename Tuple, std::
size_t index>
337 inline void stream_from::extract_value(Tuple &t)
const 341 assert(index < std::size(m_fields));
342 if constexpr (nullity::always_null)
344 if (std::data(m_fields[index]) !=
nullptr)
347 else if (std::data(m_fields[index]) ==
nullptr)
349 if constexpr (nullity::has_null)
350 std::get<index>(t) = nullity::null();
357 std::get<index>(t) = from_string<field_type>(m_fields[index]);
auto iter() &
Iterate over this stream. Supports range-based "for" loops.
Definition: stream_from.hxx:230
Value conversion failed, e.g. when converting "Hello" to int.
Definition: except.hxx:187
stream_from & operator>>(Tuple &)
Read one row into a tuple.
Definition: stream_from.hxx:316
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:43
Traits describing a type's "null value," if any.
Definition: strconv.hxx:92
The home of all libpqxx classes, functions, templates, etc.
Definition: array.hxx:26
Marker for stream_from constructors: "stream from query.".
Definition: types.hxx:73
constexpr from_query_t from_query
Pass this to a stream_from constructor to stream query results.
Definition: stream_from.hxx:45
Stream data from the database.
Definition: stream_from.hxx:77
constexpr bool operator!() const noexcept
Has this stream produced all the data it is going to produce?
Definition: stream_from.hxx:197
Error in usage of libpqxx library, similar to std::logic_error.
Definition: except.hxx:173
Interface definition (and common code) for "transaction" classes.
Definition: transaction_base.hxx:76
constexpr from_table_t from_table
Pass this to a stream_from constructor to stream table contents.
Definition: stream_from.hxx:35
std::initializer_list< std::string_view > table_path
Representation of a PostgreSQL table path.
Definition: connection.hxx:123
Marker for stream_from constructors: "stream from table.".
Definition: types.hxx:67
stream_from(transaction_base &tx, std::string_view table)
Definition: stream_from.hxx:170
std::pair< std::unique_ptr< char, std::function< void(char *)> >, std::size_t > raw_line
Definition: stream_from.hxx:81
Base class for things that monopolise a transaction's attention.
Definition: transaction_focus.hxx:28
void PQXX_COLD throw_null_conversion(std::string const &type)
Definition: strconv.cxx:253
stream_from(transaction_base &tx, std::string_view table, Columns const &columns)
End a code block started by "ignore-deprecated-pre.hxx".
Definition: stream_from.hxx:178
static stream_from query(transaction_base &tx, std::string_view q)
Factory: Execute query, and stream the results.
Definition: stream_from.hxx:93
std::remove_cv_t< std::remove_reference_t< TYPE > > strip_t
Remove any constness, volatile, and reference-ness from a type.
Definition: types.hxx:91
static stream_from table(transaction_base &tx, table_path path, std::initializer_list< std::string_view > columns={})
Factory: Stream data from a given table.
Definition: stream_from.cxx:88
stream_from(transaction_base &, from_query_t, std::string_view query)
Execute query, and stream over the results.
Definition: stream_from.cxx:39