From 177429d59f31481e75e9a3db346eff65ad675f65 Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Mon, 31 Mar 2025 21:28:40 +0200 Subject: [PATCH] Optimize retrieving columns for schema --- CHANGELOG.md | 1 + adminer/drivers/sqlite.inc.php | 10 ++++++++++ adminer/include/driver.inc.php | 17 ++++++++++++++++- adminer/schema.inc.php | 7 ++++--- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de82434d..4ec42e00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## Adminer dev - Export: Fix tar (regression from 5.0.3) +- Optimize retrieving columns for schema - Elasticsearch: Make it work with Elasticsearch 8 - CSS: Hide menu on mobile - CSS: Invert icons in dark mode diff --git a/adminer/drivers/sqlite.inc.php b/adminer/drivers/sqlite.inc.php index 1a91ab49..996a77fe 100644 --- a/adminer/drivers/sqlite.inc.php +++ b/adminer/drivers/sqlite.inc.php @@ -161,6 +161,16 @@ if (isset($_GET["sqlite"])) { preg_match_all('~ CHECK *(\( *(((?>[^()]*[^() ])|(?1))*) *\))~', get_val("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table), 0, $this->conn), $matches); //! could be inside a comment return array_combine($matches[2], $matches[2]); } + + function allFields(): array { + $return = array(); + foreach (tables_list() as $table => $type) { + foreach (fields($table) as $field) { + $return[$table][] = $field; + } + } + return $return; + } } diff --git a/adminer/include/driver.inc.php b/adminer/include/driver.inc.php index 9452beaf..ce02be8a 100644 --- a/adminer/include/driver.inc.php +++ b/adminer/include/driver.inc.php @@ -249,6 +249,21 @@ FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS c JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS t ON c.CONSTRAINT_SCHEMA = t.CONSTRAINT_SCHEMA AND c.CONSTRAINT_NAME = t.CONSTRAINT_NAME WHERE c.CONSTRAINT_SCHEMA = " . q($_GET["ns"] != "" ? $_GET["ns"] : DB) . " AND t.TABLE_NAME = " . q($table) . " -AND CHECK_CLAUSE NOT LIKE '% IS NOT NULL'"); // ignore default IS NOT NULL checks in PostrgreSQL +AND CHECK_CLAUSE NOT LIKE '% IS NOT NULL'", $this->conn); // ignore default IS NOT NULL checks in PostrgreSQL + } + + /** Get all fields in the current schema + * @return array> + */ + function allFields(): array { + $return = array(); + foreach (get_rows("SELECT TABLE_NAME AS tab, COLUMN_NAME AS field, IS_NULLABLE AS nullable, DATA_TYPE AS type, CHARACTER_MAXIMUM_LENGTH AS length" . (JUSH == 'sql' ? ", COLUMN_KEY = 'PRI' AS `primary`" : "") . " +FROM INFORMATION_SCHEMA.COLUMNS +WHERE TABLE_SCHEMA = " . q($_GET["ns"] != "" ? $_GET["ns"] : DB) . " +ORDER BY TABLE_NAME, ORDINAL_POSITION", $this->conn) as $row) { + $row["null"] = ($row["nullable"] == "YES"); + $return[$row["tab"]][] = $row; + } + return $return; } } diff --git a/adminer/schema.inc.php b/adminer/schema.inc.php index b677514b..f14616a2 100644 --- a/adminer/schema.inc.php +++ b/adminer/schema.inc.php @@ -19,16 +19,17 @@ $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 +$all_fields = driver()->allFields(); foreach (table_status('', true) as $table => $table_status) { if (is_view($table_status)) { continue; } $pos = 0; $schema[$table]["fields"] = array(); - foreach (fields($table) as $name => $field) { + foreach ($all_fields[$table] as $field) { $pos += 1.25; $field["pos"] = $pos; - $schema[$table]["fields"][$name] = $field; + $schema[$table]["fields"][$field["field"]] = $field; } $schema[$table]["pos"] = ($table_pos[$table] ?: array($top, 0)); foreach (adminer()->foreignKeys($table) as $val) { @@ -67,7 +68,7 @@ foreach ($schema as $name => $table) { echo script("qsl('div').onmousedown = schemaMousedown;"); foreach ($table["fields"] as $field) { - $val = '' . h($field["field"]) . ''; + $val = '' . h($field["field"]) . ''; echo "
" . ($field["primary"] ? "$val" : $val); }