From 4e45f7f1d425b90e2c1165f34172910c12b09dfd Mon Sep 17 00:00:00 2001 From: Valentin Rakush Date: Fri, 1 Nov 2019 06:31:33 +0000 Subject: [PATCH] Fix few problems and cleanup. - remove unnecessary variables - change snprintf to std::stringstream - extend autotests configuration - fixing several bugs --- lib/ProxySQL_Admin.cpp | 67 ++++++++----------- test/tap/tap/command_line.cpp | 30 ++++++++- test/tap/tap/command_line.h | 2 + .../proxysql_reference_select_config_file.cnf | 2 +- test/tap/tests/select_config_file-t.cpp | 4 +- 5 files changed, 61 insertions(+), 44 deletions(-) diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 87ded76ec..1a6581db3 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -3810,28 +3810,28 @@ void admin_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t *pkt) { if (query_no_space_length==strlen("SELECT CONFIG FILE") && !strncasecmp("SELECT CONFIG FILE", query_no_space, query_no_space_length)) { std::string data; data.reserve(100000); - run_query = false; data += config_header; - if (pa->Write_Global_Variables_to_configfile(data)) - goto __run_query; - if (pa->Write_MySQL_Users_to_configfile(data)) - goto __run_query; - if (pa->Write_MySQL_Query_Rules_to_configfile(data)) - goto __run_query; - if (pa->Write_MySQL_Servers_to_configfile(data)) - goto __run_query; - if (pa->Write_Scheduler_to_configfile(data)) - goto __run_query; - if (pa->Write_ProxySQL_Servers_to_configfile(data)) - goto __run_query; - char *pta[1]; - pta[0]=NULL; - pta[0]=(char*)data.c_str(); - SQLite3_result* resultset = new SQLite3_result(1); - resultset->add_column_definition(SQLITE_TEXT,"Data"); - resultset->add_row(pta); - sess->SQLite3_to_MySQL(resultset, error, affected_rows, &sess->client_myds->myprot); - delete resultset; + int rc = pa->Write_Global_Variables_to_configfile(data); + rc = pa->Write_MySQL_Users_to_configfile(data); + rc = pa->Write_MySQL_Query_Rules_to_configfile(data); + rc = pa->Write_MySQL_Servers_to_configfile(data); + rc = pa->Write_Scheduler_to_configfile(data); + rc = pa->Write_ProxySQL_Servers_to_configfile(data); + if (rc) { + std::stringstream ss; + ss << "ProxySQL Admin Error: Cannot write proxysql.cnf"; + sess->SQLite3_to_MySQL(resultset, (char*)ss.str().c_str(), affected_rows, &sess->client_myds->myprot); + } else { + char *pta[1]; + pta[0]=NULL; + pta[0]=(char*)data.c_str(); + SQLite3_result* resultset = new SQLite3_result(1); + resultset->add_column_definition(SQLITE_TEXT,"Data"); + resultset->add_row(pta); + sess->SQLite3_to_MySQL(resultset, error, affected_rows, &sess->client_myds->myprot); + delete resultset; + } + run_query = false; goto __run_query; } @@ -9724,10 +9724,10 @@ char * ProxySQL_Admin::load_mysql_query_rules_to_runtime() { } void ProxySQL_Admin::addField(std::string& data, const char* name, const char* value, const char* dq) { - char strBuf[10000] = {0}; + std::stringstream ss; if (!value || !strlen(value)) return; - snprintf(strBuf, sizeof(strBuf), "\t\t%s=%s%s%s\n", name, dq, value, dq); - data += strBuf; + ss << "\t\t" << name << "=" << dq << value << dq << "\n"; + data += ss.str(); } int ProxySQL_Admin::Write_Global_Variables_to_configfile(std::string& data) { @@ -9758,9 +9758,9 @@ int ProxySQL_Admin::Write_Global_Variables_to_configfile(std::string& data) { } } if (r->fields[1] && strlen(r->fields[1])) { - char strBuf[10000]; - snprintf(strBuf, sizeof(strBuf), "\t%s=\"%s\"\n",r->fields[0] + p1.size() + 1, r->fields[1]); - data += strBuf; + std::stringstream ss; + ss << "\t" << r->fields[0] + p1.size() + 1 << "=\"" << r->fields[1] << "\"\n"; + data += ss.str(); } } @@ -9806,7 +9806,6 @@ int ProxySQL_Admin::Read_Global_Variables_from_configfile(const char *prefix) { } //fprintf(stderr,"%s = %s\n", n, value_string.c_str()); char *query=(char *)malloc(strlen(q)+strlen(prefix)+strlen(n)+strlen(value_string.c_str())); - fprintf(stderr, "irefix %s, name %s, value %s\n", prefix, n, value_string.c_str()); sprintf(query,q, prefix, n, value_string.c_str()); //fprintf(stderr, "%s\n", query); admindb->execute(query); @@ -9830,11 +9829,9 @@ int ProxySQL_Admin::Write_MySQL_Users_to_configfile(std::string& data) { return -1; } else { if (sqlite_resultset) { - std::string prefix; data += "mysql_users:\n(\n"; bool isNext = false; for (auto r : sqlite_resultset->rows) { - char strBuf[256] = {0}; if (isNext) data += ",\n"; data += "\t{\n"; @@ -9850,7 +9847,7 @@ int ProxySQL_Admin::Write_MySQL_Users_to_configfile(std::string& data) { addField(data, "backend", r->fields[9], ""); addField(data, "frontend", r->fields[10], ""); addField(data, "max_connections", r->fields[11], ""); - addField(data, "comment", r->fields[12], ""); + addField(data, "comment", r->fields[12]); data += "\t}"; isNext = true; } @@ -9929,7 +9926,6 @@ int ProxySQL_Admin::Write_Scheduler_to_configfile(std::string& data) { return -1; } else { if (sqlite_resultset) { - std::string prefix; data += "scheduler:\n(\n"; bool isNext = false; for (auto r : sqlite_resultset->rows) { @@ -10409,7 +10405,6 @@ int ProxySQL_Admin::Write_MySQL_Servers_to_configfile(std::string& data) { return -1; } else { if (sqlite_resultset) { - std::string prefix; data += "mysql_servers:\n(\n"; bool isNext = false; for (auto r : sqlite_resultset->rows) { @@ -10446,7 +10441,6 @@ int ProxySQL_Admin::Write_MySQL_Servers_to_configfile(std::string& data) { return -1; } else { if (sqlite_resultset) { - std::string prefix; data += "mysql_replication_hostgroups:\n(\n"; bool isNext = false; for (auto r : sqlite_resultset->rows) { @@ -10475,7 +10469,6 @@ int ProxySQL_Admin::Write_MySQL_Servers_to_configfile(std::string& data) { return -1; } else { if (sqlite_resultset) { - std::string prefix; data += "mysql_group_replication_hostgroups:\n(\n"; bool isNext = false; for (auto r : sqlite_resultset->rows) { @@ -10509,7 +10502,6 @@ int ProxySQL_Admin::Write_MySQL_Servers_to_configfile(std::string& data) { return -1; } else { if (sqlite_resultset) { - std::string prefix; data += "mysql_galera_hostgroups:\n(\n"; bool isNext = false; for (auto r : sqlite_resultset->rows) { @@ -10543,7 +10535,6 @@ int ProxySQL_Admin::Write_MySQL_Servers_to_configfile(std::string& data) { return -1; } else { if (sqlite_resultset) { - std::string prefix; data += "mysql_aws_aurora_hostgroups:\n(\n"; bool isNext = false; for (auto r : sqlite_resultset->rows) { @@ -10573,7 +10564,6 @@ int ProxySQL_Admin::Write_MySQL_Servers_to_configfile(std::string& data) { delete sqlite_resultset; return 0; - } int ProxySQL_Admin::Read_MySQL_Servers_from_configfile() { @@ -10851,7 +10841,6 @@ int ProxySQL_Admin::Write_ProxySQL_Servers_to_configfile(std::string& data) { return -1; } else { if (sqlite_resultset) { - std::string prefix; data += "proxysql_servers:\n(\n"; bool isNext = false; for (auto r : sqlite_resultset->rows) { diff --git a/test/tap/tap/command_line.cpp b/test/tap/tap/command_line.cpp index 407e377d5..50c1ef507 100644 --- a/test/tap/tap/command_line.cpp +++ b/test/tap/tap/command_line.cpp @@ -13,7 +13,7 @@ using nlohmann::json; CommandLine::CommandLine() : - host(NULL), username(NULL), password(NULL) {} + host(NULL), username(NULL), password(NULL), admin_username(NULL), admin_password(NULL) {} CommandLine::~CommandLine() { if (host) @@ -22,6 +22,10 @@ CommandLine::~CommandLine() { free(username); if (password) free(password); + if (admin_username) + free(admin_username); + if (admin_password) + free(admin_password); } int CommandLine::parse(int argc, char** argv) { @@ -52,8 +56,14 @@ int CommandLine::parse(int argc, char** argv) { case 'n': no_write = true; break; + case 'U': + admin_username = strdup(optarg); + break; + case 'S': + admin_password = strdup(optarg); + break; default: /* '?' */ - fprintf(stderr, "Usage: %s -u username -p password -h host [ -P port ] [ -A port ] [ -c ] [ -s ] [ -n ]\n", argv[0]); + fprintf(stderr, "Usage: %s -u username -p password -h host [ -P port ] [ -A port ] [ -U admin_username ] [ -S admin_password ] [ -c ] [ -s ] [ -n ]\n", argv[0]); return 0; } } @@ -109,6 +119,18 @@ int CommandLine::getEnv() { if(!value) return -1; password=strdup(value); + value=getenv("TAP_ADMINUSERNAME"); + if(!value) + admin_username=strdup("admin"); + else + admin_username=strdup(value); + + value=getenv("TAP_ADMINPASSWORD"); + if(!value) + admin_password=strdup("admin"); + else + admin_password=strdup(value); + port=6033; checksum=true; @@ -117,12 +139,16 @@ int CommandLine::getEnv() { value=getenv("TAP_PORT"); if(value) env_port=strtol(value, &endstr, 10); + else + env_port=6033; if(env_port>0 && env_port<65536) port=env_port; value=getenv("TAP_ADMINPORT"); if(value) env_port=strtol(value, &endstr, 10); + else + env_port=6032; if(env_port>0 && env_port<65536) admin_port=env_port; diff --git a/test/tap/tap/command_line.h b/test/tap/tap/command_line.h index 52c34a2ed..a8f93c029 100644 --- a/test/tap/tap/command_line.h +++ b/test/tap/tap/command_line.h @@ -13,6 +13,8 @@ class CommandLine { char* host; char* username; char* password; + char* admin_username; + char* admin_password; int port; int admin_port; diff --git a/test/tap/tests/proxysql_reference_select_config_file.cnf b/test/tap/tests/proxysql_reference_select_config_file.cnf index b116e0c01..3a8a1a3cb 100644 --- a/test/tap/tests/proxysql_reference_select_config_file.cnf +++ b/test/tap/tests/proxysql_reference_select_config_file.cnf @@ -221,7 +221,7 @@ mysql_users: backend=1 frontend=1 max_connections=10 - comment=comm1 + comment="comm1" } ) mysql_query_rules: diff --git a/test/tap/tests/select_config_file-t.cpp b/test/tap/tests/select_config_file-t.cpp index 467203d0e..6850cd737 100644 --- a/test/tap/tests/select_config_file-t.cpp +++ b/test/tap/tests/select_config_file-t.cpp @@ -75,7 +75,7 @@ int main(int argc, char** argv) { if (!mysql) return exit_status(); - if (!mysql_real_connect(mysql, cl.host, cl.username, cl.password, NULL, cl.admin_port, NULL, 0)) { + if (!mysql_real_connect(mysql, cl.host, cl.admin_username, cl.admin_password, NULL, cl.admin_port, NULL, 0)) { fprintf(stderr, "File %s, line %d, Error: %s\n", __FILE__, __LINE__, mysql_error(mysql)); return exit_status(); @@ -127,7 +127,7 @@ int main(int argc, char** argv) { { std::ifstream inFile; - inFile.open("./proxysql_reference_select_config_file.cnf"); //open the input file + inFile.open("./tests/proxysql_reference_select_config_file.cnf"); //open the input file std::stringstream strStream; strStream << inFile.rdbuf(); //read the file