OZO 「お象」
Boost.Asio and libpq based asynchronous PostgreSQL unofficial header-only C++17 client library.
connector.h
1 #pragma once
2 
3 #include <ozo/asio.h>
4 #include <ozo/connection.h>
5 
6 namespace ozo {
7 
8 template <typename Provider>
9 class bind_get_connection_timeout {
10 public:
11  static_assert(ConnectionProvider<Provider>, "Provider should model ConnectionProvider concept");
12 
13  using duration = time_traits::duration;
14  using target_type = Provider;
16 
17  bind_get_connection_timeout(Provider target, duration timeout)
18  : target_(std::move(target)), timeout_(timeout) {}
19 
20  template <typename TimeConstraint, typename Handler>
21  void async_get_connection(TimeConstraint t, Handler&& handler) const& {
22  static_assert(ozo::TimeConstraint<TimeConstraint>, "should model TimeConstraint concept");
23  ozo::async_get_connection(target(), timeout(t), std::forward<Handler>(handler));
24  }
25 
26  template <typename TimeConstraint, typename Handler>
27  void async_get_connection(TimeConstraint t, Handler&& handler) & {
28  static_assert(ozo::TimeConstraint<TimeConstraint>, "should model TimeConstraint concept");
29  ozo::async_get_connection(target(), timeout(t), std::forward<Handler>(handler));
30  }
31 
32  template <typename TimeConstraint, typename Handler>
33  void async_get_connection(TimeConstraint t, Handler&& handler) && {
34  static_assert(ozo::TimeConstraint<TimeConstraint>, "should model TimeConstraint concept");
35  ozo::async_get_connection(std::move(target()), timeout(t), std::forward<Handler>(handler));
36  }
37 
38  target_type& target() & noexcept { return target_; }
39  target_type& target() && noexcept { return target_; }
40  const target_type& target() const & noexcept { return target_; }
41  constexpr duration timeout() const {return timeout_;}
42  constexpr duration timeout(none_t) const {return timeout_;}
43  constexpr duration timeout(time_traits::time_point t) const {return std::min(timeout(), time_left(t));}
44  constexpr duration timeout(time_traits::duration t) const {return std::min(timeout(), t);}
45 private:
46  target_type target_;
47  duration timeout_;
48 };
49 
65 template <typename ConnectionSource>
67 public:
68  static_assert(ozo::ConnectionSource<ConnectionSource>, "ConnectionSource should model ConnectionSource concept");
69 
73  using source_type = std::decay_t<ConnectionSource>;
78  using connection_type = typename connection_source_traits<source_type>::connection_type;
79 
86  connection_provider(ConnectionSource&& source, io_context& io)
87  : source_(std::forward<ConnectionSource>(source)), io_(io) {
88  }
89 
90  template <typename TimeConstraint, typename Handler>
91  void async_get_connection(TimeConstraint t, Handler&& h) const& {
92  static_assert(ozo::TimeConstraint<TimeConstraint>, "should model TimeConstraint concept");
93  source_(io_, std::move(t), std::forward<Handler>(h));
94  }
95 
96  template <typename TimeConstraint, typename Handler>
97  void async_get_connection(TimeConstraint t, Handler&& h) & {
98  static_assert(ozo::TimeConstraint<TimeConstraint>, "should model TimeConstraint concept");
99  source_(io_, std::move(t), std::forward<Handler>(h));
100  }
101 
102  template <typename TimeConstraint, typename Handler>
103  void async_get_connection(TimeConstraint t, Handler&& h) && {
104  static_assert(ozo::TimeConstraint<TimeConstraint>, "should model TimeConstraint concept");
105  std::move(source_)(io_, std::move(t), std::forward<Handler>(h));
106  }
107 
108 private:
109  ConnectionSource source_;
110  io_context& io_;
111 };
112 
113 template <typename ConnectionSource>
114 connection_provider(ConnectionSource&& source, io_context& io)
115  -> connection_provider<ConnectionSource>;
116 
117 } // namespace ozo
ozo::connection_provider
Default model for the ConnectionProvider concept.
Definition: connector.h:66
ozo::connection_provider::connection_type
typename connection_source_traits< source_type >::connection_type connection_type
Definition: connector.h:78
ConnectionProvider
Connection provider concept
ozo::connection_provider::connection_provider
connection_provider(ConnectionSource &&source, io_context &io)
Definition: connector.h:86
ozo::time_traits::time_point
std::chrono::steady_clock::time_point time_point
Time point type of the library.
Definition: time_traits.h:14
ConnectionSource
Connection source concept
ozo::time_traits::duration
std::chrono::steady_clock::duration duration
Time duration type of the library.
Definition: time_traits.h:13
ozo::time_left
constexpr time_traits::duration time_left(time_traits::time_point t, time_traits::time_point now) noexcept
Time left to deadline.
Definition: deadline.h:77
Handler
Handler concept.
ozo::connection_type
typename get_connection_type< std::decay_t< T > >::type connection_type
The connection object type that ConnectionProvider or ConnectionSource provide.
Definition: connection.h:572
ozo::connection_provider::source_type
std::decay_t< ConnectionSource > source_type
Definition: connector.h:73