14 #if !defined(PQXX_HEADER_PRE)
15 # error "Include libpqxx headers as <pqxx/header>, not <pqxx/header.hxx>."
20 #include "pqxx/internal/concat.hxx"
21 #include "pqxx/internal/statement_parameters.hxx"
22 #include "pqxx/types.hxx"
38 template<
typename... Args> constexpr
params(Args &&...args)
40 reserve(
sizeof...(args));
41 append_pack(std::forward<Args>(args)...);
51 void reserve(std::size_t n) &;
55 [[nodiscard]]
auto size() const noexcept {
return m_params.size(); }
79 void append(std::string
const &) &;
82 void append(std::string &&) &;
94 void append(
bytes const &) &;
96 #if defined(PQXX_HAVE_CONCEPTS) && defined(PQXX_HAVE_RANGES)
101 template<binary DATA>
void append(DATA
const &data) &
103 append(
bytes_view{std::data(data), std::size(data)});
105 #endif // PQXX_HAVE_CONCEPTS
108 void append(
bytes &&) &;
114 void append(binarystring
const &value) &;
117 template<
typename IT,
typename ACCESSOR>
120 for (
auto ¶m : value) append(value.access(param));
123 void append(
params const &value) &;
125 void append(
params &&value) &;
129 template<
typename TYPE>
void append(TYPE
const &value) &
135 m_params.emplace_back();
139 m_params.emplace_back();
143 m_params.emplace_back(entry{
to_string(value)});
150 #if defined(PQXX_HAVE_CONCEPTS) && defined(PQXX_HAVE_RANGES)
151 if constexpr (std::ranges::sized_range<RANGE>)
152 reserve(std::size(*
this) + std::size(
range));
154 for (
auto &value :
range) append(value);
171 template<
typename Arg,
typename... More>
172 void append_pack(Arg &&arg, More &&...args)
174 this->append(std::forward<Arg>(arg));
176 append_pack(std::forward<More>(args)...);
180 constexpr
void append_pack() noexcept {}
186 std::variant<std::nullptr_t, zview, std::string, bytes_view, bytes>;
187 std::vector<entry> m_params;
189 static constexpr std::string_view s_overflow{
190 "Statement parameter length overflow."sv};
210 (std::numeric_limits<COUNTER>::max)()};
214 static constexpr
auto initial{
"$1\0"sv};
215 initial.copy(std::data(m_buf), std::size(initial));
224 return zview{std::data(m_buf), m_len};
233 std::string
get()
const {
return std::string(std::data(m_buf), m_len); }
240 "Too many parameters in one statement: limit is ",
max_params,
".")};
241 PQXX_ASSUME(m_current > 0);
243 if (m_current % 10 == 0)
248 char *
const data{std::data(m_buf)};
250 data + 1, data + std::size(m_buf), m_current)};
252 m_len =
check_cast<COUNTER>(end - data,
"placeholders counter") - 1;
263 COUNTER
count() const noexcept {
return m_current; }
267 COUNTER m_current = 1;
280 std::array<char, std::numeric_limits<COUNTER>::digits10 + 3> m_buf;
289 template<
typename IT>
290 [[deprecated(
"Use the params class instead.")]] constexpr
inline auto
299 [[deprecated(
"Use the params class instead.")]] constexpr
inline auto
302 using IT =
typename C::const_iterator;
303 #include "pqxx/internal/ignore-deprecated-pre.hxx"
305 #include "pqxx/internal/ignore-deprecated-post.hxx"
310 template<
typename C,
typename ACCESSOR>
311 [[deprecated(
"Use the params class instead.")]] constexpr
inline auto
314 using IT = decltype(std::begin(container));
315 #include "pqxx/internal/ignore-deprecated-pre.hxx"
317 #include "pqxx/internal/ignore-deprecated-post.hxx"
std::string concat(TYPE...item)
Efficiently combine a bunch of items into one big string.
Definition: concat.hxx:31
Marker-type wrapper: zero-terminated std::string_view.
Definition: zview.hxx:37
void append(TYPE const &value)&
Definition: params.hxx:129
auto ssize(T const &c)
Transitional: std::ssize(), or custom implementation if not available.
Definition: util.hxx:555
TO check_cast(FROM value, std::string_view description)
Cast a numeric value to another type, or throw if it underflows/overflows.
Definition: util.hxx:153
Definition: statement_parameters.hxx:35
constexpr auto make_dynamic_params(IT begin, IT end)
Definition: params.hxx:291
auto ssize() const
Get the number of parameters (signed).
Definition: params.hxx:64
Something is out of range, similar to std::out_of_range.
Definition: except.hxx:325
constexpr zview view() const &noexcept
Read an ephemeral version of the current placeholder text.
Definition: params.hxx:222
PQXX_LIBEXPORT std::string to_string(field const &value)
Convert a field to a string.
A C++ equivalent to PostgreSQL's range types.
Definition: range.hxx:239
constexpr bool is_null(TYPE const &value) noexcept
Is value null?
Definition: strconv.hxx:515
Definition: params.hxx:286
Internal type: encode statement parameters.
Definition: statement_parameters.hxx:94
Build a parameter list for a parameterised or prepared statement.
Definition: params.hxx:32
COUNTER count() const noexcept
Return the current placeholder number. The initial placeholder is 1.
Definition: params.hxx:263
auto size() const noexcept
Get the number of parameters currently in this params.
Definition: params.hxx:55
The home of all libpqxx classes, functions, templates, etc.
Definition: array.cxx:26
constexpr void ignore_unused(T &&...) noexcept
Suppress compiler warning about an unused item.
Definition: util.hxx:144
std::conditional< has_generic_bytes_char_traits, std::basic_string< std::byte >, std::basic_string< std::byte, byte_char_traits >>::type bytes
Type alias for a container containing bytes.
Definition: util.hxx:375
void append(pqxx::internal::dynamic_params< IT, ACCESSOR > const &value)&
Append all parameters from value.
Definition: params.hxx:118
void next()&
Move on to the next parameter.
Definition: params.hxx:236
void append_multi(RANGE const &range)&
Append all elements of range as parameters.
Definition: params.hxx:148
Traits describing a type's "null value," if any.
Definition: strconv.hxx:90
static char * into_buf(char *begin, char *end, TYPE const &value)
Write value's string representation into buffer at begin.
static constexpr unsigned int max_params
Maximum number of parameters we support.
Definition: params.hxx:209
std::conditional< has_generic_bytes_char_traits, std::basic_string_view< std::byte >, std::basic_string_view< std::byte, byte_char_traits >>::type bytes_view
Type alias for a view of bytes.
Definition: util.hxx:385
Generate parameter placeholders for use in an SQL statement.
Definition: params.hxx:205
constexpr params(Args &&...args)
Pre-populate a params with args. Feel free to add more later.
Definition: params.hxx:38
std::remove_cv_t< std::remove_reference_t< TYPE >> strip_t
Remove any constness, volatile, and reference-ness from a type.
Definition: types.hxx:80