From df205364860a2d903e008d3b8b06986ed3cd0be6 Mon Sep 17 00:00:00 2001 From: Damian Zaremba Date: Thu, 23 Jul 2026 13:22:03 +0200 Subject: [PATCH 1/2] Db - use local connection - drop global connection - connect/disconnect per call --- db_functions.php | 61 ++++++++++++++++++++++++++++++--------------- globals.php | 1 - mysql_functions.php | 27 -------------------- 3 files changed, 41 insertions(+), 48 deletions(-) diff --git a/db_functions.php b/db_functions.php index 611705c..967f216 100644 --- a/db_functions.php +++ b/db_functions.php @@ -25,23 +25,40 @@ class Db { + private static function connect() + { + $cb_mysql = mysqli_connect( + 'p:' . Config::$cb_mysql_host, + Config::$cb_mysql_user, + Config::$cb_mysql_pass, + Config::$cb_mysql_db, + Config::$cb_mysql_port + ); + if (!$cb_mysql) { + Metrics::increment('bot_mysql_cb_connection_failures_total'); + die('cb mysql error: ' . mysqli_connect_error()); + } + mysqli_select_db($cb_mysql, Config::$cb_mysql_db); + return $cb_mysql; + } + // Returns the edit id for the vandalism public static function detectedVandalism($user, $title, $heuristic, $reason, $url, $old_rev_id, $rev_id) { global $logger; - checkMySQL(); + $cb_mysql = self::connect(); $query = 'INSERT INTO `vandalism` ' . '(`id`,`user`,`article`,`heuristic`,`reason`,`diff`,`old_id`,`new_id`,`reverted`) ' . 'VALUES ' . - '(NULL,\'' . mysqli_real_escape_string(Globals::$cb_mysql, $user) . '\',' . - '\'' . mysqli_real_escape_string(Globals::$cb_mysql, $title) . '\',' . - '\'' . mysqli_real_escape_string(Globals::$cb_mysql, $heuristic) . '\',' . - '\'' . mysqli_real_escape_string(Globals::$cb_mysql, $reason) . '\',' . - '\'' . mysqli_real_escape_string(Globals::$cb_mysql, $url) . '\',' . - '\'' . mysqli_real_escape_string(Globals::$cb_mysql, $old_rev_id) . '\',' . - '\'' . mysqli_real_escape_string(Globals::$cb_mysql, $rev_id) . '\',0)'; + '(NULL,\'' . mysqli_real_escape_string($cb_mysql, $user) . '\',' . + '\'' . mysqli_real_escape_string($cb_mysql, $title) . '\',' . + '\'' . mysqli_real_escape_string($cb_mysql, $heuristic) . '\',' . + '\'' . mysqli_real_escape_string($cb_mysql, $reason) . '\',' . + '\'' . mysqli_real_escape_string($cb_mysql, $url) . '\',' . + '\'' . mysqli_real_escape_string($cb_mysql, $old_rev_id) . '\',' . + '\'' . mysqli_real_escape_string($cb_mysql, $rev_id) . '\',0)'; try { - if (!mysqli_query(Globals::$cb_mysql, $query)) { + if (!mysqli_query($cb_mysql, $query)) { Metrics::increment('bot_mysql_cb_query_failures_total', ['vandalism_insert']); } } catch (mysqli_sql_exception $e) { @@ -49,20 +66,22 @@ public static function detectedVandalism($user, $title, $heuristic, $reason, $ur Metrics::increment('bot_mysql_cb_query_failures_total', ['vandalism_insert']); } - return mysqli_insert_id(Globals::$cb_mysql); + $edit_id = mysqli_insert_id($cb_mysql); + mysqli_close($cb_mysql); + return $edit_id; } // Returns nothing public static function vandalismReverted($edit_id) { global $logger; - checkMySQL(); + $cb_mysql = self::connect(); try { if ( !mysqli_query( - Globals::$cb_mysql, + $cb_mysql, 'UPDATE `vandalism` SET `reverted` = 1 WHERE `id` = \'' . - mysqli_real_escape_string(Globals::$cb_mysql, $edit_id) . '\'' + mysqli_real_escape_string($cb_mysql, $edit_id) . '\'' ) ) { Metrics::increment('bot_mysql_cb_query_failures_total', ['vandalism_update_reverted']); @@ -72,19 +91,20 @@ public static function vandalismReverted($edit_id) ": " . $e->getMessage()); Metrics::increment('bot_mysql_cb_query_failures_total', ['vandalism_update_reverted']); } + mysqli_close($cb_mysql); } // Returns nothing public static function vandalismRevertBeaten($edit_id, $title, $user, $diff) { global $logger; - checkMySQL(); + $cb_mysql = self::connect(); try { if ( !mysqli_query( - Globals::$cb_mysql, + $cb_mysql, 'UPDATE `vandalism` SET `reverted` = 0 WHERE `id` = \'' . - mysqli_real_escape_string(Globals::$cb_mysql, $edit_id) . '\'' + mysqli_real_escape_string($cb_mysql, $edit_id) . '\'' ) ) { Metrics::increment('bot_mysql_cb_query_failures_total', ['vandalism_update_beaten']); @@ -97,11 +117,11 @@ public static function vandalismRevertBeaten($edit_id, $title, $user, $diff) try { if ( !mysqli_query( - Globals::$cb_mysql, + $cb_mysql, 'INSERT INTO `beaten` (`id`,`article`,`diff`,`user`) VALUES (NULL,\'' . - mysqli_real_escape_string(Globals::$cb_mysql, $title) . '\',\'' . - mysqli_real_escape_string(Globals::$cb_mysql, $diff) . '\',\'' . - mysqli_real_escape_string(Globals::$cb_mysql, $user) . '\')' + mysqli_real_escape_string($cb_mysql, $title) . '\',\'' . + mysqli_real_escape_string($cb_mysql, $diff) . '\',\'' . + mysqli_real_escape_string($cb_mysql, $user) . '\')' ) ) { Metrics::increment('bot_mysql_cb_query_failures_total', ['beaten_insert']); @@ -110,5 +130,6 @@ public static function vandalismRevertBeaten($edit_id, $title, $user, $diff) $logger->error("beaten insert query returned an error for " . $title . ": " . $e->getMessage()); Metrics::increment('bot_mysql_cb_query_failures_total', ['beaten_insert']); } + mysqli_close($cb_mysql); } } diff --git a/globals.php b/globals.php index 59ba0dc..908af79 100644 --- a/globals.php +++ b/globals.php @@ -27,7 +27,6 @@ class Globals public static $tfas; public static $tfa; public static $aoptin; - public static $cb_mysql; public static $run; public static $wl = []; public static $optin; diff --git a/mysql_functions.php b/mysql_functions.php index 023c5c9..24fb78c 100644 --- a/mysql_functions.php +++ b/mysql_functions.php @@ -22,33 +22,6 @@ * You should have received a copy of the GNU General Public License * along with ClueBot NG. If not, see . */ -function is_mysql_alive($con) -{ - try { - return @mysqli_query($con, 'SELECT LAST_INSERT_ID()'); - } catch (mysqli_sql_exception $e) { - return false; - } -} - -function checkMySQL() -{ - if (!Globals::$cb_mysql || !is_mysql_alive(Globals::$cb_mysql)) { - Globals::$cb_mysql = mysqli_connect( - 'p:' . Config::$cb_mysql_host, - Config::$cb_mysql_user, - Config::$cb_mysql_pass, - Config::$cb_mysql_db, - Config::$cb_mysql_port - ); - if (!Globals::$cb_mysql) { - Metrics::increment('bot_mysql_cb_connection_failures_total'); - die('cb mysql error: ' . mysqli_connect_error()); - } - mysqli_select_db(Globals::$cb_mysql, Config::$cb_mysql_db); - } -} - function connect_to_mysql($exclude_users = []) { global $logger; From ffa0c8ec535c91f0dbbdf423496f01d80dc677a7 Mon Sep 17 00:00:00 2001 From: Damian Zaremba Date: Thu, 23 Jul 2026 13:57:10 +0200 Subject: [PATCH 2/2] Db - use common function - Catch exceptions - Emit consistent metrics/logging --- db_functions.php | 93 +++++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 57 deletions(-) diff --git a/db_functions.php b/db_functions.php index 967f216..ab50072 100644 --- a/db_functions.php +++ b/db_functions.php @@ -42,10 +42,21 @@ private static function connect() return $cb_mysql; } + private static function runQuery($cb_mysql, string $identifier, string $context, string $sql) + { + global $logger; + try { + return mysqli_query($cb_mysql, $sql); + } catch (mysqli_sql_exception $e) { + $logger->error("$identifier query returned an error for $context: " . $e->getMessage()); + Metrics::increment('bot_mysql_cb_query_failures_total', [$identifier]); + return false; + } + } + // Returns the edit id for the vandalism public static function detectedVandalism($user, $title, $heuristic, $reason, $url, $old_rev_id, $rev_id) { - global $logger; $cb_mysql = self::connect(); $query = 'INSERT INTO `vandalism` ' . '(`id`,`user`,`article`,`heuristic`,`reason`,`diff`,`old_id`,`new_id`,`reverted`) ' . @@ -57,14 +68,7 @@ public static function detectedVandalism($user, $title, $heuristic, $reason, $ur '\'' . mysqli_real_escape_string($cb_mysql, $url) . '\',' . '\'' . mysqli_real_escape_string($cb_mysql, $old_rev_id) . '\',' . '\'' . mysqli_real_escape_string($cb_mysql, $rev_id) . '\',0)'; - try { - if (!mysqli_query($cb_mysql, $query)) { - Metrics::increment('bot_mysql_cb_query_failures_total', ['vandalism_insert']); - } - } catch (mysqli_sql_exception $e) { - $logger->error("vandalism insert query returned an error for " . $title . ": " . $e->getMessage()); - Metrics::increment('bot_mysql_cb_query_failures_total', ['vandalism_insert']); - } + self::runQuery($cb_mysql, 'vandalism_insert', $title, $query); $edit_id = mysqli_insert_id($cb_mysql); mysqli_close($cb_mysql); @@ -74,62 +78,37 @@ public static function detectedVandalism($user, $title, $heuristic, $reason, $ur // Returns nothing public static function vandalismReverted($edit_id) { - global $logger; $cb_mysql = self::connect(); - try { - if ( - !mysqli_query( - $cb_mysql, - 'UPDATE `vandalism` SET `reverted` = 1 WHERE `id` = \'' . - mysqli_real_escape_string($cb_mysql, $edit_id) . '\'' - ) - ) { - Metrics::increment('bot_mysql_cb_query_failures_total', ['vandalism_update_reverted']); - } - } catch (mysqli_sql_exception $e) { - $logger->error("vandalism update (reverted) query returned an error for " . $edit_id . - ": " . $e->getMessage()); - Metrics::increment('bot_mysql_cb_query_failures_total', ['vandalism_update_reverted']); - } + self::runQuery( + $cb_mysql, + 'vandalism_update_reverted', + $edit_id, + 'UPDATE `vandalism` SET `reverted` = 1 WHERE `id` = \'' . + mysqli_real_escape_string($cb_mysql, $edit_id) . '\'' + ); mysqli_close($cb_mysql); } // Returns nothing public static function vandalismRevertBeaten($edit_id, $title, $user, $diff) { - global $logger; $cb_mysql = self::connect(); - try { - if ( - !mysqli_query( - $cb_mysql, - 'UPDATE `vandalism` SET `reverted` = 0 WHERE `id` = \'' . - mysqli_real_escape_string($cb_mysql, $edit_id) . '\'' - ) - ) { - Metrics::increment('bot_mysql_cb_query_failures_total', ['vandalism_update_beaten']); - } - } catch (mysqli_sql_exception $e) { - $logger->error("vandalism update (beaten) query returned an error for " . $edit_id . - ": " . $e->getMessage()); - Metrics::increment('bot_mysql_cb_query_failures_total', ['vandalism_update_beaten']); - } - try { - if ( - !mysqli_query( - $cb_mysql, - 'INSERT INTO `beaten` (`id`,`article`,`diff`,`user`) VALUES (NULL,\'' . - mysqli_real_escape_string($cb_mysql, $title) . '\',\'' . - mysqli_real_escape_string($cb_mysql, $diff) . '\',\'' . - mysqli_real_escape_string($cb_mysql, $user) . '\')' - ) - ) { - Metrics::increment('bot_mysql_cb_query_failures_total', ['beaten_insert']); - } - } catch (mysqli_sql_exception $e) { - $logger->error("beaten insert query returned an error for " . $title . ": " . $e->getMessage()); - Metrics::increment('bot_mysql_cb_query_failures_total', ['beaten_insert']); - } + self::runQuery( + $cb_mysql, + 'vandalism_update_beaten', + $edit_id, + 'UPDATE `vandalism` SET `reverted` = 0 WHERE `id` = \'' . + mysqli_real_escape_string($cb_mysql, $edit_id) . '\'' + ); + self::runQuery( + $cb_mysql, + 'beaten_insert', + $title, + 'INSERT INTO `beaten` (`id`,`article`,`diff`,`user`) VALUES (NULL,\'' . + mysqli_real_escape_string($cb_mysql, $title) . '\',\'' . + mysqli_real_escape_string($cb_mysql, $diff) . '\',\'' . + mysqli_real_escape_string($cb_mysql, $user) . '\')' + ); mysqli_close($cb_mysql); } }