31#ifndef MYSQLX_DETAIL_SETTINGS_H
32#define MYSQLX_DETAIL_SETTINGS_H
35#include "../document.h"
52template <
typename Traits>
54 :
public common::Settings_impl
57 using Option =
typename Traits::Options;
58 using COption =
typename Traits::COptions;
59 using SSLMode =
typename Traits::SSLMode;
60 using AuthMethod =
typename Traits::AuthMethod;
65 template <
bool session_only,
typename OPT,
typename... Ty>
66 void set(OPT opt, Ty&&... rest)
68 do_set(get_options<session_only>(opt, std::forward<Ty>(rest)...));
80#define OPT_VAL_TYPE(X) \
84#define CHECK_OPT(Opt,Type) \
85 if (opt == Session_option_impl::Opt) \
86 throw Error(#Opt "setting requires value of type " #Type);
93 static Value opt_val(
int opt, Value &&val)
95 OPT_VAL_TYPE(CHECK_OPT)
96 return std::move(val);
104 static Value opt_val(
int opt, std::nullptr_t)
106 return opt_val(opt, Value());
111 typename std::enable_if<std::is_convertible<V, string>::value>::type*
114 static Value opt_val(
int opt, V &&val)
116 return opt_val(opt, Value(
string(val)));
119 static Value opt_val(
int opt, SSLMode m)
121 if (opt != Session_option_impl::SSL_MODE)
123 "SessionSettings::SSLMode value can only be used on SSL_MODE setting."
128 static Value opt_val(
int opt, AuthMethod m)
130 if (opt != Session_option_impl::AUTH)
132 "SessionSettings::AuthMethod value can only be used on AUTH setting."
137 static Value opt_val(
int opt, CompressionMode m)
139 if (opt != Session_option_impl::COMPRESSION)
141 "SessionSettings::CompressionMode value can only be used on COMPRESSION setting."
151 typename std::enable_if<is_range<C>::value>::type* =
nullptr,
152 typename std::enable_if<!std::is_convertible<C,Value>::value>::type*
155 static Value opt_val(
int ,
const C &container)
157 return Value(std::begin(container), std::end(container));
160 template<
typename _Rep,
typename _Period>
161 static Value opt_val(
162 int opt,
const std::chrono::duration<_Rep, _Period> &duration
165 if (opt != Session_option_impl::CONNECT_TIMEOUT &&
166 opt != Client_option_impl::POOL_QUEUE_TIMEOUT &&
167 opt != Client_option_impl::POOL_MAX_IDLE_TIME)
169 std::stringstream err_msg;
170 err_msg <<
"Option " << option_name(opt) <<
" does not accept time value";
171 throw_error(err_msg.str().c_str());
174 return Value(std::chrono::duration_cast<std::chrono::milliseconds>(duration)
182 typename std::enable_if<std::is_convertible<V,int>::value>::type*
184 typename std::enable_if<std::is_convertible<V,Value>::value>::type*
187 static Value opt_val(
int opt, V &&val)
189 return opt_val(opt, Value(val));
192 using session_opt_val_t = std::pair<int, Value>;
193 using session_opt_list_t = std::list<session_opt_val_t>;
202 void do_set(session_opt_list_t&&);
205 void PUBLIC_API do_set(std::list<std::pair<int, common::Value>>&&);
212 template<
bool session_only>
213 static session_opt_list_t get_options()
224 bool session_only,
typename V,
typename... Ty,
225 typename std::enable_if<session_only, int>::type* =
nullptr
227 static session_opt_list_t get_options(Option opt, V&& val, Ty&&... rest)
229 int oo(
static_cast<int>(opt));
230 session_opt_list_t opts = get_options<session_only>(std::forward<Ty>(rest)...);
231 opts.emplace_front(oo,
232 Settings_detail::opt_val(oo, std::forward<V>(val))
238 bool session_only,
typename V,
typename... Ty,
239 typename std::enable_if<!session_only, int>::type* =
nullptr
241 static session_opt_list_t get_options(COption opt, V&& val, Ty&&... rest)
243 int oo(
static_cast<int>(opt));
244 session_opt_list_t opts = get_options<session_only>(std::forward<Ty>(rest)...);
247 Settings_detail::opt_val(oo, std::forward<V>(val))
257 bool has_option(COption opt)
const
259 return Settings_impl::has_option(opt);
262 Value get(COption opt)
264 return Settings_impl::get(opt);
Value object can store value of scalar type, string, array or document.
Definition: document.h:230
CompressionMode
Values to be used with COMPRESSION option .
Definition: settings.h:294
AuthMethod
Authentication methods to be used with AUTH option.
Definition: settings.h:261
SSLMode
Modes to be used with SSL_MODE option .
Definition: settings.h:227