From d5400234f065b4c04fefc893a4ffdf8455d91a26 Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Sat, 8 Sep 2012 22:56:34 -0700 Subject: [PATCH] MySQL: Support geometry data types --- adminer/drivers/mssql.inc.php | 7 +++++++ adminer/drivers/mysql.inc.php | 33 +++++++++++++++++++++++++++++++-- adminer/drivers/oracle.inc.php | 7 +++++++ adminer/drivers/pgsql.inc.php | 7 +++++++ adminer/drivers/sqlite.inc.php | 7 +++++++ adminer/edit.inc.php | 9 ++++++++- adminer/include/adminer.inc.php | 7 ++----- adminer/select.inc.php | 11 ++++++++++- changes.txt | 1 + editor/include/adminer.inc.php | 7 ++----- externals/jush | 2 +- 11 files changed, 83 insertions(+), 15 deletions(-) diff --git a/adminer/drivers/mssql.inc.php b/adminer/drivers/mssql.inc.php index 9f9c481e4..6d0837526 100644 --- a/adminer/drivers/mssql.inc.php +++ b/adminer/drivers/mssql.inc.php @@ -591,6 +591,13 @@ function show_status() { return array(); } + function convert_field($field) { + } + + function unconvert_field($field, $return) { + return $return; + } + function support($feature) { return ereg('^(scheme|trigger|view|drop_col)$', $feature); //! routine| } diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index 698c7959f..3fe56f8c0 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -946,6 +946,34 @@ function show_status() { return get_key_vals("SHOW STATUS"); } + /** Convert field in select and edit + * @param array one element from fields() + * @return string + */ + function convert_field($field) { + if (ereg("binary", $field["type"])) { + return "HEX(" . idf_escape($field["field"]) . ")"; + } + if (ereg("geometry|point|linestring|polygon", $field["type"])) { + return "AsWKT(" . idf_escape($field["field"]) . ")"; + } + } + + /** Convert value in edit after applying functions back + * @param array one element from fields() + * @param string + * @return string + */ + function unconvert_field($field, $return) { + if (ereg("binary", $field["type"])) { + $return = "unhex($return)"; + } + if (ereg("geometry|point|linestring|polygon", $field["type"])) { + $return = "GeomFromText($return)"; + } + return $return; + } + /** Check whether a feature is supported * @param string "comment", "copy", "drop_col", "dump", "event", "kill", "partitioning", "privileges", "procedure", "processlist", "routine", "scheme", "sequence", "status", "trigger", "type", "variables", "view" * @return bool @@ -962,8 +990,9 @@ function support($feature) { lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "decimal" => 66, "float" => 12, "double" => 21), lang('Date and time') => array("date" => 10, "datetime" => 19, "timestamp" => 19, "time" => 10, "year" => 4), lang('Strings') => array("char" => 255, "varchar" => 65535, "tinytext" => 255, "text" => 65535, "mediumtext" => 16777215, "longtext" => 4294967295), - lang('Binary') => array("bit" => 20, "binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), lang('Lists') => array("enum" => 65535, "set" => 64), + lang('Binary') => array("bit" => 20, "binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), + lang('Geometry') => array("geometry" => 0, "point" => 0, "linestring" => 0, "polygon" => 0, "multipoint" => 0, "multilinestring" => 0, "multipolygon" => 0, "geometrycollection" => 0), ) as $key => $val) { $types += $val; $structured_types[$key] = array_keys($val); @@ -978,7 +1007,7 @@ function support($feature) { "binary" => "md5/sha1", "date|time" => "now", ), array( - "int|float|double|decimal" => "+/-", + "(^|[^o])int|float|double|decimal" => "+/-", // not point "date" => "+ interval/- interval", "time" => "addtime/subtime", "char|text" => "concat", diff --git a/adminer/drivers/oracle.inc.php b/adminer/drivers/oracle.inc.php index 65662bfe9..c32f2b44d 100644 --- a/adminer/drivers/oracle.inc.php +++ b/adminer/drivers/oracle.inc.php @@ -361,6 +361,13 @@ function show_status() { return reset($rows); } + function convert_field($field) { + } + + function unconvert_field($field, $return) { + return $return; + } + function support($feature) { return ereg("view|scheme|processlist|drop_col|variables|status", $feature); //! } diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index 49db9a36c..56540b535 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -580,6 +580,13 @@ function process_list() { function show_status() { } + function convert_field($field) { + } + + function unconvert_field($field, $return) { + return $return; + } + function support($feature) { return ereg('^(comment|view|scheme|processlist|sequence|trigger|type|variables|drop_col)$', $feature); //! routine| } diff --git a/adminer/drivers/sqlite.inc.php b/adminer/drivers/sqlite.inc.php index 994d220b9..769322b4b 100644 --- a/adminer/drivers/sqlite.inc.php +++ b/adminer/drivers/sqlite.inc.php @@ -643,6 +643,13 @@ function show_status() { return $return; } + function convert_field($field) { + } + + function unconvert_field($field, $return) { + return $return; + } + function support($feature) { return ereg('^(view|trigger|variables|status|dump|move_col|drop_col)$', $feature); } diff --git a/adminer/edit.inc.php b/adminer/edit.inc.php index 74ef66fb4..98c3e97d4 100644 --- a/adminer/edit.inc.php +++ b/adminer/edit.inc.php @@ -53,7 +53,14 @@ $select = array(); foreach ($fields as $name => $field) { if (isset($field["privileges"]["select"])) { - $select[] = ($_POST["clone"] && $field["auto_increment"] ? "'' AS " : ($jush == "sql" && ereg("enum|set", $field["type"]) ? "1*" . idf_escape($name) . " AS " : "")) . idf_escape($name); + $as = convert_field($field); + if ($_POST["clone"] && $field["auto_increment"]) { + $as = "''"; + } + if ($jush == "sql" && ereg("enum|set", $field["type"])) { + $as = "1*" . idf_escape($name); + } + $select[] = ($as ? "$as AS " : "") . idf_escape($name); } } $row = array(); diff --git a/adminer/include/adminer.inc.php b/adminer/include/adminer.inc.php index ce78f8576..550f75580 100644 --- a/adminer/include/adminer.inc.php +++ b/adminer/include/adminer.inc.php @@ -205,7 +205,7 @@ function selectVal($val, $link, $field) { * @return string */ function editVal($val, $field) { - return (ereg("binary", $field["type"]) ? reset(unpack("H*", $val)) : $val); + return $val; } /** Print columns box in select @@ -546,10 +546,7 @@ function processInput($field, $value, $function = "") { } elseif (ereg('^(md5|sha1|password|encrypt)$', $function)) { $return = "$function($return)"; } - if (ereg("binary", $field["type"])) { - $return = "unhex($return)"; - } - return $return; + return unconvert_field($field, $return); } /** Returns export output options diff --git a/adminer/select.inc.php b/adminer/select.inc.php index 386ee9bed..18bda99e9 100644 --- a/adminer/select.inc.php +++ b/adminer/select.inc.php @@ -30,7 +30,16 @@ $where = $adminer->selectSearchProcess($fields, $indexes); $order = $adminer->selectOrderProcess($fields, $indexes); $limit = $adminer->selectLimitProcess(); -$from = ($select ? implode(", ", $select) : ($oid ? "$oid, " : "") . "*") . "\nFROM " . table($TABLE); +$from = ($select ? implode(", ", $select) : "*" . ($oid ? ", $oid" : "")); +if ($jush == "sql") { + foreach ($columns as $key => $val) { + $as = convert_field($fields[$key]); + if ($as) { + $from .= ", $as AS " . idf_escape($key); + } + } +} +$from .= "\nFROM " . table($TABLE); $group_by = ($group && $is_group ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : ""); if ($_GET["val"] && is_ajax()) { diff --git a/changes.txt b/changes.txt index 1e43d8de5..f23f5190c 100644 --- a/changes.txt +++ b/changes.txt @@ -6,6 +6,7 @@ Use VALUES() in INSERT+UPDATE export Style logout button as link Store selected database to permanent login Ctrl+click and Shift+click on button opens form to a blank window +MySQL: Support geometry data types Switch language by POST Compress translations selectQueryBuild() method (customization) diff --git a/editor/include/adminer.inc.php b/editor/include/adminer.inc.php index d8e1fa41f..ea7dc697d 100644 --- a/editor/include/adminer.inc.php +++ b/editor/include/adminer.inc.php @@ -188,7 +188,7 @@ function editVal($val, $field) { if (ereg('date|timestamp', $field["type"]) && $val !== null) { return preg_replace('~^(\\d{2}(\\d+))-(0?(\\d+))-(0?(\\d+))~', lang('$1-$3-$5'), $val); } - return (ereg("binary", $field["type"]) ? reset(unpack("H*", $val)) : $val); + return $val; } function selectColumnsPrint($select, $columns) { @@ -483,10 +483,7 @@ function processInput($field, $value, $function = "") { } elseif (ereg('^(md5|sha1)$', $function)) { $return = "$function($return)"; } - if (ereg("binary", $field["type"])) { - $return = "unhex($return)"; - } - return $return; + return unconvert_field($field, $return); } function dumpOutput() { diff --git a/externals/jush b/externals/jush index 1dbb89b3d..d5d52b19f 160000 --- a/externals/jush +++ b/externals/jush @@ -1 +1 @@ -Subproject commit 1dbb89b3d1f1aa27a067b017af44f4ef498bbaab +Subproject commit d5d52b19fb783b9ffe138496d14c7fe776b11eb4