8#include <userver/storages/postgres/exceptions.hpp>
9#include <userver/storages/postgres/io/buffer_io_base.hpp>
10#include <userver/storages/postgres/io/field_buffer.hpp>
11#include <userver/storages/postgres/io/floating_point_types.hpp>
12#include <userver/storages/postgres/io/traits.hpp>
13#include <userver/storages/postgres/io/type_mapping.hpp>
14#include <userver/storages/postgres/io/type_traits.hpp>
15#include <userver/storages/postgres/io/user_types.hpp>
17USERVER_NAMESPACE_BEGIN
28 constexpr bool operator==(
const Point& rhs)
const {
return x == rhs.x && y == rhs.y; }
35 constexpr bool operator==(
const LineSegment& rhs)
const {
return ends[0] == rhs.ends[0] && ends[1] == rhs.ends[1]; }
37 std::array<Point, 2> ends{};
42 constexpr bool operator==(
const Line& rhs)
const {
return a == rhs.a && b == rhs.b && c == rhs.c; }
50 constexpr bool operator==(
const Box& rhs)
const {
51 return corners[0] == rhs.corners[0] && corners[1] == rhs.corners[1];
54 std::array<Point, 2> corners{};
58 bool operator==(
const Path& rhs)
const {
return is_closed == rhs.is_closed && points == rhs.points; }
60 bool is_closed{
false};
61 std::vector<Point> points;
65 bool operator==(
const Polygon& rhs)
const {
return points == rhs.points; }
67 std::vector<Point> points;
71 constexpr bool operator==(
const Circle& rhs)
const {
return center == rhs.center && radius == rhs.radius; }
78struct PointParser : BufferParserBase<Point> {
79 using BaseType = BufferParserBase<Point>;
80 using BaseType::BaseType;
88struct PointFormatter : BufferFormatterBase<Point> {
89 using BaseType = BufferFormatterBase<Point>;
90 using BaseType::BaseType;
92 template <
typename Buffer>
93 void operator()(
const UserTypes& types, Buffer& buffer)
const {
94 io::WriteBuffer(types, buffer, value.x);
95 io::WriteBuffer(types, buffer, value.y);
99struct LineSegmentParser : BufferParserBase<LineSegment> {
100 using BaseType = BufferParserBase<LineSegment>;
101 using BaseType::BaseType;
104 buffer.Read(value.ends[0]);
105 buffer.Read(value.ends[1]);
109struct LineSegmentFormatter : BufferFormatterBase<LineSegment> {
110 using BaseType = BufferFormatterBase<LineSegment>;
111 using BaseType::BaseType;
113 template <
typename Buffer>
114 void operator()(
const UserTypes& types, Buffer& buffer)
const {
115 io::WriteBuffer(types, buffer, value.ends[0]);
116 io::WriteBuffer(types, buffer, value.ends[1]);
120struct LineParser : BufferParserBase<Line> {
121 using BaseType = BufferParserBase<Line>;
122 using BaseType::BaseType;
125 buffer.Read(value.a);
126 buffer.Read(value.b);
127 buffer.Read(value.c);
131struct LineFormatter : BufferFormatterBase<Line> {
132 using BaseType = BufferFormatterBase<Line>;
133 using BaseType::BaseType;
135 template <
typename Buffer>
136 void operator()(
const UserTypes& types, Buffer& buffer)
const {
137 io::WriteBuffer(types, buffer, value.a);
138 io::WriteBuffer(types, buffer, value.b);
139 io::WriteBuffer(types, buffer, value.c);
143struct BoxParser : BufferParserBase<Box> {
144 using BaseType = BufferParserBase<Box>;
145 using BaseType::BaseType;
148 buffer.Read(value.corners[0]);
149 buffer.Read(value.corners[1]);
153struct BoxFormatter : BufferFormatterBase<Box> {
154 using BaseType = BufferFormatterBase<Box>;
155 using BaseType::BaseType;
157 template <
typename Buffer>
158 void operator()(
const UserTypes& types, Buffer& buffer)
const {
159 io::WriteBuffer(types, buffer, value.corners[0]);
160 io::WriteBuffer(types, buffer, value.corners[1]);
164struct PathParser : BufferParserBase<Path> {
165 using BaseType = BufferParserBase<Path>;
166 using BaseType::BaseType;
169 buffer.Read(value.is_closed);
171 buffer.Read(point_no);
172 value.points.resize(point_no);
173 for (
auto i = 0; i < point_no; ++i) {
174 buffer.Read(value.points[i]);
179struct PathFormatter : BufferFormatterBase<Path> {
180 using BaseType = BufferFormatterBase<Path>;
181 using BaseType::BaseType;
183 template <
typename Buffer>
184 void operator()(
const UserTypes& types, Buffer& buffer)
const {
185 io::WriteBuffer(types, buffer, value.is_closed);
186 const Integer points_no = value.points.size();
187 io::WriteBuffer(types, buffer, points_no);
188 for (
const auto& p : value.points) {
189 io::WriteBuffer(types, buffer, p);
194struct PolygonParser : BufferParserBase<Polygon> {
195 using BaseType = BufferParserBase<Polygon>;
196 using BaseType::BaseType;
200 buffer.Read(point_no);
201 value.points.resize(point_no);
202 for (
auto i = 0; i < point_no; ++i) {
203 buffer.Read(value.points[i]);
208struct PolygonFormatter : BufferFormatterBase<Polygon> {
209 using BaseType = BufferFormatterBase<Polygon>;
210 using BaseType::BaseType;
212 template <
typename Buffer>
213 void operator()(
const UserTypes& types, Buffer& buffer)
const {
214 const Integer points_no = value.points.size();
215 io::WriteBuffer(types, buffer, points_no);
216 for (
const auto& p : value.points) {
217 io::WriteBuffer(types, buffer, p);
222struct CircleParser : BufferParserBase<Circle> {
223 using BaseType = BufferParserBase<Circle>;
224 using BaseType::BaseType;
227 buffer.Read(value.center);
228 buffer.Read(value.radius);
232struct CircleFormatter : BufferFormatterBase<Circle> {
233 using BaseType = BufferFormatterBase<Circle>;
234 using BaseType::BaseType;
236 template <
typename Buffer>
237 void operator()(
const UserTypes& types, Buffer& buffer)
const {
238 io::WriteBuffer(types, buffer, value.center);
239 io::WriteBuffer(types, buffer, value.radius);
248struct Input<
io::detail::Point> {
249 using type =
io::detail::PointParser;
258 using type =
io::detail::PointFormatter;
262struct Input<
io::detail::LineSegment> {
263 using type =
io::detail::LineSegmentParser;
271struct Output<
io::detail::LineSegment> {
272 using type =
io::detail::LineSegmentFormatter;
276struct Input<
io::detail::Line> {
277 using type =
io::detail::LineParser;
286 using type =
io::detail::LineFormatter;
291 using type =
io::detail::BoxParser;
300 using type =
io::detail::BoxFormatter;
304struct Input<
io::detail::Path> {
305 using type =
io::detail::PathParser;
314 using type =
io::detail::PathFormatter;
318struct Input<
io::detail::Polygon> {
319 using type =
io::detail::PolygonParser;
328 using type =
io::detail::PolygonFormatter;
332struct Input<
io::detail::Circle> {
333 using type =
io::detail::CircleParser;
342 using type =
io::detail::CircleFormatter;
348struct CppToSystemPg<detail::Point> : PredefinedOid<
PredefinedOids::kPoint> {};
350struct CppToSystemPg<detail::LineSegment> : PredefinedOid<
PredefinedOids::kLseg> {};
352struct CppToSystemPg<detail::Line> : PredefinedOid<
PredefinedOids::kLine> {};
354struct CppToSystemPg<detail::Box> : PredefinedOid<
PredefinedOids::kBox> {};
356struct CppToSystemPg<detail::Path> : PredefinedOid<
PredefinedOids::kPath> {};
358struct CppToSystemPg<detail::Polygon> : PredefinedOid<
PredefinedOids::kPolygon> {};
360struct CppToSystemPg<detail::Circle> : PredefinedOid<
PredefinedOids::kCircle> {};