From 347d9f1f5515020395d6d8e0fcf71ec7433c7cc9 Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Thu, 6 Mar 2025 14:04:47 +0100 Subject: [PATCH] Move on_actions to Driver --- adminer/drivers/mssql.inc.php | 3 +-- adminer/drivers/mysql.inc.php | 4 ++-- adminer/drivers/pgsql.inc.php | 6 +++--- adminer/foreign.inc.php | 4 ++-- adminer/include/bootstrap.inc.php | 3 +-- adminer/include/driver.inc.php | 1 + adminer/include/editing.inc.php | 10 +++++----- 7 files changed, 15 insertions(+), 16 deletions(-) diff --git a/adminer/drivers/mssql.inc.php b/adminer/drivers/mssql.inc.php index d8410d6b..fea55ece 100644 --- a/adminer/drivers/mssql.inc.php +++ b/adminer/drivers/mssql.inc.php @@ -198,6 +198,7 @@ if (isset($_GET["mssql"])) { var $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); var $functions = array("len", "lower", "round", "upper"); var $grouping = array("avg", "count", "count distinct", "max", "min", "sum"); + var $onActions = "NO ACTION|CASCADE|SET NULL|SET DEFAULT"; function __construct($connection) { parent::__construct($connection); @@ -705,8 +706,6 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)) as $row } function driver_config() { - global $on_actions; - $on_actions = str_replace('RESTRICT|', '', $on_actions); return array( 'possible_drivers' => array("SQLSRV", "PDO_SQLSRV", "PDO_DBLIB"), 'jush' => "mssql", diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index 2ab2e517..f5f6e045 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -637,12 +637,12 @@ if (!defined("DRIVER")) { * @return array [$name => ["db" => , "ns" => , "table" => , "source" => [], "target" => [], "on_delete" => , "on_update" => ]] */ function foreign_keys($table) { - global $connection, $on_actions; + global $connection, $driver; static $pattern = '(?:`(?:[^`]|``)+`|"(?:[^"]|"")+")'; $return = array(); $create_table = $connection->result("SHOW CREATE TABLE " . table($table), 1); if ($create_table) { - preg_match_all("~CONSTRAINT ($pattern) FOREIGN KEY ?\\(((?:$pattern,? ?)+)\\) REFERENCES ($pattern)(?:\\.($pattern))? \\(((?:$pattern,? ?)+)\\)(?: ON DELETE ($on_actions))?(?: ON UPDATE ($on_actions))?~", $create_table, $matches, PREG_SET_ORDER); + preg_match_all("~CONSTRAINT ($pattern) FOREIGN KEY ?\\(((?:$pattern,? ?)+)\\) REFERENCES ($pattern)(?:\\.($pattern))? \\(((?:$pattern,? ?)+)\\)(?: ON DELETE ($driver->onActions))?(?: ON UPDATE ($driver->onActions))?~", $create_table, $matches, PREG_SET_ORDER); foreach ($matches as $match) { preg_match_all("~$pattern~", $match[2], $source); preg_match_all("~$pattern~", $match[5], $target); diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index 103a7015..1eaa1085 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -476,7 +476,7 @@ ORDER BY a.attnum") as $row } function foreign_keys($table) { - global $on_actions; + global $driver; $return = array(); foreach ( get_rows("SELECT conname, condeferrable::int AS deferrable, pg_get_constraintdef(oid) AS definition @@ -492,8 +492,8 @@ ORDER BY conkey, conname") as $row $row['table'] = idf_unescape($match2[4]); } $row['target'] = array_map('Adminer\idf_unescape', array_map('trim', explode(',', $match[3]))); - $row['on_delete'] = (preg_match("~ON DELETE ($on_actions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION'); - $row['on_update'] = (preg_match("~ON UPDATE ($on_actions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION'); + $row['on_delete'] = (preg_match("~ON DELETE ($driver->onActions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION'); + $row['on_update'] = (preg_match("~ON UPDATE ($driver->onActions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION'); $return[$row['conname']] = $row; } } diff --git a/adminer/foreign.inc.php b/adminer/foreign.inc.php index ce54666b..0d922791 100644 --- a/adminer/foreign.inc.php +++ b/adminer/foreign.inc.php @@ -101,8 +101,8 @@ foreach ($row["source"] as $key => $val) { ?>

-: "") + explode("|", $on_actions), $row["on_delete"]); ?> - : "") + explode("|", $on_actions), $row["on_update"]); ?> +: "") + explode("|", $driver->onActions), $row["on_delete"]); ?> + : "") + explode("|", $driver->onActions), $row["on_update"]); ?> "innodb-foreign-key-constraints.html", 'mariadb' => "foreign-keys/", diff --git a/adminer/include/bootstrap.inc.php b/adminer/include/bootstrap.inc.php index 7c34a0a5..60e4d0b7 100644 --- a/adminer/include/bootstrap.inc.php +++ b/adminer/include/bootstrap.inc.php @@ -35,7 +35,7 @@ if ($_GET["script"] == "version") { exit; } -global $adminer, $connection, $driver, $drivers, $enum_length, $error, $HTTPS, $inout, $jush, $LANG, $langs, $on_actions, $permanent, $has_token, $token, $translations, $VERSION; // allows including Adminer inside a function +global $adminer, $connection, $driver, $drivers, $enum_length, $error, $HTTPS, $inout, $jush, $LANG, $langs, $permanent, $has_token, $token, $translations, $VERSION; // allows including Adminer inside a function if (!$_SERVER["REQUEST_URI"]) { // IIS 5 compatibility $_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"]; @@ -78,7 +78,6 @@ include "./include/adminer.inc.php"; $adminer = (function_exists('adminer_object') ? adminer_object() : new Adminer); include "../adminer/drivers/mysql.inc.php"; // must be included as last driver -$on_actions = "RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT"; ///< @var string used in foreign_keys() $config = driver_config(); $possible_drivers = $config['possible_drivers']; $jush = $config['jush']; diff --git a/adminer/include/driver.inc.php b/adminer/include/driver.inc.php index 60a3908c..fe51a22d 100644 --- a/adminer/include/driver.inc.php +++ b/adminer/include/driver.inc.php @@ -30,6 +30,7 @@ abstract class SqlDriver { var $operators = array(); ///< @var array operators used in select var $functions = array(); ///< @var array functions used in select var $grouping = array(); ///< @var array grouping functions used in select + var $onActions = "RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT"; ///< @var string used in foreign_keys() /** Create object for performing database operations * @param Db diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index 220c2a59..f738d2da 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -209,7 +209,7 @@ function json_row($key, $val = null) { * @return null */ function edit_type($key, $field, $collations, $foreign_keys = array(), $extra_types = array()) { - global $driver, $on_actions; + global $driver; $type = $field["type"]; ?>' : '' ); - echo ($foreign_keys ? " " : " "); // space for IE + echo ($foreign_keys ? " " : " "); // space for IE } /** Get partition info @@ -553,7 +553,7 @@ function remove_definer($query) { * @return string */ function format_foreign_key($foreign_key) { - global $on_actions; + global $driver; $db = $foreign_key["db"]; $ns = $foreign_key["ns"]; return " FOREIGN KEY (" . implode(", ", array_map('Adminer\idf_escape', $foreign_key["source"])) . ") REFERENCES " @@ -561,8 +561,8 @@ function format_foreign_key($foreign_key) { . ($ns != "" && $ns != $_GET["ns"] ? idf_escape($ns) . "." : "") . idf_escape($foreign_key["table"]) . " (" . implode(", ", array_map('Adminer\idf_escape', $foreign_key["target"])) . ")" //! reuse $name - check in older MySQL versions - . (preg_match("~^($on_actions)\$~", $foreign_key["on_delete"]) ? " ON DELETE $foreign_key[on_delete]" : "") - . (preg_match("~^($on_actions)\$~", $foreign_key["on_update"]) ? " ON UPDATE $foreign_key[on_update]" : "") + . (preg_match("~^($driver->onActions)\$~", $foreign_key["on_delete"]) ? " ON DELETE $foreign_key[on_delete]" : "") + . (preg_match("~^($driver->onActions)\$~", $foreign_key["on_update"]) ? " ON UPDATE $foreign_key[on_update]" : "") ; }