13 #ifndef PQXX_STREAM_FROM_HXX
14 #define PQXX_STREAM_FROM_HXX
16 #if !defined(PQXX_HEADER_PRE)
17 # error "Include libpqxx headers as <pqxx/header>, not <pqxx/header.hxx>."
34 class transaction_base;
82 std::pair<std::unique_ptr<
char[], void (*)(
void const *)>, std::size_t>;
94 [[deprecated(
"Use transaction_base::stream instead.")]]
static stream_from
130 [[deprecated(
"Use transaction_base::stream instead.")]]
static stream_from
133 std::string_view columns =
""sv);
138 [[deprecated(
"Use transaction_base::stream instead.")]]
static stream_from
141 std::initializer_list<std::string_view> columns = {});
147 [[deprecated(
"Use transaction_base::stream instead.")]] stream_from(
148 transaction_base &, from_query_t, std::string_view query);
153 [[deprecated(
"Use transaction_base::stream instead.")]] stream_from(
154 transaction_base &, from_table_t, std::string_view table);
159 template<
typename Iter>
160 [[deprecated(
"Use transaction_base::stream instead.")]] stream_from(
161 transaction_base &, from_table_t, std::string_view table,
162 Iter columns_begin, Iter columns_end);
167 template<
typename Columns>
168 [[deprecated(
"Use transaction_base::stream() instead.")]] stream_from(
169 transaction_base &tx, from_table_t, std::string_view table,
170 Columns
const &columns);
174 [[deprecated(
"Use transaction_base::stream instead.")]]
stream_from(
181 template<
typename Columns>
182 [[deprecated(
"Use transaction_base::stream instead.")]]
stream_from(
188 template<
typename Iter>
189 [[deprecated(
"Use transaction_base::stream instead.")]]
stream_from(
203 [[nodiscard]] constexpr operator
bool() const noexcept
205 return not m_finished;
223 void complete(
sl = sl::current());
233 template<
typename Tuple>
stream_from &operator>>(Tuple &);
236 template<
typename... Vs>
244 template<
typename... TYPE> [[nodiscard]]
auto iter() &
262 std::vector<std::string_view>
const *read_row(
sl loc = sl::current()) &;
266 raw_line get_raw_line(
sl);
281 template<
typename Tuple, std::size_t... indexes>
282 void extract_fields(Tuple &t, std::index_sequence<indexes...>,
sl loc)
const
284 (extract_value<Tuple, indexes>(t, loc), ...);
293 std::vector<std::string_view> m_fields;
295 bool m_finished =
false;
299 template<
typename Tuple, std::
size_t index>
300 void extract_value(Tuple &,
sl loc)
const;
307 template<
typename Columns>
310 Columns
const &columns) :
312 tx,
from_table, table_name, std::begin(columns), std::end(columns)}
316 template<
typename Iter>
319 Iter columns_begin, Iter columns_end) :
328 sl const loc{sl::current()};
329 if (m_finished) [[unlikely]]
331 static constexpr
auto tup_size{std::tuple_size_v<Tuple>};
332 m_fields.reserve(tup_size);
334 if (m_finished) [[unlikely]]
337 if (std::size(m_fields) != tup_size)
339 "Tried to extract {} field(s) from a stream of {}.", tup_size,
340 std::size(m_fields))};
342 extract_fields(t, std::make_index_sequence<tup_size>{}, loc);
347 template<
typename Tuple, std::
size_t index>
348 inline void stream_from::extract_value(Tuple &t,
sl loc)
const
350 using field_type = std::remove_cvref_t<decltype(std::get<index>(t))>;
351 assert(index < std::size(m_fields));
352 if constexpr (always_null<field_type>())
354 if (std::data(m_fields[index]) !=
nullptr)
357 else if (std::data(m_fields[index]) ==
nullptr)
359 if constexpr (has_null<field_type>())
360 std::get<index>(t) =
make_null<field_type>();
367 std::get<index>(t) = from_string<field_type>(m_fields[index]);
Stream data from the database.
Definition: stream_from.hxx:79
std::pair< std::unique_ptr< char[], void(*)(void const *)>, std::size_t > raw_line
Definition: stream_from.hxx:82
static stream_from query(transaction_base &tx, std::string_view q)
Factory: Execute query, and stream the results.
Definition: stream_from.hxx:95
stream_from(transaction_base &, from_query_t, std::string_view query)
Execute query, and stream over the results.
Definition: stream_from.cxx:41
stream_from & operator>>(Tuple &)
Read one row into a tuple.
Definition: stream_from.hxx:326
stream_from(transaction_base &tx, std::string_view table, Columns const &columns)
Definition: stream_from.hxx:182
stream_from(stream_from const &)=delete
stream_from(stream_from &&)=delete
stream_from(transaction_base &, std::string_view table, Iter columns_begin, Iter columns_end)
stream_from & operator>>(std::variant< Vs... > &)=delete
Doing this with a std::variant is going to be horrifically borked.
stream_from(transaction_base &tx, std::string_view table)
Definition: stream_from.hxx:174
auto iter() &
Iterate over this stream. Supports range-based "for" loops.
Definition: stream_from.hxx:244
constexpr bool operator!() const noexcept
Has this stream produced all the data it is going to produce?
Definition: stream_from.hxx:211
Base class for things that monopolise a transaction's attention.
Definition: transaction_focus.hxx:29
Value conversion failed, e.g. when converting "Hello" to int.
Definition: except.hxx:612
Error in usage of libpqxx library, similar to std::logic_error.
Definition: except.hxx:580
Interface definition (and common code) for "transaction" classes.
Definition: transaction_base.hxx:151
void throw_null_conversion(std::string const &type, sl loc)
Throw exception for attempt to convert SQL NULL to given type.
Definition: strconv.cxx:142
std::size_t(std::string_view haystack, std::size_t start, sl) char_finder_func
Function type: "find first occurrence of any of these ASCII characters.".
Definition: encoding_group.hxx:110
The home of all libpqxx classes, functions, templates, etc.
Definition: array.cxx:26
constexpr from_query_t from_query
Pass this to a stream_from constructor to stream query results.
Definition: stream_from.hxx:44
constexpr TYPE make_null() requires(pqxx
Return a null value of TYPE.
Definition: strconv.hxx:781
std::source_location sl
Convenience alias for std::source_location. It's just too long.
Definition: types.hxx:38
constexpr std::string_view name_type() noexcept
Return human-readable name for TYPE.
Definition: types.hxx:277
constexpr from_table_t from_table
Pass this to a stream_from constructor to stream table contents.
Definition: stream_from.hxx:34
std::initializer_list< std::string_view > table_path
Representation of a PostgreSQL table path.
Definition: connection.hxx:240
std::string separated_list(std::string_view sep, ITER begin, ITER end, ACCESS access, ctx c={})
Represent sequence of values as a string, joined by a given separator.
Definition: separated_list.hxx:41
format
Format code: is data text or binary?
Definition: types.hxx:121
Marker for stream_from constructors: "stream from query.".
Definition: types.hxx:226
Marker for stream_from constructors: "stream from table.".
Definition: types.hxx:220