connection_impl.ipp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. //
  2. // Copyright (c) 2019-2025 Ruben Perez Hidalgo (rubenperez038 at gmail dot com)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. #ifndef BOOST_MYSQL_IMPL_CONNECTION_IMPL_IPP
  8. #define BOOST_MYSQL_IMPL_CONNECTION_IMPL_IPP
  9. #pragma once
  10. #include <boost/mysql/character_set.hpp>
  11. #include <boost/mysql/diagnostics.hpp>
  12. #include <boost/mysql/pipeline.hpp>
  13. #include <boost/mysql/detail/connection_impl.hpp>
  14. #include <boost/mysql/impl/internal/sansio/connection_state.hpp>
  15. #include <boost/mysql/impl/internal/sansio/connection_state_data.hpp>
  16. #include <boost/throw_exception.hpp>
  17. #include <cstddef>
  18. #include <stdexcept>
  19. namespace boost {
  20. namespace mysql {
  21. namespace detail {
  22. inline connection_state* new_connection_state(
  23. std::size_t initial_buffer_size,
  24. std::size_t max_buffer_size,
  25. bool engine_supports_ssl
  26. )
  27. {
  28. if (initial_buffer_size > max_buffer_size)
  29. {
  30. BOOST_THROW_EXCEPTION(std::invalid_argument(
  31. "any_connection::any_connection: initial_buffer_size should be <= max_buffer_size"
  32. ));
  33. }
  34. return new connection_state(initial_buffer_size, max_buffer_size, engine_supports_ssl);
  35. }
  36. } // namespace detail
  37. } // namespace mysql
  38. } // namespace boost
  39. void boost::mysql::detail::connection_state_deleter::operator()(connection_state* st) const { delete st; }
  40. std::vector<boost::mysql::field_view>& boost::mysql::detail::get_shared_fields(connection_state& st)
  41. {
  42. return st.data().shared_fields;
  43. }
  44. boost::mysql::detail::connection_impl::connection_impl(
  45. std::size_t read_buff_size,
  46. std::size_t max_buffer_size,
  47. std::unique_ptr<engine> eng
  48. )
  49. : engine_(std::move(eng)),
  50. st_(new_connection_state(read_buff_size, max_buffer_size, engine_->supports_ssl()))
  51. {
  52. }
  53. boost::mysql::metadata_mode boost::mysql::detail::connection_impl::meta_mode() const
  54. {
  55. return st_->data().meta_mode;
  56. }
  57. void boost::mysql::detail::connection_impl::set_meta_mode(metadata_mode v) { st_->data().meta_mode = v; }
  58. bool boost::mysql::detail::connection_impl::ssl_active() const { return st_->data().tls_active; }
  59. bool boost::mysql::detail::connection_impl::backslash_escapes() const
  60. {
  61. return st_->data().backslash_escapes;
  62. }
  63. boost::mysql::diagnostics& boost::mysql::detail::connection_impl::shared_diag()
  64. {
  65. return st_->data().shared_diag;
  66. }
  67. boost::system::result<boost::mysql::character_set> boost::mysql::detail::connection_impl::
  68. current_character_set() const
  69. {
  70. character_set charset = st_->data().current_charset;
  71. if (charset.name == nullptr)
  72. return client_errc::unknown_character_set;
  73. return charset;
  74. }
  75. boost::optional<std::uint32_t> boost::mysql::detail::connection_impl::connection_id() const
  76. {
  77. const auto& data = st_->data();
  78. if (data.status == connection_status::not_connected)
  79. return {};
  80. else
  81. return data.connection_id;
  82. }
  83. boost::mysql::detail::run_pipeline_algo_params boost::mysql::detail::connection_impl::make_params_pipeline(
  84. const pipeline_request& req,
  85. std::vector<stage_response>& response
  86. )
  87. {
  88. const auto& req_impl = access::get_impl(req);
  89. return {req_impl.buffer_, req_impl.stages_, &response};
  90. }
  91. template <class AlgoParams>
  92. boost::mysql::detail::any_resumable_ref boost::mysql::detail::setup(
  93. connection_state& st,
  94. diagnostics& diag,
  95. const AlgoParams& params
  96. )
  97. {
  98. return st.setup(diag, params);
  99. }
  100. template <class AlgoParams>
  101. typename AlgoParams::result_type boost::mysql::detail::get_result(const connection_state& st)
  102. {
  103. return st.result<AlgoParams>();
  104. }
  105. #ifdef BOOST_MYSQL_SEPARATE_COMPILATION
  106. #define BOOST_MYSQL_INSTANTIATE_SETUP(op_params_type) \
  107. template any_resumable_ref setup<op_params_type>(connection_state&, diagnostics&, const op_params_type&);
  108. #define BOOST_MYSQL_INSTANTIATE_GET_RESULT(op_params_type) \
  109. template op_params_type::result_type get_result<op_params_type>(const connection_state&);
  110. namespace boost {
  111. namespace mysql {
  112. namespace detail {
  113. BOOST_MYSQL_INSTANTIATE_SETUP(connect_algo_params)
  114. BOOST_MYSQL_INSTANTIATE_SETUP(handshake_algo_params)
  115. BOOST_MYSQL_INSTANTIATE_SETUP(execute_algo_params)
  116. BOOST_MYSQL_INSTANTIATE_SETUP(start_execution_algo_params)
  117. BOOST_MYSQL_INSTANTIATE_SETUP(read_resultset_head_algo_params)
  118. BOOST_MYSQL_INSTANTIATE_SETUP(read_some_rows_algo_params)
  119. BOOST_MYSQL_INSTANTIATE_SETUP(read_some_rows_dynamic_algo_params)
  120. BOOST_MYSQL_INSTANTIATE_SETUP(prepare_statement_algo_params)
  121. BOOST_MYSQL_INSTANTIATE_SETUP(close_statement_algo_params)
  122. BOOST_MYSQL_INSTANTIATE_SETUP(set_character_set_algo_params)
  123. BOOST_MYSQL_INSTANTIATE_SETUP(ping_algo_params)
  124. BOOST_MYSQL_INSTANTIATE_SETUP(reset_connection_algo_params)
  125. BOOST_MYSQL_INSTANTIATE_SETUP(quit_connection_algo_params)
  126. BOOST_MYSQL_INSTANTIATE_SETUP(close_connection_algo_params)
  127. BOOST_MYSQL_INSTANTIATE_SETUP(run_pipeline_algo_params)
  128. BOOST_MYSQL_INSTANTIATE_GET_RESULT(read_some_rows_algo_params)
  129. BOOST_MYSQL_INSTANTIATE_GET_RESULT(read_some_rows_dynamic_algo_params)
  130. BOOST_MYSQL_INSTANTIATE_GET_RESULT(prepare_statement_algo_params)
  131. } // namespace detail
  132. } // namespace mysql
  133. } // namespace boost
  134. #endif
  135. #endif