OZO 「お象」
Boost.Asio and libpq based asynchronous PostgreSQL unofficial header-only C++17 client library.
|
|
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>
11 namespace asio = boost::asio;
12 using asio::async_completion;
13 using asio::io_context;
15 #if BOOST_VERSION < 107000
18 typename Initiation,
typename... Args>
19 inline decltype(
auto) async_initiate(Initiation&& initiation,
21 async_completion<CompletionToken, Signature> completion(token);
23 initiation(std::move(completion.completion_handler), std::forward<Args>(args)...);
25 return completion.result.get();
30 using asio::async_initiate;
36 template <
typename Executor>
37 struct strand_executor {
38 using type = asio::strand<Executor>;
40 static auto get(
const Executor& ex = Executor{}) {
45 template <
typename Executor>
46 using strand =
typename strand_executor<std::decay_t<Executor>>::type;
48 template <
typename Executor>
49 auto make_strand_executor(
const Executor& ex) {
50 return strand_executor<Executor>::get(ex);
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");
59 #if BOOST_VERSION < 107000
61 struct operation_timer<asio::io_context::executor_type> {
62 using type = asio::steady_timer;
64 template <
typename TimeConstra
int>
65 static type get(
const asio::io_context::executor_type& ex, TimeConstraint t) {
66 return type{ex.context(), t};
69 static type get(
const asio::io_context::executor_type& ex) {
70 return type{ex.context()};
75 struct operation_timer<asio::io_context::executor_type> {
76 using type = asio::steady_timer;
78 template <
typename TimeConstra
int>
79 static type get(
const asio::io_context::executor_type& ex, TimeConstraint t) {
83 static type get(
const asio::io_context::executor_type& ex) {
89 template <
typename Executior,
typename TimeConstra
int>
90 inline auto get_operation_timer(
const Executior& ex, TimeConstraint t) {
91 return operation_timer<Executior>::get(ex, t);
94 template <
typename Executor>
95 inline auto get_operation_timer(
const Executor& ex) {
96 return operation_timer<Executor>::get(ex);
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");
107 struct connection_stream<asio::io_context::executor_type> {
108 using type = asio::posix::stream_descriptor;
110 static type get(
const asio::io_context::executor_type& ex, type::native_handle_type fd) {
111 return type{ex.context(), fd};
114 static type get(
const asio::io_context::executor_type& ex) {
115 return type{ex.context()};
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);
124 template <
typename Executor>
125 inline auto get_connection_stream(
const Executor& ex) {
126 return connection_stream<Executor>::get(ex);
131 template <
typename Operation>
132 struct get_operation_initiator_impl {
133 constexpr
static auto apply(
const Operation& op) {
134 return op.get_initiator();
165 template <
typename Operation>
167 return get_operation_initiator_impl<Operation>::apply(op);
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");
202 template <
typename Operation,
typename Factory>
204 return construct_initiator_impl<std::decay_t<Factory>, Operation>::apply(f, op);
235 template <
typename Operation,
typename Initiator>
237 using initiator_type = Initiator;
239 initiator_type initiator_;
241 constexpr
base_async_operation(
const Initiator& initiator = Initiator{}) : initiator_(initiator) {}
243 constexpr initiator_type get_initiator()
const {
return initiator_;}
245 template <
typename InitiatorFactory>
246 constexpr
auto operator[] (InitiatorFactory&& f)
const {
247 const auto& op =
static_cast<const Operation&
>(*this);
Connection pool implementation.
Definition: connection_pool.h:302
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.
constexpr decltype(auto) make_role_based_connection_source(hana::pair< Key, Value > p1, Pairs &&...ps)
Definition: role_based.h:419
boost::system::error_code error_code
Error code representation of the library.
Definition: error.h:38
constexpr time_traits::time_point deadline(time_traits::time_point t) noexcept
Dealdine calculation.
Definition: deadline.h:16
std::string_view error_message(const Connection &conn)
Get native libpq error message.
Definition: connection.h:97
time_traits::duration idle_timeout
time interval to close connection after last usage
Definition: connection_pool.h:23
std::vector< typed_row< Ts... > > rows_of
Shortcut for easy result container definition.
Definition: shortcuts.h:37
boost::system::system_error system_error
Error code contaning exception of the library.
Definition: error.h:45
Options for retry.
Definition: retry.h:40
@ connection_error
connection-related error condition, incorporates ozo, libpq and Boost.Asio connection errors
Definition: error.h:399
std::size_t capacity
maximum number of stored connections
Definition: connection_pool.h:21
constexpr auto into(T &v)
Shortcut for create result container back inserter.
Definition: shortcuts.h:85
decltype(auto) execute(ConnectionProvider &&provider, BinaryQueryConvertible &&query, TimeConstraint time_constraint, CompletionToken &&token)
Executes query with no result data expected.
Connection pool configuration.
Definition: connection_pool.h:20
constexpr auto retry(ErrorConditions ...ec)
Definition: retry.h:308
constexpr bool is_null_recursive(T &&v) noexcept
Indicates if one of unwrapped values is in null state.
Definition: recursive.h:78
Connection source to a single host.
Definition: connection_info.h:28
constexpr auto get_operation_initiator(const Operation &op)
Get asynchronous operation initiator.
Definition: asio.h:166
constexpr role< class replica_tag > replica
Definition: role_based.h:122
decltype(auto) begin(ConnectionProvider &&provider, TimeConstraint time_constraint, CompletionToken &&token)
Start new transaction.
constexpr static option< on_retry_tag > on_retry
Set handler for retry event, may be useful for logging.
Definition: retry.h:46
Completion token concept.
constexpr role< class master_tag > master
Definition: role_based.h:93
time_traits::duration lifespan
time interval to keep connection open
Definition: connection_pool.h:24
constexpr auto role_based(Roles ...roles)
Definition: role_based.h:652
constexpr auto construct_initiator(Factory &&f, const Operation &op)
Create asynchronous operation initiator using factory.
Definition: asio.h:203
std::size_t queue_capacity
maximum number of queued requests to get available connection
Definition: connection_pool.h:22
Options for role-based failover.
Definition: role_based.h:58
decltype(auto) commit(transaction< T, Options > &&transaction, TimeConstraint t, CompletionToken &&token)
Commits a transaction.
Base class for async operations.
Definition: asio.h:236
basic_result< pg::result > result
Database raw result representation.
Definition: result.h:444
const auto & get_error_context(const Connection &conn)
Get additional error context.
Definition: connection.h:124