]> git.joonet.de Git - adminer.git/commitdiff
NoSQL: Allow editing complex values
authorJakub Vrana <jakub@vrana.cz>
Fri, 9 Aug 2013 22:49:34 +0000 (15:49 -0700)
committerJakub Vrana <jakub@vrana.cz>
Fri, 9 Aug 2013 22:49:34 +0000 (15:49 -0700)
adminer/drivers/elastic.inc.php
adminer/drivers/mongo.inc.php
adminer/drivers/simpledb.inc.php
adminer/include/functions.inc.php

index d448a6b284771a9a232a59605da80dc1a5c2e6ac..6698f73bf491703f8c4b771cd50478c1e527af4a 100644 (file)
@@ -283,5 +283,5 @@ if (isset($_GET["elastic"])) {
        $operators = array("=", "query");
        $functions = array();
        $grouping = array();
-       $edit_functions = array();
+       $edit_functions = array(array("json"));
 }
index 1a6eb308f9973db1a8552f83965a485ad2c92d85..e3999fc8965c2c7c8bf1b480f2d0f41afce7a736 100644 (file)
@@ -290,5 +290,5 @@ if (isset($_GET["mongo"])) {
        $operators = array("=");
        $functions = array();
        $grouping = array();
-       $edit_functions = array();
+       $edit_functions = array(array("json"));
 }
index 6810a5ae63a6687a95bd6fdd8308e09b188a1d4b..652314dc3421039762fccee15d81a6a5828b958b 100644 (file)
@@ -173,11 +173,15 @@ if (isset($_GET["simpledb"])) {
                                $key = idf_unescape($key);
                                if ($val == "NULL") {
                                        $delete["Attribute." . count($delete) . ".Name"] = $key;
-                               } elseif ($key != "itemName()") {
-                                       $insert["Attribute.$i.Name"] = $key;
-                                       $insert["Attribute.$i.Value"] = idf_unescape($val);
-                                       $insert["Attribute.$i.Replace"] = "true";
-                                       $i++;
+                               } elseif ($key != "itemName()") { //! allow changing itemName()
+                                       foreach ((array) $val as $k => $v) {
+                                               $insert["Attribute.$i.Name"] = $key;
+                                               $insert["Attribute.$i.Value"] = (is_array($val) ? $v : idf_unescape($v));
+                                               if (!$k) {
+                                                       $insert["Attribute.$i.Replace"] = "true";
+                                               }
+                                               $i++;
+                                       }
                                }
                        }
                        $ids = $this->_extractIds($table, $queryWhere, $limit);
@@ -473,5 +477,5 @@ if (isset($_GET["simpledb"])) {
        $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "IS NOT NULL");
        $functions = array();
        $grouping = array("count");
-       $edit_functions = array();
+       $edit_functions = array(array("json"));
 }
index c5f3af9731cb2bde1b671758d5feda53204922e8..85ecb28dfba9ed45b59dec0a232be3936aeb1d39 100644 (file)
@@ -781,6 +781,14 @@ function input($field, $value, $function) {
        global $connection, $types, $adminer, $jush;
        $name = h(bracket_escape($field["field"]));
        echo "<td class='function'>";
+       if (is_array($value) && !$function) {
+               $args = array($value);
+               if (version_compare(PHP_VERSION, 5.4) >= 0) {
+                       $args[] = JSON_PRETTY_PRINT;
+               }
+               $value = call_user_func_array('json_encode', $args); //! requires PHP 5.2
+               $function = "json";
+       }
        $reset = ($jush == "mssql" && $field["auto_increment"]);
        if ($reset && !$_POST["save"]) {
                $function = null;
@@ -823,6 +831,8 @@ function input($field, $value, $function) {
                                $attrs .= " cols='30' rows='$rows'" . ($rows == 1 ? " style='height: 1.2em;'" : ""); // 1.2em - line-height
                        }
                        echo "<textarea$attrs>" . h($value) . '</textarea>';
+               } elseif ($function == "json") {
+                       echo "<textarea$attrs cols='50' rows='12' class='jush-js'>" . h($value) . '</textarea>';
                } else {
                        // int(3) is only a display hint
                        $maxlength = (!preg_match('~int~', $field["type"]) && preg_match('~^(\\d+)(,(\\d+))?$~', $field["length"], $match) ? ((preg_match("~binary~", $field["type"]) ? 2 : 1) * $match[1] + ($match[3] ? 1 : 0) + ($match[2] && !$field["unsigned"] ? 1 : 0)) : ($types[$field["type"]] ? $types[$field["type"]] + ($field["unsigned"] ? 0 : 1) : 0));
@@ -837,7 +847,7 @@ function input($field, $value, $function) {
 
 /** Process edit input field
 * @param one field from fields()
-* @return string
+* @return string or false to leave the original value
 */
 function process_input($field) {
        global $adminer;
@@ -865,6 +875,14 @@ function process_input($field) {
        if ($field["type"] == "set") {
                return array_sum((array) $value);
        }
+       if ($function == "json") {
+               $function = "";
+               $value = json_decode($value, true);
+               if (!is_array($value)) {
+                       return false; //! report errors
+               }
+               return $value;
+       }
        if (preg_match('~blob|bytea|raw|file~', $field["type"]) && ini_bool("file_uploads")) {
                $file = get_file("fields-$idf");
                if (!is_string($file)) {