From 2e907bdd3ad318a84f385257deeb311f68c68348 Mon Sep 17 00:00:00 2001 From: Rene Cannao Date: Mon, 9 Feb 2026 15:01:16 +0000 Subject: [PATCH] refactor: migrate prepare_v2 SIMPLE cases in ProxySQL_Cluster.cpp Migrated 4 prepare_v2 calls to RAII-based pattern in: - pull_mysql_query_rules_from_peer(): 3 statements (statement1, statement1fr, statement32fr) - update_mysql_users(): 1 statement (also fixes memory leak - missing finalize) - update_ldap_mappings(): 1 statement (also fixes memory leak - missing finalize) The RAII pattern ensures automatic cleanup and eliminates manual (*proxy_sqlite3_finalize) calls, reducing the risk of resource leaks. --- lib/ProxySQL_Cluster.cpp | 44 ++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/ProxySQL_Cluster.cpp b/lib/ProxySQL_Cluster.cpp index 647a522a7..b399f9c98 100644 --- a/lib/ProxySQL_Cluster.cpp +++ b/lib/ProxySQL_Cluster.cpp @@ -1187,11 +1187,10 @@ void ProxySQL_Cluster::pull_mysql_query_rules_from_peer(const string& expected_c GloAdmin->admindb->execute("DELETE FROM mysql_query_rules_fast_routing"); MYSQL_ROW row; char *q = (char *)"INSERT INTO mysql_query_rules (rule_id, active, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, cache_empty_result, cache_timeout, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, ok_msg, sticky_conn, multiplex, gtid_from_hostgroup, log, apply, attributes, comment) VALUES (?1 , ?2 , ?3 , ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23, ?24, ?25, ?26, ?27, ?28, ?29, ?30, ?31, ?32, ?33, ?34, ?35)"; - sqlite3_stmt *statement1 = NULL; - //sqlite3 *mydb3 = GloAdmin->admindb->get_db(); - //rc=(*proxy_sqlite3_prepare_v2)(mydb3, q, -1, &statement1, 0); - int rc = GloAdmin->admindb->prepare_v2(q, &statement1); - ASSERT_SQLITE_OK(rc, GloAdmin->admindb); + auto [rc1, statement1_unique] = GloAdmin->admindb->prepare_v2(q); + ASSERT_SQLITE_OK(rc1, GloAdmin->admindb); + sqlite3_stmt *statement1 = statement1_unique.get(); + int rc; GloAdmin->admindb->execute("BEGIN TRANSACTION"); while ((row = mysql_fetch_row(result1))) { rc=(*proxy_sqlite3_bind_int64)(statement1, 1, atoll(row[0])); ASSERT_SQLITE_OK(rc, GloAdmin->admindb); // rule_id @@ -1233,21 +1232,19 @@ void ProxySQL_Cluster::pull_mysql_query_rules_from_peer(const string& expected_c rc=(*proxy_sqlite3_clear_bindings)(statement1); ASSERT_SQLITE_OK(rc, GloAdmin->admindb); rc=(*proxy_sqlite3_reset)(statement1); ASSERT_SQLITE_OK(rc, GloAdmin->admindb); } - (*proxy_sqlite3_finalize)(statement1); + // RAII auto-finalizes statement1 GloAdmin->admindb->execute("COMMIT"); std::string query32frs = "INSERT INTO mysql_query_rules_fast_routing(username, schemaname, flagIN, destination_hostgroup, comment) VALUES " + generate_multi_rows_query(32,5); char *q1fr = (char *)"INSERT INTO mysql_query_rules_fast_routing(username, schemaname, flagIN, destination_hostgroup, comment) VALUES (?1, ?2, ?3, ?4, ?5)"; char *q32fr = (char *)query32frs.c_str(); - sqlite3_stmt *statement1fr = NULL; - sqlite3_stmt *statement32fr = NULL; - //rc=(*proxy_sqlite3_prepare_v2)(mydb3, q1fr, -1, &statement1fr, 0); - rc = GloAdmin->admindb->prepare_v2(q1fr, &statement1fr); - ASSERT_SQLITE_OK(rc, GloAdmin->admindb); - //rc=(*proxy_sqlite3_prepare_v2)(mydb3, q32fr, -1, &statement32fr, 0); - rc = GloAdmin->admindb->prepare_v2(q32fr, &statement32fr); - ASSERT_SQLITE_OK(rc, GloAdmin->admindb); + auto [rc2, statement1fr_unique] = GloAdmin->admindb->prepare_v2(q1fr); + ASSERT_SQLITE_OK(rc2, GloAdmin->admindb); + auto [rc3, statement32fr_unique] = GloAdmin->admindb->prepare_v2(q32fr); + ASSERT_SQLITE_OK(rc3, GloAdmin->admindb); + sqlite3_stmt *statement1fr = statement1fr_unique.get(); + sqlite3_stmt *statement32fr = statement32fr_unique.get(); int row_idx=0; int max_bulk_row_idx=mysql_num_rows(result2)/32; max_bulk_row_idx=max_bulk_row_idx*32; @@ -1277,8 +1274,7 @@ void ProxySQL_Cluster::pull_mysql_query_rules_from_peer(const string& expected_c } row_idx++; } - (*proxy_sqlite3_finalize)(statement1fr); - (*proxy_sqlite3_finalize)(statement32fr); + // RAII auto-finalizes statement1fr and statement32fr //GloAdmin->admindb->execute("PRAGMA integrity_check"); GloAdmin->admindb->execute("COMMIT"); @@ -1369,9 +1365,10 @@ void update_mysql_users(MYSQL_RES* result) { " schema_locked, transaction_persistent, fast_forward, backend, frontend, max_connections, attributes, comment)" " VALUES (?1 , ?2 , ?3 , ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14)"; - sqlite3_stmt *statement1 = NULL; - int rc = GloAdmin->admindb->prepare_v2(q, &statement1); - ASSERT_SQLITE_OK(rc, GloAdmin->admindb); + auto [rc1, statement1_unique] = GloAdmin->admindb->prepare_v2(q); + ASSERT_SQLITE_OK(rc1, GloAdmin->admindb); + sqlite3_stmt *statement1 = statement1_unique.get(); + int rc; while (MYSQL_ROW row = mysql_fetch_row(result)) { rc=(*proxy_sqlite3_bind_text)(statement1, 1, row[0], -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, GloAdmin->admindb); // username @@ -1393,6 +1390,7 @@ void update_mysql_users(MYSQL_RES* result) { rc=(*proxy_sqlite3_clear_bindings)(statement1); ASSERT_SQLITE_OK(rc, GloAdmin->admindb); rc=(*proxy_sqlite3_reset)(statement1); ASSERT_SQLITE_OK(rc, GloAdmin->admindb); } + // RAII auto-finalizes statement1 (fixes memory leak) } void update_ldap_mappings(MYSQL_RES* result) { @@ -1402,9 +1400,10 @@ void update_ldap_mappings(MYSQL_RES* result) { " VALUES (?1 , ?2 , ?3 , ?4)" ); - sqlite3_stmt *statement1 = NULL; - int rc = GloAdmin->admindb->prepare_v2(q, &statement1); - ASSERT_SQLITE_OK(rc, GloAdmin->admindb); + auto [rc1, statement1_unique] = GloAdmin->admindb->prepare_v2(q); + ASSERT_SQLITE_OK(rc1, GloAdmin->admindb); + sqlite3_stmt *statement1 = statement1_unique.get(); + int rc; while (MYSQL_ROW row = mysql_fetch_row(result)) { rc=(*proxy_sqlite3_bind_int64)(statement1, 1, atoll(row[0])); ASSERT_SQLITE_OK(rc, GloAdmin->admindb); // priority @@ -1416,6 +1415,7 @@ void update_ldap_mappings(MYSQL_RES* result) { rc=(*proxy_sqlite3_clear_bindings)(statement1); ASSERT_SQLITE_OK(rc, GloAdmin->admindb); rc=(*proxy_sqlite3_reset)(statement1); ASSERT_SQLITE_OK(rc, GloAdmin->admindb); } + // RAII auto-finalizes statement1 (fixes memory leak) } void ProxySQL_Cluster::pull_mysql_users_from_peer(const string& expected_checksum, const time_t epoch) {