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