9#include <userver/storages/postgres/io/buffer_io.hpp>
10#include <userver/storages/postgres/io/buffer_io_base.hpp>
11#include <userver/storages/postgres/io/integral_types.hpp>
12#include <userver/storages/postgres/io/type_mapping.hpp>
13#include <userver/utils/datetime/date.hpp>
15USERVER_NAMESPACE_BEGIN
17namespace storages::postgres {
20using Date = USERVER_NAMESPACE::utils::datetime::Date;
39struct BufferFormatter<Date> {
42 explicit BufferFormatter(Date value)
46 template <
typename Buffer>
47 void operator()(
const UserTypes& types, Buffer& buffer) {
50 WriteBuffer(types, buffer, std::numeric_limits<Integer>::max());
52 WriteBuffer(types, buffer, std::numeric_limits<Integer>::min());
54 auto pg_days =
static_cast<Integer>((value.GetSysDays() - kPgEpoch.GetSysDays()).count());
55 WriteBuffer(types, buffer, pg_days);
62struct BufferParser<Date> : detail::BufferParserBase<Date> {
63 using BaseType = detail::BufferParserBase<Date>;
65 using BaseType::BaseType;
67 void operator()(
const FieldBuffer& buffer) {
70 ReadBuffer(buffer, pg_days);
71 if (pg_days == std::numeric_limits<Integer>::max()) {
73 }
else if (pg_days == std::numeric_limits<Integer>::min()) {
76 this->value = kPgEpoch.GetSysDays() + Date::Days{pg_days};
82struct CppToSystemPg<Date> : PredefinedOid<PredefinedOids::kDate> {};