11#include <userver/storages/postgres/exceptions.hpp>
12#include <userver/storages/postgres/io/buffer_io_base.hpp>
13#include <userver/storages/postgres/io/traits.hpp>
14#include <userver/storages/postgres/io/type_mapping.hpp>
16USERVER_NAMESPACE_BEGIN
23struct BufferFormatter<
const char*> {
26 explicit BufferFormatter(
const char* val)
30 template <
typename Buffer>
31 void operator()(
const UserTypes&, Buffer& buf)
const {
32 auto sz = std::strlen(value);
33 WriteN(buf, value, sz);
36 template <
typename Buffer>
37 static void WriteN(Buffer& buf,
const char* c, std::size_t n) {
39 while (n > 0 && c[n - 1] ==
'\0') {
42 buf.reserve(buf.size() + n);
43 std::copy(c, c + n, std::back_inserter(buf));
50template <std::size_t N>
51struct BufferFormatter<
char[N]> {
52 using CharFormatter = BufferFormatter<
const char*>;
55 explicit BufferFormatter(
const char* val)
59 template <
typename Buffer>
60 void operator()(
const UserTypes&, Buffer& buf)
const {
61 CharFormatter::WriteN(buf, value, N);
70struct BufferFormatter<std::string> {
71 using CharFormatter = BufferFormatter<
const char*>;
72 const std::string& value;
74 explicit BufferFormatter(
const std::string& val)
77 template <
typename Buffer>
78 void operator()(
const UserTypes&, Buffer& buf)
const {
79 CharFormatter::WriteN(buf, value.data(), value.size());
84struct BufferParser<std::string> {
87 explicit BufferParser(std::string& val)
98struct BufferFormatter<std::string_view> : detail::BufferFormatterBase<std::string_view> {
99 using BaseType = detail::BufferFormatterBase<std::string_view>;
100 using CharFormatter = BufferFormatter<
const char*>;
102 using BaseType::BaseType;
104 template <
typename Buffer>
105 void operator()(
const UserTypes&, Buffer& buffer)
const {
106 CharFormatter::WriteN(buffer, value.data(), value.size());
111struct BufferParser<std::string_view> : detail::BufferParserBase<std::string_view> {
112 using BaseType = detail::BufferParserBase<std::string_view>;
113 using BaseType::BaseType;
117 ValueType tmp{
reinterpret_cast<
const char*>(buffer.buffer), buffer.length};
126struct BufferFormatter<
char> {
129 explicit BufferFormatter(
char val)
132 template <
typename Buffer>
133 void operator()(
const UserTypes&, Buffer& buf)
const {
134 buf.push_back(value);
139struct BufferParser<
char> {
142 explicit BufferParser(
char& val)
147 if (buffer.length != 1) {
150 value = *buffer.buffer;
159template <std::size_t N>