OZO 「お象」
Boost.Asio and libpq based asynchronous PostgreSQL unofficial header-only C++17 client library.
transaction.h
1 #pragma once
2 
3 #include <ozo/core/options.h>
4 #include <ozo/detail/begin_statement_builder.h>
5 #include <ozo/transaction_status.h>
6 
7 namespace ozo {
8 
44 template <typename Connection, typename Options>
45 class transaction {
46 public:
47  static_assert(ozo::Connection<Connection>, "Connection should model Connection concept");
48 
49  using handle_type = Connection;
51  using native_handle_type = typename lowest_layer_type::native_handle_type;
52  using oid_map_type = typename lowest_layer_type::oid_map_type;
53  using error_context_type = typename lowest_layer_type::error_context_type;
54  using executor_type = typename lowest_layer_type::executor_type;
55  using options_type = std::decay_t<Options>;
56 
67  transaction() = default;
68 
78  transaction(Connection&& connection, Options options) noexcept(
79  std::is_nothrow_move_constructible_v<Connection>
80  && std::is_nothrow_move_constructible_v<Options>)
81  : impl_(std::move(connection)), options_(std::move(options)) {}
82 
93  native_handle_type native_handle() const noexcept {
94  return lowest_layer().native_handle();
95  }
96 
104  const oid_map_type& oid_map() const noexcept { return lowest_layer().oid_map();}
105 
106  template <typename Key, typename Value>
107  void update_statistics(const Key& key, Value&& v) noexcept {
108  lowest_layer().update_statistics(key, std::forward<Value>(v));
109  }
110  decltype(auto) statistics() const noexcept {
111  return lowest_layer().statistics();
112  }
113 
121  const error_context_type& get_error_context() const noexcept {
122  return lowest_layer().get_error_context();
123  }
133  lowest_layer().set_error_context(std::move(v));
134  }
135 
143  executor_type get_executor() const noexcept {
144  return lowest_layer().get_executor();
145  }
146 
162  return std::move(x.impl_);
163  }
164 
175  template <typename WaitHandler>
176  void async_wait_write(WaitHandler&& handler) {
177  lowest_layer().async_wait_write(std::forward<WaitHandler>(handler));
178  }
179 
190  template <typename WaitHandler>
191  void async_wait_read(WaitHandler&& handler) {
192  lowest_layer().async_wait_read(std::forward<WaitHandler>(handler));
193  }
194 
207  error_code close() noexcept { return lowest_layer().close();}
208 
217  void cancel() noexcept { lowest_layer().cancel();}
218 
229  bool is_bad() const noexcept { return lowest_layer().is_bad();}
230 
240  operator bool () const noexcept { return !(is_null() || is_bad());}
241 
249  bool is_open() const noexcept { return !is_null() && lowest_layer().is_open();}
250 
256  constexpr const options_type& options() const noexcept { return options_;}
257 
263  lowest_layer_type& lowest_layer() noexcept { return ozo::unwrap(impl_);}
264 
270  const lowest_layer_type& lowest_layer() const noexcept {return ozo::unwrap(impl_);}
271 
272 private:
273  bool is_null() const noexcept { return ozo::is_null(impl_); }
274 
275  friend struct is_null_impl<transaction>;
276  handle_type impl_;
277  options_type options_;
278 };
279 
280 template <typename ...Ts>
281 struct is_connection<transaction<Ts...>> : std::true_type {};
282 
283 namespace impl {
284 // [[DEPRECATED]] for backward compatibility only
285 template <typename ...Ts>
286 using transaction = ozo::transaction<Ts...>;
287 } // namespace impl
288 
289 namespace detail {
290 struct initiate_async_start_transaction {
291  template <typename Handler, typename ...Args>
292  constexpr void operator()(Handler&& h, Args&& ...args) const;
293 };
294 } // namespace detail
295 
296 #ifdef OZO_DOCUMENTATION
297 
330 template <typename ConnectionProvider, typename TimeConstraint, typename CompletionToken>
331 decltype(auto) begin (ConnectionProvider&& provider, TimeConstraint time_constraint, CompletionToken&& token);
332 
346 template <typename ConnectionProvider, typename CompletionToken>
347 decltype(auto) begin (ConnectionProvider&& provider, CompletionToken&& token);
348 
349 #endif
350 template <typename Initiator, typename Options = decltype(make_options())>
352 struct begin_op : base_async_operation <begin_op<Initiator, Options>, Initiator> {
353  using base = typename begin_op::base;
354  Options options_;
355 
356  constexpr explicit begin_op(Initiator initiator = {}, Options options = {}) : base(initiator), options_(options) {}
357 
358  template <typename T, typename TimeConstraint, typename CompletionToken>
359  auto operator() (T&& provider, TimeConstraint t, CompletionToken&& token) const {
360  static_assert(ConnectionProvider<T>, "provider should be a ConnectionProvider");
361  static_assert(ozo::TimeConstraint<TimeConstraint>, "should model TimeConstraint concept");
362  using namespace ozo::literals;
363  return async_initiate<CompletionToken, handler_signature<transaction<connection_type<T>, Options>>>(
364  get_operation_initiator(*this), token,
365  std::forward<T>(provider), options_, detail::begin_statement_builder::build(options_), t);
366  }
367 
368  template <typename T, typename CompletionToken>
369  auto operator() (T&& provider, CompletionToken&& token) const {
370  return (*this)(
371  std::forward<T>(provider),
372  none,
373  std::forward<CompletionToken>(token)
374  );
375  }
376 
377  template <typename OtherOptions>
378  constexpr auto with_transaction_options(const OtherOptions& options) const {
379  return begin_op<Initiator, OtherOptions>{get_operation_initiator(*this), options};
380  }
381 
382  template <typename OtherInitiator>
383  constexpr auto rebind_initiator(const OtherInitiator& other) const {
384  return begin_op<OtherInitiator, Options>{other, options_};
385  }
386 };
387 
388 inline constexpr begin_op<detail::initiate_async_start_transaction> begin;
389 
391 
392 namespace detail {
393 struct initiate_async_end_transaction {
394  template <typename Handler, typename ...Args>
395  constexpr void operator()(Handler&& h, Args&& ...args) const;
396 };
397 } // namespace detail
398 
399 #ifdef OZO_DOCUMENTATION
400 
424 template <typename T, typename Options, typename TimeConstraint, typename CompletionToken>
425 decltype(auto) commit (transaction<T, Options>&& transaction, TimeConstraint t, CompletionToken&& token);
426 
440 template <typename ConnectionProvider, typename CompletionToken>
441 decltype(auto) commit (ConnectionProvider&& provider, CompletionToken&& token);
442 
443 #endif
444 struct commit_op {
446  template <typename T, typename Options, typename TimeConstraint, typename CompletionToken>
447  auto operator() (transaction<T, Options>&& transaction, TimeConstraint t, CompletionToken&& token) const {
448  static_assert(ozo::TimeConstraint<TimeConstraint>, "should model TimeConstraint concept");
449  using namespace ozo::literals;
450  return async_initiate<CompletionToken, handler_signature<typename ozo::transaction<T, Options>::handle_type>>(
451  detail::initiate_async_end_transaction{}, token,
452  std::move(transaction), "COMMIT"_SQL, t);
453  }
454 
455  template <typename... Ts, typename CompletionToken>
456  auto operator() (transaction<Ts...>&& transaction, CompletionToken&& token) const {
457  return (*this)(
458  std::move(transaction),
459  none,
460  std::forward<CompletionToken>(token)
461  );
462  }
463 };
464 
465 inline constexpr commit_op commit;
466 
468 
469 #ifdef OZO_DOCUMENTATION
470 
496 template <typename T, typename Options, typename TimeConstraint, typename CompletionToken>
497 decltype(auto) rollback (transaction<T, Options>&& transaction, TimeConstraint t, CompletionToken&& token);
498 
512 template <typename ConnectionProvider, typename CompletionToken>
513 decltype(auto) rollback (ConnectionProvider&& provider, CompletionToken&& token);
514 
515 #endif
516 struct rollback_op {
518  template <typename T, typename Options, typename TimeConstraint, typename CompletionToken>
519  auto operator() (transaction<T, Options>&& transaction, TimeConstraint t, CompletionToken&& token) const {
520  static_assert(ozo::TimeConstraint<TimeConstraint>, "should model TimeConstraint concept");
521  using namespace ozo::literals;
522  return async_initiate<CompletionToken, handler_signature<typename ozo::transaction<T, Options>::handle_type>>(
523  detail::initiate_async_end_transaction{}, token,
524  std::move(transaction), "ROLLBACK"_SQL, t);
525  }
526 
527  template <typename... Ts, typename CompletionToken>
528  auto operator() (transaction<Ts...>&& transaction, CompletionToken&& token) const {
529  return (*this)(
530  std::move(transaction),
531  none,
532  std::forward<CompletionToken>(token)
533  );
534  }
535 };
536 
537 inline constexpr rollback_op rollback;
538 
540 
552 template<typename... Ts>
555 }
556 
568 template<typename... Ts>
571 }
572 
585 template<typename... Ts>
588 }
589 
590 } // namespace ozo
591 
592 #include <ozo/impl/transaction.h>
ozo::transaction::async_wait_read
void async_wait_read(WaitHandler &&handler)
Definition: transaction.h:191
ozo::begin
decltype(auto) begin(ConnectionProvider &&provider, CompletionToken &&token)
Start new transaction.
ozo::unwrap
constexpr decltype(auto) unwrap(T &&v) noexcept(noexcept(unwrap_impl< std::decay_t< T >>::apply(std::forward< T >(v))))
Unwraps argument underlying value or forwards the argument.
Definition: unwrap.h:57
ozo::transaction::get_error_context
const error_context_type & get_error_context() const noexcept
Definition: transaction.h:121
ozo::error_code
boost::system::error_code error_code
Error code representation of the library.
Definition: error.h:38
ozo::transaction::lowest_layer_type
unwrap_type< handle_type > lowest_layer_type
Lowest level Connection model type - fully unwrapped type.
Definition: transaction.h:50
ozo::transaction::options_type
std::decay_t< Options > options_type
The type of options specified for the transaction.
Definition: transaction.h:55
ozo::transaction
Transaction Connection model.
Definition: transaction.h:45
ozo::commit
decltype(auto) commit(ConnectionProvider &&provider, CompletionToken &&token)
Commits a transaction.
ozo::transaction::oid_map_type
typename lowest_layer_type::oid_map_type oid_map_type
Oid map of types that are used with the connection.
Definition: transaction.h:52
ozo::transaction::get_executor
executor_type get_executor() const noexcept
Definition: transaction.h:143
ozo::transaction::release_connection
friend handle_type release_connection(transaction &&x) noexcept
Definition: transaction.h:161
ozo::transaction::is_bad
bool is_bad() const noexcept
Definition: transaction.h:229
ozo::rollback
decltype(auto) rollback(ConnectionProvider &&provider, CompletionToken &&token)
Commits a transaction.
ozo::transaction::error_context_type
typename lowest_layer_type::error_context_type error_context_type
Additional error context which could provide context depended information for errors.
Definition: transaction.h:53
ozo::get_transaction_mode
constexpr auto get_transaction_mode(const transaction< Ts... > &transaction)
Retrieve's a transactions transaction mode.
Definition: transaction.h:569
ozo::transaction::lowest_layer
lowest_layer_type & lowest_layer() noexcept
Definition: transaction.h:263
ozo::transaction::close
error_code close() noexcept
Definition: transaction.h:207
ConnectionProvider
Connection provider concept
ozo::get_transaction_isolation_level
constexpr auto get_transaction_isolation_level(const transaction< Ts... > &transaction)
Retrieve's a transactions isolation level.
Definition: transaction.h:553
ozo::none
constexpr auto none
None object.
Definition: none.h:27
ozo::get_transaction_deferrability
constexpr auto get_transaction_deferrability(const transaction< Ts... > &transaction)
Retrieve's a transactions deferrability.
Definition: transaction.h:586
ozo::transaction::transaction
transaction(Connection &&connection, Options options) noexcept(std::is_nothrow_move_constructible_v< Connection > &&std::is_nothrow_move_constructible_v< Options >)
Definition: transaction.h:78
ozo::transaction::native_handle
native_handle_type native_handle() const noexcept
Definition: transaction.h:93
ozo::transaction_options::isolation_level
constexpr static option< class isolation_level_tag > isolation_level
Transaction isolation level, see ozo::isolation_level.
Definition: transaction_options.h:66
ozo::connection
Default model for Connection concept.
Definition: connection.h:93
ozo::transaction::options
constexpr const options_type & options() const noexcept
Definition: transaction.h:256
ozo::get_operation_initiator
constexpr auto get_operation_initiator(const Operation &op)
Get asynchronous operation initiator.
Definition: asio.h:166
CompletionToken
Completion token concept.
ozo::transaction::cancel
void cancel() noexcept
Definition: transaction.h:217
ozo::transaction_options::mode
constexpr static option< class mode_tag > mode
Transaction mode, see ozo::transaction_mode.
Definition: transaction_options.h:67
ozo::unwrap_type
typename get_unwrapped_type< T >::type unwrap_type
Shortcut for ozo::get_unwrapped_type.
Definition: unwrap.h:107
ozo::transaction::native_handle_type
typename lowest_layer_type::native_handle_type native_handle_type
Native connection handle type.
Definition: transaction.h:51
ozo::transaction::executor_type
typename lowest_layer_type::executor_type executor_type
The type of the executor associated with the object.
Definition: transaction.h:54
ozo::transaction::transaction
transaction()=default
ozo::transaction::async_wait_write
void async_wait_write(WaitHandler &&handler)
Definition: transaction.h:176
ozo::transaction::oid_map
const oid_map_type & oid_map() const noexcept
Definition: transaction.h:104
ozo::get_option
constexpr decltype(auto) get_option(Map &&map, ozo::option< Key > op)
Get the option object from Hana.Map.
Definition: options.h:52
ozo::transaction::lowest_layer
const lowest_layer_type & lowest_layer() const noexcept
Definition: transaction.h:270
Handler
Handler concept.
ozo::is_null
constexpr decltype(auto) is_null(const T &v) noexcept(noexcept(is_null_impl< T >::apply(v)))
Indicates if value is in null state.
Definition: nullable.h:85
Connection
Database connection concept.
ozo::transaction::set_error_context
void set_error_context(error_context_type v=error_context_type{})
Definition: transaction.h:132
ozo::base_async_operation
Base class for async operations.
Definition: asio.h:236
ozo::transaction_options::deferrability
constexpr static option< class deferrability_tag > deferrability
Transaction deferrability, see ozo::deferrable_mode.
Definition: transaction_options.h:68
ozo::transaction::is_open
bool is_open() const noexcept
Definition: transaction.h:249