File indexing completed on 2025-12-16 09:58:24
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef BOOST_MYSQL_IMPL_CONNECTION_IMPL_IPP
0009 #define BOOST_MYSQL_IMPL_CONNECTION_IMPL_IPP
0010
0011 #pragma once
0012
0013 #include <boost/mysql/character_set.hpp>
0014 #include <boost/mysql/diagnostics.hpp>
0015 #include <boost/mysql/pipeline.hpp>
0016
0017 #include <boost/mysql/detail/connection_impl.hpp>
0018
0019 #include <boost/mysql/impl/internal/sansio/connection_state.hpp>
0020 #include <boost/mysql/impl/internal/sansio/connection_state_data.hpp>
0021
0022 #include <boost/throw_exception.hpp>
0023
0024 #include <cstddef>
0025 #include <stdexcept>
0026
0027 namespace boost {
0028 namespace mysql {
0029 namespace detail {
0030
0031 inline connection_state* new_connection_state(
0032 std::size_t initial_buffer_size,
0033 std::size_t max_buffer_size,
0034 bool engine_supports_ssl
0035 )
0036 {
0037 if (initial_buffer_size > max_buffer_size)
0038 {
0039 BOOST_THROW_EXCEPTION(std::invalid_argument(
0040 "any_connection::any_connection: initial_buffer_size should be <= max_buffer_size"
0041 ));
0042 }
0043 return new connection_state(initial_buffer_size, max_buffer_size, engine_supports_ssl);
0044 }
0045
0046 }
0047 }
0048 }
0049
0050 void boost::mysql::detail::connection_state_deleter::operator()(connection_state* st) const { delete st; }
0051
0052 std::vector<boost::mysql::field_view>& boost::mysql::detail::get_shared_fields(connection_state& st)
0053 {
0054 return st.data().shared_fields;
0055 }
0056
0057 boost::mysql::detail::connection_impl::connection_impl(
0058 std::size_t read_buff_size,
0059 std::size_t max_buffer_size,
0060 std::unique_ptr<engine> eng
0061 )
0062 : engine_(std::move(eng)),
0063 st_(new_connection_state(read_buff_size, max_buffer_size, engine_->supports_ssl()))
0064 {
0065 }
0066
0067 boost::mysql::metadata_mode boost::mysql::detail::connection_impl::meta_mode() const
0068 {
0069 return st_->data().meta_mode;
0070 }
0071
0072 void boost::mysql::detail::connection_impl::set_meta_mode(metadata_mode v) { st_->data().meta_mode = v; }
0073
0074 bool boost::mysql::detail::connection_impl::ssl_active() const { return st_->data().tls_active; }
0075
0076 bool boost::mysql::detail::connection_impl::backslash_escapes() const
0077 {
0078 return st_->data().backslash_escapes;
0079 }
0080
0081 boost::mysql::diagnostics& boost::mysql::detail::connection_impl::shared_diag()
0082 {
0083 return st_->data().shared_diag;
0084 }
0085
0086 boost::system::result<boost::mysql::character_set> boost::mysql::detail::connection_impl::
0087 current_character_set() const
0088 {
0089 character_set charset = st_->data().current_charset;
0090 if (charset.name == nullptr)
0091 return client_errc::unknown_character_set;
0092 return charset;
0093 }
0094
0095 boost::optional<std::uint32_t> boost::mysql::detail::connection_impl::connection_id() const
0096 {
0097 const auto& data = st_->data();
0098 if (data.status == connection_status::not_connected)
0099 return {};
0100 else
0101 return data.connection_id;
0102 }
0103
0104 boost::mysql::detail::run_pipeline_algo_params boost::mysql::detail::connection_impl::make_params_pipeline(
0105 const pipeline_request& req,
0106 std::vector<stage_response>& response
0107 )
0108 {
0109 const auto& req_impl = access::get_impl(req);
0110 return {req_impl.buffer_, req_impl.stages_, &response};
0111 }
0112
0113 template <class AlgoParams>
0114 boost::mysql::detail::any_resumable_ref boost::mysql::detail::setup(
0115 connection_state& st,
0116 diagnostics& diag,
0117 const AlgoParams& params
0118 )
0119 {
0120 return st.setup(diag, params);
0121 }
0122
0123 template <class AlgoParams>
0124 typename AlgoParams::result_type boost::mysql::detail::get_result(const connection_state& st)
0125 {
0126 return st.result<AlgoParams>();
0127 }
0128
0129 #ifdef BOOST_MYSQL_SEPARATE_COMPILATION
0130
0131 #define BOOST_MYSQL_INSTANTIATE_SETUP(op_params_type) \
0132 template any_resumable_ref setup<op_params_type>(connection_state&, diagnostics&, const op_params_type&);
0133
0134 #define BOOST_MYSQL_INSTANTIATE_GET_RESULT(op_params_type) \
0135 template op_params_type::result_type get_result<op_params_type>(const connection_state&);
0136
0137 namespace boost {
0138 namespace mysql {
0139 namespace detail {
0140
0141 BOOST_MYSQL_INSTANTIATE_SETUP(connect_algo_params)
0142 BOOST_MYSQL_INSTANTIATE_SETUP(handshake_algo_params)
0143 BOOST_MYSQL_INSTANTIATE_SETUP(execute_algo_params)
0144 BOOST_MYSQL_INSTANTIATE_SETUP(start_execution_algo_params)
0145 BOOST_MYSQL_INSTANTIATE_SETUP(read_resultset_head_algo_params)
0146 BOOST_MYSQL_INSTANTIATE_SETUP(read_some_rows_algo_params)
0147 BOOST_MYSQL_INSTANTIATE_SETUP(read_some_rows_dynamic_algo_params)
0148 BOOST_MYSQL_INSTANTIATE_SETUP(prepare_statement_algo_params)
0149 BOOST_MYSQL_INSTANTIATE_SETUP(close_statement_algo_params)
0150 BOOST_MYSQL_INSTANTIATE_SETUP(set_character_set_algo_params)
0151 BOOST_MYSQL_INSTANTIATE_SETUP(ping_algo_params)
0152 BOOST_MYSQL_INSTANTIATE_SETUP(reset_connection_algo_params)
0153 BOOST_MYSQL_INSTANTIATE_SETUP(quit_connection_algo_params)
0154 BOOST_MYSQL_INSTANTIATE_SETUP(close_connection_algo_params)
0155 BOOST_MYSQL_INSTANTIATE_SETUP(run_pipeline_algo_params)
0156
0157 BOOST_MYSQL_INSTANTIATE_GET_RESULT(read_some_rows_algo_params)
0158 BOOST_MYSQL_INSTANTIATE_GET_RESULT(read_some_rows_dynamic_algo_params)
0159 BOOST_MYSQL_INSTANTIATE_GET_RESULT(prepare_statement_algo_params)
0160
0161 }
0162 }
0163 }
0164
0165 #endif
0166
0167 #endif