]> git.joonet.de Git - adminer.git/commitdiff
Optimize table_status()
authorJakub Vrana <jakub@vrana.cz>
Sat, 27 Apr 2013 03:04:57 +0000 (20:04 -0700)
committerJakub Vrana <jakub@vrana.cz>
Sat, 27 Apr 2013 05:19:54 +0000 (22:19 -0700)
12 files changed:
adminer/drivers/mysql.inc.php
adminer/dump.inc.php
adminer/edit.inc.php
adminer/foreign.inc.php
adminer/include/adminer.inc.php
adminer/include/editing.inc.php
adminer/include/functions.inc.php
adminer/indexes.inc.php
adminer/schema.inc.php
adminer/table.inc.php
changes.txt
editor/include/adminer.inc.php

index eca33c48418a37d05e40a9ca1e1822253bbcfa69..8c412dcaf261c5c2cf06855006130155b61f05d2 100644 (file)
@@ -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)";
                }
index 02fa52ee9efcbf56fe1b7ccbac021b0908ff637b..3d9f0bcd7f7ab1b74e9952b362d8835d734bfb72 100644 (file)
@@ -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) {
index b3f9d301ba3dcef5dc4523971d5a332ba43f946f..08892e940521c067acd79e02f7eace6faa458208 100644 (file)
@@ -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,
index 081b65104cb25c1fbee917967d64d49e1808e7a3..95ca075b211472d6bc1c2202c4292298ee232c6e 100644 (file)
@@ -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'));
 ?>
 
 <form action="" method="post">
index 42c08a9ab46579900a19a02e30eb0892092a81a7..db1b88dc63843de578802907f88546302041f31b 100644 (file)
@@ -777,7 +777,7 @@ username.form['auth[driver]'].onchange();
                        $this->databasesPrint($missing);
                        if ($_GET["ns"] !== "" && !$missing && DB != "") {
                                echo '<p><a href="' . h(ME) . 'create="' . bold($_GET["create"] === "") . ">" . lang('Create new table') . "</a>\n";
-                               $tables = tables_list();
+                               $tables = table_status('', true);
                                if (!$tables) {
                                        echo "<p class='message'>" . 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 "<p id='tables' onmouseover='menuOver(this, event);' onmouseout='menuOut(this);'>\n";
-               foreach ($tables as $table => $type) {
+               foreach ($tables as $table => $status) {
                        echo '<a href="' . h(ME) . 'select=' . urlencode($table) . '"' . bold($_GET["select"] == $table) . ">" . lang('select') . "</a> ";
-                       echo '<a href="' . h(ME) . 'table=' . urlencode($table) . '"' . bold($_GET["table"] == $table) . " title='" . lang('Show structure') . "'>" . $this->tableName(array("Name" => $table)) . "</a><br>\n"; //! Adminer::tableName may work with full table status
+                       echo '<a href="' . h(ME) . 'table=' . urlencode($table) . '"' . bold($_GET["table"] == $table) . " title='" . lang('Show structure') . "'>" . $this->tableName($status) . "</a><br>\n";
                }
        }
        
index 685d19046d409cd08fde08ecba480a1dccfe7117..08c41966a14ea5b2676a8cbf291cad2ebd02bd3c 100644 (file)
@@ -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"]) {
index be3ca27d660a9bed9986dbccf57e2411a7fc0c05..3d65f0fa6e2c8606a0d53999275038188f12a43f 100644 (file)
@@ -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));
index 11d6ea8aef07d99709f49c4dd47b2a2ce88a91d6..2dcb4d144e38603821136660d00a20bfa04d9171 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 $TABLE = $_GET["indexes"];
 $index_types = array("PRIMARY", "UNIQUE", "INDEX");
-$table_status = table_status($TABLE);
+$table_status = table_status($TABLE, true);
 if (eregi("MyISAM|M?aria" . ($connection->server_info >= 5.6 ? "|InnoDB" : ""), $table_status["Engine"])) {
        $index_types[] = "FULLTEXT";
 }
index 5e9010421ebd5203e690e353322789d871b55a47..2c07bfe9983a1a94493680b9ac99434759b241bf 100644 (file)
@@ -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;
        }
index 4a37e9a6cc7f4e2ff7ef9b229a48478885c1358f..b897755ac49603a9a8855d8337f567d62ce6cf22 100644 (file)
@@ -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);
index c3264ad76260262b65851b54e2a1eb6e2343a857..a3b0341ef0bbfaa556e39d56ee6ac88fb38b3427 100644 (file)
@@ -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
index 44845e2d1e06403e0a70e442c6ac3003d54e2a33..c110fd8834362db12566d486e43a772d4f1c1838 100644 (file)
@@ -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
 <?php
                        $this->databasesPrint($missing);
                        if ($missing != "db" && $missing != "ns") {
-                               $table_status = table_status();
+                               $table_status = table_status('', true);
                                if (!$table_status) {
                                        echo "<p class='message'>" . lang('No tables.') . "\n";
                                } else {