diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index eca33c48..8c412dca 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -366,11 +366,16 @@ if (!defined("DRIVER")) { /** Get table status * @param string + * @param bool return only "Name", "Engine" and "Comment" fields * @return array array($name => array("Name" => , "Engine" => , "Comment" => , "Oid" => , "Rows" => , "Collation" => , "Auto_increment" => , "Data_length" => , "Index_length" => , "Data_free" => )) or only inner array with $name */ - function table_status($name = "") { + function table_status($name = "", $fast = false) { + global $connection; $return = array(); - foreach (get_rows("SHOW TABLE STATUS" . ($name != "" ? " LIKE " . q(addcslashes($name, "%_\\")) : "")) as $row) { + foreach (get_rows($fast && $connection->server_info >= 5 + ? "SELECT table_name AS Name, Engine, TABLE_COMMENT AS Comment FROM information_schema.TABLES WHERE table_schema = " . q(DB) . ($name != "" ? " AND table_name = " . q($name) : "") + : "SHOW TABLE STATUS" . ($name != "" ? " LIKE " . q(addcslashes($name, "%_\\")) : "") + ) as $row) { if ($row["Engine"] == "InnoDB") { // ignore internal comment, unnecessary since MySQL 5.1.21 $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); @@ -391,7 +396,7 @@ if (!defined("DRIVER")) { * @return bool */ function is_view($table_status) { - return !isset($table_status["Rows"]); + return !isset($table_status["Engine"]); } /** Check if table supports foreign keys @@ -960,6 +965,9 @@ if (!defined("DRIVER")) { if (ereg("binary", $field["type"])) { return "HEX(" . idf_escape($field["field"]) . ")"; } + if ($field["type"] == "bit") { + return "BIN(" . idf_escape($field["field"]) . " + 0)"; // + 0 is required outside MySQLnd + } if (ereg("geometry|point|linestring|polygon", $field["type"])) { return "AsWKT(" . idf_escape($field["field"]) . ")"; } @@ -974,6 +982,9 @@ if (!defined("DRIVER")) { if (ereg("binary", $field["type"])) { $return = "UNHEX($return)"; } + if ($field["type"] == "bit") { + return "CONV($return, 2, 10) + 0"; + } if (ereg("geometry|point|linestring|polygon", $field["type"])) { $return = "GeomFromText($return)"; } diff --git a/adminer/dump.inc.php b/adminer/dump.inc.php index 02fa52ee..3d9f0bcd 100644 --- a/adminer/dump.inc.php +++ b/adminer/dump.inc.php @@ -66,7 +66,7 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; if ($_POST["table_style"] || $_POST["data_style"]) { $views = array(); - foreach (table_status() as $name => $table_status) { + foreach (table_status('', true) as $name => $table_status) { $table = (DB == "" || in_array($name, (array) $_POST["tables"])); $data = (DB == "" || in_array($name, (array) $_POST["data"])); if ($table || $data) { diff --git a/adminer/edit.inc.php b/adminer/edit.inc.php index b3f9d301..08892e94 100644 --- a/adminer/edit.inc.php +++ b/adminer/edit.inc.php @@ -38,7 +38,7 @@ if ($_POST && !$error && !isset($_GET["select"])) { } } -$table_name = $adminer->tableName(table_status($TABLE)); +$table_name = $adminer->tableName(table_status($TABLE, true)); page_header( ($update ? lang('Edit') : lang('Insert')), $error, diff --git a/adminer/foreign.inc.php b/adminer/foreign.inc.php index 081b6510..95ca075b 100644 --- a/adminer/foreign.inc.php +++ b/adminer/foreign.inc.php @@ -39,12 +39,7 @@ if ($_POST) { $source = array_keys(fields($TABLE)); //! no text and blob $target = ($TABLE === $row["table"] ? $source : array_keys(fields($row["table"]))); -$referencable = array(); -foreach (table_status() as $name => $table_status) { - if (fk_support($table_status)) { - $referencable[] = $name; - } -} +$referencable = array_keys(array_filter(table_status('', true), 'fk_support')); ?>
diff --git a/adminer/include/adminer.inc.php b/adminer/include/adminer.inc.php index 42c08a9a..db1b88dc 100644 --- a/adminer/include/adminer.inc.php +++ b/adminer/include/adminer.inc.php @@ -777,7 +777,7 @@ username.form['auth[driver]'].onchange(); $this->databasesPrint($missing); if ($_GET["ns"] !== "" && !$missing && DB != "") { echo '

" . lang('Create new table') . "\n"; - $tables = tables_list(); + $tables = table_status('', true); if (!$tables) { echo "

" . lang('No tables.') . "\n"; } else { @@ -832,14 +832,14 @@ echo ($databases } /** Prints table list in menu - * @param array + * @param array result of table_status('', true) * @return null */ function tablesPrint($tables) { echo "

\n"; - foreach ($tables as $table => $type) { + foreach ($tables as $table => $status) { echo '" . lang('select') . " "; - echo '" . $this->tableName(array("Name" => $table)) . "
\n"; //! Adminer::tableName may work with full table status + echo '" . $this->tableName($status) . "
\n"; } } diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index 685d1904..08c41966 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -94,7 +94,7 @@ function select($result, $connection2 = null, $href = "", $orgtables = array()) */ function referencable_primary($self) { $return = array(); // table_name => field - foreach (table_status() as $table_name => $table) { + foreach (table_status('', true) as $table_name => $table) { if ($table_name != $self && fk_support($table)) { foreach (fields($table_name) as $field) { if ($field["primary"]) { diff --git a/adminer/include/functions.inc.php b/adminer/include/functions.inc.php index be3ca27d..3d65f0fa 100644 --- a/adminer/include/functions.inc.php +++ b/adminer/include/functions.inc.php @@ -822,7 +822,7 @@ function search_tables() { $_GET["where"][0]["op"] = "LIKE %%"; $_GET["where"][0]["val"] = $_POST["query"]; $found = false; - foreach (table_status() as $table => $table_status) { + foreach (table_status('', true) as $table => $table_status) { $name = $adminer->tableName($table_status); if (isset($table_status["Engine"]) && $name != "" && (!$_POST["tables"] || in_array($table, $_POST["tables"]))) { $result = $connection->query("SELECT" . limit("1 FROM " . table($table), " WHERE " . implode(" AND ", $adminer->selectSearchProcess(fields($table), array())), 1)); diff --git a/adminer/indexes.inc.php b/adminer/indexes.inc.php index 11d6ea8a..2dcb4d14 100644 --- a/adminer/indexes.inc.php +++ b/adminer/indexes.inc.php @@ -1,7 +1,7 @@ server_info >= 5.6 ? "|InnoDB" : ""), $table_status["Engine"])) { $index_types[] = "FULLTEXT"; } diff --git a/adminer/schema.inc.php b/adminer/schema.inc.php index 5e901042..2c07bfe9 100644 --- a/adminer/schema.inc.php +++ b/adminer/schema.inc.php @@ -16,7 +16,7 @@ $base_left = -1; $schema = array(); // table => array("fields" => array(name => field), "pos" => array(top, left), "references" => array(table => array(left => array(source, target)))) $referenced = array(); // target_table => array(table => array(left => target_column)) $lefts = array(); // float => bool -foreach (table_status() as $table => $table_status) { +foreach (table_status('', true) as $table => $table_status) { if (is_view($table_status)) { continue; } diff --git a/adminer/table.inc.php b/adminer/table.inc.php index 4a37e9a6..b897755a 100644 --- a/adminer/table.inc.php +++ b/adminer/table.inc.php @@ -4,7 +4,7 @@ $fields = fields($TABLE); if (!$fields) { $error = error(); } -$table_status = ($fields ? table_status($TABLE) : array()); +$table_status = ($fields ? table_status($TABLE, true) : array()); page_header(($fields && is_view($table_status) ? lang('View') : lang('Table')) . ": " . h($TABLE), $error); $adminer->selectLinks($table_status); diff --git a/changes.txt b/changes.txt index c3264ad7..a3b0341e 100644 --- a/changes.txt +++ b/changes.txt @@ -2,8 +2,9 @@ Adminer 3.7.0-dev: Allow more SQL files to be uploaded at the same time Print run time next to executed queries Disable SQL export when applying functions in select -Fix handling of POINT data type (bug #3582578) -Don't export binary and geometry columns twice in select +MySQL: Optimize create table page and Editor navigation +MySQL: Fix handling of POINT data type (bug #3582578) +MySQL: Don't export binary and geometry columns twice in select Adminer 3.6.4 (released 2013-04-26): Display pagination on a fixed position diff --git a/editor/include/adminer.inc.php b/editor/include/adminer.inc.php index 44845e2d..c110fd88 100644 --- a/editor/include/adminer.inc.php +++ b/editor/include/adminer.inc.php @@ -92,7 +92,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5 $return[$row["TABLE_NAME"]]["keys"][$row["CONSTRAINT_NAME"]][$row["COLUMN_NAME"]] = $row["REFERENCED_COLUMN_NAME"]; } foreach ($return as $key => $val) { - $name = $this->tableName(table_status($key)); + $name = $this->tableName(table_status($key, true)); if ($name != "") { $search = preg_quote($tableName); $separator = "(:|\\s*-)?\\s+"; @@ -562,7 +562,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5 databasesPrint($missing); if ($missing != "db" && $missing != "ns") { - $table_status = table_status(); + $table_status = table_status('', true); if (!$table_status) { echo "

" . lang('No tables.') . "\n"; } else {