@@ -735,6 +735,28 @@ bool admin_handler_command_proxysql(char *query_no_space, unsigned int query_no_
735735 return false ;
736736 }
737737
738+ if (strncasecmp (" PROXYSQL SET CONFIG FILE " , query_no_space, 25 ) == 0 ) {
739+ proxy_info (" Received %s command\n " , query_no_space);
740+ ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa;
741+
742+ char *file_path = trim_spaces_and_quotes_in_place (query_no_space + 25 );
743+
744+ if (GloVars.configfile_open ) {
745+ GloVars.confFile ->CloseFile ();
746+ }
747+ free (GloVars.config_file );
748+
749+ GloVars.config_file = strdup (file_path);
750+ if (GloVars.confFile ->OpenFile (GloVars.config_file )) {
751+ GloVars.configfile_open = true ;
752+ SPA->send_ok_msg_to_client (sess, NULL , 0 , query_no_space);
753+ } else {
754+ SPA->send_error_msg_to_client (sess, " Invalid config file" );
755+ }
756+
757+ return false ;
758+ }
759+
738760#ifndef NOJEM
739761 if (query_no_space_length==strlen (" PROXYSQL MEMPROFILE START" ) && !strncasecmp (" PROXYSQL MEMPROFILE START" ,query_no_space, query_no_space_length)) {
740762 bool en=true ;
@@ -1306,14 +1328,28 @@ bool admin_handler_command_load_or_save(char *query_no_space, unsigned int query
13061328 if (GloVars.confFile ->OpenFile (NULL )==true ) {
13071329 ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa;
13081330 int rows=0 ;
1331+ std::string msg, validation_err;
13091332 if (query_no_space[5 ] == ' P' || query_no_space[5 ] == ' p' ) {
1310- rows=SPA->proxysql_config ().Read_PgSQL_Users_from_configfile ();
1311- proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Loaded pgsql users from CONFIG\n " );
1333+ rows = SPA->proxysql_config ().Read_PgSQL_Users_from_configfile (validation_err);
1334+ if (rows < 0 ) {
1335+ proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Failed to load pgsql users from CONFIG due to validation error\n " );
1336+ msg = " Configuration validation failed - " + validation_err;
1337+ SPA->send_error_msg_to_client (sess, msg.c_str ());
1338+ } else {
1339+ proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Loaded pgsql users from CONFIG\n " );
1340+ SPA->send_ok_msg_to_client (sess, NULL , rows, query_no_space);
1341+ }
13121342 } else {
1313- rows=SPA->proxysql_config ().Read_MySQL_Users_from_configfile ();
1314- proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Loaded mysql users from CONFIG\n " );
1343+ rows = SPA->proxysql_config ().Read_MySQL_Users_from_configfile (validation_err);
1344+ if (rows < 0 ) {
1345+ proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Failed to load mysql users from CONFIG due to validation error\n " );
1346+ msg = " Configuration validation failed - " + validation_err;
1347+ SPA->send_error_msg_to_client (sess, msg.c_str ());
1348+ } else {
1349+ proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Loaded mysql users from CONFIG\n " );
1350+ SPA->send_ok_msg_to_client (sess, NULL , rows, query_no_space);
1351+ }
13151352 }
1316- SPA->send_ok_msg_to_client (sess, NULL , rows, query_no_space);
13171353 GloVars.confFile ->CloseFile ();
13181354 } else {
13191355 proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Unable to open or parse config file %s\n " , GloVars.config_file );
@@ -1707,14 +1743,28 @@ bool admin_handler_command_load_or_save(char *query_no_space, unsigned int query
17071743 if (GloVars.confFile ->OpenFile (NULL )==true ) {
17081744 ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa;
17091745 int rows=0 ;
1746+ std::string msg, validation_err;
17101747 if (is_pgsql) {
1711- rows=SPA->proxysql_config ().Read_PgSQL_Servers_from_configfile ();
1712- proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Loaded pgsql servers from CONFIG\n " );
1748+ rows = SPA->proxysql_config ().Read_PgSQL_Servers_from_configfile (validation_err);
1749+ if (rows < 0 ) {
1750+ proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Failed to load pgsql servers from CONFIG due to validation error\n " );
1751+ msg = " Configuration validation failed - " + validation_err;
1752+ SPA->send_error_msg_to_client (sess, msg.c_str ());
1753+ } else {
1754+ proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Loaded pgsql servers from CONFIG\n " );
1755+ SPA->send_ok_msg_to_client (sess, NULL , rows, query_no_space);
1756+ }
17131757 } else {
1714- rows=SPA->proxysql_config ().Read_MySQL_Servers_from_configfile ();
1715- proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Loaded mysql servers from CONFIG\n " );
1758+ rows = SPA->proxysql_config ().Read_MySQL_Servers_from_configfile (validation_err);
1759+ if (rows < 0 ) {
1760+ proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Failed to load mysql servers from CONFIG due to validation error\n " );
1761+ msg = " Configuration validation failed - " + validation_err;
1762+ SPA->send_error_msg_to_client (sess, msg.c_str ());
1763+ } else {
1764+ proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Loaded mysql servers from CONFIG\n " );
1765+ SPA->send_ok_msg_to_client (sess, NULL , rows, query_no_space);
1766+ }
17161767 }
1717- SPA->send_ok_msg_to_client (sess, NULL , rows, query_no_space);
17181768 GloVars.confFile ->CloseFile ();
17191769 } else {
17201770 proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Unable to open or parse config file %s\n " , GloVars.config_file );
@@ -1829,9 +1879,16 @@ bool admin_handler_command_load_or_save(char *query_no_space, unsigned int query
18291879 if (GloVars.confFile ->OpenFile (NULL )==true ) {
18301880 ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa;
18311881 int rows=0 ;
1832- rows=SPA->proxysql_config ().Read_ProxySQL_Servers_from_configfile ();
1833- proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Loaded ProxySQL servers from CONFIG\n " );
1834- SPA->send_ok_msg_to_client (sess, NULL , rows, query_no_space);
1882+ std::string msg, validation_err;
1883+ rows = SPA->proxysql_config ().Read_ProxySQL_Servers_from_configfile (validation_err);
1884+ if (rows < 0 ) {
1885+ proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Failed to load ProxySQL servers from CONFIG due to validation error\n " );
1886+ msg = " Configuration validation failed - " + validation_err;
1887+ SPA->send_error_msg_to_client (sess, msg.c_str ());
1888+ } else {
1889+ proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Loaded ProxySQL servers from CONFIG\n " );
1890+ SPA->send_ok_msg_to_client (sess, NULL , rows, query_no_space);
1891+ }
18351892 GloVars.confFile ->CloseFile ();
18361893 } else {
18371894 proxy_debug (PROXY_DEBUG_ADMIN, 4 , " Unable to open or parse config file %s\n " , GloVars.config_file );
0 commit comments