diff --git a/adminer/include/adminer.inc.php b/adminer/include/adminer.inc.php index 9181d311..7e183a71 100644 --- a/adminer/include/adminer.inc.php +++ b/adminer/include/adminer.inc.php @@ -108,6 +108,14 @@ document.getElementById('username').focus(); echo "\n"; } + /** Get foreign keys for table + * @param string + * @return array same format as foreign_keys() + */ + function foreignKeys($table) { + return foreign_keys($table); + } + /** Find backward keys for table * @param string * @param string diff --git a/adminer/include/functions.inc.php b/adminer/include/functions.inc.php index 489108f2..1d9c1860 100644 --- a/adminer/include/functions.inc.php +++ b/adminer/include/functions.inc.php @@ -550,8 +550,9 @@ function hidden_fields_get() { * @return array array($col => array()) */ function column_foreign_keys($table) { + global $adminer; $return = array(); - foreach (foreign_keys($table) as $foreign_key) { + foreach ($adminer->foreignKeys($table) as $foreign_key) { foreach ($foreign_key["source"] as $val) { $return[$val][] = $foreign_key; } diff --git a/adminer/schema.inc.php b/adminer/schema.inc.php index 6410ffe8..1a7e0576 100644 --- a/adminer/schema.inc.php +++ b/adminer/schema.inc.php @@ -27,23 +27,21 @@ foreach (table_status() as $row) { $schema[$row["Name"]]["fields"][$name] = $field; } $schema[$row["Name"]]["pos"] = ($table_pos[$row["Name"]] ? $table_pos[$row["Name"]] : array($top, 0)); - if (fk_support($row)) { - foreach (foreign_keys($row["Name"]) as $val) { - if (!$val["db"]) { - $left = $base_left; - if ($table_pos[$row["Name"]][1] || $table_pos[$val["table"]][1]) { - $left = min(floatval($table_pos[$row["Name"]][1]), floatval($table_pos[$val["table"]][1])) - 1; - } else { - $base_left -= .1; - } - while ($lefts[(string) $left]) { - // find free $left - $left -= .0001; - } - $schema[$row["Name"]]["references"][$val["table"]][(string) $left] = array($val["source"], $val["target"]); - $referenced[$val["table"]][$row["Name"]][(string) $left] = $val["target"]; - $lefts[(string) $left] = true; + foreach ($adminer->foreignKeys($row["Name"]) as $val) { + if (!$val["db"]) { + $left = $base_left; + if ($table_pos[$row["Name"]][1] || $table_pos[$val["table"]][1]) { + $left = min(floatval($table_pos[$row["Name"]][1]), floatval($table_pos[$val["table"]][1])) - 1; + } else { + $base_left -= .1; } + while ($lefts[(string) $left]) { + // find free $left + $left -= .0001; + } + $schema[$row["Name"]]["references"][$val["table"]][(string) $left] = array($val["source"], $val["target"]); + $referenced[$val["table"]][$row["Name"]][(string) $left] = $val["target"]; + $lefts[(string) $left] = true; } } $top = max($top, $schema[$row["Name"]]["pos"][0] + 2.5 + $pos); diff --git a/changes.txt b/changes.txt index 4cb4f24e..7b3dad97 100644 --- a/changes.txt +++ b/changes.txt @@ -4,6 +4,7 @@ Highlight and edit SQL command in processlist Disable XSS "protection" of IE8 Timestamp in export Link to bookmark SQL command +Support for virtual foreign keys Immunity against zend.ze1_compatibility_mode Fix last page with empty result set diff --git a/editor/include/adminer.inc.php b/editor/include/adminer.inc.php index af6b47e1..0ebbb868 100644 --- a/editor/include/adminer.inc.php +++ b/editor/include/adminer.inc.php @@ -65,6 +65,10 @@ document.getElementById('username').focus(); echo ">>\n"; } + function foreignKeys($table) { + return foreign_keys($table); + } + function backwardKeys($table, $tableName) { $return = array(); foreach (get_rows("SELECT TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_COLUMN_NAME