OZO 「お象」
Boost.Asio and libpq based asynchronous PostgreSQL unofficial header-only C++17 client library.
asio.h
1 #pragma once
2 
3 #include <boost/asio/io_service.hpp>
4 #include <boost/asio/executor.hpp>
5 #include <boost/asio/strand.hpp>
6 #include <boost/asio/steady_timer.hpp>
7 #include <boost/asio/posix/stream_descriptor.hpp>
8 
9 namespace ozo {
10 
11 namespace asio = boost::asio;
12 using asio::async_completion;
13 using asio::io_context;
14 
15 #if BOOST_VERSION < 107000
16 
17 template <typename CompletionToken, typename Signature,
18  typename Initiation, typename... Args>
19 inline decltype(auto) async_initiate(Initiation&& initiation,
20  CompletionToken& token, Args&&... args) {
21  async_completion<CompletionToken, Signature> completion(token);
22 
23  initiation(std::move(completion.completion_handler), std::forward<Args>(args)...);
24 
25  return completion.result.get();
26 }
27 
28 #else
29 
30 using asio::async_initiate;
31 
32 #endif
33 
34 namespace detail {
35 
36 template <typename Executor>
37 struct strand_executor {
38  using type = asio::strand<Executor>;
39 
40  static auto get(const Executor& ex = Executor{}) {
41  return type{ex};
42  }
43 };
44 
45 template <typename Executor>
46 using strand = typename strand_executor<std::decay_t<Executor>>::type;
47 
48 template <typename Executor>
49 auto make_strand_executor(const Executor& ex) {
50  return strand_executor<Executor>::get(ex);
51 }
52 
53 template <typename ExecutionContext>
54 struct operation_timer {
55  static_assert(std::is_same_v<ExecutionContext, operation_timer>,
56  "No operation_timer<> specialization found for specified type");
57 };
58 
59 #if BOOST_VERSION < 107000
60 template <>
61 struct operation_timer<asio::io_context::executor_type> {
62  using type = asio::steady_timer;
63 
64  template <typename TimeConstraint>
65  static type get(const asio::io_context::executor_type& ex, TimeConstraint t) {
66  return type{ex.context(), t};
67  }
68 
69  static type get(const asio::io_context::executor_type& ex) {
70  return type{ex.context()};
71  }
72 };
73 #else
74 template <>
75 struct operation_timer<asio::io_context::executor_type> {
76  using type = asio::steady_timer;
77 
78  template <typename TimeConstraint>
79  static type get(const asio::io_context::executor_type& ex, TimeConstraint t) {
80  return type{ex, t};
81  }
82 
83  static type get(const asio::io_context::executor_type& ex) {
84  return type{ex};
85  }
86 };
87 #endif
88 
89 template <typename Executior, typename TimeConstraint>
90 inline auto get_operation_timer(const Executior& ex, TimeConstraint t) {
91  return operation_timer<Executior>::get(ex, t);
92 }
93 
94 template <typename Executor>
95 inline auto get_operation_timer(const Executor& ex) {
96  return operation_timer<Executor>::get(ex);
97 }
98 
99 
100 template <typename ExecutionContext>
101 struct connection_stream {
102  static_assert(std::is_same_v<ExecutionContext, connection_stream>,
103  "No connection_stream<> specialization found for specified type");
104 };
105 
106 template <>
107 struct connection_stream<asio::io_context::executor_type> {
108  using type = asio::posix::stream_descriptor;
109 
110  static type get(const asio::io_context::executor_type& ex, type::native_handle_type fd) {
111  return type{ex.context(), fd};
112  }
113 
114  static type get(const asio::io_context::executor_type& ex) {
115  return type{ex.context()};
116  }
117 };
118 
119 template <typename Executior, typename NativeHandle>
120 inline auto get_connection_stream(const Executior& ex, NativeHandle fd) {
121  return connection_stream<Executior>::get(ex, fd);
122 }
123 
124 template <typename Executor>
125 inline auto get_connection_stream(const Executor& ex) {
126  return connection_stream<Executor>::get(ex);
127 }
128 
129 } // namespace detail
130 
131 template <typename Operation>
132 struct get_operation_initiator_impl {
133  constexpr static auto apply(const Operation& op) {
134  return op.get_initiator();
135  }
136 };
137 
165 template <typename Operation>
166 constexpr auto get_operation_initiator(const Operation& op) {
167  return get_operation_initiator_impl<Operation>::apply(op);
168 }
169 
170 template <typename Factory, typename Operation>
171 struct construct_initiator_impl {
172  constexpr static auto apply(const Factory&, const Operation&) {
173  static_assert(std::is_void_v<Factory>, "Factory is not supported for the Operation");
174  }
175 };
176 
202 template <typename Operation, typename Factory>
203 constexpr auto construct_initiator(Factory&& f, const Operation& op) {
204  return construct_initiator_impl<std::decay_t<Factory>, Operation>::apply(f, op);
205 }
206 
235 template <typename Operation, typename Initiator>
237  using initiator_type = Initiator;
238  using base = base_async_operation;
239  initiator_type initiator_;
240 
241  constexpr base_async_operation(const Initiator& initiator = Initiator{}) : initiator_(initiator) {}
242 
243  constexpr initiator_type get_initiator() const { return initiator_;}
244 
245  template <typename InitiatorFactory>
246  constexpr auto operator[] (InitiatorFactory&& f) const {
247  const auto& op = static_cast<const Operation&>(*this);
248  return op.rebind_initiator(construct_initiator(std::forward<InitiatorFactory>(f), *this));
249  }
250 };
251 
252 } // namespace ozo
ozo::connection_pool
Connection pool implementation.
Definition: connection_pool.h:302
ozo::request
decltype(auto) request(ConnectionProvider &&provider, BinaryQueryConvertible &&query, TimeConstraint time_constraint, Out out, CompletionToken &&token)
Executes query and retrives a result from a database with time constraint.
ozo::failover::make_role_based_connection_source
constexpr decltype(auto) make_role_based_connection_source(hana::pair< Key, Value > p1, Pairs &&...ps)
Definition: role_based.h:419
ozo::error_code
boost::system::error_code error_code
Error code representation of the library.
Definition: error.h:38
ozo::deadline
constexpr time_traits::time_point deadline(time_traits::time_point t) noexcept
Dealdine calculation.
Definition: deadline.h:16
ozo::error_message
std::string_view error_message(const Connection &conn)
Get native libpq error message.
Definition: connection.h:97
ozo::connection_pool_config::idle_timeout
time_traits::duration idle_timeout
time interval to close connection after last usage
Definition: connection_pool.h:23
ozo::rows_of
std::vector< typed_row< Ts... > > rows_of
Shortcut for easy result container definition.
Definition: shortcuts.h:37
ozo::system_error
boost::system::system_error system_error
Error code contaning exception of the library.
Definition: error.h:45
ozo::failover::retry_options
Options for retry.
Definition: retry.h:40
ozo::errc::connection_error
@ connection_error
connection-related error condition, incorporates ozo, libpq and Boost.Asio connection errors
Definition: error.h:399
ozo::connection_pool_config::capacity
std::size_t capacity
maximum number of stored connections
Definition: connection_pool.h:21
ozo::into
constexpr auto into(T &v)
Shortcut for create result container back inserter.
Definition: shortcuts.h:85
ozo::execute
decltype(auto) execute(ConnectionProvider &&provider, BinaryQueryConvertible &&query, TimeConstraint time_constraint, CompletionToken &&token)
Executes query with no result data expected.
ozo::connection_pool_config
Connection pool configuration.
Definition: connection_pool.h:20
ozo::failover::retry
constexpr auto retry(ErrorConditions ...ec)
Definition: retry.h:308
ozo::is_null_recursive
constexpr bool is_null_recursive(T &&v) noexcept
Indicates if one of unwrapped values is in null state.
Definition: recursive.h:78
ozo::connection_info
Connection source to a single host.
Definition: connection_info.h:28
ozo::get_operation_initiator
constexpr auto get_operation_initiator(const Operation &op)
Get asynchronous operation initiator.
Definition: asio.h:166
ozo::failover::replica
constexpr role< class replica_tag > replica
Definition: role_based.h:122
ozo::begin
decltype(auto) begin(ConnectionProvider &&provider, TimeConstraint time_constraint, CompletionToken &&token)
Start new transaction.
ozo::failover::retry_options::on_retry
constexpr static option< on_retry_tag > on_retry
Set handler for retry event, may be useful for logging.
Definition: retry.h:46
CompletionToken
Completion token concept.
ozo::failover::master
constexpr role< class master_tag > master
Definition: role_based.h:93
ozo::connection_pool_config::lifespan
time_traits::duration lifespan
time interval to keep connection open
Definition: connection_pool.h:24
ozo::failover::role_based
constexpr auto role_based(Roles ...roles)
Definition: role_based.h:652
ozo::construct_initiator
constexpr auto construct_initiator(Factory &&f, const Operation &op)
Create asynchronous operation initiator using factory.
Definition: asio.h:203
ozo::connection_pool_config::queue_capacity
std::size_t queue_capacity
maximum number of queued requests to get available connection
Definition: connection_pool.h:22
ozo::failover::role_based_options
Options for role-based failover.
Definition: role_based.h:58
ozo::commit
decltype(auto) commit(transaction< T, Options > &&transaction, TimeConstraint t, CompletionToken &&token)
Commits a transaction.
ozo::base_async_operation
Base class for async operations.
Definition: asio.h:236
ozo::result
basic_result< pg::result > result
Database raw result representation.
Definition: result.h:444
ozo::get_error_context
const auto & get_error_context(const Connection &conn)
Get additional error context.
Definition: connection.h:124