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"]; ?>