Commit bd6afd8b authored by Alexander Barkov's avatar Alexander Barkov

MDEV-21956 Add class Sys_var_charptr_fscs

Simplifying definitions on Sys_var_charptr*:

- Removing sys_var::is_os_charset
- Adding a new class Sys_var_charptr_fscs, to handle system
  variables with character_set_filesystem.
parent 9cc7edb1
......@@ -154,8 +154,7 @@ sys_var::sys_var(sys_var_chain *chain, const char *name_arg,
next(0), binlog_status(binlog_status_arg), value_origin(COMPILE_TIME),
flags(flags_arg), show_val_type(show_val_type_arg),
guard(lock), offset(off), on_check(on_check_func), on_update(on_update_func),
deprecation_substitute(substitute),
is_os_charset(FALSE)
deprecation_substitute(substitute)
{
/*
There is a limitation in handle_options() related to short options:
......@@ -509,12 +508,6 @@ bool throw_bounds_warning(THD *thd, const char *name, bool fixed, double v)
return false;
}
CHARSET_INFO *sys_var::charset(THD *thd)
{
return is_os_charset ? thd->variables.character_set_filesystem :
system_charset_info;
}
typedef struct old_names_map_st
{
......
......@@ -90,7 +90,6 @@ class sys_var: protected Value_source // for double_from_string_with_check
on_check_function on_check;
on_update_function on_update;
const char *const deprecation_substitute;
bool is_os_charset; ///< true if the value is in character_set_filesystem
public:
sys_var(sys_var_chain *chain, const char *name_arg, const char *comment,
......@@ -130,7 +129,10 @@ class sys_var: protected Value_source // for double_from_string_with_check
SHOW_TYPE show_type() { return show_val_type; }
int scope() const { return flags & SCOPE_MASK; }
CHARSET_INFO *charset(THD *thd);
virtual CHARSET_INFO *charset(THD *thd) const
{
return system_charset_info;
}
bool is_readonly() const { return flags & READONLY; }
/**
the following is only true for keycache variables,
......
......@@ -501,16 +501,16 @@ static Sys_var_ulong Sys_back_log(
AUTO_SET READ_ONLY GLOBAL_VAR(back_log), CMD_LINE(REQUIRED_ARG),
VALID_RANGE(0, 65535), DEFAULT(150), BLOCK_SIZE(1));
static Sys_var_charptr Sys_basedir(
static Sys_var_charptr_fscs Sys_basedir(
"basedir", "Path to installation directory. All paths are "
"usually resolved relative to this",
READ_ONLY GLOBAL_VAR(mysql_home_ptr), CMD_LINE(REQUIRED_ARG, 'b'),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_my_bind_addr(
static Sys_var_charptr_fscs Sys_my_bind_addr(
"bind_address", "IP address to bind to.",
READ_ONLY GLOBAL_VAR(my_bind_addr_str), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
const char *Sys_var_vers_asof::asof_keywords[]= {"DEFAULT", NULL};
static Sys_var_vers_asof Sys_vers_asof_timestamp(
......@@ -730,10 +730,10 @@ static Sys_var_ulonglong Sys_bulk_insert_buff_size(
SESSION_VAR(bulk_insert_buff_size), CMD_LINE(REQUIRED_ARG),
VALID_RANGE(0, SIZE_T_MAX), DEFAULT(8192*1024), BLOCK_SIZE(1));
static Sys_var_charptr Sys_character_sets_dir(
static Sys_var_charptr_fscs Sys_character_sets_dir(
"character_sets_dir", "Directory where character sets are",
READ_ONLY GLOBAL_VAR(charsets_dir), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static bool check_not_null(sys_var *self, THD *thd, set_var *var)
{
......@@ -986,10 +986,10 @@ static Sys_var_ulong Sys_connect_timeout(
GLOBAL_VAR(connect_timeout), CMD_LINE(REQUIRED_ARG),
VALID_RANGE(2, LONG_TIMEOUT), DEFAULT(CONNECT_TIMEOUT), BLOCK_SIZE(1));
static Sys_var_charptr Sys_datadir(
static Sys_var_charptr_fscs Sys_datadir(
"datadir", "Path to the database root directory",
READ_ONLY GLOBAL_VAR(mysql_real_data_home_ptr),
CMD_LINE(REQUIRED_ARG, 'h'), IN_FS_CHARSET, DEFAULT(mysql_real_data_home));
CMD_LINE(REQUIRED_ARG, 'h'), DEFAULT(mysql_real_data_home));
#ifndef DBUG_OFF
static Sys_var_dbug Sys_dbug(
......@@ -1185,7 +1185,7 @@ static Sys_var_charptr Sys_ft_boolean_syntax(
"ft_boolean_syntax", "List of operators for "
"MATCH ... AGAINST ( ... IN BOOLEAN MODE)",
GLOBAL_VAR(ft_boolean_syntax),
CMD_LINE(REQUIRED_ARG), IN_SYSTEM_CHARSET,
CMD_LINE(REQUIRED_ARG),
DEFAULT(DEFAULT_FTB_SYNTAX), NO_MUTEX_GUARD,
NOT_IN_BINLOG, ON_CHECK(check_ftb_syntax), ON_UPDATE(query_cache_flush));
......@@ -1212,11 +1212,11 @@ static Sys_var_ulong Sys_ft_query_expansion_limit(
CMD_LINE(REQUIRED_ARG),
VALID_RANGE(0, 1000), DEFAULT(20), BLOCK_SIZE(1));
static Sys_var_charptr Sys_ft_stopword_file(
static Sys_var_charptr_fscs Sys_ft_stopword_file(
"ft_stopword_file",
"Use stopwords from this file instead of built-in list",
READ_ONLY GLOBAL_VAR(ft_stopword_file), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_mybool Sys_ignore_builtin_innodb(
"ignore_builtin_innodb",
......@@ -1237,7 +1237,7 @@ static PolyLock_rwlock PLock_sys_init_connect(&LOCK_sys_init_connect);
static Sys_var_lexstring Sys_init_connect(
"init_connect", "Command(s) that are executed for each "
"new connection (unless the user has SUPER privilege)",
GLOBAL_VAR(opt_init_connect), CMD_LINE(REQUIRED_ARG), IN_SYSTEM_CHARSET,
GLOBAL_VAR(opt_init_connect), CMD_LINE(REQUIRED_ARG),
DEFAULT(""), &PLock_sys_init_connect, NOT_IN_BINLOG,
ON_CHECK(check_init_string));
......@@ -1257,11 +1257,11 @@ static Sys_var_session_lexstring Sys_default_master_connection(
"default_master_connection",
"Master connection to use for all slave variables and slave commands",
SESSION_ONLY(default_master_connection),
NO_CMD_LINE, IN_SYSTEM_CHARSET,
NO_CMD_LINE,
DEFAULT(""), MAX_CONNECTION_NAME, ON_CHECK(check_master_connection));
#endif
static Sys_var_charptr Sys_init_file(
static Sys_var_charptr_fscs Sys_init_file(
"init_file", "Read SQL commands from this file at startup",
READ_ONLY GLOBAL_VAR(opt_init_file),
#ifdef DISABLE_GRANT_OPTIONS
......@@ -1269,13 +1269,13 @@ static Sys_var_charptr Sys_init_file(
#else
CMD_LINE(REQUIRED_ARG),
#endif
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static PolyLock_rwlock PLock_sys_init_slave(&LOCK_sys_init_slave);
static Sys_var_lexstring Sys_init_slave(
"init_slave", "Command(s) that are executed by a slave server "
"each time the SQL thread starts", GLOBAL_VAR(opt_init_slave),
CMD_LINE(REQUIRED_ARG), IN_SYSTEM_CHARSET,
CMD_LINE(REQUIRED_ARG),
DEFAULT(""), &PLock_sys_init_slave,
NOT_IN_BINLOG, ON_CHECK(check_init_string));
......@@ -1361,10 +1361,10 @@ static Sys_var_mybool Sys_large_pages(
READ_ONLY GLOBAL_VAR(opt_large_pages),
IF_WIN(NO_CMD_LINE, CMD_LINE(OPT_ARG)), DEFAULT(FALSE));
static Sys_var_charptr Sys_language(
static Sys_var_charptr_fscs Sys_language(
"lc_messages_dir", "Directory where error messages are",
READ_ONLY GLOBAL_VAR(lc_messages_dir_ptr), CMD_LINE(REQUIRED_ARG, 'L'),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_mybool Sys_local_infile(
"local_infile", "Enable LOAD DATA LOCAL INFILE",
......@@ -1412,14 +1412,14 @@ static Sys_var_mybool Sys_trust_function_creators(
GLOBAL_VAR(trust_function_creators),
CMD_LINE(OPT_ARG), DEFAULT(FALSE));
static Sys_var_charptr Sys_log_error(
static Sys_var_charptr_fscs Sys_log_error(
"log_error",
"Log errors to file (instead of stdout). If file name is not specified "
"then 'datadir'/'log-basename'.err or the 'pid-file' path with extension "
".err is used",
READ_ONLY GLOBAL_VAR(log_error_file_ptr),
CMD_LINE(OPT_ARG, OPT_LOG_ERROR),
IN_FS_CHARSET, DEFAULT(disabled_my_option));
DEFAULT(disabled_my_option));
static Sys_var_bit Sys_log_queries_not_using_indexes(
"log_queries_not_using_indexes",
......@@ -2691,15 +2691,15 @@ static Sys_var_ulong Sys_optimizer_trace_max_mem_size(
SESSION_VAR(optimizer_trace_max_mem_size), CMD_LINE(REQUIRED_ARG),
VALID_RANGE(0, ULONG_MAX), DEFAULT(1024 * 1024), BLOCK_SIZE(1));
static Sys_var_charptr Sys_pid_file(
static Sys_var_charptr_fscs Sys_pid_file(
"pid_file", "Pid file used by safe_mysqld",
READ_ONLY GLOBAL_VAR(pidfile_name_ptr), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_plugin_dir(
static Sys_var_charptr_fscs Sys_plugin_dir(
"plugin_dir", "Directory for plugins",
READ_ONLY GLOBAL_VAR(opt_plugin_dir_ptr), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_uint Sys_port(
"port",
......@@ -2725,12 +2725,10 @@ static Sys_var_uint Sys_protocol_version(
VALID_RANGE(0, ~0U), DEFAULT(PROTOCOL_VERSION), BLOCK_SIZE(1));
static Sys_var_proxy_user Sys_proxy_user(
"proxy_user", "The proxy user account name used when logging in",
IN_SYSTEM_CHARSET);
"proxy_user", "The proxy user account name used when logging in");
static Sys_var_external_user Sys_exterenal_user(
"external_user", "The external user account used when logging in",
IN_SYSTEM_CHARSET);
"external_user", "The external user account used when logging in");
static Sys_var_ulong Sys_read_buff_size(
"read_buffer_size",
......@@ -2911,10 +2909,10 @@ static Sys_var_mybool Sys_skip_show_database(
READ_ONLY GLOBAL_VAR(opt_skip_show_db), CMD_LINE(OPT_ARG),
DEFAULT(FALSE));
static Sys_var_charptr Sys_socket(
static Sys_var_charptr_fscs Sys_socket(
"socket", "Socket file to use for connection",
READ_ONLY GLOBAL_VAR(mysqld_unix_port), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_ulonglong Sys_thread_stack(
"thread_stack", "The stack size for each thread",
......@@ -2922,7 +2920,7 @@ static Sys_var_ulonglong Sys_thread_stack(
VALID_RANGE(128*1024, ULONGLONG_MAX), DEFAULT(DEFAULT_THREAD_STACK),
BLOCK_SIZE(1024));
static Sys_var_charptr Sys_tmpdir(
static Sys_var_charptr_fscs Sys_tmpdir(
"tmpdir", "Path for temporary files. Several paths may "
"be specified, separated by a "
#if defined(__WIN__)
......@@ -2932,7 +2930,7 @@ static Sys_var_charptr Sys_tmpdir(
#endif
", in this case they are used in a round-robin fashion",
READ_ONLY GLOBAL_VAR(opt_mysql_tmpdir), CMD_LINE(REQUIRED_ARG, 't'),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static bool fix_trans_mem_root(sys_var *self, THD *thd, enum_var_type type)
{
......@@ -3135,12 +3133,12 @@ static Sys_var_mybool Sys_require_secure_transport(
NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(check_require_secure_transport), ON_UPDATE(0));
static Sys_var_charptr Sys_secure_file_priv(
static Sys_var_charptr_fscs Sys_secure_file_priv(
"secure_file_priv",
"Limit LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE() to files "
"within specified directory",
PREALLOCATED READ_ONLY GLOBAL_VAR(opt_secure_file_priv),
CMD_LINE(REQUIRED_ARG), IN_FS_CHARSET, DEFAULT(0));
CMD_LINE(REQUIRED_ARG), DEFAULT(0));
static bool fix_server_id(sys_var *self, THD *thd, enum_var_type type)
{
......@@ -3599,44 +3597,44 @@ static Sys_var_set Sys_old_behavior(
#define SSL_OPT(X) NO_CMD_LINE
#endif
static Sys_var_charptr Sys_ssl_ca(
static Sys_var_charptr_fscs Sys_ssl_ca(
"ssl_ca",
"CA file in PEM format (check OpenSSL docs, implies --ssl)",
READ_ONLY GLOBAL_VAR(opt_ssl_ca), SSL_OPT(OPT_SSL_CA),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_ssl_capath(
static Sys_var_charptr_fscs Sys_ssl_capath(
"ssl_capath",
"CA directory (check OpenSSL docs, implies --ssl)",
READ_ONLY GLOBAL_VAR(opt_ssl_capath), SSL_OPT(OPT_SSL_CAPATH),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_ssl_cert(
static Sys_var_charptr_fscs Sys_ssl_cert(
"ssl_cert", "X509 cert in PEM format (implies --ssl)",
READ_ONLY GLOBAL_VAR(opt_ssl_cert), SSL_OPT(OPT_SSL_CERT),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_ssl_cipher(
static Sys_var_charptr_fscs Sys_ssl_cipher(
"ssl_cipher", "SSL cipher to use (implies --ssl)",
READ_ONLY GLOBAL_VAR(opt_ssl_cipher), SSL_OPT(OPT_SSL_CIPHER),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_ssl_key(
static Sys_var_charptr_fscs Sys_ssl_key(
"ssl_key", "X509 key in PEM format (implies --ssl)",
READ_ONLY GLOBAL_VAR(opt_ssl_key), SSL_OPT(OPT_SSL_KEY),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_ssl_crl(
static Sys_var_charptr_fscs Sys_ssl_crl(
"ssl_crl",
"CRL file in PEM format (check OpenSSL docs, implies --ssl)",
READ_ONLY GLOBAL_VAR(opt_ssl_crl), SSL_OPT(OPT_SSL_CRL),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_ssl_crlpath(
static Sys_var_charptr_fscs Sys_ssl_crlpath(
"ssl_crlpath",
"CRL directory (check OpenSSL docs, implies --ssl)",
READ_ONLY GLOBAL_VAR(opt_ssl_crlpath), SSL_OPT(OPT_SSL_CRLPATH),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static const char *tls_version_names[]=
{
......@@ -3690,7 +3688,7 @@ static Sys_var_charptr Sys_system_time_zone(
"system_time_zone", "The server system time zone",
READ_ONLY GLOBAL_VAR(system_time_zone_ptr),
CMD_LINE_HELP_ONLY,
IN_SYSTEM_CHARSET, DEFAULT(system_time_zone));
DEFAULT(system_time_zone));
/*
If One use views with prepared statements this should be bigger than
......@@ -3972,7 +3970,7 @@ static Sys_var_charptr Sys_version(
"enabled, for example 10.1.1-MariaDB-mariadb1precise-log.",
READ_ONLY GLOBAL_VAR(server_version_ptr),
CMD_LINE_HELP_ONLY,
IN_SYSTEM_CHARSET, DEFAULT(server_version));
DEFAULT(server_version));
static char *server_version_comment_ptr;
static Sys_var_charptr Sys_version_comment(
......@@ -3981,14 +3979,14 @@ static Sys_var_charptr Sys_version_comment(
"mariadb.org binary distribution.",
READ_ONLY GLOBAL_VAR(server_version_comment_ptr),
CMD_LINE_HELP_ONLY,
IN_SYSTEM_CHARSET, DEFAULT(MYSQL_COMPILATION_COMMENT));
DEFAULT(MYSQL_COMPILATION_COMMENT));
static char *server_version_compile_machine_ptr;
static Sys_var_charptr Sys_version_compile_machine(
"version_compile_machine", "The machine type or architecture "
"MariaDB was built on, for example i686.",
READ_ONLY GLOBAL_VAR(server_version_compile_machine_ptr),
CMD_LINE_HELP_ONLY, IN_SYSTEM_CHARSET, DEFAULT(DEFAULT_MACHINE));
CMD_LINE_HELP_ONLY, DEFAULT(DEFAULT_MACHINE));
static char *server_version_compile_os_ptr;
static Sys_var_charptr Sys_version_compile_os(
......@@ -3996,7 +3994,7 @@ static Sys_var_charptr Sys_version_compile_os(
"on, for example debian-linux-gnu.",
READ_ONLY GLOBAL_VAR(server_version_compile_os_ptr),
CMD_LINE_HELP_ONLY,
IN_SYSTEM_CHARSET, DEFAULT(SYSTEM_TYPE));
DEFAULT(SYSTEM_TYPE));
#include <source_revision.h>
static char *server_version_source_revision;
......@@ -4004,19 +4002,19 @@ static Sys_var_charptr Sys_version_source_revision(
"version_source_revision", "Source control revision id for MariaDB source code",
READ_ONLY GLOBAL_VAR(server_version_source_revision),
CMD_LINE_HELP_ONLY,
IN_SYSTEM_CHARSET, DEFAULT(SOURCE_REVISION));
DEFAULT(SOURCE_REVISION));
static char *malloc_library;
static Sys_var_charptr Sys_malloc_library(
"version_malloc_library", "Version of the used malloc library",
READ_ONLY GLOBAL_VAR(malloc_library), CMD_LINE_HELP_ONLY,
IN_SYSTEM_CHARSET, DEFAULT(guess_malloc_library()));
DEFAULT(guess_malloc_library()));
static char *ssl_library;
static Sys_var_charptr Sys_ssl_library(
"version_ssl_library", "Version of the used SSL library",
READ_ONLY GLOBAL_VAR(ssl_library), CMD_LINE_HELP_ONLY,
IN_SYSTEM_CHARSET, DEFAULT(SSL_LIBRARY));
DEFAULT(SSL_LIBRARY));
static Sys_var_ulong Sys_net_wait_timeout(
"wait_timeout",
......@@ -4142,7 +4140,7 @@ static Sys_var_debug_sync Sys_debug_sync(
static Sys_var_charptr Sys_date_format(
"date_format", "The DATE format (ignored)",
READ_ONLY GLOBAL_VAR(global_date_format.format.str),
CMD_LINE(REQUIRED_ARG), IN_SYSTEM_CHARSET,
CMD_LINE(REQUIRED_ARG),
DEFAULT(known_date_time_formats[ISO_FORMAT].date_format),
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(0),
DEPRECATED("")); // since 10.1.2
......@@ -4150,7 +4148,7 @@ static Sys_var_charptr Sys_date_format(
static Sys_var_charptr Sys_datetime_format(
"datetime_format", "The DATETIME format (ignored)",
READ_ONLY GLOBAL_VAR(global_datetime_format.format.str),
CMD_LINE(REQUIRED_ARG), IN_SYSTEM_CHARSET,
CMD_LINE(REQUIRED_ARG),
DEFAULT(known_date_time_formats[ISO_FORMAT].datetime_format),
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(0),
DEPRECATED("")); // since 10.1.2
......@@ -4158,7 +4156,7 @@ static Sys_var_charptr Sys_datetime_format(
static Sys_var_charptr Sys_time_format(
"time_format", "The TIME format (ignored)",
READ_ONLY GLOBAL_VAR(global_time_format.format.str),
CMD_LINE(REQUIRED_ARG), IN_SYSTEM_CHARSET,
CMD_LINE(REQUIRED_ARG),
DEFAULT(known_date_time_formats[ISO_FORMAT].time_format),
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(0),
DEPRECATED("")); // since 10.1.2
......@@ -4640,7 +4638,7 @@ static char *glob_hostname_ptr;
static Sys_var_charptr Sys_hostname(
"hostname", "Server host name",
READ_ONLY GLOBAL_VAR(glob_hostname_ptr), NO_CMD_LINE,
IN_SYSTEM_CHARSET, DEFAULT(glob_hostname));
DEFAULT(glob_hostname));
#ifndef EMBEDDED_LIBRARY
static Sys_var_charptr Sys_repl_report_host(
......@@ -4653,21 +4651,21 @@ static Sys_var_charptr Sys_repl_report_host(
"NAT and other routing issues, that IP may not be valid for connecting "
"to the slave from the master or other hosts",
READ_ONLY GLOBAL_VAR(report_host), CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_repl_report_user(
"report_user",
"The account user name of the slave to be reported to the master "
"during slave registration",
READ_ONLY GLOBAL_VAR(report_user), CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_repl_report_password(
"report_password",
"The account password of the slave to be reported to the master "
"during slave registration",
READ_ONLY GLOBAL_VAR(report_password), CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_uint Sys_repl_report_port(
"report_port",
......@@ -4688,7 +4686,7 @@ static Sys_var_mybool Sys_keep_files_on_create(
static char *license;
static Sys_var_charptr Sys_license(
"license", "The type of license the server has",
READ_ONLY GLOBAL_VAR(license), NO_CMD_LINE, IN_SYSTEM_CHARSET,
READ_ONLY GLOBAL_VAR(license), NO_CMD_LINE,
DEFAULT(STRINGIFY_ARG(LICENSE)));
#include <proxy_protocol.h>
......@@ -4707,7 +4705,7 @@ static bool fix_proxy_protocol_networks(sys_var *, THD *, enum_var_type)
}
static Sys_var_charptr Sys_proxy_protocol_networks(
static Sys_var_charptr_fscs Sys_proxy_protocol_networks(
"proxy_protocol_networks", "Enable proxy protocol for these source "
"networks. The syntax is a comma separated list of IPv4 and IPv6 "
"networks. If the network doesn't contain mask, it is considered to be "
......@@ -4715,7 +4713,7 @@ static Sys_var_charptr Sys_proxy_protocol_networks(
"directive on the line. String \"localhost\" represents non-TCP "
"local connections (Unix domain socket, Windows named pipe or shared memory).",
GLOBAL_VAR(my_proxy_protocol_networks), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(""), NO_MUTEX_GUARD, NOT_IN_BINLOG,
DEFAULT(""), NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(check_proxy_protocol_networks), ON_UPDATE(fix_proxy_protocol_networks));
......@@ -4812,10 +4810,10 @@ static bool fix_general_log_file(sys_var *self, THD *thd, enum_var_type type)
return fix_log(&opt_logname, opt_log_basename, ".log", opt_log,
reopen_general_log);
}
static Sys_var_charptr Sys_general_log_path(
static Sys_var_charptr_fscs Sys_general_log_path(
"general_log_file", "Log connections and queries to given file",
PREALLOCATED GLOBAL_VAR(opt_logname), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(0), NO_MUTEX_GUARD, NOT_IN_BINLOG,
DEFAULT(0), NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(check_log_path), ON_UPDATE(fix_general_log_file));
static void reopen_slow_log(char* name)
......@@ -4828,12 +4826,12 @@ static bool fix_slow_log_file(sys_var *self, THD *thd, enum_var_type type)
return fix_log(&opt_slow_logname, opt_log_basename, "-slow.log",
global_system_variables.sql_log_slow, reopen_slow_log);
}
static Sys_var_charptr Sys_slow_log_path(
static Sys_var_charptr_fscs Sys_slow_log_path(
"slow_query_log_file", "Log slow queries to given log file. "
"Defaults logging to 'hostname'-slow.log. Must be enabled to activate "
"other slow log options",
PREALLOCATED GLOBAL_VAR(opt_slow_logname), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(0), NO_MUTEX_GUARD, NOT_IN_BINLOG,
DEFAULT(0), NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(check_log_path), ON_UPDATE(fix_slow_log_file));
static Sys_var_have Sys_have_compress(
......@@ -4896,12 +4894,12 @@ static Sys_var_have Sys_have_symlink(
#ifdef __SANITIZE_ADDRESS__
static char *have_sanitizer;
static Sys_var_charptr Sys_have_santitizer(
static Sys_var_charptr_fscs Sys_have_santitizer(
"have_sanitizer",
"If the server is compiled with ASan (Address sanitizer) this will be "
"set to ASAN",
READ_ONLY GLOBAL_VAR(have_sanitizer), NO_CMD_LINE,
IN_FS_CHARSET, DEFAULT("ASAN"));
DEFAULT("ASAN"));
#endif
static bool fix_log_state(sys_var *self, THD *thd, enum_var_type type);
......@@ -4994,49 +4992,49 @@ static Sys_var_mybool Sys_log_slave_updates(
READ_ONLY GLOBAL_VAR(opt_log_slave_updates), CMD_LINE(OPT_ARG),
DEFAULT(0));
static Sys_var_charptr Sys_relay_log(
static Sys_var_charptr_fscs Sys_relay_log(
"relay_log", "The location and name to use for relay logs.",
READ_ONLY GLOBAL_VAR(opt_relay_logname), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
/*
Uses NO_CMD_LINE since the --relay-log-index option set
opt_relaylog_index_name variable and computes a value for the
relay_log_index variable.
*/
static Sys_var_charptr Sys_relay_log_index(
static Sys_var_charptr_fscs Sys_relay_log_index(
"relay_log_index", "The location and name to use for the file "
"that keeps a list of the last relay logs.",
READ_ONLY GLOBAL_VAR(relay_log_index), NO_CMD_LINE,
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
/*
Uses NO_CMD_LINE since the --log-bin-index option set
opt_binlog_index_name variable and computes a value for the
log_bin_index variable.
*/
static Sys_var_charptr Sys_binlog_index(
static Sys_var_charptr_fscs Sys_binlog_index(
"log_bin_index", "File that holds the names for last binary log files.",
READ_ONLY GLOBAL_VAR(log_bin_index), NO_CMD_LINE,
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_relay_log_basename(
static Sys_var_charptr_fscs Sys_relay_log_basename(
"relay_log_basename",
"The full path of the relay log file names, excluding the extension.",
READ_ONLY GLOBAL_VAR(relay_log_basename), NO_CMD_LINE,
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_log_bin_basename(
static Sys_var_charptr_fscs Sys_log_bin_basename(
"log_bin_basename",
"The full path of the binary log file names, excluding the extension.",
READ_ONLY GLOBAL_VAR(log_bin_basename), NO_CMD_LINE,
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_charptr Sys_relay_log_info_file(
static Sys_var_charptr_fscs Sys_relay_log_info_file(
"relay_log_info_file", "The location and name of the file that "
"remembers where the SQL replication thread is in the relay logs.",
READ_ONLY GLOBAL_VAR(relay_log_info_file), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_mybool Sys_relay_log_purge(
"relay_log_purge", "if disabled - do not purge relay logs. "
......@@ -5208,11 +5206,11 @@ static Sys_var_rpl_filter Sys_replicate_wild_ignore_table(
"Tells the slave thread to not replicate to the tables that "
"match the given wildcard pattern.");
static Sys_var_charptr Sys_slave_load_tmpdir(
static Sys_var_charptr_fscs Sys_slave_load_tmpdir(
"slave_load_tmpdir", "The location where the slave should put "
"its temporary files when replicating a LOAD DATA INFILE command",
READ_ONLY GLOBAL_VAR(slave_load_tmpdir), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_uint Sys_slave_net_timeout(
"slave_net_timeout", "Number of seconds to wait for more data "
......@@ -5330,7 +5328,7 @@ static Sys_var_charptr Sys_slave_skip_errors(
"replication when a query event returns an error from the "
"provided list",
READ_ONLY GLOBAL_VAR(opt_slave_skip_errors), CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_ulonglong Sys_read_binlog_speed_limit(
"read_binlog_speed_limit", "Maximum speed(KB/s) to read binlog from"
......@@ -5346,7 +5344,7 @@ static Sys_var_charptr Sys_slave_transaction_retry_errors(
"connect error and 2 types of lost connection error are automatically "
"added to this list",
READ_ONLY GLOBAL_VAR(opt_slave_transaction_retry_errors), CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_ulonglong Sys_relay_log_space_limit(
"relay_log_space_limit", "Maximum space to use for all relay logs",
......@@ -5486,10 +5484,10 @@ static Sys_var_tz Sys_time_zone(
#include "wsrep_sst.h"
#include "wsrep_binlog.h"
static Sys_var_charptr Sys_wsrep_provider(
static Sys_var_charptr_fscs Sys_wsrep_provider(
"wsrep_provider", "Path to replication provider library",
PREALLOCATED GLOBAL_VAR(wsrep_provider), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(WSREP_NONE),
DEFAULT(WSREP_NONE),
NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(wsrep_provider_check), ON_UPDATE(wsrep_provider_update));
......@@ -5498,19 +5496,19 @@ static Sys_var_charptr Sys_wsrep_provider_options(
"options (see wsrep_provider_options documentation).",
PREALLOCATED GLOBAL_VAR(wsrep_provider_options),
CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(""), NO_MUTEX_GUARD, NOT_IN_BINLOG,
DEFAULT(""), NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(wsrep_provider_options_check),
ON_UPDATE(wsrep_provider_options_update));
static Sys_var_charptr Sys_wsrep_data_home_dir(
static Sys_var_charptr_fscs Sys_wsrep_data_home_dir(
"wsrep_data_home_dir", "home directory for wsrep provider",
READ_ONLY GLOBAL_VAR(wsrep_data_home_dir), CMD_LINE(REQUIRED_ARG),
IN_FS_CHARSET, DEFAULT(mysql_real_data_home));
DEFAULT(mysql_real_data_home));
static Sys_var_charptr Sys_wsrep_cluster_name(
"wsrep_cluster_name", "Name for the cluster",
PREALLOCATED GLOBAL_VAR(wsrep_cluster_name), CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(WSREP_CLUSTER_NAME),
DEFAULT(WSREP_CLUSTER_NAME),
NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(wsrep_cluster_name_check),
ON_UPDATE(wsrep_cluster_name_update));
......@@ -5520,7 +5518,7 @@ static Sys_var_charptr Sys_wsrep_cluster_address (
"wsrep_cluster_address", "Address to initially connect to cluster",
PREALLOCATED GLOBAL_VAR(wsrep_cluster_address),
CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(""),
DEFAULT(""),
&PLock_wsrep_cluster_config, NOT_IN_BINLOG,
ON_CHECK(wsrep_cluster_address_check),
ON_UPDATE(wsrep_cluster_address_update));
......@@ -5530,7 +5528,7 @@ static Sys_var_charptr Sys_wsrep_node_name (
"wsrep_sst_donor as a preferred donor. Note that multiple nodes "
"in a cluster can have the same name.",
PREALLOCATED GLOBAL_VAR(wsrep_node_name), CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(glob_hostname), NO_MUTEX_GUARD, NOT_IN_BINLOG,
DEFAULT(glob_hostname), NO_MUTEX_GUARD, NOT_IN_BINLOG,
wsrep_node_name_check, wsrep_node_name_update);
static Sys_var_charptr Sys_wsrep_node_address (
......@@ -5538,7 +5536,7 @@ static Sys_var_charptr Sys_wsrep_node_address (
"the format ip address[:port]. Used in situations where autoguessing "
"is not reliable. As of MariaDB 10.1.8, supports IPv6.",
PREALLOCATED GLOBAL_VAR(wsrep_node_address), CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(""),
DEFAULT(""),
NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(wsrep_node_address_check),
ON_UPDATE(wsrep_node_address_update));
......@@ -5546,7 +5544,7 @@ static Sys_var_charptr Sys_wsrep_node_address (
static Sys_var_charptr Sys_wsrep_node_incoming_address(
"wsrep_node_incoming_address", "Client connection address",
PREALLOCATED GLOBAL_VAR(wsrep_node_incoming_address),CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(WSREP_NODE_INCOMING_AUTO));
DEFAULT(WSREP_NODE_INCOMING_AUTO));
static Sys_var_ulong Sys_wsrep_slave_threads(
"wsrep_slave_threads", "Number of slave appliers to launch",
......@@ -5559,7 +5557,7 @@ static Sys_var_ulong Sys_wsrep_slave_threads(
static Sys_var_charptr Sys_wsrep_dbug_option(
"wsrep_dbug_option", "DBUG options to provider library",
GLOBAL_VAR(wsrep_dbug_option),CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(""));
DEFAULT(""));
static const char *wsrep_debug_names[]=
{ "NONE", "SERVER", "TRANSACTION", "STREAMING", "CLIENT", NullS };
......@@ -5641,14 +5639,14 @@ static Sys_var_mybool Sys_wsrep_drupal_282555_workaround(
static Sys_var_charptr sys_wsrep_sst_method(
"wsrep_sst_method", "State snapshot transfer method",
GLOBAL_VAR(wsrep_sst_method),CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(WSREP_SST_DEFAULT), NO_MUTEX_GUARD, NOT_IN_BINLOG,
DEFAULT(WSREP_SST_DEFAULT), NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(wsrep_sst_method_check));
static Sys_var_charptr Sys_wsrep_sst_receive_address(
"wsrep_sst_receive_address", "Address where node is waiting for "
"SST contact",
GLOBAL_VAR(wsrep_sst_receive_address),CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(WSREP_SST_ADDRESS_AUTO), NO_MUTEX_GUARD,
DEFAULT(WSREP_SST_ADDRESS_AUTO), NO_MUTEX_GUARD,
NOT_IN_BINLOG,
ON_CHECK(wsrep_sst_receive_address_check),
ON_UPDATE(wsrep_sst_receive_address_update));
......@@ -5656,7 +5654,7 @@ static Sys_var_charptr Sys_wsrep_sst_receive_address(
static Sys_var_charptr Sys_wsrep_sst_auth(
"wsrep_sst_auth", "Authentication for SST connection",
PREALLOCATED GLOBAL_VAR(wsrep_sst_auth), CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(NULL), NO_MUTEX_GUARD,
DEFAULT(NULL), NO_MUTEX_GUARD,
NOT_IN_BINLOG,
ON_CHECK(wsrep_sst_auth_check),
ON_UPDATE(wsrep_sst_auth_update));
......@@ -5664,7 +5662,7 @@ static Sys_var_charptr Sys_wsrep_sst_auth(
static Sys_var_charptr Sys_wsrep_sst_donor(
"wsrep_sst_donor", "preferred donor node for the SST",
GLOBAL_VAR(wsrep_sst_donor),CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(""), NO_MUTEX_GUARD, NOT_IN_BINLOG,
DEFAULT(""), NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(wsrep_sst_donor_check),
ON_UPDATE(wsrep_sst_donor_update));
......@@ -5686,7 +5684,7 @@ static Sys_var_charptr Sys_wsrep_start_position (
"wsrep_start_position", "global transaction position to start from ",
PREALLOCATED GLOBAL_VAR(wsrep_start_position),
CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(WSREP_START_POSITION_ZERO),
DEFAULT(WSREP_START_POSITION_ZERO),
NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(wsrep_start_position_check),
ON_UPDATE(wsrep_start_position_update));
......@@ -5706,7 +5704,7 @@ static Sys_var_ulong Sys_wsrep_max_ws_rows (
static Sys_var_charptr Sys_wsrep_notify_cmd(
"wsrep_notify_cmd", "",
GLOBAL_VAR(wsrep_notify_cmd),CMD_LINE(REQUIRED_ARG),
IN_SYSTEM_CHARSET, DEFAULT(""));
DEFAULT(""));
static Sys_var_mybool Sys_wsrep_certify_nonPK(
"wsrep_certify_nonPK", "Certify tables with no primary key",
......@@ -5893,7 +5891,7 @@ static char *wsrep_patch_version_ptr;
static Sys_var_charptr Sys_wsrep_patch_version(
"wsrep_patch_version", "Wsrep patch version, for example wsrep_25.10.",
READ_ONLY GLOBAL_VAR(wsrep_patch_version_ptr), CMD_LINE_HELP_ONLY,
IN_SYSTEM_CHARSET, DEFAULT(WSREP_PATCH_VERSION));
DEFAULT(WSREP_PATCH_VERSION));
#endif /* WITH_WSREP */
......@@ -5959,14 +5957,14 @@ static Sys_var_mybool Sys_tcp_nodelay(
ON_CHECK(check_session_only_variable),
ON_UPDATE(update_tcp_nodelay));
static Sys_var_charptr Sys_ignore_db_dirs(
static Sys_var_charptr_fscs Sys_ignore_db_dirs(
"ignore_db_dirs",
"Specifies a directory to add to the ignore list when collecting "
"database names from the datadir. Put a blank argument to reset "
"the list accumulated so far.",
READ_ONLY GLOBAL_VAR(opt_ignore_db_dirs),
CMD_LINE(REQUIRED_ARG, OPT_IGNORE_DB_DIRECTORY),
IN_FS_CHARSET, DEFAULT(0));
DEFAULT(0));
static Sys_var_ulong Sys_sp_cache_size(
"stored_program_cache",
......@@ -6410,7 +6408,7 @@ static Sys_var_ulonglong Sys_max_thread_mem(
static Sys_var_sesvartrack Sys_track_session_sys_vars(
"session_track_system_variables",
"Track changes in registered system variables. ",
CMD_LINE(REQUIRED_ARG), IN_SYSTEM_CHARSET,
CMD_LINE(REQUIRED_ARG),
DEFAULT("autocommit,character_set_client,character_set_connection,"
"character_set_results,time_zone"));
......
......@@ -97,7 +97,6 @@
exit(255); \
}
enum charset_enum {IN_SYSTEM_CHARSET, IN_FS_CHARSET};
static const char *bool_values[3]= {"OFF", "ON", 0};
TYPELIB bool_typelib={ array_elements(bool_values)-1, "", bool_values, 0 };
......@@ -449,9 +448,6 @@ public:
or not. The state of the initial value is specified in the constructor,
after that it's managed automatically. The value of NULL is supported.
Class specific constructor arguments:
enum charset_enum is_os_charset_arg
Backing store: char*
@note
......@@ -465,7 +461,6 @@ public:
Sys_var_charptr_base(const char *name_arg,
const char *comment, int flag_args, ptrdiff_t off, size_t size,
CMD_LINE getopt,
enum charset_enum is_os_charset_arg,
const char *def_val, PolyLock *lock=0,
enum binlog_status_enum binlog_status_arg=VARIABLE_NOT_IN_BINLOG,
on_check_function on_check_func=0,
......@@ -476,7 +471,6 @@ public:
lock, binlog_status_arg, on_check_func, on_update_func,
substitute)
{
is_os_charset= is_os_charset_arg == IN_FS_CHARSET;
/*
use GET_STR_ALLOC - if ALLOCATED it must be *always* allocated,
otherwise (GET_STR) you'll never know whether to free it or not.
......@@ -566,14 +560,13 @@ public:
Sys_var_charptr(const char *name_arg,
const char *comment, int flag_args, ptrdiff_t off, size_t size,
CMD_LINE getopt,
enum charset_enum is_os_charset_arg,
const char *def_val, PolyLock *lock=0,
enum binlog_status_enum binlog_status_arg=VARIABLE_NOT_IN_BINLOG,
on_check_function on_check_func=0,
on_update_function on_update_func=0,
const char *substitute=0) :
Sys_var_charptr_base(name_arg, comment, flag_args, off, size, getopt,
is_os_charset_arg, def_val, lock, binlog_status_arg,
def_val, lock, binlog_status_arg,
on_check_func, on_update_func, substitute)
{
SYSVAR_ASSERT(scope() == GLOBAL);
......@@ -589,6 +582,18 @@ public:
{ DBUG_ASSERT(FALSE); }
};
class Sys_var_charptr_fscs: public Sys_var_charptr
{
using Sys_var_charptr::Sys_var_charptr;
public:
CHARSET_INFO *charset(THD *thd) const override
{
return thd->variables.character_set_filesystem;
}
};
#ifndef EMBEDDED_LIBRARY
class Sys_var_sesvartrack: public Sys_var_charptr_base
{
......@@ -596,11 +601,10 @@ public:
Sys_var_sesvartrack(const char *name_arg,
const char *comment,
CMD_LINE getopt,
enum charset_enum is_os_charset_arg,
const char *def_val, PolyLock *lock= 0) :
Sys_var_charptr_base(name_arg, comment,
SESSION_VAR(session_track_system_variables),
getopt, is_os_charset_arg, def_val, lock,
getopt, def_val, lock,
VARIABLE_NOT_IN_BINLOG, 0, 0, 0)
{}
bool do_check(THD *thd, set_var *var)
......@@ -649,14 +653,12 @@ public:
class Sys_var_proxy_user: public sys_var
{
public:
Sys_var_proxy_user(const char *name_arg,
const char *comment, enum charset_enum is_os_charset_arg)
Sys_var_proxy_user(const char *name_arg, const char *comment)
: sys_var(&all_sys_vars, name_arg, comment,
sys_var::READONLY+sys_var::ONLY_SESSION, 0, NO_GETOPT,
NO_ARG, SHOW_CHAR, 0, NULL, VARIABLE_NOT_IN_BINLOG,
NULL, NULL, NULL)
{
is_os_charset= is_os_charset_arg == IN_FS_CHARSET;
option.var_type|= GET_STR;
}
bool do_check(THD *thd, set_var *var)
......@@ -689,9 +691,8 @@ protected:
class Sys_var_external_user : public Sys_var_proxy_user
{
public:
Sys_var_external_user(const char *name_arg, const char *comment_arg,
enum charset_enum is_os_charset_arg)
: Sys_var_proxy_user (name_arg, comment_arg, is_os_charset_arg)
Sys_var_external_user(const char *name_arg, const char *comment_arg)
: Sys_var_proxy_user (name_arg, comment_arg)
{}
protected:
......@@ -743,9 +744,6 @@ protected:
The class for string variables. Useful for strings that aren't necessarily
\0-terminated. Otherwise the same as Sys_var_charptr.
Class specific constructor arguments:
enum charset_enum is_os_charset_arg
Backing store: LEX_CSTRING
@note
......@@ -757,14 +755,13 @@ public:
Sys_var_lexstring(const char *name_arg,
const char *comment, int flag_args, ptrdiff_t off, size_t size,
CMD_LINE getopt,
enum charset_enum is_os_charset_arg,
const char *def_val, PolyLock *lock=0,
enum binlog_status_enum binlog_status_arg=VARIABLE_NOT_IN_BINLOG,
on_check_function on_check_func=0,
on_update_function on_update_func=0,
const char *substitute=0)
: Sys_var_charptr(name_arg, comment, flag_args, off, sizeof(char*),
getopt, is_os_charset_arg, def_val, lock, binlog_status_arg,
getopt, def_val, lock, binlog_status_arg,
on_check_func, on_update_func, substitute)
{
global_var(LEX_CSTRING).length= strlen(def_val);
......@@ -793,7 +790,6 @@ public:
Sys_var_session_lexstring(const char *name_arg,
const char *comment, int flag_args,
ptrdiff_t off, size_t size, CMD_LINE getopt,
enum charset_enum is_os_charset_arg,
const char *def_val, size_t max_length_arg,
on_check_function on_check_func=0,
on_update_function on_update_func=0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment