From f0416937cf83f03f3550515f08d62d6c8801070d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 12 Jun 2016 17:30:35 +0000 Subject: [PATCH] Added table runtime_global_variables --- include/proxysql_admin.h | 4 ++-- lib/ProxySQL_Admin.cpp | 46 +++++++++++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/include/proxysql_admin.h b/include/proxysql_admin.h index 5d208ec28..818205b09 100644 --- a/include/proxysql_admin.h +++ b/include/proxysql_admin.h @@ -101,7 +101,7 @@ class ProxySQL_Admin { void add_admin_users(); void __refresh_users(); - void flush_mysql_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty); + void flush_mysql_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty, bool runtime=false); void flush_mysql_variables___database_to_runtime(SQLite3DB *db, bool replace); @@ -109,7 +109,7 @@ class ProxySQL_Admin { char *get_variable(char *name); bool set_variable(char *name, char *value); void flush_admin_variables___database_to_runtime(SQLite3DB *db, bool replace); - void flush_admin_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty); + void flush_admin_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty, bool runtime=false); void disk_upgrade_mysql_query_rules(); void disk_upgrade_mysql_servers(); diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 8dc80b056..4691dad6f 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -92,6 +92,8 @@ pthread_mutex_t admin_mutex = PTHREAD_MUTEX_INITIALIZER; #define ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES "CREATE TABLE global_variables (variable_name VARCHAR NOT NULL PRIMARY KEY , variable_value VARCHAR NOT NULL)" +#define ADMIN_SQLITE_RUNTIME_GLOBAL_VARIABLES "CREATE TABLE runtime_global_variables (variable_name VARCHAR NOT NULL PRIMARY KEY , variable_value VARCHAR NOT NULL)" + #define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , UNIQUE (reader_hostgroup))" #define ADMIN_SQLITE_TABLE_MYSQL_COLLATIONS "CREATE TABLE mysql_collations (Id INTEGER NOT NULL PRIMARY KEY , Collation VARCHAR NOT NULL , Charset VARCHAR NOT NULL , `Default` VARCHAR NOT NULL)" @@ -1218,8 +1220,9 @@ void ProxySQL_Admin::GenericRefreshStatistics(const char *query_no_space, unsign stats___mysql_global(); if (admin) { if (dump_global_variables) { - flush_admin_variables___runtime_to_database(admindb, false, false, false); - flush_mysql_variables___runtime_to_database(admindb, false, false, false); + admindb->execute("DELETE FROM runtime_global_variables"); // extra + flush_admin_variables___runtime_to_database(admindb, false, false, false, true); + flush_mysql_variables___runtime_to_database(admindb, false, false, false, true); } if (runtime_mysql_servers) { mysql_servers_wrlock(); @@ -2358,6 +2361,7 @@ bool ProxySQL_Admin::init() { insert_into_tables_defs(tables_defs_admin,"mysql_query_rules", ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES); insert_into_tables_defs(tables_defs_admin,"runtime_mysql_query_rules", ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_QUERY_RULES); insert_into_tables_defs(tables_defs_admin,"global_variables", ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES); + insert_into_tables_defs(tables_defs_admin,"runtime_global_variables", ADMIN_SQLITE_RUNTIME_GLOBAL_VARIABLES); insert_into_tables_defs(tables_defs_admin,"mysql_collations", ADMIN_SQLITE_TABLE_MYSQL_COLLATIONS); insert_into_tables_defs(tables_defs_admin,"scheduler", ADMIN_SQLITE_TABLE_SCHEDULER); insert_into_tables_defs(tables_defs_admin,"runtime_scheduler", ADMIN_SQLITE_TABLE_RUNTIME_SCHEDULER); @@ -2678,7 +2682,7 @@ void ProxySQL_Admin::flush_mysql_variables___database_to_runtime(SQLite3DB *db, if (resultset) delete resultset; } -void ProxySQL_Admin::flush_mysql_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty) { +void ProxySQL_Admin::flush_mysql_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty, bool runtime) { proxy_debug(PROXY_DEBUG_ADMIN, 4, "Flushing MySQL variables. Replace:%d, Delete:%d, Only_If_Empty:%d\n", replace, del, onlyifempty); if (onlyifempty) { char *error=NULL; @@ -2707,7 +2711,11 @@ void ProxySQL_Admin::flush_mysql_variables___runtime_to_database(SQLite3DB *db, proxy_debug(PROXY_DEBUG_ADMIN, 4, "Deleting MySQL variables from global_variables\n"); db->execute("DELETE FROM global_variables WHERE variable_name LIKE 'mysql-%'"); } + if (runtime) { + db->execute("DELETE FROM runtime_global_variables WHERE variable_name LIKE 'mysql-%'"); + } char *a; + char *b=(char *)"INSERT INTO runtime_global_variables(variable_name, variable_value) VALUES(\"mysql-%s\",\"%s\")"; if (replace) { a=(char *)"REPLACE INTO global_variables(variable_name, variable_value) VALUES(\"mysql-%s\",\"%s\")"; } else { @@ -2716,15 +2724,22 @@ void ProxySQL_Admin::flush_mysql_variables___runtime_to_database(SQLite3DB *db, int l=strlen(a)+200; GloMTH->wrlock(); char **varnames=GloMTH->get_variables_list(); - char *query=(char *)malloc(l); for (int i=0; varnames[i]; i++) { char *val=GloMTH->get_variable(varnames[i]); + l+=( varnames[i] ? strlen(varnames[i]) : 6); + l+=( val ? strlen(val) : 6); + char *query=(char *)malloc(l); sprintf(query, a, varnames[i], val); + if (runtime) { + db->execute(query); + sprintf(query, b, varnames[i], val); + } db->execute(query); - free(val); + if (val) + free(val); + free(query); } GloMTH->wrunlock(); - free(query); for (int i=0; varnames[i]; i++) { free(varnames[i]); } @@ -3218,7 +3233,7 @@ void ProxySQL_Admin::save_mysql_query_rules_from_runtime(bool _runtime) { delete resultset; } -void ProxySQL_Admin::flush_admin_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty) { +void ProxySQL_Admin::flush_admin_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty, bool runtime) { proxy_debug(PROXY_DEBUG_ADMIN, 4, "Flushing ADMIN variables. Replace:%d, Delete:%d, Only_If_Empty:%d\n", replace, del, onlyifempty); if (onlyifempty) { char *error=NULL; @@ -3247,7 +3262,11 @@ void ProxySQL_Admin::flush_admin_variables___runtime_to_database(SQLite3DB *db, proxy_debug(PROXY_DEBUG_ADMIN, 4, "Deleting ADMIN variables from global_variables\n"); db->execute("DELETE FROM global_variables WHERE variable_name LIKE 'admin-%'"); } + if (runtime) { + db->execute("DELETE FROM runtime_global_variables WHERE variable_name LIKE 'admin-%'"); + } char *a; + char *b=(char *)"INSERT INTO runtime_global_variables(variable_name, variable_value) VALUES(\"admin-%s\",\"%s\")"; if (replace) { a=(char *)"REPLACE INTO global_variables(variable_name, variable_value) VALUES(\"admin-%s\",\"%s\")"; } else { @@ -3256,14 +3275,21 @@ void ProxySQL_Admin::flush_admin_variables___runtime_to_database(SQLite3DB *db, int l=strlen(a)+200; char **varnames=get_variables_list(); - char *query=(char *)malloc(l); for (int i=0; varnames[i]; i++) { char *val=get_variable(varnames[i]); + l+=( varnames[i] ? strlen(varnames[i]) : 6); + l+=( val ? strlen(val) : 6); + char *query=(char *)malloc(l); sprintf(query, a, varnames[i], val); db->execute(query); - free(val); + if (runtime) { + sprintf(query, b, varnames[i], val); + db->execute(query); + } + if (val) + free(val); + free(query); } - free(query); for (int i=0; varnames[i]; i++) { free(varnames[i]); }