31#ifndef MYSQLX_COMMON_SETTINGS_H
32#define MYSQLX_COMMON_SETTINGS_H
44#include "../common_constants.h"
75class PUBLIC_API Settings_impl
83#define SETTINGS_OPT_ENUM_str(X,N) X = N,
84#define SETTINGS_OPT_ENUM_num(X,N) X = N,
85#define SETTINGS_OPT_ENUM_any(X,N) X = N,
86#define SETTINGS_OPT_ENUM_bool(X,N) X = N,
88 enum Session_option_impl{
89 SESSION_OPTION_LIST(SETTINGS_OPT_ENUM)
99#define CLIENT_OPT_IMPL_ENUM_str(X,N) X = -N,
100#define CLIENT_OPT_IMPL_ENUM_bool(X,N) X = -N,
101#define CLIENT_OPT_IMPL_ENUM_num(X,N) X = -N,
102#define CLIENT_OPT_IMPL_ENUM_any(X,N) X = -N,
104 enum Client_option_impl {
105 CLIENT_OPTION_LIST(CLIENT_OPT_IMPL_ENUM)
110 static const char* option_name(
int opt);
113#define SETTINGS_VAL_ENUM(X,N) X = N,
115 enum class SSL_mode {
116 SSL_MODE_LIST(SETTINGS_VAL_ENUM)
120 static const char* ssl_mode_name(SSL_mode mode);
123 enum class Auth_method {
124 AUTH_METHOD_LIST(SETTINGS_VAL_ENUM)
128 static const char* auth_method_name(Auth_method method);
130 enum class Compression_mode {
131 COMPRESSION_MODE_LIST(SETTINGS_VAL_ENUM)
135 static const char* compression_mode_name(Compression_mode mode);
139 using Value = common::Value;
140 using opt_val_t = std::pair<int, Value>;
142 using option_list_t = std::vector<opt_val_t>;
143 using connection_attr = std::map<std::string,std::string>;
144 using iterator = option_list_t::const_iterator;
152 bool has_option(
int)
const;
153 const Value& get(
int)
const;
158 iterator begin()
const
160 return m_data.m_options.cbegin();
165 return m_data.m_options.cend();
182 void get_data_source(cdk::ds::Multi_source&);
184 void get_attributes(cdk::ds::Attr_processor&);
188 void set_from_uri(
const std::string &);
192 void set_client_opts(
const std::string &);
196 void set_client_opts(
const Settings_impl &);
213 struct PUBLIC_API Data
217 init_connection_attr();
220 option_list_t m_options;
221 connection_attr m_connection_attr;
223 unsigned m_host_cnt = 0;
224 bool m_user_priorities =
false;
225 bool m_ssl_ca =
false;
226 SSL_mode m_ssl_mode = SSL_mode::LAST;
227 bool m_tcpip =
false;
229 bool m_tls_vers =
false;
230 bool m_tls_ciphers =
false;
231 bool m_compression_algorithms =
false;
234 void init_connection_attr();
235 void clear_connection_attr();
244#define SETTINGS_OPT_NAME_str(X,N) case N: return #X;
245#define SETTINGS_OPT_NAME_bool(X,N) case N: return #X;
246#define SETTINGS_OPT_NAME_num(X,N) case N: return #X;
247#define SETTINGS_OPT_NAME_any(X,N) case N: return #X;
248#define SETTINGS_OPT_NAME_bool(X,N) case N: return #X;
251#define CLIENT_OPT_NAME_str(X,N) case -N: return #X;
252#define CLIENT_OPT_NAME_bool(X,N) case -N: return #X;
253#define CLIENT_OPT_NAME_num(X,N) case -N: return #X;
254#define CLIENT_OPT_NAME_any(X,N) case -N: return #X;
258const char* Settings_impl::option_name(
int opt)
262 SESSION_OPTION_LIST(SETTINGS_OPT_NAME)
263 CLIENT_OPTION_LIST(CLIENT_OPT_NAME)
270#define SETTINGS_VAL_NAME(X,N) case N: return #X;
273const char* Settings_impl::ssl_mode_name(SSL_mode mode)
275 switch (
unsigned(mode))
277 SSL_MODE_LIST(SETTINGS_VAL_NAME)
284const char* Settings_impl::auth_method_name(Auth_method method)
286 switch (
unsigned(method))
288 AUTH_METHOD_LIST(SETTINGS_VAL_NAME)
295const char* Settings_impl::compression_mode_name(Compression_mode mode)
297 switch (
unsigned(mode))
299 COMPRESSION_MODE_LIST(SETTINGS_VAL_NAME)
310const common::Value& Settings_impl::get(
int opt)
const
314 auto it = find_if(m_data.m_options.crbegin(), m_data.m_options.crend(),
315 [opt](opt_val_t el) ->
bool { return el.first == opt; }
318 static Value null_value;
320 if (it == m_data.m_options.crend())
328bool Settings_impl::has_option(
int opt)
const
336 case Session_option_impl::TLS_VERSIONS:
337 if (m_data.m_tls_vers)
341 case Session_option_impl::TLS_CIPHERSUITES:
342 if (m_data.m_tls_ciphers)
346 case Session_option_impl::COMPRESSION_ALGORITHMS:
347 if (m_data.m_compression_algorithms)
355 return m_data.m_options.cend() !=
356 find_if(m_data.m_options.cbegin(), m_data.m_options.cend(),
357 [opt](opt_val_t el) ->
bool { return el.first == opt; }
364void Settings_impl::erase(
int opt)
376void Settings_impl::Data::erase(
int opt)
378 remove_from(m_options,
379 [opt](opt_val_t el) ->
bool
381 return el.first == opt;
392 case Session_option_impl::HOST:
395 case Session_option_impl::PORT:
399 case Session_option_impl::SOCKET:
402 case Session_option_impl::PRIORITY:
403 m_user_priorities =
false;
405 case Session_option_impl::SSL_CA:
408 case Session_option_impl::SSL_MODE:
409 m_ssl_mode = SSL_mode::LAST;
411 case Session_option_impl::CONNECTION_ATTRIBUTES:
412 clear_connection_attr();