libpqxx
The C++ client library for PostgreSQL
statement_parameters.hxx
1 
13 #ifndef PQXX_H_STATEMENT_PARAMETER
14 #define PQXX_H_STATEMENT_PARAMETER
15 
16 #include <cstring>
17 #include <iterator>
18 #include <string>
19 #include <vector>
20 
21 #include "pqxx/binarystring.hxx"
22 #include "pqxx/strconv.hxx"
23 #include "pqxx/util.hxx"
24 
25 
26 namespace pqxx::internal
27 {
28 template<typename ITERATOR>
29 constexpr inline auto const iterator_identity{
30  [](decltype(*std::declval<ITERATOR>()) x) { return x; }};
31 
32 
34 
52 template<typename IT, typename ACCESSOR = decltype(iterator_identity<IT>)>
54 {
55 public:
57  constexpr dynamic_params(IT begin, IT end) :
58  m_begin(begin), m_end(end), m_accessor(iterator_identity<IT>)
59  {}
60 
62 
66  constexpr dynamic_params(IT begin, IT end, ACCESSOR &acc) :
67  m_begin(begin), m_end(end), m_accessor(acc)
68  {}
69 
71  template<typename C>
72  explicit constexpr dynamic_params(C &container) :
73  dynamic_params(std::begin(container), std::end(container))
74  {}
75 
77 
81  template<typename C>
82  explicit constexpr dynamic_params(C &container, ACCESSOR &acc) :
83  dynamic_params(std::begin(container), std::end(container), acc)
84  {}
85 
86  constexpr IT begin() const noexcept { return m_begin; }
87  constexpr IT end() const noexcept { return m_end; }
88 
89  constexpr auto access(decltype(*std::declval<IT>()) value) const
90  -> decltype(std::declval<ACCESSOR>()(value))
91  {
92  return m_accessor(value);
93  }
94 
95 private:
96  IT const m_begin, m_end;
97  ACCESSOR m_accessor = iterator_identity<IT>;
98 };
99 
100 
102 
112 struct PQXX_LIBEXPORT c_params
113 {
114  c_params() = default;
116  c_params(c_params const &) = delete;
117  c_params(c_params &&) = default;
118 
120  void reserve(std::size_t n) &;
121 
123  std::vector<char const *> values;
125  std::vector<int> lengths;
127  std::vector<format> formats;
128 };
129 } // namespace pqxx::internal
130 #endif
Marker type: pass a dynamically-determined number of statement parameters.
Definition: statement_parameters.hxx:54
constexpr dynamic_params(C &container)
Wrap a container.
Definition: statement_parameters.hxx:72
constexpr dynamic_params(IT begin, IT end)
Wrap a sequence of pointers or iterators.
Definition: statement_parameters.hxx:57
constexpr dynamic_params(C &container, ACCESSOR &acc)
Wrap a container.
Definition: statement_parameters.hxx:82
constexpr dynamic_params(IT begin, IT end, ACCESSOR &acc)
Wrap a sequence of pointers or iterators.
Definition: statement_parameters.hxx:66
Internal items for libpqxx' own use. Do not use these yourself.
Definition: encodings.cxx:33
Internal type: encode statement parameters.
Definition: statement_parameters.hxx:113
c_params(c_params const &)=delete
Copying these objects is pointless and expensive. Don't do it.
std::vector< int > lengths
As used by libpq: lengths of non-null arguments, in bytes.
Definition: statement_parameters.hxx:125
std::vector< format > formats
As used by libpq: effectively boolean "is this a binary parameter?".
Definition: statement_parameters.hxx:127
std::vector< char const * > values
As used by libpq: pointers to parameter values.
Definition: statement_parameters.hxx:123