]> git.joonet.de Git - adminer.git/commitdiff
Support for viewing and editing of column comments in mssql driver
authorMichal Adamec <emsy@waimanu.cromwell.lamac>
Tue, 11 Jun 2019 23:03:07 +0000 (01:03 +0200)
committerJakub Vrana <jakub@vrana.cz>
Mon, 15 Jul 2019 10:45:39 +0000 (12:45 +0200)
adminer/drivers/mssql.inc.php
changes.txt

index 116f6b02d16c68b45c0160c3fb4cb4455091660e..4a053c82bfac9ef28892b193b919c460392f378a 100644 (file)
@@ -350,7 +350,7 @@ if (isset($_GET["mssql"])) {
 
        function table_status($name = "") {
                $return = array();
-               foreach (get_rows("SELECT name AS Name, type_desc AS Engine FROM sys.all_objects WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
+               foreach (get_rows("SELECT ao.name AS Name, ao.type_desc AS Engine, (SELECT value FROM fn_listextendedproperty(default, 'SCHEMA', schema_name(schema_id), 'TABLE', ao.name, null, null)) AS Comment FROM sys.all_objects AS ao WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
                        if ($name != "") {
                                return $row;
                        }
@@ -368,6 +368,7 @@ if (isset($_GET["mssql"])) {
        }
 
        function fields($table) {
+               $comments = get_key_vals("SELECT objname, cast(value as varchar) FROM fn_listextendedproperty('MS_DESCRIPTION', 'schema', " . q(get_schema()) . ", 'table', " . q($table) . ", 'column', NULL)");
                $return = array();
                foreach (get_rows("SELECT c.max_length, c.precision, c.scale, c.name, c.is_nullable, c.is_identity, c.collation_name, t.name type, CAST(d.definition as text) [default]
 FROM sys.all_columns c
@@ -389,6 +390,7 @@ WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U',
                                "collation" => $row["collation_name"],
                                "privileges" => array("insert" => 1, "select" => 1, "update" => 1),
                                "primary" => $row["is_identity"], //! or indexes.is_primary_key
+                               "comment" => $comments[$row["name"]],
                        );
                }
                return $return;
@@ -456,6 +458,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
 
        function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
                $alter = array();
+               $comments = array();
                foreach ($fields as $field) {
                        $column = idf_escape($field[0]);
                        $val = $field[1];
@@ -463,6 +466,8 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
                                $alter["DROP"][] = " COLUMN $column";
                        } else {
                                $val[1] = preg_replace("~( COLLATE )'(\\w+)'~", '\1\2', $val[1]);
+                               $comments[$field[0]] = $val[5];
+                               unset($val[5]);
                                if ($field[0] == "") {
                                        $alter["ADD"][] = "\n  " . implode("", $val) . ($table == "" ? substr($foreign[$val[0]], 16 + strlen($val[0])) : ""); // 16 - strlen("  FOREIGN KEY ()")
                                } else {
@@ -488,6 +493,11 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
                                return false;
                        }
                }
+               foreach ($comments as $key => $val) {
+                       $comment = substr($val, 9); // 9 - strlen(" COMMENT ")
+                       queries("EXEC sp_dropextendedproperty @name = N'MS_Description', @level0type = N'Schema', @level0name = " . q(get_schema()) . ", @level1type = N'Table',  @level1name = " . q($name) . ", @level2type = N'Column', @level2name = " . q($key));
+                       queries("EXEC sp_addextendedproperty @name = N'MS_Description', @value = " . $comment . ", @level0type = N'Schema', @level0name = " . q(get_schema()) . ", @level1type = N'Table',  @level1name = " . q($name) . ", @level2type = N'Column', @level2name = " . q($key));
+               }
                return true;
        }
 
@@ -632,7 +642,7 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
        }
 
        function support($feature) {
-               return preg_match('~^(columns|database|drop_col|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
+               return preg_match('~^(comment|columns|database|drop_col|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
        }
 
        $jush = "mssql";
index d669adb2f786c311c7300c55d56ff1684d15c8a2..c555f6e551f3f0bec676fdf6a0712ca729d5e9d4 100644 (file)
@@ -7,6 +7,7 @@ MySQL: Fix displaying multi-columns foreign keys (bug #675)
 MySQL: Fix creating users and changing password in MySQL 8 (bug #663)
 MySQL: Pass SRID to GeomFromText
 PostgreSQL: Fix setting column comments on new table
+MS SQL: Support comments
 Elasticsearch: Fix setting number of rows
 
 Adminer 4.7.1 (released 2019-01-24):