userver
C++ Async Framework
Toggle main menu visibility
Loading...
Searching...
No Matches
interval.hpp
Go to the documentation of this file.
1
#
pragma
once
2
3
/// @file userver/storages/postgres/io/interval.hpp
4
/// @brief Time intervals I/O support
5
/// @ingroup userver_postgres_parse_and_format
6
7
#
include
<
chrono
>
8
9
#
include
<
userver
/
storages
/
postgres
/
exceptions
.
hpp
>
10
#
include
<
userver
/
storages
/
postgres
/
io
/
buffer_io
.
hpp
>
11
#
include
<
userver
/
storages
/
postgres
/
io
/
buffer_io_base
.
hpp
>
12
#
include
<
userver
/
storages
/
postgres
/
io
/
integral_types
.
hpp
>
13
#
include
<
userver
/
storages
/
postgres
/
io
/
traits
.
hpp
>
14
#
include
<
userver
/
storages
/
postgres
/
io
/
type_mapping
.
hpp
>
15
16
USERVER_NAMESPACE_BEGIN
17
18
namespace
storages::
postgres
::
io
{
19
20
namespace
detail {
21
22
/// Internal structure for representing PostgreSQL interval type
23
struct
Interval {
24
using
DurationType = std::chrono::microseconds;
25
26
Integer months = 0;
27
Integer days = 0;
28
Bigint microseconds = 0;
29
30
constexpr
Interval() =
default
;
31
constexpr
Interval(Integer months, Integer days, Bigint microseconds)
32
: months{months},
33
days{days},
34
microseconds{microseconds}
35
{}
36
constexpr
explicit
Interval(DurationType ms)
37
: microseconds{ms.count()}
38
{}
39
40
constexpr
bool
operator==(
const
Interval& rhs)
const
{
41
return
months == rhs.months && days == rhs.days && microseconds == rhs.microseconds;
42
}
43
44
constexpr
DurationType GetDuration()
const
{
45
if
(months != 0) {
46
throw
UnsupportedInterval
{};
47
}
48
return
std::chrono::duration_cast<
49
DurationType>(std::chrono::microseconds{microseconds} + std::chrono::hours{days * 24});
50
}
51
};
52
53
}
// namespace detail
54
55
template
<>
56
struct
BufferParser<detail::Interval> : detail::BufferParserBase<detail::Interval> {
57
using
BaseType = detail::BufferParserBase<detail::Interval>;
58
using
ValueType =
typename
BaseType::ValueType;
59
60
using
BaseType::BaseType;
61
62
void
operator()(
const
FieldBuffer
& buffer) {
63
ValueType tmp;
64
std::size_t offset = 0;
65
io
::
ReadBuffer
(
buffer.GetSubBuffer(offset,
sizeof
(Bigint),
BufferCategory
::
kPlainBuffer
)
,
tmp.microseconds
)
;
66
offset +=
sizeof
(Bigint);
67
io
::
ReadBuffer
(
buffer.GetSubBuffer(offset,
sizeof
(Integer),
BufferCategory
::
kPlainBuffer
)
,
tmp.days
)
;
68
offset +=
sizeof
(Integer);
69
io
::
ReadBuffer
(
buffer.GetSubBuffer(offset,
sizeof
(Integer),
BufferCategory
::
kPlainBuffer
)
,
tmp.months
)
;
70
71
std::swap(
this
->value, tmp);
72
}
73
};
74
75
template
<>
76
struct
BufferFormatter<detail::Interval> : detail::BufferFormatterBase<detail::Interval> {
77
using
BaseType = detail::BufferFormatterBase<detail::Interval>;
78
79
using
BaseType::BaseType;
80
81
template
<
typename
Buffer>
82
void
operator()(
const
UserTypes
& types, Buffer& buffer)
const
{
83
io
::WriteBuffer(types, buffer,
this
->value.microseconds);
84
io
::WriteBuffer(types, buffer,
this
->value.days);
85
io
::WriteBuffer(types, buffer,
this
->value.months);
86
}
87
};
88
89
template
<>
90
struct
CppToSystemPg<detail::Interval> : PredefinedOid<
PredefinedOids
::kInterval> {};
91
92
}
// namespace storages::postgres::io
93
94
USERVER_NAMESPACE_END
userver
storages
postgres
io
interval.hpp
Generated on
for userver by
Doxygen
1.17.0