From c6fc6b63e88ba0592c0cc4bbf0542469544224d1 Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Wed, 21 Aug 2019 15:00:11 +0200 Subject: [PATCH] Allow editing foreign keys pointing to tables in other database/schema (bug #694) --- adminer/foreign.inc.php | 31 +++++++++++++++++++++++-------- adminer/include/editing.inc.php | 9 +++++++-- changes.txt | 1 + 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/adminer/foreign.inc.php b/adminer/foreign.inc.php index 811eb64b..4484175b 100644 --- a/adminer/foreign.inc.php +++ b/adminer/foreign.inc.php @@ -53,13 +53,29 @@ if ($_POST) {

+$source = array_keys(fields($TABLE)); //! no text and blob +if ($row["db"] != "") { + $connection->select_db($row["db"]); +} +if ($row["ns"] != "") { + set_schema($row["ns"]); +} +$target = ($TABLE === $row["table"] ? $source : array_keys(fields($row["table"]))); +$referencable = array_keys(array_filter(table_status('', true), 'fk_support')); +$onchange = "this.form['change-js'].value = '1'; this.form.submit();"; +echo lang('Target table') . ": " . html_select("table", $referencable, $row["table"], $onchange) . "\n"; +if ($jush == "pgsql") { + echo lang('Schema') . ": " . html_select("ns", $adminer->schemas(), $row["ns"] ? $row["ns"] : $_GET["ns"], $onchange); +} elseif ($jush != "sqlite") { + $dbs = array(); + foreach ($adminer->databases() as $db) { + if (!information_schema($db)) { + $dbs[] = $db; + } + } + echo lang('DB') . ": " . html_select("db", $dbs, $row["db"] ? $row["db"] : $_GET["db"], $onchange); +} +?>

@@ -87,7 +103,6 @@ foreach ($row["source"] as $key => $val) {

- diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index 59af7386..eb44fc8d 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -470,12 +470,17 @@ function remove_definer($query) { } /** Format foreign key to use in SQL query -* @param array ("table" => string, "source" => array, "target" => array, "on_delete" => one of $on_actions, "on_update" => one of $on_actions) +* @param array ("db" => string, "ns" => string, "table" => string, "source" => array, "target" => array, "on_delete" => one of $on_actions, "on_update" => one of $on_actions) * @return string */ function format_foreign_key($foreign_key) { global $on_actions; - return " FOREIGN KEY (" . implode(", ", array_map('idf_escape', $foreign_key["source"])) . ") REFERENCES " . table($foreign_key["table"]) + $db = $foreign_key["db"]; + $ns = $foreign_key["ns"]; + return " FOREIGN KEY (" . implode(", ", array_map('idf_escape', $foreign_key["source"])) . ") REFERENCES " + . ($db != "" && $db != $_GET["db"] ? idf_escape($db) . "." : "") + . ($ns != "" && $ns != $_GET["ns"] ? idf_escape($ns) . "." : "") + . table($foreign_key["table"]) . " (" . implode(", ", array_map('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]" : "") diff --git a/changes.txt b/changes.txt index 73d4ca26..08f369b1 100644 --- a/changes.txt +++ b/changes.txt @@ -1,4 +1,5 @@ Adminer 4.7.3-dev: +Allow editing foreign keys pointing to tables in other database/schema (bug #694) MySQL: Speed up displaying tables in large databases (bug #700, regression from 4.7.2) MySQL: Allow editing rows identified by negative floats (bug #695) MySQL: Skip editing generated columns