28 #ifndef FASTCGIPP_SQL_PARAMETERS_HPP
29 #define FASTCGIPP_SQL_PARAMETERS_HPP
53 template<
typename T>
class Parameter;
61 static const unsigned oid;
62 constexpr Parameter(
bool x) noexcept:
63 m_data(
static_cast<char>(x))
65 constexpr Parameter& operator=(
bool x) noexcept
67 m_data =
static_cast<char>(x);
70 constexpr
const char* data()
const
74 constexpr
unsigned size()
const
81 struct Parameter<int16_t>:
public BigEndian<int16_t>
84 using BigEndian<int16_t>::operator=;
85 static const unsigned oid;
93 static const unsigned oid;
101 static const unsigned oid;
109 static const unsigned oid;
117 static const unsigned oid;
121 struct Parameter<std::string>:
public std::string
126 using std::string::string;
127 using std::string::operator=;
128 static const unsigned oid;
132 struct Parameter<std::vector<char>>:
public std::vector<char>
137 using std::vector<char>::vector;
138 using std::vector<char>::operator=;
139 static const unsigned oid;
146 static std::string convert(
const std::wstring& x);
149 Parameter& operator=(
const std::wstring& x)
156 std::string(convert(x))
159 static const unsigned oid;
163 class Parameter<std::chrono::time_point<std::chrono::system_clock>>:
164 public BigEndian<int64_t>
167 using BigEndian<int64_t>::operator=;
168 static int64_t convert(
169 const std::chrono::time_point<std::chrono::system_clock>& x)
171 return std::chrono::duration_cast<
172 std::chrono::duration<int64_t, std::micro>>(
173 x.time_since_epoch()-std::chrono::seconds(946684800)).count();
177 Parameter& operator=(
178 const std::chrono::time_point<std::chrono::system_clock>& x)
185 const std::chrono::time_point<std::chrono::system_clock>& x):
186 BigEndian<int64_t>(convert(x))
189 static const unsigned oid;
193 struct Parameter<Address>:
public std::array<char, 20>
195 Parameter& operator=(
const Address& x)
198 *next++ = addressFamily;
203 reinterpret_cast<const char*
>(&x),
208 Parameter(
const Address& x)
212 static const unsigned oid;
213 static const char addressFamily;
216 template<
typename Numeric>
217 class Parameter<std::vector<Numeric>>
221 std::is_integral<Numeric>::value ||
222 std::is_floating_point<Numeric>::value,
223 "Numeric must be a numeric type.");
225 std::unique_ptr<char[]> m_data;
227 void resize(
const unsigned size);
244 m_data.get() + 6*
sizeof(int32_t)
245 + i*(
sizeof(int32_t) +
sizeof(Numeric)));
248 unsigned size()
const
253 const char* data()
const
258 static const unsigned oid;
262 class Parameter<std::vector<std::string>>
266 std::unique_ptr<char[]> m_data;
268 void assign(
const std::vector<std::string>& x);
270 Parameter& operator=(
const std::vector<std::string>& x)
276 Parameter(
const std::vector<std::string>& x)
281 std::string operator[](
const unsigned i)
const;
283 unsigned size()
const
288 const char* data()
const
293 static const unsigned oid;
297 class Parameter<std::vector<std::wstring>>:
298 public Parameter<std::vector<std::string>>
301 static std::vector<std::string> convert(
302 const std::vector<std::wstring>& x);
303 static std::wstring convert(
const std::string& x);
305 Parameter& operator=(
const std::vector<std::wstring>& x)
311 Parameter(
const std::vector<std::wstring>& x):
312 Parameter<std::vector<std::string>>(convert(x))
315 std::wstring operator[](
const unsigned i)
const
318 Parameter<std::vector<std::string>>::
operator[](i));
323 class Parameters_base
330 const std::vector<unsigned>*
m_oids;
336 std::vector<const char*>
m_raws;
365 const unsigned*
oids()
const
374 const char*
const*
raws()
const
380 const int*
sizes()
const
392 virtual int size()
const =0;
408 template<
typename... Types>
410 public std::tuple<Parameter<Types>...>,
414 static const std::vector<unsigned>
s_oids;
418 constexpr
int size()
const
420 return sizeof...(Types);
424 template<
size_t column,
size_t... columns>
425 inline void build_impl(std::index_sequence<column, columns...>)
427 m_raws.push_back(std::get<column>(*this).data());
428 m_sizes.push_back(std::get<column>(*this).size());
429 build_impl(std::index_sequence<columns...>{});
433 template<
size_t column>
434 inline void build_impl(std::index_sequence<column>)
436 m_raws.push_back(std::get<column>(*this).data());
437 m_sizes.push_back(std::get<column>(*this).size());
443 using std::tuple<Parameter<Types>...>::tuple;
444 using std::tuple<Parameter<Types>...>::operator=;
447 template<
typename... Types>
449 const Types&... args)
455 template<
typename... Types>
457 const std::tuple<Types...>& tuple)
465 template<
typename... Types>
469 m_formats = &s_formats;
470 build_impl(std::index_sequence_for<Types...>{});
473 template<
typename... Types>
479 template<
typename... Types>