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" 23 #include "pqxx/except.hxx" 24 #include "pqxx/internal/encoding_group.hxx" 25 #include "pqxx/internal/stream_iterator.hxx" 26 #include "pqxx/internal/transaction_focus.hxx" 27 #include "pqxx/separated_list.hxx" 28 #include "pqxx/transaction_base.hxx" 64 std::pair<std::unique_ptr<char, std::function<void(char *)>>, std::size_t>;
82 template<
typename Iter>
85 Iter columns_begin, Iter columns_end);
88 template<
typename Columns>
91 Columns
const &columns);
99 template<
typename Columns>
106 template<
typename Iter>
108 transaction_base &, std::string_view table, Iter columns_begin,
111 ~stream_from() noexcept;
113 [[nodiscard]] operator
bool() const noexcept {
return not m_finished; }
114 [[nodiscard]]
bool operator!() const noexcept {
return m_finished; }
133 raw_line get_raw_line();
134 template<
typename Tuple>
stream_from &operator>>(Tuple &);
137 template<
typename... Vs>
138 stream_from &operator>>(std::variant<Vs...> &) =
delete;
145 template<
typename... TYPE>[[nodiscard]]
auto iter()
147 return pqxx::internal::stream_input_iteration<TYPE...>{*
this};
155 template<
typename Tuple, std::size_t... indexes>
156 void extract_fields(Tuple &t, std::index_sequence<indexes...>)
const 158 (extract_value<Tuple, indexes>(t), ...);
161 static std::string compose_query(
162 transaction_base
const &tx, std::string_view table,
163 std::string
const &columns);
165 pqxx::internal::glyph_scanner_func *m_glyph_scanner;
171 std::vector<zview> m_fields;
173 bool m_finished =
false;
177 template<
typename Tuple, std::
size_t index>
178 void extract_value(Tuple &)
const;
185 template<
typename Columns>
188 Columns
const &columns) :
190 tb,
from_table, table_name, std::begin(columns), std::end(columns)}
194 template<
typename Iter>
197 Iter columns_begin, Iter columns_end) :
208 constexpr
auto tup_size{std::tuple_size_v<Tuple>};
209 m_fields.reserve(tup_size);
214 if (m_fields.size() != tup_size)
216 "Tried to extract " +
to_string(tup_size) +
217 " field(s) from a stream of " +
to_string(m_fields.size()) +
"."};
219 extract_fields(t, std::make_index_sequence<tup_size>{});
224 template<
typename Tuple, std::
size_t index>
225 inline void stream_from::extract_value(Tuple &t)
const 229 assert(index < m_fields.size());
230 if constexpr (nullity::always_null)
232 if (m_fields[index].data() !=
nullptr)
235 else if (m_fields[index].data() ==
nullptr)
237 if constexpr (nullity::has_null)
238 std::get<index>(t) = nullity::null();
245 std::get<index>(t) = from_string<field_type>(m_fields[index]);
250 #include "pqxx/internal/compiler-internal-post.hxx" Error in usage of libpqxx library, similar to std::logic_error.
Definition: except.hxx:165
Marker for stream_from constructors: "stream from query.".
Definition: types.hxx:59
Value conversion failed, e.g. when converting "Hello" to int.
Definition: except.hxx:179
std::string to_string(field const &value)
Convert a field to a string.
Definition: result.cxx:498
std::remove_cv_t< std::remove_reference_t< TYPE > > strip_t
Remove any constness, volatile, and reference-ness from a type.
Definition: util.hxx:119
stream_from(transaction_base &tx, std::string_view table, Columns const &columns)
Definition: stream_from.hxx:100
auto iter()
Iterate over this stream. Supports range-based "for" loops.
Definition: stream_from.hxx:145
Traits describing a type's "null value," if any.
Definition: strconv.hxx:86
std::pair< std::unique_ptr< char, std::function< void(char *)> >, std::size_t > raw_line
Definition: stream_from.hxx:64
Marker for stream_from constructors: "stream from table.".
Definition: types.hxx:55
stream_from & operator>>(Tuple &)
Definition: stream_from.hxx:204
stream_from(transaction_base &tx, std::string_view table)
Definition: stream_from.hxx:94
Stream data from the database.
Definition: stream_from.hxx:60
stream_from(transaction_base &, from_query_t, std::string_view query)
Execute query, and stream over the results.
Definition: stream_from.cxx:56
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
void throw_null_conversion(std::string const &type)
Definition: strconv.cxx:241
Interface definition (and common code) for "transaction" classes.
Definition: transaction_base.hxx:67
The home of all libpqxx classes, functions, templates, etc.
Definition: array.hxx:25
constexpr from_query_t from_query
Pass this to a stream_from constructor to stream query results.
Definition: stream_from.hxx:36
bool operator!() const noexcept
Definition: stream_from.hxx:114
constexpr from_table_t from_table
Pass this to a stream_from constructor to stream table contents.
Definition: stream_from.hxx:34