diff --git a/adminer/create.inc.php b/adminer/create.inc.php index 7df9d79a..fcbfabce 100644 --- a/adminer/create.inc.php +++ b/adminer/create.inc.php @@ -157,7 +157,7 @@ foreach ($engines as $engine) {

- + : " autocapitalize="off"> " . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "" : ""); ?> @@ -165,7 +165,7 @@ foreach ($engines as $engine) { - + database(); + $options = array(); + if ($username != "") { + $options["username"] = $username; + $options["password"] = $password; + } + if ($db != "") { + $options["db"] = $db; + } + try { + $this->_link = new MongoClient("mongodb://$server", $options); + return true; + } catch (Exception $ex) { + $this->error = $ex->getMessage(); + return false; + } + } + + function query($query) { + return false; + } + + function select_db($database) { + try { + $this->_db = $this->_link->selectDB($database); + return true; + } catch (Exception $ex) { + $this->error = $ex->getMessage(); + return false; + } + } + + } + + class Min_Result { + var $num_rows, $_rows = array(), $_offset = 0, $_charset = array(); + + function Min_Result($result) { + foreach ($result as $item) { + $row = array(); + foreach ($item as $key => $val) { + if (is_a($val, 'MongoBinData')) { + $this->_charset[$key] = 63; + } + $row[$key] = + (is_a($val, 'MongoDate') ? gmdate("Y-m-d H:i:s", $val->sec) . " GMT" : + (is_a($val, 'MongoBinData') ? $val->bin : //! allow downloading + (is_a($val, 'MongoRegex') ? strval($val) : + (is_object($val) ? get_class($val) : // MongoMinKey, MongoMaxKey + $val + )))); + } + $this->_rows[] = $row; + foreach ($row as $key => $val) { + if (!isset($this->_rows[0][$key])) { + $this->_rows[0][$key] = null; + } + } + } + $this->num_rows = count($this->_rows); + } + + function fetch_assoc() { + $row = current($this->_rows); + if (!$row) { + return $row; + } + $return = array(); + foreach ($this->_rows[0] as $key => $val) { + $return[$key] = $row[$key]; + } + next($this->_rows); + return $return; + } + + function fetch_row() { + $return = $this->fetch_assoc(); + if (!$return) { + return $return; + } + return array_values($return); + } + + function fetch_field() { + $keys = array_keys($this->_rows[0]); + $name = $keys[$this->_offset++]; + return (object) array( + 'name' => $name, + 'charsetnr' => $this->_charset[$name], + ); + } + + } + } + + + + class Min_Driver extends Min_SQL { + function select($table, $select, $where, $group, $order, $limit, $page) { + global $connection; + if ($select == array("*")) { + $select = array(); + } else { + $select = array_fill_keys($select, true); + } + $return = array(); + foreach ($connection->_db->selectCollection($table)->find(array(), $select) as $val) { + $return[] = $val; + } + return new Min_Result($return); + } + } + + + + function connect() { + global $adminer; + $connection = new Min_DB; + $credentials = $adminer->credentials(); + if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) { + return $connection; + } + return $connection->error; + } + + function error() { + global $connection; + return h($connection->error); + } + + function logged_user() { + global $adminer; + $credentials = $adminer->credentials(); + return $credentials[1]; + } + + function get_databases($flush) { + global $connection; + $return = array(); + $dbs = $connection->_link->listDBs(); + foreach ($dbs['databases'] as $db) { + $return[] = $db['name']; + } + return $return; + } + + function collations() { + return array(); + } + + function db_collation($db, $collations) { + } + + function count_tables($databases) { + return array(); + } + + function tables_list() { + global $connection; + return array_fill_keys($connection->_db->getCollectionNames(true), 'table'); + } + + function table_status($name = "", $fast = false) { + $return = array(); + foreach (tables_list() as $table => $type) { + $return[$table] = array("Name" => $table); + if ($name == $table) { + return $return[$table]; + } + } + return $return; + } + + function information_schema() { + } + + function is_view($table_status) { + } + + function drop_databases($databases) { + global $connection; + foreach ($databases as $db) { + $response = $connection->_link->selectDB($db)->drop(); + if (!$response['ok']) { + return false; + } + } + return true; + } + + function indexes($table, $connection2 = null) { + global $connection; + $return = array(); + foreach ($connection->_db->selectCollection($table)->getIndexInfo() as $index) { + $descs = array(); + foreach ($index["key"] as $column => $type) { + $descs[] = ($type == -1 ? '1' : null); + } + $return[$index["name"]] = array( + "type" => ($index["name"] == "_id_" ? "PRIMARY" : ($index["unique"] ? "UNIQUE" : "INDEX")), + "columns" => array_keys($index["key"]), + "descs" => $descs, + ); + } + return $return; + } + + function fields($table) { + return array("_id" => array( + "field" => "_id", + "auto_increment" => true, + "privileges" => array("select" => 1, "insert" => 1, "update" => 1), + )); + } + + function convert_field($field) { + } + + function foreign_keys($table) { + return array(); + } + + function fk_support($table_status) { + } + + function engines() { + return array(); + } + + function found_rows($table_status, $where) { + return null; + } + + function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) { + global $connection; + if ($table == "") { + $connection->_db->createCollection($name); + return true; + } + } + + function drop_tables($tables) { + global $connection; + foreach ($tables as $table) { + $response = $connection->_db->selectCollection($table)->drop(); + if (!$response['ok']) { + return false; + } + } + return true; + } + + function truncate_tables($tables) { + global $connection; + foreach ($tables as $table) { + $response = $connection->_db->selectCollection($table)->remove(); + if (!$response['ok']) { + return false; + } + } + return true; + } + + function table($idf) { + return $idf; + } + + function idf_escape($idf) { + return $idf; + } + + function support($feature) { + return preg_match("~database|table|indexes~", $feature); + } + + $jush = "mongo"; + $operators = array("="); + $functions = array(); + $grouping = array(); + $edit_functions = array(); +} diff --git a/adminer/drivers/mssql.inc.php b/adminer/drivers/mssql.inc.php index 162709f5..ef03c854 100644 --- a/adminer/drivers/mssql.inc.php +++ b/adminer/drivers/mssql.inc.php @@ -607,7 +607,7 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table) } function support($feature) { - return preg_match('~^(database|table|sql|indexes|scheme|trigger|view|drop_col)$~', $feature); //! routine| + return preg_match('~^(database|table|columns|sql|indexes|scheme|trigger|view|drop_col)$~', $feature); //! routine| } $jush = "mssql"; diff --git a/adminer/drivers/oracle.inc.php b/adminer/drivers/oracle.inc.php index e848c91c..76c5c449 100644 --- a/adminer/drivers/oracle.inc.php +++ b/adminer/drivers/oracle.inc.php @@ -376,7 +376,7 @@ ORDER BY PROCESS } function support($feature) { - return preg_match('~^(database|table|sql|indexes|view|scheme|processlist|drop_col|variables|status)$~', $feature); //! + return preg_match('~^(database|table|columns|sql|indexes|view|scheme|processlist|drop_col|variables|status)$~', $feature); //! } $jush = "oracle"; diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index 9f1158d3..e6c4ba23 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -612,7 +612,7 @@ AND typelem = 0" } function support($feature) { - return preg_match('~^(database|table|sql|indexes|comment|view|scheme|processlist|sequence|trigger|type|variables|drop_col)$~', $feature); //! routine| + return preg_match('~^(database|table|columns|sql|indexes|comment|view|scheme|processlist|sequence|trigger|type|variables|drop_col)$~', $feature); //! routine| } $jush = "pgsql"; diff --git a/adminer/drivers/sqlite.inc.php b/adminer/drivers/sqlite.inc.php index 09b592fd..edf06073 100644 --- a/adminer/drivers/sqlite.inc.php +++ b/adminer/drivers/sqlite.inc.php @@ -693,7 +693,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) { } function support($feature) { - return preg_match('~^(database|table|sql|indexes|view|trigger|variables|status|dump|move_col|drop_col)$~', $feature); + return preg_match('~^(database|table|columns|sql|indexes|view|trigger|variables|status|dump|move_col|drop_col)$~', $feature); } $jush = "sqlite"; diff --git a/adminer/include/bootstrap.inc.php b/adminer/include/bootstrap.inc.php index 9163d437..3a1bc35e 100644 --- a/adminer/include/bootstrap.inc.php +++ b/adminer/include/bootstrap.inc.php @@ -64,6 +64,7 @@ include "../adminer/drivers/sqlite.inc.php"; include "../adminer/drivers/pgsql.inc.php"; include "../adminer/drivers/oracle.inc.php"; include "../adminer/drivers/mssql.inc.php"; +include "../adminer/drivers/mongo.inc.php"; include "../adminer/drivers/elastic.inc.php"; include "../adminer/drivers/simpledb.inc.php"; include "../adminer/drivers/mysql.inc.php"; // must be included as last driver diff --git a/changes.txt b/changes.txt index 69493a82..449ee1c3 100644 --- a/changes.txt +++ b/changes.txt @@ -1,5 +1,5 @@ Adminer 4.0.0-dev: -Driver for SimpleDB and Elasticsearch +Driver for MongoDB, SimpleDB and Elasticsearch Save and continue edit by AJAX Split SQL command and import Add a new column in alter table on key press diff --git a/readme.txt b/readme.txt index 5e457b0c..21807c78 100644 --- a/readme.txt +++ b/readme.txt @@ -3,7 +3,7 @@ Adminer Editor - Data manipulation for end-users http://www.adminer.org/ Supports: MySQL, PostgreSQL, SQLite, MS SQL, Oracle, SimpleDB, Elasticsearch -Requirements: PHP 4.3.3+ or PHP 5+ +Requirements: PHP 5+ Apache License 2.0 or GPL 2 adminer/index.php - Run development version of Adminer