From: Nick Porter Date: Wed, 26 Jun 2024 12:17:15 +0000 (+0100) Subject: Reinstate running open_query for MySQL X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bfdb938fc38e882beebe1091ef4b137540a22198;p=thirdparty%2Ffreeradius-server.git Reinstate running open_query for MySQL --- diff --git a/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c b/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c index b92588fc0f0..4043b4070f0 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c @@ -217,6 +217,37 @@ connected: connection_signal_connected(c->conn); } +static void _sql_connect_query_run(connection_t *conn, UNUSED connection_state_t prev, + UNUSED connection_state_t state, void *uctx) +{ + rlm_sql_t const *sql = talloc_get_type_abort_const(uctx, rlm_sql_t); + rlm_sql_mysql_conn_t *sql_conn = talloc_get_type_abort(conn->h, rlm_sql_mysql_conn_t); + int ret; + MYSQL_RES *result; + + DEBUG2("Executing \"%s\" on connection %s", sql->config.connect_query, conn->name); + + ret = mysql_real_query(sql_conn->sock, sql->config.connect_query, strlen(sql->config.connect_query)); + if (ret != 0) { + char const *info; + ERROR("Failed running \"open_query\""); + info = mysql_info(sql_conn->sock); + if (info) ERROR("%s", info); + connection_signal_reconnect(conn, CONNECTION_FAILED); + return; + } + + /* + * These queries should not return any results - but let's be safe + */ + result = mysql_store_result(sql_conn->sock); + if (result) mysql_free_result(result); + while ((mysql_next_result(sql_conn->sock) == 0) && + (result = mysql_store_result(sql_conn->sock))) { + mysql_free_result(result); + } +} + static connection_state_t _sql_connection_init(void **h, connection_t *conn, void *uctx) { rlm_sql_t const *sql = talloc_get_type_abort_const(uctx, rlm_sql_t); @@ -333,6 +364,9 @@ static connection_state_t _sql_connection_init(void **h, connection_t *conn, voi *h = c; + if (config->connect_query) connection_add_watch_post(conn, CONNECTION_STATE_CONNECTED, + _sql_connect_query_run, true, sql); + return CONNECTION_STATE_CONNECTING; }