From dfd26d07043d539c64e44b2d879f290acc6f1a54 Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Wed, 26 Feb 2025 13:37:58 +0100 Subject: [PATCH] MS SQL: Support export --- adminer/drivers/mssql.inc.php | 48 ++++++++++++++++++++++++++++++++- adminer/dump.inc.php | 2 +- adminer/include/editing.inc.php | 4 +-- changes.txt | 1 + 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/adminer/drivers/mssql.inc.php b/adminer/drivers/mssql.inc.php index 035efdbf..562b33ad 100644 --- a/adminer/drivers/mssql.inc.php +++ b/adminer/drivers/mssql.inc.php @@ -654,10 +654,56 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table) return true; // ALTER USER is permanent } + function create_sql($table, $auto_increment, $style) { + global $driver; + if (is_view(table_status($table))) { + $view = view($table); + return "CREATE VIEW " . table($table) . " AS $view[select]"; + } + $fields = array(); + $primary = false; + foreach (fields($table) as $name => $field) { + $val = process_field($field, $field); + if ($val[6]) { + $primary = true; + } + $fields[] = implode("", $val); + } + foreach (indexes($table) as $name => $index) { + if (!$primary || $index["type"] != "PRIMARY") { + $columns = array(); + foreach ($index["columns"] as $key => $val) { + $columns[] = idf_escape($val) . ($index["descs"][$key] ? " DESC" : ""); + } + $name = idf_escape($name); + $fields[] = ($index["type"] == "INDEX" ? "INDEX $name" : "CONSTRAINT $name " . ($index["type"] == "UNIQUE" ? "UNIQUE" : "PRIMARY KEY")) . " (" . implode(", ", $columns) . ")"; + } + } + foreach (foreign_keys($table) as $foreign) { + $fields[] = ltrim(format_foreign_key($foreign)); + } + foreach ($driver->checkConstraints($table) as $name => $check) { + $fields[] = "CONSTRAINT " . idf_escape($name) . " CHECK ($check)"; + } + return "CREATE TABLE " . table($table) . " (\n\t" . implode(",\n\t", $fields) . "\n)"; + } + + function truncate_sql($table) { + return "TRUNCATE TABLE " . table($table); + } + function use_sql($database) { return "USE " . idf_escape($database); } + function trigger_sql($table) { + $return = ""; + foreach (triggers($table) as $name => $trigger) { + $return .= create_trigger(" ON " . table($table), trigger($name)) . ";"; + } + return $return; + } + function show_variables() { return array(); } @@ -674,7 +720,7 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table) } function support($feature) { - return preg_match('~^(check|comment|columns|database|drop_col|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine| + return preg_match('~^(check|comment|columns|database|drop_col|dump|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine| } function driver_config() { diff --git a/adminer/dump.inc.php b/adminer/dump.inc.php index d79793b5..951e2f32 100644 --- a/adminer/dump.inc.php +++ b/adminer/dump.inc.php @@ -126,7 +126,7 @@ SET foreign_key_checks = 0; } if ($is_sql) { - echo "-- " . $connection->result("SELECT NOW()") . "\n"; + echo "-- " . gmdate("Y-m-d H:i:s e") . "\n"; } exit; } diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index 33766988..2f53b83d 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -266,11 +266,11 @@ function process_length($length) { * @return string */ function process_type($field, $collate = "COLLATE") { - global $unsigned; + global $unsigned, $jush; return " $field[type]" . process_length($field["length"]) . (preg_match(number_type(), $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "") - . (preg_match('~char|text|enum|set~', $field["type"]) && $field["collation"] ? " $collate " . q($field["collation"]) : "") + . (preg_match('~char|text|enum|set~', $field["type"]) && $field["collation"] ? " $collate " . ($jush == "mssql" ? $field["collation"] : q($field["collation"])) : "") ; } diff --git a/changes.txt b/changes.txt index fac91525..5e61d6d7 100644 --- a/changes.txt +++ b/changes.txt @@ -3,6 +3,7 @@ SQLite: Support CHECK constraint SQLite: Add command Check tables SQLite: Display all rows of variable values SQLite: Remove support for SQLite version 2 +MS SQL: Support export (bug #480) MongoDB: Remove support for deprecated extension mongo Adminer-4.17.1 (released 2025-02-25):