Thread: [adminer-svn] SF.net SVN: adminer:[1199] branches/sqlite
Database management in a single PHP file
Brought to you by:
jakubvrana
From: <jak...@us...> - 2009-10-19 06:40:47
|
Revision: 1199 http://adminer.svn.sourceforge.net/adminer/?rev=1199&view=rev Author: jakubvrana Date: 2009-10-19 06:40:41 +0000 (Mon, 19 Oct 2009) Log Message: ----------- Prepare driver separation Modified Paths: -------------- branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/include/bootstrap.inc.php branches/sqlite/adminer/include/connect.inc.php branches/sqlite/adminer/lang/cs.inc.php branches/sqlite/compile.php branches/sqlite/editor/include/adminer.inc.php branches/sqlite/lang.php Added Paths: ----------- branches/sqlite/adminer/drivers/ branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php Removed Paths: ------------- branches/sqlite/adminer/include/mysql.inc.php branches/sqlite/adminer/include/sqlite.inc.php Property changes on: branches/sqlite/adminer/drivers ___________________________________________________________________ Added: tsvn:projectlanguage + 1033 Copied: branches/sqlite/adminer/drivers/mysql.inc.php (from rev 1194, branches/sqlite/adminer/include/mysql.inc.php) =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php (rev 0) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2009-10-19 06:40:41 UTC (rev 1199) @@ -0,0 +1,397 @@ +<?php +// MySQLi supports everything, MySQL doesn't support multiple result sets, PDO_MySQL doesn't support orgtable +if (extension_loaded("mysqli")) { + class Min_DB extends MySQLi { + var $extension = "MySQLi"; + + function Min_DB() { + parent::init(); + } + + function connect($server, $username, $password) { + list($host, $port) = explode(":", $server, 2); // part after : is used for port or socket + return @$this->real_connect( + (strlen($server) ? $host : ini_get("mysqli.default_host")), + (strlen("$server$username") ? $username : ini_get("mysqli.default_user")), + (strlen("$server$username$password") ? $password : ini_get("mysqli.default_pw")), + null, + (is_numeric($port) ? $port : ini_get("mysqli.default_port")), + (!is_numeric($port) ? $port : null) + ); + } + + function result($result, $field = 0) { + if (!$result) { + return false; + } + $row = $result->fetch_array(); + return $row[$field]; + } + + function quote($string) { + return "'" . $this->escape_string($string) . "'"; + } + } + +} elseif (extension_loaded("mysql")) { + class Min_DB { + var $extension = "MySQL", $_link, $_result, $server_info, $affected_rows, $error; + + function connect($server, $username, $password) { + $this->_link = @mysql_connect( + (strlen($server) ? $server : ini_get("mysql.default_host")), + (strlen("$server$username") ? $username : ini_get("mysql.default_user")), + (strlen("$server$username$password") ? $password : ini_get("mysql.default_password")), + true, + 131072 // CLIENT_MULTI_RESULTS for CALL + ); + if ($this->_link) { + $this->server_info = mysql_get_server_info($this->_link); + } else { + $this->error = mysql_error(); + } + return (bool) $this->_link; + } + + function quote($string) { + return "'" . mysql_real_escape_string($string, $this->_link) . "'"; + } + + function select_db($database) { + return mysql_select_db($database, $this->_link); + } + + function query($query, $unbuffered = false) { + $result = @($unbuffered ? mysql_unbuffered_query($query, $this->_link) : mysql_query($query, $this->_link)); // @ - mute mysql.trace_mode + if (!$result) { + $this->error = mysql_error($this->_link); + return false; + } elseif ($result === true) { + $this->affected_rows = mysql_affected_rows($this->_link); + return true; + } + return new Min_Result($result); + } + + function multi_query($query) { + return $this->_result = $this->query($query); + } + + function store_result() { + return $this->_result; + } + + function next_result() { + // MySQL extension doesn't support multiple results + return false; + } + + function result($result, $field = 0) { + if (!$result) { + return false; + } + return mysql_result($result->_result, 0, $field); + } + } + + class Min_Result { + var $_result, $_offset = 0, $num_rows; + + function Min_Result($result) { + $this->_result = $result; + $this->num_rows = mysql_num_rows($result); + } + + function fetch_assoc() { + return mysql_fetch_assoc($this->_result); + } + + function fetch_row() { + return mysql_fetch_row($this->_result); + } + + function fetch_field() { + $row = mysql_fetch_field($this->_result, $this->_offset++); + $row->orgtable = $row->table; + $row->orgname = $row->name; + $row->charsetnr = ($row->blob ? 63 : 0); + return $row; + } + + function __destruct() { + mysql_free_result($this->_result); //! is not called in PHP 4 which is a problem with mysql.trace_mode + } + } + +} elseif (extension_loaded("pdo_mysql")) { + class Min_DB extends Min_PDO { + var $extension = "PDO_MySQL"; + + function connect($server, $username, $password) { + $this->dsn("mysql:host=" . str_replace(":", ";unix_socket=", preg_replace('~:([0-9])~', ';port=\\1', $server)), $username, $password); + $this->server_info = $this->result($this->query("SELECT VERSION()")); + return true; + } + + function query($query, $unbuffered = false) { + $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, !$unbuffered); + return parent::query($query, $unbuffered); + } + } + +} else { + page_header(lang('No MySQL extension'), lang('None of the supported PHP extensions (%s) are available.', 'MySQLi, MySQL, PDO_MySQL'), null); + page_footer("auth"); + exit; +} + +/** Connect to the database +* @return mixed Min_DB or string for error +*/ +function connect() { + global $adminer; + $connection = new Min_DB; + $credentials = $adminer->credentials(); + if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) { + $connection->query("SET SQL_QUOTE_SHOW_CREATE=1"); + $connection->query("SET NAMES utf8"); + return $connection; + } + return $connection->error; +} + +/** Get cached list of databases +* @param bool +* @return array +*/ +function get_databases($flush = true) { + // SHOW DATABASES can take a very long time so it is cached + $return = &$_SESSION["databases"][$_GET["server"]]; + if (!isset($return)) { + $return = get_vals("SHOW DATABASES"); + if ($flush) { + ob_flush(); + flush(); + } + } + return $return; +} + +/**Get supported engines +* @return array +*/ +function engines() { + global $connection; + $return = array(); + $result = $connection->query("SHOW ENGINES"); + while ($row = $result->fetch_assoc()) { + if (ereg("YES|DEFAULT", $row["Support"])) { + $return[] = $row["Engine"]; + } + } + return $return; +} + +/** Print links and information about the database +* @return null +*/ +function db_info() { + global $connection; + foreach (array( + 'privileges' => lang('Privileges'), + 'processlist' => lang('Process list'), + 'variables' => lang('Variables'), + ) as $key => $val) { + echo "<a href='" . h(ME) . "$key='>$val</a>\n"; + } + echo "<p>" . lang('%s version: %s through PHP extension %s', "MySQL", "<b" . ($connection->server_info < 4.1 ? " class='binary'" : "") . ">$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; + echo "<p>" . lang('Logged as: %s', "<b>" . h($connection->result($connection->query("SELECT USER()"))) . "</b>") . "\n"; +} + +/** Get tables list +* @return array +*/ +function tables_list() { + return get_vals("SHOW TABLES"); +} + +/** Get table status +* @param string +* @return array +*/ +function table_status($name = "") { + global $connection; + $return = array(); + $result = $connection->query("SHOW TABLE STATUS" . (strlen($name) ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); + while ($row = $result->fetch_assoc()) { + if ($row["Engine"] == "InnoDB") { + // ignore internal comment, unnecessary since MySQL 5.1.21 + $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); + } + $return[$row["Name"]] = $row; + } + return (strlen($name) ? $return[$name] : $return); +} + +/** +* @param array result of table_status +* @return bool +*/ +function fk_support($table_status) { + return ($table_status["Engine"] == "InnoDB"); +} + +/** Get status of referencable tables +* @return array +*/ +function table_status_referencable() { + $return = array(); + foreach (table_status() as $name => $row) { + if ($row["Engine"] == "InnoDB") { + $return[$name] = $row; + } + } + return $return; +} + +/** Get information about fields +* @param string +* @return array array($name => array("field" => , "full_type" => , "type" => , "length" => , "unsigned" => , "default" => , "null" => , "auto_increment" => , "on_update" => , "collation" => , "privileges" => , "comment" => , "primary" => )) +*/ +function fields($table) { + global $connection; + $return = array(); + $result = $connection->query("SHOW FULL COLUMNS FROM " . idf_escape($table)); + if ($result) { + while ($row = $result->fetch_assoc()) { + preg_match('~^([^( ]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match); + $return[$row["Field"]] = array( + "field" => $row["Field"], + "full_type" => $row["Type"], + "type" => $match[1], + "length" => $match[2], + "unsigned" => ltrim($match[3] . $match[4]), + "default" => (strlen($row["Default"]) || ereg("char", $match[1]) ? $row["Default"] : null), + "null" => ($row["Null"] == "YES"), + "auto_increment" => ($row["Extra"] == "auto_increment"), + "on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23 + "collation" => $row["Collation"], + "privileges" => array_flip(explode(",", $row["Privileges"])), + "comment" => $row["Comment"], + "primary" => ($row["Key"] == "PRI"), + ); + } + } + return $return; +} + +/** Get table indexes +* @param string +* @param string Min_DB to use +* @return array array($key_name => array("type" => , "columns" => array(), "lengths" => array())) +*/ +function indexes($table, $connection2 = null) { + global $connection; + if (!is_object($connection2)) { // use the main connection if the separate connection is unavailable + $connection2 = $connection; + } + $return = array(); + $result = $connection2->query("SHOW INDEX FROM " . idf_escape($table)); + if ($result) { + while ($row = $result->fetch_assoc()) { + $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE"))); + $return[$row["Key_name"]]["columns"][$row["Seq_in_index"]] = $row["Column_name"]; + $return[$row["Key_name"]]["lengths"][$row["Seq_in_index"]] = $row["Sub_part"]; + } + } + return $return; +} + +/** Get foreign keys in table +* @param string +* @return array array($name => array("db" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => )) +*/ +function foreign_keys($table) { + global $connection, $on_actions; + static $pattern = '(?:[^`]|``)+'; + $return = array(); + $result = $connection->query("SHOW CREATE TABLE " . idf_escape($table)); + if ($result) { + $create_table = $connection->result($result, 1); + preg_match_all("~CONSTRAINT `($pattern)` FOREIGN KEY \\(((?:`$pattern`,? ?)+)\\) REFERENCES `($pattern)`(?:\\.`($pattern)`)? \\(((?:`$pattern`,? ?)+)\\)(?: ON DELETE (" . implode("|", $on_actions) . "))?(?: ON UPDATE (" . implode("|", $on_actions) . "))?~", $create_table, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + preg_match_all("~`($pattern)`~", $match[2], $source); + preg_match_all("~`($pattern)`~", $match[5], $target); + $return[$match[1]] = array( + "db" => idf_unescape(strlen($match[4]) ? $match[3] : $match[4]), + "table" => idf_unescape(strlen($match[4]) ? $match[4] : $match[3]), + "source" => array_map('idf_unescape', $source[1]), + "target" => array_map('idf_unescape', $target[1]), + "on_delete" => $match[6], + "on_update" => $match[7], + ); + } + } + return $return; +} + +/** Get view SELECT +* @param string +* @return array array("select" => ) +*/ +function view($name) { + global $connection; + return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result($connection->query("SHOW CREATE VIEW " . idf_escape($name)), 1))); +} + +/** Get sorted grouped list of collations +* @return array +*/ +function collations() { + global $connection; + $return = array(); + $result = $connection->query("SHOW COLLATION"); + while ($row = $result->fetch_assoc()) { + $return[$row["Charset"]][] = $row["Collation"]; + } + ksort($return); + foreach ($return as $key => $val) { + sort($return[$key]); + } + return $return; +} + +/** Find out if database is information_schema +* @param string +* @return bool +*/ +function information_schema($db) { + global $connection; + return ($connection->server_info >= 5 && $db == "information_schema"); +} + +/** Return expression for binary comparison +* @param string +* @return string +*/ +function exact_value($val) { + global $connection; + return "BINARY " . $connection->quote($val); +} + +$driver = "sqlite"; +$comments_support = true; +// value means maximum unsigned length +$types = array(); +$structured_types = array(); +foreach (array( + lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "float" => 12, "double" => 21, "decimal" => 66), + 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("binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), + lang('Lists') => array("enum" => 65535, "set" => 64), +) as $key => $val) { + $types += $val; + $structured_types[$key] = array_keys($val); +} +$unsigned = array("unsigned", "zerofill", "unsigned zerofill"); Copied: branches/sqlite/adminer/drivers/sqlite.inc.php (from rev 1194, branches/sqlite/adminer/include/sqlite.inc.php) =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php (rev 0) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2009-10-19 06:40:41 UTC (rev 1199) @@ -0,0 +1,325 @@ +<?php +if (extension_loaded($_GET["sqlite"] == 2 ? "sqlite" : "sqlite3")) { + if ($_GET["sqlite"] == 2) { //! detect from file + + class Min_SQLite extends SQLiteDatabase { + var $extension = "SQLite"; + + function __construct() { + $this->server_info = sqlite_libversion(); + } + + function open($filename) { + parent::__construct($filename); + } + + function query($query) { + $result = @parent::query($query, SQLITE_BOTH, $error); + if (!$result) { + $this->error = $error; + return false; + } elseif ($result === true) { + $this->affected_rows = $this->changes(); + return true; + } + return new Min_Result($result); + } + + function quote($string) { + return "'" . sqlite_escape_string($string) . "'"; + } + + function result($result, $field = 0) { + if (!$result) { + return false; + } + $row = $result->_result->fetch(); + return $row[$field]; + } + } + + class Min_Result { + var $_result, $num_rows; + + function __construct($result) { + $this->_result = $result; + $this->num_rows = $result->numRows(); + } + + function fetch_assoc() { + return $this->_result->fetch(SQLITE_ASSOC); + } + + function fetch_row() { + return $this->_result->fetch(SQLITE_NUM); + } + + function fetch_field() { + static $column = -1; + $column++; + return (object) array( + "name" => $this->fieldName($column), + //! type, orgtable, charsetnr + ); + } + + } + + } else { + + class Min_SQLite extends SQLite3 { + var $extension = "SQLite3"; + + function __construct() { + $version = $this->version(); + $this->server_info = $version["versionString"]; + } + + function open($filename) { + parent::__construct($filename); + } + + function query($query) { + $result = @parent::query($query); + if (!$result) { + $this->error = $this->lastErrorMsg(); + return false; + } elseif ($result->numColumns()) { + return new Min_Result($result); + } + $this->affected_rows = $this->changes(); + return true; + } + + function quote($string) { + return "'" . $this->escapeString($string) . "'"; + } + + function result($result, $field = 0) { + if (!$result) { + return false; + } + $row = $result->_result->fetchArray(); + return $row[$field]; + } + } + + class Min_Result { + var $_result, $num_rows; + + function __construct($result) { + $this->_result = $result; + $this->num_rows = 1; //! + } + + function fetch_assoc() { + return $this->_result->fetchArray(SQLITE3_ASSOC); + } + + function fetch_row() { + return $this->_result->fetchArray(SQLITE3_NUM); + } + + function fetch_field() { + static $column = -1; + $column++; + return (object) array( + "name" => $this->_result->columnName($column), + "type" => $this->_result->columnType($column), + //! orgtable, charsetnr + ); + } + + function __desctruct() { + return $this->_result->finalize(); + } + } + + } + + class Min_DB extends Min_SQLite { + + function select_db($filename) { + static $connected = false; + if ($connected) { + return true; + } + set_exception_handler('connect_error'); // try/catch is not compatible with PHP 4 + $this->open($filename); + $connected = true; + restore_exception_handler(); + return true; + } + + function multi_query($query) { + return $this->_result = $this->query($query); + } + + function store_result() { + return $this->_result; + } + + function next_result() { + return false; + } + } + +} elseif (extension_loaded("pdo_sqlite")) { + class Min_DB extends Min_PDO { + var $extension = "PDO_SQLite"; + + function select_db($filename) { + static $connected = false; + if ($connected) { + return true; + } + set_exception_handler('connect_error'); // try/catch is not compatible with PHP 4 + $connected = true; + $this->__construct(($_GET["sqlite"] == 2 ? "sqlite2" : "sqlite") . ":$filename"); + restore_exception_handler(); + $this->setAttribute(13, array('Min_PDOStatement')); // PDO::ATTR_STATEMENT_CLASS + $this->server_info = $this->result($this->query("SELECT sqlite_version()")); + return true; + } + } + +} else { + page_header(lang('No MySQL extension'), lang('None of the supported PHP extensions (%s) are available.', 'SQLite, SQLite3, PDO_SQLite'), null); + page_footer("auth"); + exit; +} + +function connect() { + static $connected = false; //! EXPLAIN doesn't work with second connection + if ($connected) { + return false; + } + $connected = true; + return new Min_DB; +} + +function get_databases() { + return array(); +} + +function engines() { + return array(); +} + +function db_info() { + global $connection; + echo "<p>" . lang('%s version: %s through PHP extension %s', "SQLite", "<b>$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; +} + +function tables_list() { + return get_vals("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')", 1); +} + +function table_status($name = "") { + global $connection; + $return = array(); + $result = $connection->query("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')" . (strlen($name) ? " AND name = " . $connection->quote($name) : "")); + while ($row = $result->fetch_assoc()) { + $return[$row["name"]] = array( + "Name" => $row["name"], + "Rows" => ($row["type"] == "table" ? $connection->result($connection->query("SELECT COUNT(*) FROM " . idf_escape($row["name"]))) : ""), + ); + } + return (strlen($name) ? $return[$name] : $return); +} + +function fk_support($table_status) { + return true; +} + +function table_status_referencable() { + return table_status(); +} + +function fields($table) { + global $connection; + $return = array(); + $result = $connection->query("PRAGMA table_info(" . idf_escape($table) . ")"); + while ($row = $result->fetch_assoc()) { + $type = strtolower($row["type"]); + $return[$row["name"]] = array( + "field" => $row["name"], + "type" => $type, + "full_type" => $type, + "default" => $row["dflt_value"], + "null" => !$row["notnull"], + "auto_increment" => false, //! + "collation" => null, //! + "privileges" => array("select" => 1, "insert" => 1, "update" => 1), + "primary" => $row["pk"], + ); + } + return $return; +} + +function indexes($table, $connection2 = null) { + global $connection; + $return = array(); + $primary = array(); + foreach (fields($table) as $field) { + if ($field["primary"]) { + $primary[] = $field["field"]; + } + } + if ($primary) { + $return[""] = array("type" => "PRIMARY", "columns" => $primary, "lengths" => array()); + } + $result = $connection->query("PRAGMA index_list(" . idf_escape($table) . ")"); + if (is_object($result)) { + while ($row = $result->fetch_assoc()) { + $return[$row["name"]]["type"] = ($row["unique"] ? "UNIQUE" : "INDEX"); + $return[$row["name"]]["lengths"] = array(); + $result1 = $connection->query("PRAGMA index_info(" . idf_escape($row["name"]) . ")"); + while ($row1 = $result1->fetch_assoc()) { + $return[$row["name"]]["columns"][$row1["seqno"]] = $row1["name"]; + } + } + } + return $return; +} + +function foreign_keys($table) { + global $connection; + $return = array(); + $result = $connection->query("PRAGMA foreign_key_list(" . idf_escape($table) . ")"); + if (is_object($result)) { + while ($row = $result->fetch_assoc()) { + $foreign_key = &$return[$row["id"]]; + if (!$foreign_key) { + $foreign_key = $row; + } + $foreign_key["source"][] = $row["from"]; + $foreign_key["target"][] = $row["to"]; + } + } + return $return; +} + +function view($name) { + global $connection; + return array("select" => preg_replace('~^(?:[^`]+|`[^`]*`)* AS ~iU', '', $connection->result($connection->query("SELECT sql FROM sqlite_master WHERE name = " . $connection->quote($name)), 0))); +} + +function collations() { + return get_vals("PRAGMA collation_list", 1); +} + +function information_schema($db) { + return false; +} + +function exact_value($val) { + global $connection; + return $connection->quote($val); +} + +$driver = "sqlite"; +$comments_support = false; +$types = array("text" => 0, "numeric" => 0, "integer" => 0, "real" => 0, "blob" => 0); +$structured_types = array_keys($types); +$unsigned = array(); Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2009-10-19 05:11:45 UTC (rev 1198) +++ branches/sqlite/adminer/include/adminer.inc.php 2009-10-19 06:40:41 UTC (rev 1199) @@ -33,6 +33,7 @@ function loginForm($username) { ?> <table cellspacing="0"> +<tr><th><?php echo lang('Driver'); ?><td><?php echo html_select("driver", array("" => "MySQL", "sqlite2" => "SQLite 2", "sqlite" => "SQLite 3"), $_COOKIE["adminer_driver"]); //! detect available drivers ?></tr> <tr><th><?php echo lang('Server'); ?><td><input name="server" value="<?php echo h($_GET["server"]); ?>"> <tr><th><?php echo lang('Username'); ?><td><input name="username" value="<?php echo h($username); ?>"> <tr><th><?php echo lang('Password'); ?><td><input type="password" name="password"> Modified: branches/sqlite/adminer/include/bootstrap.inc.php =================================================================== --- branches/sqlite/adminer/include/bootstrap.inc.php 2009-10-19 05:11:45 UTC (rev 1198) +++ branches/sqlite/adminer/include/bootstrap.inc.php 2009-10-19 06:40:41 UTC (rev 1199) @@ -40,7 +40,7 @@ } if (!isset($_SERVER["REQUEST_URI"])) { - $_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"] . (strlen($_SERVER["QUERY_STRING"]) ? "?$_SERVER[QUERY_STRING]" : ""); + $_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"] . (strlen($_SERVER["QUERY_STRING"]) ? "?$_SERVER[QUERY_STRING]" : ""); // IIS 5 compatibility } if (!ini_get("session.auto_start")) { @@ -86,7 +86,11 @@ include "./include/adminer.inc.php"; include "../adminer/include/design.inc.php"; include "../adminer/include/pdo.inc.php"; -include "../adminer/include/sqlite.inc.php"; +if (isset($_GET["sqlite"])) { + include "../adminer/drivers/sqlite.inc.php"; +} else { + include "../adminer/drivers/mysql.inc.php"; +} include "../adminer/include/auth.inc.php"; include "./include/connect.inc.php"; include "./include/editing.inc.php"; Modified: branches/sqlite/adminer/include/connect.inc.php =================================================================== --- branches/sqlite/adminer/include/connect.inc.php 2009-10-19 05:11:45 UTC (rev 1198) +++ branches/sqlite/adminer/include/connect.inc.php 2009-10-19 06:40:41 UTC (rev 1199) @@ -5,6 +5,7 @@ page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), false); } else { page_header(lang('Select database'), "", null); + echo "<p><a href='" . h(ME) . "database='>" . lang('Create new database') . "</a>\n"; db_info(); } page_footer("db"); Deleted: branches/sqlite/adminer/include/mysql.inc.php =================================================================== --- branches/sqlite/adminer/include/mysql.inc.php 2009-10-19 05:11:45 UTC (rev 1198) +++ branches/sqlite/adminer/include/mysql.inc.php 2009-10-19 06:40:41 UTC (rev 1199) @@ -1,398 +0,0 @@ -<?php -// MySQLi supports everything, MySQL doesn't support multiple result sets, PDO_MySQL doesn't support orgtable -if (extension_loaded("mysqli")) { - class Min_DB extends MySQLi { - var $extension = "MySQLi"; - - function Min_DB() { - parent::init(); - } - - function connect($server, $username, $password) { - list($host, $port) = explode(":", $server, 2); // part after : is used for port or socket - return @$this->real_connect( - (strlen($server) ? $host : ini_get("mysqli.default_host")), - (strlen("$server$username") ? $username : ini_get("mysqli.default_user")), - (strlen("$server$username$password") ? $password : ini_get("mysqli.default_pw")), - null, - (is_numeric($port) ? $port : ini_get("mysqli.default_port")), - (!is_numeric($port) ? $port : null) - ); - } - - function result($result, $field = 0) { - if (!$result) { - return false; - } - $row = $result->fetch_array(); - return $row[$field]; - } - - function quote($string) { - return "'" . $this->escape_string($string) . "'"; - } - } - -} elseif (extension_loaded("mysql")) { - class Min_DB { - var $extension = "MySQL", $_link, $_result, $server_info, $affected_rows, $error; - - function connect($server, $username, $password) { - $this->_link = @mysql_connect( - (strlen($server) ? $server : ini_get("mysql.default_host")), - (strlen("$server$username") ? $username : ini_get("mysql.default_user")), - (strlen("$server$username$password") ? $password : ini_get("mysql.default_password")), - true, - 131072 // CLIENT_MULTI_RESULTS for CALL - ); - if ($this->_link) { - $this->server_info = mysql_get_server_info($this->_link); - } else { - $this->error = mysql_error(); - } - return (bool) $this->_link; - } - - function quote($string) { - return "'" . mysql_real_escape_string($string, $this->_link) . "'"; - } - - function select_db($database) { - return mysql_select_db($database, $this->_link); - } - - function query($query, $unbuffered = false) { - $result = @($unbuffered ? mysql_unbuffered_query($query, $this->_link) : mysql_query($query, $this->_link)); // @ - mute mysql.trace_mode - if (!$result) { - $this->error = mysql_error($this->_link); - return false; - } elseif ($result === true) { - $this->affected_rows = mysql_affected_rows($this->_link); - return true; - } - return new Min_Result($result); - } - - function multi_query($query) { - return $this->_result = $this->query($query); - } - - function store_result() { - return $this->_result; - } - - function next_result() { - // MySQL extension doesn't support multiple results - return false; - } - - function result($result, $field = 0) { - if (!$result) { - return false; - } - return mysql_result($result->_result, 0, $field); - } - } - - class Min_Result { - var $_result, $_offset = 0, $num_rows; - - function Min_Result($result) { - $this->_result = $result; - $this->num_rows = mysql_num_rows($result); - } - - function fetch_assoc() { - return mysql_fetch_assoc($this->_result); - } - - function fetch_row() { - return mysql_fetch_row($this->_result); - } - - function fetch_field() { - $row = mysql_fetch_field($this->_result, $this->_offset++); - $row->orgtable = $row->table; - $row->orgname = $row->name; - $row->charsetnr = ($row->blob ? 63 : 0); - return $row; - } - - function __destruct() { - mysql_free_result($this->_result); //! is not called in PHP 4 which is a problem with mysql.trace_mode - } - } - -} elseif (extension_loaded("pdo_mysql")) { - class Min_DB extends Min_PDO { - var $extension = "PDO_MySQL"; - - function connect($server, $username, $password) { - $this->dsn("mysql:host=" . str_replace(":", ";unix_socket=", preg_replace('~:([0-9])~', ';port=\\1', $server)), $username, $password); - $this->server_info = $this->result($this->query("SELECT VERSION()")); - return true; - } - - function query($query, $unbuffered = false) { - $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, !$unbuffered); - return parent::query($query, $unbuffered); - } - } - -} else { - page_header(lang('No MySQL extension'), lang('None of the supported PHP extensions (%s) are available.', 'MySQLi, MySQL, PDO_MySQL'), null); - page_footer("auth"); - exit; -} - -/** Connect to the database -* @return mixed Min_DB or string for error -*/ -function connect() { - global $adminer; - $connection = new Min_DB; - $credentials = $adminer->credentials(); - if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) { - $connection->query("SET SQL_QUOTE_SHOW_CREATE=1"); - $connection->query("SET NAMES utf8"); - return $connection; - } - return $connection->error; -} - -/** Get cached list of databases -* @param bool -* @return array -*/ -function get_databases($flush = true) { - // SHOW DATABASES can take a very long time so it is cached - $return = &$_SESSION["databases"][$_GET["server"]]; - if (!isset($return)) { - $return = get_vals("SHOW DATABASES"); - if ($flush) { - ob_flush(); - flush(); - } - } - return $return; -} - -/**Get supported engines -* @return array -*/ -function engines() { - global $connection; - $return = array(); - $result = $connection->query("SHOW ENGINES"); - while ($row = $result->fetch_assoc()) { - if (ereg("YES|DEFAULT", $row["Support"])) { - $return[] = $row["Engine"]; - } - } - return $return; -} - -/** Print links and information about the database -* @return null -*/ -function db_info() { - global $connection; - foreach (array( - 'database' => lang('Create new database'), - 'privileges' => lang('Privileges'), - 'processlist' => lang('Process list'), - 'variables' => lang('Variables'), - ) as $key => $val) { - echo "<p><a href='" . h(ME) . "$key='>$val</a>\n"; - } - echo "<p>" . lang('%s version: %s through PHP extension %s', "MySQL", "<b" . ($connection->server_info < 4.1 ? " class='binary'" : "") . ">$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; - echo "<p>" . lang('Logged as: %s', "<b>" . h($connection->result($connection->query("SELECT USER()"))) . "</b>") . "\n"; -} - -/** Get tables list -* @return array -*/ -function tables_list() { - return get_vals("SHOW TABLES"); -} - -/** Get table status -* @param string -* @return array -*/ -function table_status($name = "") { - global $connection; - $return = array(); - $result = $connection->query("SHOW TABLE STATUS" . (strlen($name) ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); - while ($row = $result->fetch_assoc()) { - if ($row["Engine"] == "InnoDB") { - // ignore internal comment, unnecessary since MySQL 5.1.21 - $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); - } - $return[$row["Name"]] = $row; - } - return (strlen($name) ? $return[$name] : $return); -} - -/** -* @param array result of table_status -* @return bool -*/ -function fk_support($table_status) { - return ($table_status["Engine"] == "InnoDB"); -} - -/** Get status of referencable tables -* @return array -*/ -function table_status_referencable() { - $return = array(); - foreach (table_status() as $name => $row) { - if ($row["Engine"] == "InnoDB") { - $return[$name] = $row; - } - } - return $return; -} - -/** Get information about fields -* @param string -* @return array array($name => array("field" => , "full_type" => , "type" => , "length" => , "unsigned" => , "default" => , "null" => , "auto_increment" => , "on_update" => , "collation" => , "privileges" => , "comment" => , "primary" => )) -*/ -function fields($table) { - global $connection; - $return = array(); - $result = $connection->query("SHOW FULL COLUMNS FROM " . idf_escape($table)); - if ($result) { - while ($row = $result->fetch_assoc()) { - preg_match('~^([^( ]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match); - $return[$row["Field"]] = array( - "field" => $row["Field"], - "full_type" => $row["Type"], - "type" => $match[1], - "length" => $match[2], - "unsigned" => ltrim($match[3] . $match[4]), - "default" => (strlen($row["Default"]) || ereg("char", $match[1]) ? $row["Default"] : null), - "null" => ($row["Null"] == "YES"), - "auto_increment" => ($row["Extra"] == "auto_increment"), - "on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23 - "collation" => $row["Collation"], - "privileges" => array_flip(explode(",", $row["Privileges"])), - "comment" => $row["Comment"], - "primary" => ($row["Key"] == "PRI"), - ); - } - } - return $return; -} - -/** Get table indexes -* @param string -* @param string Min_DB to use -* @return array array($key_name => array("type" => , "columns" => array(), "lengths" => array())) -*/ -function indexes($table, $connection2 = null) { - global $connection; - if (!is_object($connection2)) { // use the main connection if the separate connection is unavailable - $connection2 = $connection; - } - $return = array(); - $result = $connection2->query("SHOW INDEX FROM " . idf_escape($table)); - if ($result) { - while ($row = $result->fetch_assoc()) { - $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE"))); - $return[$row["Key_name"]]["columns"][$row["Seq_in_index"]] = $row["Column_name"]; - $return[$row["Key_name"]]["lengths"][$row["Seq_in_index"]] = $row["Sub_part"]; - } - } - return $return; -} - -/** Get foreign keys in table -* @param string -* @return array array($name => array("db" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => )) -*/ -function foreign_keys($table) { - global $connection, $on_actions; - static $pattern = '(?:[^`]|``)+'; - $return = array(); - $result = $connection->query("SHOW CREATE TABLE " . idf_escape($table)); - if ($result) { - $create_table = $connection->result($result, 1); - preg_match_all("~CONSTRAINT `($pattern)` FOREIGN KEY \\(((?:`$pattern`,? ?)+)\\) REFERENCES `($pattern)`(?:\\.`($pattern)`)? \\(((?:`$pattern`,? ?)+)\\)(?: ON DELETE (" . implode("|", $on_actions) . "))?(?: ON UPDATE (" . implode("|", $on_actions) . "))?~", $create_table, $matches, PREG_SET_ORDER); - foreach ($matches as $match) { - preg_match_all("~`($pattern)`~", $match[2], $source); - preg_match_all("~`($pattern)`~", $match[5], $target); - $return[$match[1]] = array( - "db" => idf_unescape(strlen($match[4]) ? $match[3] : $match[4]), - "table" => idf_unescape(strlen($match[4]) ? $match[4] : $match[3]), - "source" => array_map('idf_unescape', $source[1]), - "target" => array_map('idf_unescape', $target[1]), - "on_delete" => $match[6], - "on_update" => $match[7], - ); - } - } - return $return; -} - -/** Get view SELECT -* @param string -* @return array array("select" => ) -*/ -function view($name) { - global $connection; - return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result($connection->query("SHOW CREATE VIEW " . idf_escape($name)), 1))); -} - -/** Get sorted grouped list of collations -* @return array -*/ -function collations() { - global $connection; - $return = array(); - $result = $connection->query("SHOW COLLATION"); - while ($row = $result->fetch_assoc()) { - $return[$row["Charset"]][] = $row["Collation"]; - } - ksort($return); - foreach ($return as $key => $val) { - sort($return[$key]); - } - return $return; -} - -/** Find out if database is information_schema -* @param string -* @return bool -*/ -function information_schema($db) { - global $connection; - return ($connection->server_info >= 5 && $db == "information_schema"); -} - -/** Return expression for binary comparison -* @param string -* @return string -*/ -function exact_value($val) { - global $connection; - return "BINARY " . $connection->quote($val); -} - -$driver = "sqlite"; -$comments_support = true; -// value means maximum unsigned length -$types = array(); -$structured_types = array(); -foreach (array( - lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "float" => 12, "double" => 21, "decimal" => 66), - 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("binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), - lang('Lists') => array("enum" => 65535, "set" => 64), -) as $key => $val) { - $types += $val; - $structured_types[$key] = array_keys($val); -} -$unsigned = array("unsigned", "zerofill", "unsigned zerofill"); Deleted: branches/sqlite/adminer/include/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/include/sqlite.inc.php 2009-10-19 05:11:45 UTC (rev 1198) +++ branches/sqlite/adminer/include/sqlite.inc.php 2009-10-19 06:40:41 UTC (rev 1199) @@ -1,330 +0,0 @@ -<?php -if (extension_loaded($_GET["sqlite_version"] == 2 ? "sqlite" : "sqlite3")) { - if ($_GET["sqlite_version"] == 2) { //! detect from file - - class Min_SQLite extends SQLiteDatabase { - var $extension = "SQLite"; - - function __construct() { - $this->server_info = sqlite_libversion(); - } - - function open($filename) { - parent::__construct($filename); - } - - function query($query) { - $result = @parent::query($query, SQLITE_BOTH, $error); - if (!$result) { - $this->error = $error; - return false; - } elseif ($result === true) { - $this->affected_rows = $this->changes(); - return true; - } - return new Min_Result($result); - } - - function quote($string) { - return "'" . sqlite_escape_string($string) . "'"; - } - - function result($result, $field = 0) { - if (!$result) { - return false; - } - $row = $result->_result->fetch(); - return $row[$field]; - } - } - - class Min_Result { - var $_result, $num_rows; - - function __construct($result) { - $this->_result = $result; - $this->num_rows = $result->numRows(); - } - - function fetch_assoc() { - return $this->_result->fetch(SQLITE_ASSOC); - } - - function fetch_row() { - return $this->_result->fetch(SQLITE_NUM); - } - - function fetch_field() { - static $column = -1; - $column++; - return (object) array( - "name" => $this->fieldName($column), - //! type, orgtable, charsetnr - ); - } - - } - - } else { - - class Min_SQLite extends SQLite3 { - var $extension = "SQLite3"; - - function __construct() { - $version = $this->version(); - $this->server_info = $version["versionString"]; - } - - function open($filename) { - parent::__construct($filename); - } - - function query($query) { - $result = @parent::query($query); - if (!$result) { - $this->error = $this->lastErrorMsg(); - return false; - } elseif ($result->numColumns()) { - return new Min_Result($result); - } - $this->affected_rows = $this->changes(); - return true; - } - - function quote($string) { - return "'" . $this->escapeString($string) . "'"; - } - - function result($result, $field = 0) { - if (!$result) { - return false; - } - $row = $result->_result->fetchArray(); - return $row[$field]; - } - } - - class Min_Result { - var $_result, $num_rows; - - function __construct($result) { - $this->_result = $result; - $this->num_rows = 1; //! - } - - function fetch_assoc() { - return $this->_result->fetchArray(SQLITE3_ASSOC); - } - - function fetch_row() { - return $this->_result->fetchArray(SQLITE3_NUM); - } - - function fetch_field() { - static $column = -1; - $column++; - return (object) array( - "name" => $this->_result->columnName($column), - "type" => $this->_result->columnType($column), - //! orgtable, charsetnr - ); - } - - function __desctruct() { - return $this->_result->finalize(); - } - } - - } - - class Min_DB extends Min_SQLite { - - function select_db($filename) { - static $connected = false; - if ($connected) { - return true; - } - set_exception_handler('connect_error'); // try/catch is not compatible with PHP 4 - $this->open($filename); - $connected = true; - restore_exception_handler(); - return true; - } - - function multi_query($query) { - return $this->_result = $this->query($query); - } - - function store_result() { - return $this->_result; - } - - function next_result() { - return false; - } - } - -} elseif (extension_loaded("pdo_sqlite")) { - class Min_DB extends Min_PDO { - var $extension = "PDO_SQLite"; - - function select_db($filename) { - static $connected = false; - if ($connected) { - return true; - } - set_exception_handler('connect_error'); // try/catch is not compatible with PHP 4 - $connected = true; - $this->__construct(($_GET["sqlite_version"] == 2 ? "sqlite2" : "sqlite") . ":$filename"); - restore_exception_handler(); - $this->setAttribute(13, array('Min_PDOStatement')); // PDO::ATTR_STATEMENT_CLASS - $this->server_info = $this->result($this->query("SELECT sqlite_version()")); - return true; - } - } - -} else { - page_header(lang('No MySQL extension'), lang('None of the supported PHP extensions (%s) are available.', 'SQLite, SQLite3, PDO_SQLite'), null); - page_footer("auth"); - exit; -} - -function connect() { - static $connected = false; //! EXPLAIN doesn't work with second connection - if ($connected) { - return false; - } - $connected = true; - return new Min_DB; -} - -function get_databases() { - return array(); -} - -function engines() { - return array(); -} - -function db_info() { - global $connection; - foreach (array( - 'database' => lang('Create new database'), - ) as $key => $val) { - echo "<p><a href='" . h(ME) . "$key='>$val</a>\n"; - } - echo "<p>" . lang('%s version: %s through PHP extension %s', "SQLite", "<b>$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; -} - -function tables_list() { - return get_vals("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')", 1); -} - -function table_status($name = "") { - global $connection; - $return = array(); - $result = $connection->query("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')" . (strlen($name) ? " AND name = " . $connection->quote($name) : "")); - while ($row = $result->fetch_assoc()) { - $return[$row["name"]] = array( - "Name" => $row["name"], - "Rows" => ($row["type"] == "table" ? $connection->result($connection->query("SELECT COUNT(*) FROM " . idf_escape($row["name"]))) : ""), - ); - } - return (strlen($name) ? $return[$name] : $return); -} - -function fk_support($table_status) { - return true; -} - -function table_status_referencable() { - return table_status(); -} - -function fields($table) { - global $connection; - $return = array(); - $result = $connection->query("PRAGMA table_info(" . idf_escape($table) . ")"); - while ($row = $result->fetch_assoc()) { - $type = strtolower($row["type"]); - $return[$row["name"]] = array( - "field" => $row["name"], - "type" => $type, - "full_type" => $type, - "default" => $row["dflt_value"], - "null" => !$row["notnull"], - "auto_increment" => false, //! - "collation" => null, //! - "privileges" => array("select" => 1, "insert" => 1, "update" => 1), - "primary" => $row["pk"], - ); - } - return $return; -} - -function indexes($table, $connection2 = null) { - global $connection; - $return = array(); - $primary = array(); - foreach (fields($table) as $field) { - if ($field["primary"]) { - $primary[] = $field["field"]; - } - } - if ($primary) { - $return[""] = array("type" => "PRIMARY", "columns" => $primary, "lengths" => array()); - } - $result = $connection->query("PRAGMA index_list(" . idf_escape($table) . ")"); - if (is_object($result)) { - while ($row = $result->fetch_assoc()) { - $return[$row["name"]]["type"] = ($row["unique"] ? "UNIQUE" : "INDEX"); - $return[$row["name"]]["lengths"] = array(); - $result1 = $connection->query("PRAGMA index_info(" . idf_escape($row["name"]) . ")"); - while ($row1 = $result1->fetch_assoc()) { - $return[$row["name"]]["columns"][$row1["seqno"]] = $row1["name"]; - } - } - } - return $return; -} - -function foreign_keys($table) { - global $connection; - $return = array(); - $result = $connection->query("PRAGMA foreign_key_list(" . idf_escape($table) . ")"); - if (is_object($result)) { - while ($row = $result->fetch_assoc()) { - $foreign_key = &$return[$row["id"]]; - if (!$foreign_key) { - $foreign_key = $row; - } - $foreign_key["source"][] = $row["from"]; - $foreign_key["target"][] = $row["to"]; - } - } - return $return; -} - -function view($name) { - global $connection; - return array("select" => preg_replace('~^(?:[^`]+|`[^`]*`)* AS ~iU', '', $connection->result($connection->query("SELECT sql FROM sqlite_master WHERE name = " . $connection->quote($name)), 0))); -} - -function collations() { - return get_vals("PRAGMA collation_list", 1); -} - -function information_schema($db) { - return false; -} - -function exact_value($val) { - global $connection; - return $connection->quote($val); -} - -$driver = "sqlite"; -$comments_support = false; -$types = array("text" => 0, "numeric" => 0, "integer" => 0, "real" => 0, "blob" => 0); -$structured_types = array_keys($types); -$unsigned = array(); Modified: branches/sqlite/adminer/lang/cs.inc.php =================================================================== --- branches/sqlite/adminer/lang/cs.inc.php 2009-10-19 05:11:45 UTC (rev 1198) +++ branches/sqlite/adminer/lang/cs.inc.php 2009-10-19 06:40:41 UTC (rev 1199) @@ -225,4 +225,6 @@ 'Editor' => 'Editor', 'Webserver file %s' => 'Soubor %s na webovém serveru', 'File does not exist.' => 'Soubor neexistuje.', + 'Attachments' => 'Přílohy', + 'Driver' => 'Ovladač', ); Modified: branches/sqlite/compile.php =================================================================== --- branches/sqlite/compile.php 2009-10-19 05:11:45 UTC (rev 1198) +++ branches/sqlite/compile.php 2009-10-19 06:40:41 UTC (rev 1199) @@ -157,6 +157,12 @@ return call_user_func($match[2], file_get_contents(dirname(__FILE__) . "/$project/$match[1]")); } +$driver = ""; +if (file_exists(dirname(__FILE__) . "/adminer/drivers/" . $_SERVER["argv"][1] . ".inc.php")) { + $driver = $_SERVER["argv"][1]; + array_shift($_SERVER["argv"]); +} + unset($_COOKIE["adminer_lang"]); $_SESSION["lang"] = $_SERVER["argv"][1]; // Adminer functions read language from session if (isset($_SESSION["lang"])) { @@ -173,7 +179,13 @@ $file = file_get_contents(dirname(__FILE__) . "/$project/index.php"); $file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file); $file = str_replace('include "../adminer/include/coverage.inc.php";', '', $file); + if ($driver) { + $file = preg_replace("(" . preg_quote('if (isset($_GET["sqlite"])) {') . ".*\n\\}\n", 'include "../adminer/drivers/' . $driver . '.inc.php";', $file); + } $file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file); // bootstrap.inc.php + if ($driver) { + $file = preg_replace("(" . preg_quote("<tr><th><?php echo lang('Driver'); ?>") . ".*\n)", '', $file); + } $file = preg_replace_callback("~lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])~s", 'lang_ids', $file); $file = preg_replace_callback('~\\b(include|require) "([^"]*\\$LANG.inc.php)";~', 'put_file_lang', $file); if ($_SESSION["lang"]) { Modified: branches/sqlite/editor/include/adminer.inc.php =================================================================== --- branches/sqlite/editor/include/adminer.inc.php 2009-10-19 05:11:45 UTC (rev 1198) +++ branches/sqlite/editor/include/adminer.inc.php 2009-10-19 06:40:41 UTC (rev 1199) @@ -228,7 +228,7 @@ echo lang('Subject') . ": <input name='email_subject' value='" . h($_POST["email_subject"]) . "'>\n"; echo "<p><textarea name='email_message' rows='15' cols='75'>" . h($_POST["email_message"] . ($_POST["email_append"] ? '{$' . "$_POST[email_addition]}" : "")) . "</textarea><br>\n"; echo html_select("email_addition", $columns, $_POST["email_addition"]) . "<input type='submit' name='email_append' value='" . lang('Insert') . "'>\n"; //! JavaScript - echo "<p><input type='file' name='email_files[]' onchange=\"var el = this.cloneNode(true); el.value = ''; this.parentNode.appendChild(el); this.onchange = function () { };\">"; + echo "<p>" . lang('Attachments') . ": <input type='file' name='email_files[]' onchange=\"var el = this.cloneNode(true); el.value = ''; this.parentNode.appendChild(el); this.onchange = function () { };\">"; echo "<p>" . (count($emailFields) == 1 ? '<input type="hidden" name="email_field" value="' . h(key($emailFields)) . '">' : html_select("email_field", $emailFields)); echo "<input type='submit' name='email' value='" . lang('Send') . "' onclick=\"return this.form['delete'].onclick();\">\n"; echo "</div></fieldset>\n"; Modified: branches/sqlite/lang.php =================================================================== --- branches/sqlite/lang.php 2009-10-19 05:11:45 UTC (rev 1198) +++ branches/sqlite/lang.php 2009-10-19 06:40:41 UTC (rev 1199) @@ -14,6 +14,7 @@ foreach (array_merge( glob(dirname(__FILE__) . "/adminer/*.php"), glob(dirname(__FILE__) . "/adminer/include/*.php"), + glob(dirname(__FILE__) . "/adminer/drivers/*.php"), glob(dirname(__FILE__) . "/editor/*.php"), glob(dirname(__FILE__) . "/editor/include/*.php") ) as $filename) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2009-10-21 13:13:05
|
Revision: 1206 http://adminer.svn.sourceforge.net/adminer/?rev=1206&view=rev Author: jakubvrana Date: 2009-10-21 13:12:57 +0000 (Wed, 21 Oct 2009) Log Message: ----------- Prepare PgSQL Modified Paths: -------------- branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/lang/cs.inc.php branches/sqlite/adminer/lang/de.inc.php branches/sqlite/adminer/lang/es.inc.php branches/sqlite/adminer/lang/et.inc.php branches/sqlite/adminer/lang/fr.inc.php branches/sqlite/adminer/lang/it.inc.php branches/sqlite/adminer/lang/nl.inc.php branches/sqlite/adminer/lang/ru.inc.php branches/sqlite/adminer/lang/sk.inc.php branches/sqlite/adminer/lang/zh-tw.inc.php branches/sqlite/adminer/lang/zh.inc.php branches/sqlite/compile.php Added Paths: ----------- branches/sqlite/adminer/drivers/pgsql.inc.php Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -140,7 +140,7 @@ } } else { - page_header(lang('No MySQL extension'), lang('None of the supported PHP extensions (%s) are available.', 'MySQLi, MySQL, PDO_MySQL'), null); + page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', 'MySQLi, MySQL, PDO_MySQL'), null); page_footer("auth"); exit; } @@ -379,7 +379,7 @@ return "BINARY " . $connection->quote($val); } -$driver = "sqlite"; +$driver = "sql"; $comments_support = true; // value means maximum unsigned length $types = array(); Added: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php (rev 0) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -0,0 +1,278 @@ +<?php +if (extension_loaded("pgsql")) { + class Min_DB { + var $extension = "PgSQL", $_link, $_result, $server_info, $affected_rows, $error; + + function connect($server, $username, $password) { + $this->_link = @pg_connect("host=" . str_replace(":", " port=", $server)) . " user=$username password=$password"); //! escaping + if ($this->_link) { + $version = pg_version($this->_link); + $this->server_info = $version["server_version"]; + } else { + $this->error = pg_last_error(); + } + return (bool) $this->_link; + } + + function quote($string) { + return "'" . pg_escape_string($this->_link, $string) . "'"; //! bytea + } + + function select_db($database) { + //! reconnect or query USE + } + + function query($query, $unbuffered = false) { + $result = pg_query($this->_link, $query); + if (!$result) { + $this->error = pg_last_error($this->_link); + return false; + } elseif (!pg_num_fields($result)) { + $this->affected_rows = pg_affected_rows($result); + return true; + } + return new Min_Result($result); + } + + function multi_query($query) { + return $this->_result = $this->query($query); + } + + function store_result() { + return $this->_result; + } + + function next_result() { + // PgSQL extension doesn't support multiple results + return false; + } + + function result($result, $field = 0) { + if (!$result) { + return false; + } + return pg_fetch_result($result->_result, 0, $field); + } + } + + class Min_Result { + var $_result, $_offset = 0, $num_rows; + + function Min_Result($result) { + $this->_result = $result; + $this->num_rows = pg_num_rows($result); + } + + function fetch_assoc() { + return pg_fetch_assoc($this->_result); + } + + function fetch_row() { + return pg_fetch_row($this->_result); + } + + function fetch_field() { + static $column = -1; + $column++; + $row = new stdClass; + $row->orgtable = pg_field_table($this->_result, $column); + $row->name = pg_field_name($this->_result, $column); + $row->orgname = $row->name; + $row->type = pg_field_type($this->_result, $column); + $row->charsetnr = ($row->type == "bytea" ? 63 : 0); + return $row; + } + + function __destruct() { + pg_free_result($this->_result); + } + } + +} elseif (extension_loaded("pdo_pgsql")) { + class Min_DB extends Min_PDO { + var $extension = "PDO_PgSQL"; + + function connect($server, $username, $password) { + $this->dsn("pgsql:host=" . str_replace(":", " port=", $server)), $username, $password); + $this->server_info = $this->result($this->query("SHOW SERVER_VERSION")); + return true; + } + } + +} else { + page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', 'PgSQL, PDO_PgSQL'), null); + page_footer("auth"); + exit; +} + +function connect() { + global $adminer; + $connection = new Min_DB; + $credentials = $adminer->credentials(); + if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) { + pg_set_client_encoding($connection, "UTF8"); + return $connection; + } + return $connection->error; +} + +function get_databases($flush = true) { + $return = &$_SESSION["databases"][$_GET["server"]]; + if (!isset($return)) { + $return = get_vals("SELECT datname FROM pg_database"); + if ($flush) { + ob_flush(); + flush(); + } + } + return $return; +} + +function engines() { + return array(); +} + +function db_info() { + global $connection; + echo "<p>" . lang('%s version: %s through PHP extension %s', "PostgreSQL", "<b>$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; +} + +function tables_list() { + global $connection; + return get_vals("SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema = " . $connection->quote(DB)); +} + +function table_status($name = "") { //! + global $connection; + $return = array(); + $result = $connection->query("SHOW TABLE STATUS" . (strlen($name) ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); + while ($row = $result->fetch_assoc()) { + if ($row["Engine"] == "InnoDB") { + // ignore internal comment, unnecessary since MySQL 5.1.21 + $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); + } + $return[$row["Name"]] = $row; + } + return (strlen($name) ? $return[$name] : $return); +} + +function fk_support($table_status) { + return true; +} + +function table_status_referencable() { + return table_status(); +} + +function fields($table) { //! + global $connection; + $return = array(); + $result = $connection->query("SHOW FULL COLUMNS FROM " . idf_escape($table)); + if ($result) { + while ($row = $result->fetch_assoc()) { + preg_match('~^([^( ]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match); + $return[$row["Field"]] = array( + "field" => $row["Field"], + "full_type" => $row["Type"], + "type" => $match[1], + "length" => $match[2], + "unsigned" => ltrim($match[3] . $match[4]), + "default" => (strlen($row["Default"]) || ereg("char", $match[1]) ? $row["Default"] : null), + "null" => ($row["Null"] == "YES"), + "auto_increment" => ($row["Extra"] == "auto_increment"), + "on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23 + "collation" => $row["Collation"], + "privileges" => array_flip(explode(",", $row["Privileges"])), + "comment" => $row["Comment"], + "primary" => ($row["Key"] == "PRI"), + ); + } + } + return $return; +} + +function indexes($table, $connection2 = null) { //! + global $connection; + if (!is_object($connection2)) { // use the main connection if the separate connection is unavailable + $connection2 = $connection; + } + $return = array(); + $result = $connection2->query("SHOW INDEX FROM " . idf_escape($table)); + if ($result) { + while ($row = $result->fetch_assoc()) { + $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE"))); + $return[$row["Key_name"]]["columns"][$row["Seq_in_index"]] = $row["Column_name"]; + $return[$row["Key_name"]]["lengths"][$row["Seq_in_index"]] = $row["Sub_part"]; + } + } + return $return; +} + +function foreign_keys($table) { //! + global $connection, $on_actions; + static $pattern = '(?:[^`]|``)+'; + $return = array(); + $result = $connection->query("SHOW CREATE TABLE " . idf_escape($table)); + if ($result) { + $create_table = $connection->result($result, 1); + preg_match_all("~CONSTRAINT `($pattern)` FOREIGN KEY \\(((?:`$pattern`,? ?)+)\\) REFERENCES `($pattern)`(?:\\.`($pattern)`)? \\(((?:`$pattern`,? ?)+)\\)(?: ON DELETE (" . implode("|", $on_actions) . "))?(?: ON UPDATE (" . implode("|", $on_actions) . "))?~", $create_table, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + preg_match_all("~`($pattern)`~", $match[2], $source); + preg_match_all("~`($pattern)`~", $match[5], $target); + $return[$match[1]] = array( + "db" => idf_unescape(strlen($match[4]) ? $match[3] : $match[4]), + "table" => idf_unescape(strlen($match[4]) ? $match[4] : $match[3]), + "source" => array_map('idf_unescape', $source[1]), + "target" => array_map('idf_unescape', $target[1]), + "on_delete" => $match[6], + "on_update" => $match[7], + ); + } + } + return $return; +} + +function view($name) { + global $connection; + return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result($connection->query("SHOW CREATE VIEW " . idf_escape($name)), 1))); +} + +function collations() { + global $connection; + $return = array(); + $result = $connection->query("SHOW COLLATION"); + while ($row = $result->fetch_assoc()) { + $return[$row["Charset"]][] = $row["Collation"]; + } + ksort($return); + foreach ($return as $key => $val) { + sort($return[$key]); + } + return $return; +} + +function information_schema($db) { + return ($db == "information_schema"); +} + +function exact_value($val) { + global $connection; + return "BINARY " . $connection->quote($val); +} + +$driver = "pgsql"; +$comments_support = true; +// value means maximum unsigned length +$types = array(); +$structured_types = array(); +foreach (array( + lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "float" => 12, "double" => 21, "decimal" => 66), + 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("binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), + lang('Lists') => array("enum" => 65535, "set" => 64), +) as $key => $val) { + $types += $val; + $structured_types[$key] = array_keys($val); +} +$unsigned = array("unsigned", "zerofill", "unsigned zerofill"); Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -184,7 +184,7 @@ } } else { - page_header(lang('No MySQL extension'), lang('None of the supported PHP extensions (%s) are available.', 'SQLite, SQLite3, PDO_SQLite'), null); + page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', 'SQLite, SQLite3, PDO_SQLite'), null); page_footer("auth"); exit; } Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/include/adminer.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -33,7 +33,7 @@ function loginForm($username) { ?> <table cellspacing="0"> -<tr><th><?php echo lang('Driver'); ?><td><?php echo html_select("driver", array("" => "MySQL", "sqlite2" => "SQLite 2", "sqlite" => "SQLite 3"), $_COOKIE["adminer_driver"]); //! detect available drivers ?></tr> +<tr><th><?php echo lang('Driver'); ?><td><?php echo html_select("driver", array("" => "MySQL", "sqlite" => "SQLite 3", "sqlite2" => "SQLite 2", "pgsql" => "PostgreSQL"), $_COOKIE["adminer_driver"]); //! detect available drivers ?></tr> <tr><th><?php echo lang('Server'); ?><td><input name="server" value="<?php echo h($_GET["server"]); ?>"> <tr><th><?php echo lang('Username'); ?><td><input name="username" value="<?php echo h($username); ?>"> <tr><th><?php echo lang('Password'); ?><td><input type="password" name="password"> Modified: branches/sqlite/adminer/lang/cs.inc.php =================================================================== --- branches/sqlite/adminer/lang/cs.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/lang/cs.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -79,7 +79,7 @@ 'File uploads are disabled.' => 'Nahrávání souborů není povoleno.', 'Routine has been called, %d row(s) affected.' => array('Procedura byla zavolána, byl změněn %d záznam.', 'Procedura byla zavolána, byly změněny %d záznamy.', 'Procedura byla zavolána, bylo změněno %d záznamů.'), 'Call' => 'Zavolat', - 'No MySQL extension' => 'Žádná MySQL extenze', + 'No extension' => 'Žádná extenze', 'None of the supported PHP extensions (%s) are available.' => 'Není dostupná žádná z podporovaných PHP extenzí (%s).', 'Session support must be enabled.' => 'Session proměnné musí být povolené.', 'Session expired, please login again.' => 'Session vypršela, přihlašte se prosím znovu.', Modified: branches/sqlite/adminer/lang/de.inc.php =================================================================== --- branches/sqlite/adminer/lang/de.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/lang/de.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -79,7 +79,7 @@ 'File uploads are disabled.' => 'Importieren von Dateien abgeschaltet.', 'Routine has been called, %d row(s) affected.' => array('Kommando SQL ausgeführt, %d Datensatz betroffen.', 'Kommando SQL ausgeführt, %d Datensätze betroffen.'), 'Call' => 'Aufrufen', - 'No MySQL extension' => 'Keine MySQL-Erweiterungen installiert', + 'No extension' => 'Keine Erweiterungen installiert', 'None of the supported PHP extensions (%s) are available.' => 'Keine der unterstützten PHP-Erweiterungen (%s) ist vorhanden.', 'Session support must be enabled.' => 'Sitzungen müssen aktiviert sein.', 'Session expired, please login again.' => 'Sitzungsdauer abgelaufen, bitte erneut anmelden.', Modified: branches/sqlite/adminer/lang/es.inc.php =================================================================== --- branches/sqlite/adminer/lang/es.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/lang/es.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -79,7 +79,7 @@ 'File uploads are disabled.' => 'Importación de archivos deshablilitado.', 'Routine has been called, %d row(s) affected.' => array('Consulta ejecutada, %d registro afectado.', 'Consulta ejecutada, %d registros afectados.'), 'Call' => 'Llamar', - 'No MySQL extension' => 'No hay extension MySQL', + 'No extension' => 'No hay extension', 'None of the supported PHP extensions (%s) are available.' => 'Ninguna de las extensiones PHP soportadas (%s) está disponible.', 'Session support must be enabled.' => 'Deben estar habilitadas las sesiones.', 'Session expired, please login again.' => 'Sesión expirada, favor loguéese de nuevo.', Modified: branches/sqlite/adminer/lang/et.inc.php =================================================================== --- branches/sqlite/adminer/lang/et.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/lang/et.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -79,7 +79,7 @@ 'File uploads are disabled.' => 'Failide üleslaadimine on keelatud.', 'Routine has been called, %d row(s) affected.' => array('Protseduur täideti edukalt, mõjutatud ridu: %d.', 'Protseduur täideti edukalt, mõjutatud ridu: %d.'), 'Call' => 'Käivita', - 'No MySQL extension' => 'Ei leitud MySQL laiendust', + 'No extension' => 'Ei leitud laiendust', 'None of the supported PHP extensions (%s) are available.' => 'Serveris pole ühtegi toetatud PHP laiendustest (%s).', 'Session support must be enabled.' => 'Sessioonid peavad olema lubatud.', 'Session expired, please login again.' => 'Sessioon on aegunud, palun logige uuesti sisse.', Modified: branches/sqlite/adminer/lang/fr.inc.php =================================================================== --- branches/sqlite/adminer/lang/fr.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/lang/fr.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -79,7 +79,7 @@ 'File uploads are disabled.' => 'Importation de fichier désactivé.', 'Routine has been called, %d row(s) affected.' => array('Routine exécutée, %d ligne modifiée.', 'Routine exécutée, %d lignes modifiées.'), 'Call' => 'Appeler', - 'No MySQL extension' => 'Extension MySQL introuvable', + 'No extension' => 'Extension introuvable', 'None of the supported PHP extensions (%s) are available.' => 'Aucune des extensions PHP supportées (%s) n\'est disponible.', 'Session support must be enabled.' => 'Veuillez activer les sessions.', 'Session expired, please login again.' => 'Session expirée, veuillez vous authentifier à nouveau.', Modified: branches/sqlite/adminer/lang/it.inc.php =================================================================== --- branches/sqlite/adminer/lang/it.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/lang/it.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -79,7 +79,7 @@ 'File uploads are disabled.' => 'Caricamento file disabilitato.', 'Routine has been called, %d row(s) affected.' => array('Routine chiamata, %d riga interessata.', 'Routine chiamata, %d righe interessate.'), 'Call' => 'Chiama', - 'No MySQL extension' => 'Estensioni MySQL non presenti', + 'No extension' => 'Estensioni non presenti', 'None of the supported PHP extensions (%s) are available.' => 'Nessuna delle estensioni PHP supportate (%s) disponibile.', 'Session support must be enabled.' => 'Le sessioni devono essere abilitate.', 'Session expired, please login again.' => 'Sessione scaduta, autenticarsi di nuovo.', Modified: branches/sqlite/adminer/lang/nl.inc.php =================================================================== --- branches/sqlite/adminer/lang/nl.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/lang/nl.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -79,7 +79,7 @@ 'File uploads are disabled.' => 'Bestanden uploaden is uitgeschakeld.', 'Routine has been called, %d row(s) affected.' => array('Procedure uitgevoerd, %d rij geraakt.', 'Procedure uitgevoerd, %d rijen geraakt.'), 'Call' => 'Uitvoeren', - 'No MySQL extension' => 'Geen MySQL extensie', + 'No extension' => 'Geen extensie', 'None of the supported PHP extensions (%s) are available.' => 'Geen geldige PHP extensies beschikbaar (%s).', 'Session support must be enabled.' => 'Sessies moeten geactiveerd zijn.', 'Session expired, please login again.' => 'Uw sessie is verlopen. Gelieve opnieuw in te loggen.', Modified: branches/sqlite/adminer/lang/ru.inc.php =================================================================== --- branches/sqlite/adminer/lang/ru.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/lang/ru.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -79,7 +79,7 @@ 'File uploads are disabled.' => 'Загрузка файлов на сервер запрещена.', 'Routine has been called, %d row(s) affected.' => array('Была вызвана процедура, %d запись была изменена.', 'Была вызвана процедура, %d записи было изменено.', 'Была вызвана процедура, %d записей было изменено.'), 'Call' => 'Вызвать', - 'No MySQL extension' => 'Нет MySQL расширений', + 'No extension' => 'Нет расширений', 'None of the supported PHP extensions (%s) are available.' => 'Не доступно ни одного расширения из поддерживаемых (%s).', 'Session support must be enabled.' => 'Сессии должны быть включены.', 'Session expired, please login again.' => 'Срок действия сесси истек, нужно снова войти в систему.', Modified: branches/sqlite/adminer/lang/sk.inc.php =================================================================== --- branches/sqlite/adminer/lang/sk.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/lang/sk.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -79,7 +79,7 @@ 'File uploads are disabled.' => 'Nahrávánie súborov nie je povolené.', 'Routine has been called, %d row(s) affected.' => array('Procedúra bola zavolaná, bol zmenený %d záznam.', 'Procedúra bola zavolaná, boli zmenené %d záznamy.', 'Procedúra bola zavolaná, bolo zmenených %d záznamov.'), 'Call' => 'Zavolať', - 'No MySQL extension' => 'Žiadne MySQL rozšírenie', + 'No extension' => 'Žiadne rozšírenie', 'None of the supported PHP extensions (%s) are available.' => 'Nie je dostupné žiadne z podporovaných rozšírení (%s).', 'Session support must be enabled.' => 'Session premenné musia byť povolené.', 'Session expired, please login again.' => 'Session vypršala, prihláste sa prosím znova.', Modified: branches/sqlite/adminer/lang/zh-tw.inc.php =================================================================== --- branches/sqlite/adminer/lang/zh-tw.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/lang/zh-tw.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -79,7 +79,7 @@ 'File uploads are disabled.' => '檔案上傳被禁用。', 'Routine has been called, %d row(s) affected.' => '程序已被執行,%d行被影響', 'Call' => '呼叫', - 'No MySQL extension' => '沒有 MySQL 擴充模組', + 'No extension' => '沒有 擴充模組', 'None of the supported PHP extensions (%s) are available.' => '沒有任何支援的PHP擴充模組(%s)。', 'Session support must be enabled.' => 'Session 必須被啟用。', 'Session expired, please login again.' => 'Session 已過期,請重新登入。', Modified: branches/sqlite/adminer/lang/zh.inc.php =================================================================== --- branches/sqlite/adminer/lang/zh.inc.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/adminer/lang/zh.inc.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -79,7 +79,7 @@ 'File uploads are disabled.' => '文件上传被禁用。', 'Routine has been called, %d row(s) affected.' => '子程序被调用,%d 行被影响', 'Call' => '调用', - 'No MySQL extension' => '没有MySQL扩展', + 'No extension' => '没有扩展', 'None of the supported PHP extensions (%s) are available.' => '没有支持的 PHP 扩展可用(%s)。', 'Session support must be enabled.' => '会话必须被启用。', 'Session expired, please login again.' => '会话已过期,请重新登录。', Modified: branches/sqlite/compile.php =================================================================== --- branches/sqlite/compile.php 2009-10-20 15:37:26 UTC (rev 1205) +++ branches/sqlite/compile.php 2009-10-21 13:12:57 UTC (rev 1206) @@ -184,7 +184,7 @@ } $file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file); // bootstrap.inc.php if ($driver) { - $file = preg_replace("(" . preg_quote("<tr><th><?php echo lang('Driver'); ?>") . ".*\n)", '', $file); + $file = preg_replace("(" . preg_quote("<tr><th><?php echo lang('Driver'); ?>") . ".*\n)", '', $file); //! leave SQLite 2 and SQLite 3 for sqlite } $file = preg_replace_callback("~lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])~s", 'lang_ids', $file); $file = preg_replace_callback('~\\b(include|require) "([^"]*\\$LANG.inc.php)";~', 'put_file_lang', $file); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2009-10-21 15:32:45
|
Revision: 1207 http://adminer.svn.sourceforge.net/adminer/?rev=1207&view=rev Author: jakubvrana Date: 2009-10-21 15:32:38 +0000 (Wed, 21 Oct 2009) Log Message: ----------- Driver selection Modified Paths: -------------- branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/include/auth.inc.php branches/sqlite/adminer/include/bootstrap.inc.php branches/sqlite/adminer/include/pdo.inc.php branches/sqlite/adminer/include/version.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/compile.php branches/sqlite/editor/include/adminer.inc.php branches/sqlite/todo.txt Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2009-10-21 13:12:57 UTC (rev 1206) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2009-10-21 15:32:38 UTC (rev 1207) @@ -1,397 +1,402 @@ <?php -// MySQLi supports everything, MySQL doesn't support multiple result sets, PDO_MySQL doesn't support orgtable -if (extension_loaded("mysqli")) { - class Min_DB extends MySQLi { - var $extension = "MySQLi"; - - function Min_DB() { - parent::init(); +$possible_drivers[] = "MySQLi"; +$possible_drivers[] = "MySQL"; +$possible_drivers[] = "PDO_MySQL"; +if (extension_loaded("mysqli") || extension_loaded("mysql") || extension_loaded("pdo_mysql")) { + $drivers[""] = "MySQL"; +} + +if (!$_GET["driver"]) { + // MySQLi supports everything, MySQL doesn't support multiple result sets, PDO_MySQL doesn't support orgtable + if (extension_loaded("mysqli")) { + class Min_DB extends MySQLi { + var $extension = "MySQLi"; + + function Min_DB() { + parent::init(); + } + + function connect($server, $username, $password) { + list($host, $port) = explode(":", $server, 2); // part after : is used for port or socket + return @$this->real_connect( + (strlen($server) ? $host : ini_get("mysqli.default_host")), + (strlen("$server$username") ? $username : ini_get("mysqli.default_user")), + (strlen("$server$username$password") ? $password : ini_get("mysqli.default_pw")), + null, + (is_numeric($port) ? $port : ini_get("mysqli.default_port")), + (!is_numeric($port) ? $port : null) + ); + } + + function result($result, $field = 0) { + if (!$result) { + return false; + } + $row = $result->fetch_array(); + return $row[$field]; + } + + function quote($string) { + return "'" . $this->escape_string($string) . "'"; + } } - function connect($server, $username, $password) { - list($host, $port) = explode(":", $server, 2); // part after : is used for port or socket - return @$this->real_connect( - (strlen($server) ? $host : ini_get("mysqli.default_host")), - (strlen("$server$username") ? $username : ini_get("mysqli.default_user")), - (strlen("$server$username$password") ? $password : ini_get("mysqli.default_pw")), - null, - (is_numeric($port) ? $port : ini_get("mysqli.default_port")), - (!is_numeric($port) ? $port : null) - ); - } - - function result($result, $field = 0) { - if (!$result) { + } elseif (extension_loaded("mysql")) { + class Min_DB { + var $extension = "MySQL", $_link, $_result, $server_info, $affected_rows, $error; + + function connect($server, $username, $password) { + $this->_link = @mysql_connect( + (strlen($server) ? $server : ini_get("mysql.default_host")), + (strlen("$server$username") ? $username : ini_get("mysql.default_user")), + (strlen("$server$username$password") ? $password : ini_get("mysql.default_password")), + true, + 131072 // CLIENT_MULTI_RESULTS for CALL + ); + if ($this->_link) { + $this->server_info = mysql_get_server_info($this->_link); + } else { + $this->error = mysql_error(); + } + return (bool) $this->_link; + } + + function quote($string) { + return "'" . mysql_real_escape_string($string, $this->_link) . "'"; + } + + function select_db($database) { + return mysql_select_db($database, $this->_link); + } + + function query($query, $unbuffered = false) { + $result = @($unbuffered ? mysql_unbuffered_query($query, $this->_link) : mysql_query($query, $this->_link)); // @ - mute mysql.trace_mode + if (!$result) { + $this->error = mysql_error($this->_link); + return false; + } elseif ($result === true) { + $this->affected_rows = mysql_affected_rows($this->_link); + return true; + } + return new Min_Result($result); + } + + function multi_query($query) { + return $this->_result = $this->query($query); + } + + function store_result() { + return $this->_result; + } + + function next_result() { + // MySQL extension doesn't support multiple results return false; } - $row = $result->fetch_array(); - return $row[$field]; + + function result($result, $field = 0) { + if (!$result) { + return false; + } + return mysql_result($result->_result, 0, $field); + } } - function quote($string) { - return "'" . $this->escape_string($string) . "'"; - } - } - -} elseif (extension_loaded("mysql")) { - class Min_DB { - var $extension = "MySQL", $_link, $_result, $server_info, $affected_rows, $error; - - function connect($server, $username, $password) { - $this->_link = @mysql_connect( - (strlen($server) ? $server : ini_get("mysql.default_host")), - (strlen("$server$username") ? $username : ini_get("mysql.default_user")), - (strlen("$server$username$password") ? $password : ini_get("mysql.default_password")), - true, - 131072 // CLIENT_MULTI_RESULTS for CALL - ); - if ($this->_link) { - $this->server_info = mysql_get_server_info($this->_link); - } else { - $this->error = mysql_error(); + class Min_Result { + var $_result, $_offset = 0, $num_rows; + + function Min_Result($result) { + $this->_result = $result; + $this->num_rows = mysql_num_rows($result); } - return (bool) $this->_link; + + function fetch_assoc() { + return mysql_fetch_assoc($this->_result); + } + + function fetch_row() { + return mysql_fetch_row($this->_result); + } + + function fetch_field() { + $row = mysql_fetch_field($this->_result, $this->_offset++); + $row->orgtable = $row->table; + $row->orgname = $row->name; + $row->charsetnr = ($row->blob ? 63 : 0); + return $row; + } + + function __destruct() { + mysql_free_result($this->_result); //! is not called in PHP 4 which is a problem with mysql.trace_mode + } } - function quote($string) { - return "'" . mysql_real_escape_string($string, $this->_link) . "'"; - } - - function select_db($database) { - return mysql_select_db($database, $this->_link); - } - - function query($query, $unbuffered = false) { - $result = @($unbuffered ? mysql_unbuffered_query($query, $this->_link) : mysql_query($query, $this->_link)); // @ - mute mysql.trace_mode - if (!$result) { - $this->error = mysql_error($this->_link); - return false; - } elseif ($result === true) { - $this->affected_rows = mysql_affected_rows($this->_link); + } elseif (extension_loaded("pdo_mysql")) { + class Min_DB extends Min_PDO { + var $extension = "PDO_MySQL"; + + function connect($server, $username, $password) { + $this->dsn("mysql:host=" . str_replace(":", ";unix_socket=", preg_replace('~:([0-9])~', ';port=\\1', $server)), $username, $password); + $this->server_info = $this->result($this->query("SELECT VERSION()")); return true; } - return new Min_Result($result); + + function query($query, $unbuffered = false) { + $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, !$unbuffered); + return parent::query($query, $unbuffered); + } } - function multi_query($query) { - return $this->_result = $this->query($query); + } + + /** Connect to the database + * @return mixed Min_DB or string for error + */ + function connect() { + global $adminer; + $connection = new Min_DB; + $credentials = $adminer->credentials(); + if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) { + $connection->query("SET SQL_QUOTE_SHOW_CREATE=1"); + $connection->query("SET NAMES utf8"); + return $connection; } - - function store_result() { - return $this->_result; - } - - function next_result() { - // MySQL extension doesn't support multiple results - return false; - } - - function result($result, $field = 0) { - if (!$result) { - return false; + return $connection->error; + } + + /** Get cached list of databases + * @param bool + * @return array + */ + function get_databases($flush = true) { + // SHOW DATABASES can take a very long time so it is cached + $return = &$_SESSION["databases"][$_GET["server"]]; + if (!isset($return)) { + $return = get_vals("SHOW DATABASES"); + if ($flush) { + ob_flush(); + flush(); } - return mysql_result($result->_result, 0, $field); } + return $return; } - - class Min_Result { - var $_result, $_offset = 0, $num_rows; - - function Min_Result($result) { - $this->_result = $result; - $this->num_rows = mysql_num_rows($result); + + /**Get supported engines + * @return array + */ + function engines() { + global $connection; + $return = array(); + $result = $connection->query("SHOW ENGINES"); + while ($row = $result->fetch_assoc()) { + if (ereg("YES|DEFAULT", $row["Support"])) { + $return[] = $row["Engine"]; + } } - - function fetch_assoc() { - return mysql_fetch_assoc($this->_result); - } - - function fetch_row() { - return mysql_fetch_row($this->_result); - } - - function fetch_field() { - $row = mysql_fetch_field($this->_result, $this->_offset++); - $row->orgtable = $row->table; - $row->orgname = $row->name; - $row->charsetnr = ($row->blob ? 63 : 0); - return $row; - } - - function __destruct() { - mysql_free_result($this->_result); //! is not called in PHP 4 which is a problem with mysql.trace_mode - } + return $return; } - -} elseif (extension_loaded("pdo_mysql")) { - class Min_DB extends Min_PDO { - var $extension = "PDO_MySQL"; - - function connect($server, $username, $password) { - $this->dsn("mysql:host=" . str_replace(":", ";unix_socket=", preg_replace('~:([0-9])~', ';port=\\1', $server)), $username, $password); - $this->server_info = $this->result($this->query("SELECT VERSION()")); - return true; + + /** Print links and information about the database + * @return null + */ + function db_info() { + global $connection; + foreach (array( + 'privileges' => lang('Privileges'), + 'processlist' => lang('Process list'), + 'variables' => lang('Variables'), + ) as $key => $val) { + echo "<a href='" . h(ME) . "$key='>$val</a>\n"; } - - function query($query, $unbuffered = false) { - $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, !$unbuffered); - return parent::query($query, $unbuffered); - } + echo "<p>" . lang('%s version: %s through PHP extension %s', "MySQL", "<b" . ($connection->server_info < 4.1 ? " class='binary'" : "") . ">$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; + echo "<p>" . lang('Logged as: %s', "<b>" . h($connection->result($connection->query("SELECT USER()"))) . "</b>") . "\n"; } - -} else { - page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', 'MySQLi, MySQL, PDO_MySQL'), null); - page_footer("auth"); - exit; -} -/** Connect to the database -* @return mixed Min_DB or string for error -*/ -function connect() { - global $adminer; - $connection = new Min_DB; - $credentials = $adminer->credentials(); - if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) { - $connection->query("SET SQL_QUOTE_SHOW_CREATE=1"); - $connection->query("SET NAMES utf8"); - return $connection; + /** Get tables list + * @return array + */ + function tables_list() { + return get_vals("SHOW TABLES"); } - return $connection->error; -} -/** Get cached list of databases -* @param bool -* @return array -*/ -function get_databases($flush = true) { - // SHOW DATABASES can take a very long time so it is cached - $return = &$_SESSION["databases"][$_GET["server"]]; - if (!isset($return)) { - $return = get_vals("SHOW DATABASES"); - if ($flush) { - ob_flush(); - flush(); + /** Get table status + * @param string + * @return array + */ + function table_status($name = "") { + global $connection; + $return = array(); + $result = $connection->query("SHOW TABLE STATUS" . (strlen($name) ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); + while ($row = $result->fetch_assoc()) { + if ($row["Engine"] == "InnoDB") { + // ignore internal comment, unnecessary since MySQL 5.1.21 + $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); + } + $return[$row["Name"]] = $row; } + return (strlen($name) ? $return[$name] : $return); } - return $return; -} -/**Get supported engines -* @return array -*/ -function engines() { - global $connection; - $return = array(); - $result = $connection->query("SHOW ENGINES"); - while ($row = $result->fetch_assoc()) { - if (ereg("YES|DEFAULT", $row["Support"])) { - $return[] = $row["Engine"]; - } + /** + * @param array result of table_status + * @return bool + */ + function fk_support($table_status) { + return ($table_status["Engine"] == "InnoDB"); } - return $return; -} -/** Print links and information about the database -* @return null -*/ -function db_info() { - global $connection; - foreach (array( - 'privileges' => lang('Privileges'), - 'processlist' => lang('Process list'), - 'variables' => lang('Variables'), - ) as $key => $val) { - echo "<a href='" . h(ME) . "$key='>$val</a>\n"; + /** Get status of referencable tables + * @return array + */ + function table_status_referencable() { + $return = array(); + foreach (table_status() as $name => $row) { + if ($row["Engine"] == "InnoDB") { + $return[$name] = $row; + } + } + return $return; } - echo "<p>" . lang('%s version: %s through PHP extension %s', "MySQL", "<b" . ($connection->server_info < 4.1 ? " class='binary'" : "") . ">$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; - echo "<p>" . lang('Logged as: %s', "<b>" . h($connection->result($connection->query("SELECT USER()"))) . "</b>") . "\n"; -} -/** Get tables list -* @return array -*/ -function tables_list() { - return get_vals("SHOW TABLES"); -} - -/** Get table status -* @param string -* @return array -*/ -function table_status($name = "") { - global $connection; - $return = array(); - $result = $connection->query("SHOW TABLE STATUS" . (strlen($name) ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); - while ($row = $result->fetch_assoc()) { - if ($row["Engine"] == "InnoDB") { - // ignore internal comment, unnecessary since MySQL 5.1.21 - $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); + /** Get information about fields + * @param string + * @return array array($name => array("field" => , "full_type" => , "type" => , "length" => , "unsigned" => , "default" => , "null" => , "auto_increment" => , "on_update" => , "collation" => , "privileges" => , "comment" => , "primary" => )) + */ + function fields($table) { + global $connection; + $return = array(); + $result = $connection->query("SHOW FULL COLUMNS FROM " . idf_escape($table)); + if ($result) { + while ($row = $result->fetch_assoc()) { + preg_match('~^([^( ]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match); + $return[$row["Field"]] = array( + "field" => $row["Field"], + "full_type" => $row["Type"], + "type" => $match[1], + "length" => $match[2], + "unsigned" => ltrim($match[3] . $match[4]), + "default" => (strlen($row["Default"]) || ereg("char", $match[1]) ? $row["Default"] : null), + "null" => ($row["Null"] == "YES"), + "auto_increment" => ($row["Extra"] == "auto_increment"), + "on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23 + "collation" => $row["Collation"], + "privileges" => array_flip(explode(",", $row["Privileges"])), + "comment" => $row["Comment"], + "primary" => ($row["Key"] == "PRI"), + ); + } } - $return[$row["Name"]] = $row; + return $return; } - return (strlen($name) ? $return[$name] : $return); -} -/** -* @param array result of table_status -* @return bool -*/ -function fk_support($table_status) { - return ($table_status["Engine"] == "InnoDB"); -} - -/** Get status of referencable tables -* @return array -*/ -function table_status_referencable() { - $return = array(); - foreach (table_status() as $name => $row) { - if ($row["Engine"] == "InnoDB") { - $return[$name] = $row; + /** Get table indexes + * @param string + * @param string Min_DB to use + * @return array array($key_name => array("type" => , "columns" => array(), "lengths" => array())) + */ + function indexes($table, $connection2 = null) { + global $connection; + if (!is_object($connection2)) { // use the main connection if the separate connection is unavailable + $connection2 = $connection; } + $return = array(); + $result = $connection2->query("SHOW INDEX FROM " . idf_escape($table)); + if ($result) { + while ($row = $result->fetch_assoc()) { + $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE"))); + $return[$row["Key_name"]]["columns"][$row["Seq_in_index"]] = $row["Column_name"]; + $return[$row["Key_name"]]["lengths"][$row["Seq_in_index"]] = $row["Sub_part"]; + } + } + return $return; } - return $return; -} -/** Get information about fields -* @param string -* @return array array($name => array("field" => , "full_type" => , "type" => , "length" => , "unsigned" => , "default" => , "null" => , "auto_increment" => , "on_update" => , "collation" => , "privileges" => , "comment" => , "primary" => )) -*/ -function fields($table) { - global $connection; - $return = array(); - $result = $connection->query("SHOW FULL COLUMNS FROM " . idf_escape($table)); - if ($result) { - while ($row = $result->fetch_assoc()) { - preg_match('~^([^( ]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match); - $return[$row["Field"]] = array( - "field" => $row["Field"], - "full_type" => $row["Type"], - "type" => $match[1], - "length" => $match[2], - "unsigned" => ltrim($match[3] . $match[4]), - "default" => (strlen($row["Default"]) || ereg("char", $match[1]) ? $row["Default"] : null), - "null" => ($row["Null"] == "YES"), - "auto_increment" => ($row["Extra"] == "auto_increment"), - "on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23 - "collation" => $row["Collation"], - "privileges" => array_flip(explode(",", $row["Privileges"])), - "comment" => $row["Comment"], - "primary" => ($row["Key"] == "PRI"), - ); + /** Get foreign keys in table + * @param string + * @return array array($name => array("db" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => )) + */ + function foreign_keys($table) { + global $connection, $on_actions; + static $pattern = '(?:[^`]|``)+'; + $return = array(); + $result = $connection->query("SHOW CREATE TABLE " . idf_escape($table)); + if ($result) { + $create_table = $connection->result($result, 1); + preg_match_all("~CONSTRAINT `($pattern)` FOREIGN KEY \\(((?:`$pattern`,? ?)+)\\) REFERENCES `($pattern)`(?:\\.`($pattern)`)? \\(((?:`$pattern`,? ?)+)\\)(?: ON DELETE (" . implode("|", $on_actions) . "))?(?: ON UPDATE (" . implode("|", $on_actions) . "))?~", $create_table, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + preg_match_all("~`($pattern)`~", $match[2], $source); + preg_match_all("~`($pattern)`~", $match[5], $target); + $return[$match[1]] = array( + "db" => idf_unescape(strlen($match[4]) ? $match[3] : $match[4]), + "table" => idf_unescape(strlen($match[4]) ? $match[4] : $match[3]), + "source" => array_map('idf_unescape', $source[1]), + "target" => array_map('idf_unescape', $target[1]), + "on_delete" => $match[6], + "on_update" => $match[7], + ); + } } + return $return; } - return $return; -} -/** Get table indexes -* @param string -* @param string Min_DB to use -* @return array array($key_name => array("type" => , "columns" => array(), "lengths" => array())) -*/ -function indexes($table, $connection2 = null) { - global $connection; - if (!is_object($connection2)) { // use the main connection if the separate connection is unavailable - $connection2 = $connection; + /** Get view SELECT + * @param string + * @return array array("select" => ) + */ + function view($name) { + global $connection; + return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result($connection->query("SHOW CREATE VIEW " . idf_escape($name)), 1))); } - $return = array(); - $result = $connection2->query("SHOW INDEX FROM " . idf_escape($table)); - if ($result) { + + /** Get sorted grouped list of collations + * @return array + */ + function collations() { + global $connection; + $return = array(); + $result = $connection->query("SHOW COLLATION"); while ($row = $result->fetch_assoc()) { - $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE"))); - $return[$row["Key_name"]]["columns"][$row["Seq_in_index"]] = $row["Column_name"]; - $return[$row["Key_name"]]["lengths"][$row["Seq_in_index"]] = $row["Sub_part"]; + $return[$row["Charset"]][] = $row["Collation"]; } + ksort($return); + foreach ($return as $key => $val) { + sort($return[$key]); + } + return $return; } - return $return; -} -/** Get foreign keys in table -* @param string -* @return array array($name => array("db" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => )) -*/ -function foreign_keys($table) { - global $connection, $on_actions; - static $pattern = '(?:[^`]|``)+'; - $return = array(); - $result = $connection->query("SHOW CREATE TABLE " . idf_escape($table)); - if ($result) { - $create_table = $connection->result($result, 1); - preg_match_all("~CONSTRAINT `($pattern)` FOREIGN KEY \\(((?:`$pattern`,? ?)+)\\) REFERENCES `($pattern)`(?:\\.`($pattern)`)? \\(((?:`$pattern`,? ?)+)\\)(?: ON DELETE (" . implode("|", $on_actions) . "))?(?: ON UPDATE (" . implode("|", $on_actions) . "))?~", $create_table, $matches, PREG_SET_ORDER); - foreach ($matches as $match) { - preg_match_all("~`($pattern)`~", $match[2], $source); - preg_match_all("~`($pattern)`~", $match[5], $target); - $return[$match[1]] = array( - "db" => idf_unescape(strlen($match[4]) ? $match[3] : $match[4]), - "table" => idf_unescape(strlen($match[4]) ? $match[4] : $match[3]), - "source" => array_map('idf_unescape', $source[1]), - "target" => array_map('idf_unescape', $target[1]), - "on_delete" => $match[6], - "on_update" => $match[7], - ); - } + /** Find out if database is information_schema + * @param string + * @return bool + */ + function information_schema($db) { + global $connection; + return ($connection->server_info >= 5 && $db == "information_schema"); } - return $return; -} -/** Get view SELECT -* @param string -* @return array array("select" => ) -*/ -function view($name) { - global $connection; - return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result($connection->query("SHOW CREATE VIEW " . idf_escape($name)), 1))); -} + /** Return expression for binary comparison + * @param string + * @return string + */ + function exact_value($val) { + global $connection; + return "BINARY " . $connection->quote($val); + } -/** Get sorted grouped list of collations -* @return array -*/ -function collations() { - global $connection; - $return = array(); - $result = $connection->query("SHOW COLLATION"); - while ($row = $result->fetch_assoc()) { - $return[$row["Charset"]][] = $row["Collation"]; + $driver = "sql"; + $comments_support = true; + // value means maximum unsigned length + $types = array(); + $structured_types = array(); + foreach (array( + lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "float" => 12, "double" => 21, "decimal" => 66), + 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("binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), + lang('Lists') => array("enum" => 65535, "set" => 64), + ) as $key => $val) { + $types += $val; + $structured_types[$key] = array_keys($val); } - ksort($return); - foreach ($return as $key => $val) { - sort($return[$key]); - } - return $return; + $unsigned = array("unsigned", "zerofill", "unsigned zerofill"); } - -/** Find out if database is information_schema -* @param string -* @return bool -*/ -function information_schema($db) { - global $connection; - return ($connection->server_info >= 5 && $db == "information_schema"); -} - -/** Return expression for binary comparison -* @param string -* @return string -*/ -function exact_value($val) { - global $connection; - return "BINARY " . $connection->quote($val); -} - -$driver = "sql"; -$comments_support = true; -// value means maximum unsigned length -$types = array(); -$structured_types = array(); -foreach (array( - lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "float" => 12, "double" => 21, "decimal" => 66), - 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("binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), - lang('Lists') => array("enum" => 65535, "set" => 64), -) as $key => $val) { - $types += $val; - $structured_types[$key] = array_keys($val); -} -$unsigned = array("unsigned", "zerofill", "unsigned zerofill"); Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2009-10-21 13:12:57 UTC (rev 1206) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2009-10-21 15:32:38 UTC (rev 1207) @@ -1,278 +1,282 @@ <?php -if (extension_loaded("pgsql")) { - class Min_DB { - var $extension = "PgSQL", $_link, $_result, $server_info, $affected_rows, $error; - - function connect($server, $username, $password) { - $this->_link = @pg_connect("host=" . str_replace(":", " port=", $server)) . " user=$username password=$password"); //! escaping - if ($this->_link) { - $version = pg_version($this->_link); - $this->server_info = $version["server_version"]; - } else { - $this->error = pg_last_error(); +$possible_drivers[] = "PgSQL"; +$possible_drivers[] = "PDO_PgSQL"; +if (extension_loaded("pgsql") || extension_loaded("pdo_pgsql")) { + $drivers["pgsql"] = "PostgreSQL"; +} + +if ($_GET["driver"] == "pgsql") { + if (extension_loaded("pgsql")) { + class Min_DB { + var $extension = "PgSQL", $_link, $_result, $server_info, $affected_rows, $error; + + function connect($server, $username, $password) { + $this->_link = @pg_connect("host=" . str_replace(":", " port=", $server) . " user=$username password=$password", PGSQL_CONNECT_FORCE_NEW); //! escaping + if ($this->_link) { + $version = pg_version($this->_link); + $this->server_info = $version["server_version"]; + } else { + //! $this->error = pg_last_error(); + } + return (bool) $this->_link; } - return (bool) $this->_link; + + function quote($string) { + return "'" . pg_escape_string($this->_link, $string) . "'"; //! bytea + } + + function select_db($database) { + //! reconnect or query USE + } + + function query($query, $unbuffered = false) { + $result = pg_query($this->_link, $query); + if (!$result) { + $this->error = pg_last_error($this->_link); + return false; + } elseif (!pg_num_fields($result)) { + $this->affected_rows = pg_affected_rows($result); + return true; + } + return new Min_Result($result); + } + + function multi_query($query) { + return $this->_result = $this->query($query); + } + + function store_result() { + return $this->_result; + } + + function next_result() { + // PgSQL extension doesn't support multiple results + return false; + } + + function result($result, $field = 0) { + if (!$result) { + return false; + } + return pg_fetch_result($result->_result, 0, $field); + } } - function quote($string) { - return "'" . pg_escape_string($this->_link, $string) . "'"; //! bytea + class Min_Result { + var $_result, $_offset = 0, $num_rows; + + function Min_Result($result) { + $this->_result = $result; + $this->num_rows = pg_num_rows($result); + } + + function fetch_assoc() { + return pg_fetch_assoc($this->_result); + } + + function fetch_row() { + return pg_fetch_row($this->_result); + } + + function fetch_field() { + static $column = -1; + $column++; + $row = new stdClass; + $row->orgtable = pg_field_table($this->_result, $column); + $row->name = pg_field_name($this->_result, $column); + $row->orgname = $row->name; + $row->type = pg_field_type($this->_result, $column); + $row->charsetnr = ($row->type == "bytea" ? 63 : 0); + return $row; + } + + function __destruct() { + pg_free_result($this->_result); + } } - function select_db($database) { - //! reconnect or query USE - } - - function query($query, $unbuffered = false) { - $result = pg_query($this->_link, $query); - if (!$result) { - $this->error = pg_last_error($this->_link); - return false; - } elseif (!pg_num_fields($result)) { - $this->affected_rows = pg_affected_rows($result); + } elseif (extension_loaded("pdo_pgsql")) { + class Min_DB extends Min_PDO { + var $extension = "PDO_PgSQL"; + + function connect($server, $username, $password) { + $this->dsn("pgsql:host=" . str_replace(":", " port=", $server), $username, $password); + $this->server_info = $this->result($this->query("SHOW SERVER_VERSION")); return true; } - return new Min_Result($result); } - function multi_query($query) { - return $this->_result = $this->query($query); + } + + function connect() { + global $adminer; + $connection = new Min_DB; + $credentials = $adminer->credentials(); + if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) { + pg_set_client_encoding($connection, "UTF8"); + return $connection; } - - function store_result() { - return $this->_result; - } - - function next_result() { - // PgSQL extension doesn't support multiple results - return false; - } - - function result($result, $field = 0) { - if (!$result) { - return false; + return $connection->error; + } + + function get_databases($flush = true) { + $return = &$_SESSION["databases"][$_GET["server"]]; + if (!isset($return)) { + $return = get_vals("SELECT datname FROM pg_database"); + if ($flush) { + ob_flush(); + flush(); } - return pg_fetch_result($result->_result, 0, $field); } + return $return; } - class Min_Result { - var $_result, $_offset = 0, $num_rows; - - function Min_Result($result) { - $this->_result = $result; - $this->num_rows = pg_num_rows($result); - } - - function fetch_assoc() { - return pg_fetch_assoc($this->_result); - } - - function fetch_row() { - return pg_fetch_row($this->_result); - } - - function fetch_field() { - static $column = -1; - $column++; - $row = new stdClass; - $row->orgtable = pg_field_table($this->_result, $column); - $row->name = pg_field_name($this->_result, $column); - $row->orgname = $row->name; - $row->type = pg_field_type($this->_result, $column); - $row->charsetnr = ($row->type == "bytea" ? 63 : 0); - return $row; - } - - function __destruct() { - pg_free_result($this->_result); - } + function engines() { + return array(); } -} elseif (extension_loaded("pdo_pgsql")) { - class Min_DB extends Min_PDO { - var $extension = "PDO_PgSQL"; - - function connect($server, $username, $password) { - $this->dsn("pgsql:host=" . str_replace(":", " port=", $server)), $username, $password); - $this->server_info = $this->result($this->query("SHOW SERVER_VERSION")); - return true; + function db_info() { + global $connection; + echo "<p>" . lang('%s version: %s through PHP extension %s', "PostgreSQL", "<b>$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; + } + + function tables_list() { + global $connection; + return get_vals("SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema = " . $connection->quote(DB)); + } + + function table_status($name = "") { //! + global $connection; + $return = array(); + $result = $connection->query("SHOW TABLE STATUS" . (strlen($name) ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); + while ($row = $result->fetch_assoc()) { + if ($row["Engine"] == "InnoDB") { + // ignore internal comment, unnecessary since MySQL 5.1.21 + $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); + } + $return[$row["Name"]] = $row; } + return (strlen($name) ? $return[$name] : $return); } -} else { - page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', 'PgSQL, PDO_PgSQL'), null); - page_footer("auth"); - exit; -} - -function connect() { - global $adminer; - $connection = new Min_DB; - $credentials = $adminer->credentials(); - if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) { - pg_set_client_encoding($connection, "UTF8"); - return $connection; + function fk_support($table_status) { + return true; } - return $connection->error; -} - -function get_databases($flush = true) { - $return = &$_SESSION["databases"][$_GET["server"]]; - if (!isset($return)) { - $return = get_vals("SELECT datname FROM pg_database"); - if ($flush) { - ob_flush(); - flush(); + + function table_status_referencable() { + return table_status(); + } + + function fields($table) { //! + global $connection; + $return = array(); + $result = $connection->query("SHOW FULL COLUMNS FROM " . idf_escape($table)); + if ($result) { + while ($row = $result->fetch_assoc()) { + preg_match('~^([^( ]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match); + $return[$row["Field"]] = array( + "field" => $row["Field"], + "full_type" => $row["Type"], + "type" => $match[1], + "length" => $match[2], + "unsigned" => ltrim($match[3] . $match[4]), + "default" => (strlen($row["Default"]) || ereg("char", $match[1]) ? $row["Default"] : null), + "null" => ($row["Null"] == "YES"), + "auto_increment" => ($row["Extra"] == "auto_increment"), + "on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23 + "collation" => $row["Collation"], + "privileges" => array_flip(explode(",", $row["Privileges"])), + "comment" => $row["Comment"], + "primary" => ($row["Key"] == "PRI"), + ); + } } + return $return; } - return $return; -} - -function engines() { - return array(); -} - -function db_info() { - global $connection; - echo "<p>" . lang('%s version: %s through PHP extension %s', "PostgreSQL", "<b>$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; -} - -function tables_list() { - global $connection; - return get_vals("SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema = " . $connection->quote(DB)); -} - -function table_status($name = "") { //! - global $connection; - $return = array(); - $result = $connection->query("SHOW TABLE STATUS" . (strlen($name) ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); - while ($row = $result->fetch_assoc()) { - if ($row["Engine"] == "InnoDB") { - // ignore internal comment, unnecessary since MySQL 5.1.21 - $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); + + function indexes($table, $connection2 = null) { //! + global $connection; + if (!is_object($connection2)) { // use the main connection if the separate connection is unavailable + $connection2 = $connection; } - $return[$row["Name"]] = $row; + $return = array(); + $result = $connection2->query("SHOW INDEX FROM " . idf_escape($table)); + if ($result) { + while ($row = $result->fetch_assoc()) { + $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE"))); + $return[$row["Key_name"]]["columns"][$row["Seq_in_index"]] = $row["Column_name"]; + $return[$row["Key_name"]]["lengths"][$row["Seq_in_index"]] = $row["Sub_part"]; + } + } + return $return; } - return (strlen($name) ? $return[$name] : $return); -} - -function fk_support($table_status) { - return true; -} - -function table_status_referencable() { - return table_status(); -} - -function fields($table) { //! - global $connection; - $return = array(); - $result = $connection->query("SHOW FULL COLUMNS FROM " . idf_escape($table)); - if ($result) { - while ($row = $result->fetch_assoc()) { - preg_match('~^([^( ]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match); - $return[$row["Field"]] = array( - "field" => $row["Field"], - "full_type" => $row["Type"], - "type" => $match[1], - "length" => $match[2], - "unsigned" => ltrim($match[3] . $match[4]), - "default" => (strlen($row["Default"]) || ereg("char", $match[1]) ? $row["Default"] : null), - "null" => ($row["Null"] == "YES"), - "auto_increment" => ($row["Extra"] == "auto_increment"), - "on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23 - "collation" => $row["Collation"], - "privileges" => array_flip(explode(",", $row["Privileges"])), - "comment" => $row["Comment"], - "primary" => ($row["Key"] == "PRI"), - ); + + function foreign_keys($table) { //! + global $connection, $on_actions; + static $pattern = '(?:[^`]|``)+'; + $return = array(); + $result = $connection->query("SHOW CREATE TABLE " . idf_escape($table)); + if ($result) { + $create_table = $connection->result($result, 1); + preg_match_all("~CONSTRAINT `($pattern)` FOREIGN KEY \\(((?:`$pattern`,? ?)+)\\) REFERENCES `($pattern)`(?:\\.`($pattern)`)? \\(((?:`$pattern`,? ?)+)\\)(?: ON DELETE (" . implode("|", $on_actions) . "))?(?: ON UPDATE (" . implode("|", $on_actions) . "))?~", $create_table, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + preg_match_all("~`($pattern)`~", $match[2], $source); + preg_match_all("~`($pattern)`~", $match[5], $target); + $return[$match[1]] = array( + "db" => idf_unescape(strlen($match[4]) ? $match[3] : $match[4]), + "table" => idf_unescape(strlen($match[4]) ? $match[4] : $match[3]), + "source" => array_map('idf_unescape', $source[1]), + "target" => array_map('idf_unescape', $target[1]), + "on_delete" => $match[6], + "on_update" => $match[7], + ); + } } + return $return; } - return $return; -} - -function indexes($table, $connection2 = null) { //! - global $connection; - if (!is_object($connection2)) { // use the main connection if the separate connection is unavailable - $connection2 = $connection; + + function view($name) { + global $connection; + return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result($connection->query("SHOW CREATE VIEW " . idf_escape($name)), 1))); } - $return = array(); - $result = $connection2->query("SHOW INDEX FROM " . idf_escape($table)); - if ($result) { + + function collations() { + global $connection; + $return = array(); + $result = $connection->query("SHOW COLLATION"); while ($row = $result->fetch_assoc()) { - $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE"))); - $return[$row["Key_name"]]["columns"][$row["Seq_in_index"]] = $row["Column_name"]; - $return[$row["Key_name"]]["lengths"][$row["Seq_in_index"]] = $row["Sub_part"]; + $return[$row["Charset"]][] = $row["Collation"]; } - } - return $return; -} - -function foreign_keys($table) { //! - global $connection, $on_actions; - static $pattern = '(?:[^`]|``)+'; - $return = array(); - $result = $connection->query("SHOW CREATE TABLE " . idf_escape($table)); - if ($result) { - $create_table = $connection->result($result, 1); - preg_match_all("~CONSTRAINT `($pattern)` FOREIGN KEY \\(((?:`$pattern`,? ?)+)\\) REFERENCES `($pattern)`(?:\\.`($pattern)`)? \\(((?:`$pattern`,? ?)+)\\)(?: ON DELETE (" . implode("|", $on_actions) . "))?(?: ON UPDATE (" . implode("|", $on_actions) . "))?~", $create_table, $matches, PREG_SET_ORDER); - foreach ($matches as $match) { - preg_match_all("~`($pattern)`~", $match[2], $source); - preg_match_all("~`($pattern)`~", $match[5], $target); - $return[$match[1]] = array( - "db" => idf_unescape(strlen($match[4]) ? $match[3] : $match[4]), - "table" => idf_unescape(strlen($match[4]) ? $match[4] : $match[3]), - "source" => array_map('idf_unescape', $source[1]), - "target" => array_map('idf_unescape', $target[1]), - "on_delete" => $match[6], - "on_update" => $match[7], - ); + ksort($return); + foreach ($return as $key => $val) { + sort($return[$key]); } + return $return; } - return $return; -} - -function view($name) { - global $connection; - return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result($connection->query("SHOW CREATE VIEW " . idf_escape($name)), 1))); -} - -function collations() { - global $connection; - $return = array(); - $result = $connection->query("SHOW COLLATION"); - while ($row = $result->fetch_assoc()) { - $return[$row["Charset"]][] = $row["Collation"]; + + function information_schema($db) { + return ($db == "information_schema"); } - ksort($return); - foreach ($return as $key => $val) { - sort($return[$key]); + + function exact_value($val) { + global $connection; + return "BINARY " . $connection->quote($val); } - return $return; + + $driver = "pgsql"; + $comments_support = true; + // value means maximum unsigned length + $types = array(); + $structured_types = array(); + foreach (array( + lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "float" => 12, "double" => 21, "decimal" => 66), + 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("binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), + lang('Lists') => array("enum" => 65535, "set" => 64), + ) as $key => $val) { + $types += $val; + $structured_types[$key] = array_keys($val); + } + $unsigned = array("unsigned", "zerofill", "unsigned zerofill"); } - -function information_schema($db) { - return ($db == "information_schema"); -} - -function exact_value($val) { - global $connection; - return "BINARY " . $connection->quote($val); -} - -$driver = "pgsql"; -$comments_support = true; -// value means maximum unsigned length -$types = array(); -$structured_types = array(); -foreach (array( - lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "float" => 12, "double" => 21, "decimal" => 66), - 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("binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), - lang('Lists') => array("enum" => 65535, "set" => 64), -) as $key => $val) { - $types += $val; - $structured_types[$key] = array_keys($val); -} -$unsigned = array("unsigned", "zerofill", "unsigned zerofill"); Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2009-10-21 13:12:57 UTC (rev 1206) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2009-10-21 15:32:38 UTC (rev 1207) @@ -1,325 +1,333 @@ <?php -if (extension_loaded($_GET["sqlite"] == 2 ? "sqlite" : "sqlite3")) { - if ($_GET["sqlite"] == 2) { //! detect from file - - class Min_SQLite extends SQLiteDatabase { - var $extension = "SQLite"; +$possible_drivers[] = "SQLite"; +$possible_drivers[] = "SQLite3"; +$possible_drivers[] = "PDO_SQLite"; +if (extension_loaded("sqlite3") || extension_loaded("pdo_sqlite")) { + $drivers["sqlite"] = "SQLite 3"; +} +if (extension_loaded("sqlite") || extension_loaded("pdo_sqlite")) { + $drivers["sqlite2"] = "SQLite 2"; +} + +if (ereg("sqlite", $_GET["driver"])) { + if (extension_loaded($_GET["driver"] == "sqlite2" ? "sqlite" : "sqlite3")) { + if ($_GET["driver"] == "sqlite2") { - function __construct() { - $this->server_info = sqlite_libversion(); + class Min_SQLite extends SQLiteDatabase { + var $extension = "SQLite"; + + function __construct() { + $this->server_info = sqlite_libversion(); + } + + function open($filename) { + parent::__construct($filename); + } + + function query($query) { + $result = @parent::query($query, SQLITE_BOTH, $error); + if (!$result) { + $this->error = $error; + return false; + } elseif ($result === true) { + $this->affected_rows = $this->changes(); + return true; + } + return new Min_Result($result); + } + + function quote($string) { + return "'" . sqlite_escape_string($string) . "'"; + } + + function result($result, $field = 0) { + if (!$result) { + return false; + } + $row = $result->_result->fetch(); + return $row[$field]; + } } - function open($filename) { - parent::__construct($filename); + class Min_Result { + var $_result, $num_rows; + + function __construct($result) { + $this->_result = $result; + $this->num_rows = $result->numRows(); + } + + function fetch_assoc() { + return $this->_result->fetch(SQLITE_ASSOC); + } + + function fetch_row() { + return $this->_result->fetch(SQLITE_NUM); + } + + function fetch_field() { + static $column = -1; + $column++; + return (object) array( + "name" => $this->fieldName($column), + //! type, orgtable, charsetnr + ); + } + } - function query($query) { - $result = @parent::query($query, SQLITE_BOTH, $error); - if (!$result) { - $this->error = $error; - return false; - } elseif ($result === true) { + } else { + + class Min_SQLite extends SQLite3 { + var $extension = "SQLite3"; + + function __construct() { + $version = $this->version(); + $this->server_info = $version["versionString"]; + } + + function open($filename) { + parent::__construct($filename); + } + + function query($query) { + $result = @parent::query($query); + if (!$result) { + $this->error = $this->lastErrorMsg(); + return false; + } elseif ($result->numColumns()) { + return new Min_Result($result); + } $this->affected_rows = $this->changes(); return true; } - return new Min_Result($result); + + function quote($string) { + return "'" . $this->escapeString($string) . "'"; + } + + function result($result, $field = 0) { + if (!$result) { + return false; + } + $row = $result->_result->fetchArray(); + return $row[$field]; + } } - function quote($string) { - return "'" . sqlite_escape_string($string) . "'"; + class Min_Result { + var $_result, $num_rows; + + function __construct($result) { + $this->_result = $result; + $this->num_rows = 1; //! + } + + function fetch_assoc() { + return $this->_result->fetchArray(SQLITE3_ASSOC); + } + + function fetch_row() { + return $this->_result->fetchArray(SQLITE3_NUM); + } + + function fetch_field() { + static $column = -1; + $column++; + return (object) array( + "name" => $this->_result->columnName($column), + "type" => $this->_result->columnType($column), + //! orgtable, charsetnr + ); + } + + function __desctruct() { + return $this->_result->finalize(); + } } - function result($result, $field = 0) { - if (!$result) { - return false; - } - $row = $result->_result->fetch(); - return $row[$field]; - } } - class Min_Result { - var $_result, $num_rows; + class Min_DB extends Min_SQLite { - function __construct($result) { - $this->_result = $result; - $this->num_rows = $result->numRows(); + function select_db($filename) { + static $connected = false; + if ($connected) { + return true; + } + set_exception_handler('connect_error'); // try/catch is not compatible with PHP 4 + $this->open($filename); + $connected = true; + restore_exception_handler(); + return true; } - function fetch_assoc() { - return $this->_result->fetch(SQLITE_ASSOC); + function multi_query($query) { + return $this->_result = $this->query($query); } - function fetch_row() { - return $this->_result->fetch(SQLITE_NUM); + function store_result() { + return $this->_result; } - function fetch_field() { - static $column = -1; - $column++; - return (object) array( - "name" => $this->fieldName($column), - //! type, orgtable, charsetnr - ); + function next_result() { + return false; } - } - } else { - - class Min_SQLite extends SQLite3 { - var $extension = "SQLite3"; + } elseif (extension_loaded("pdo_sqlite")) { + class Min_DB extends Min_PDO { + var $extension = "PDO_SQLite"; - function __construct() { - $version = $this->version(); - $this->server_info = $version["versionString"]; - } - - function open($filename) { - parent::__construct($filename); - } - - function query($query) { - $result = @parent::query($query); - if (!$result) { - $this->error = $this->lastErrorMsg(); - return false; - } elseif ($result->numColumns()) { - return new Min_Result($result); + function select_db($filename) { + static $connected = false; + if ($connected) { + return true; } - $this->affected_rows = $this->changes(); + set_exception_handler('connect_error'); // try/catch is not compatible with PHP 4 + $connected = true; + $this->__construct(($_GET["driver"] == "sqlite2" ? "sqlite2" : "sqlite") . ":$filename"); + restore_exception_handler(); + $this->setAttribute(13, array('Min_PDOStatement')); // PDO::ATTR_STATEMENT_CLASS + $this->server_info = $this->result($this->query("SELECT sqlite_version()")); return true; } - - function quote($string) { - return "'" . $this->escapeString($string) . "'"; - } - - function result($result, $field = 0) { - if (!$result) { - return false; - } - $row = $result->_result->fetchArray(); - return $row[$field]; - } } - class Min_Result { - var $_result, $num_rows; - - function __construct($result) { - $this->_result = $result; - $this->num_rows = 1; //! - } - - function fetch_assoc() { - return $this->_result->fetchArray(SQLITE3_ASSOC); - } - - function fetch_row() { - return $this->_result->fetchArray(SQLITE3_NUM); - } - - function fetch_field() { - static $column = -1; - $column++; - return (object) array( - "name" => $this->_result->columnName($column), - "type" => $this->_result->columnType($column), - //! orgtable, charsetnr - ); - } - - function __desctruct() { - return $this->_result->finalize(); - } - } - } - - class Min_DB extends Min_SQLite { - - function select_db($filename) { - static $connected = false; - if ($connected) { - return true; - } - set_exception_handler('connect_error'); // try/catch is not compatible with PHP 4 - $this->open($filename); - $connected = true; - restore_exception_handler(); - return true; - } - - function multi_query($query) { - return $this->_result = $this->query($query); - } - - function store_result() { - return $this->_result; - } - - function next_result() { + + function connect() { + static $connected = false; //! EXPLAIN doesn't work with second connection + if ($connected) { return false; } + $connected = true; + return new Min_DB; } - -} elseif (extension_loaded("pdo_sqlite")) { - class Min_DB extends Min_PDO { - var $extension = "PDO_SQLite"; - - function select_db($filename) { - static $connected = false; - if ($connected) { - return true; - } - set_exception_handler('connect_error'); // try/catch is not compatible with PHP 4 - $connected = true; - $this->__construct(($_GET["sqlite"] == 2 ? "sqlite2" : "sqlite") . ":$filename"); - restore_exception_handler(); - $this->setAttribute(13, array('Min_PDOStatement')); // PDO::ATTR_STATEMENT_CLASS - $this->server_info = $this->result($this->query("SELECT sqlite_version()")); - return true; - } + + function get_databases() { + return array(); } - -} else { - page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', 'SQLite, SQLite3, PDO_SQLite'), null); - page_footer("auth"); - exit; -} -function connect() { - static $connected = false; //! EXPLAIN doesn't work with second connection - if ($connected) { - return false; + function engines() { + return array(); } - $connected = true; - return new Min_DB; -} -function get_databases() { - return array(); -} + function db_info() { + global $connection; + echo "<p>" . lang('%s version: %s through PHP extension %s', "SQLite", "<b>$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; + } -function engines() { - return array(); -} + function tables_list() { + return get_vals("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')", 1); + } -function db_info() { - global $connection; - echo "<p>" . lang('%s version: %s through PHP extension %s', "SQLite", "<b>$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; -} + function table_status($name = "") { + global $connection; + $return = array(); + $result = $connection->query("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')" . (strlen($name) ? " AND name = " . $connection->quote($name) : "")); + while ($row = $result->fetch_assoc()) { + $return[$row["name"]] = array( + "Name" => $row["name"], + "Rows" => ($row["type"] == "table" ? $connection->result($connection->query("SELECT COUNT(*) FROM " . idf_escape($row["name"]))) : ""), + ); + } + return (strlen($name) ? $return[$name] : $return); + } -function tables_list() { - return get_vals("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')", 1); -} - -function table_status($name = "") { - global $connection; - $return = array(); - $result = $connection->query("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')" . (strlen($name) ? " AND name = " . $connection->quote($name) : "")); - while ($row = $result->fetch_assoc()) { - $return[$row["name"]] = array( - "Name" => $row["name"], - "Rows" => ($row["type"] == "table" ? $connection->result($connection->query("SELECT COUNT(*) FROM " . idf_escape($row["name"]))) : ""), - ); + function fk_support($table_status) { + return true; } - return (strlen($name) ? $return[$name] : $return); -} -function fk_support($table_status) { - return true; -} - -function table_status_referencable() { - return table_status(); -} - -function fields($table) { - global $connection; - $return = array(); - $result = $connection->query("PRAGMA table_info(" . idf_escape($table) . ")"); - while ($row = $result->fetch_assoc()) { - $type = strtolower($row["type"]); - $return[$row["name"]] = array( - "field" => $row["name"], - "type" => $type, - "full_type" => $type, - "default" => $row["dflt_value"], - "null" => !$row["notnull"], - "auto_increment" => false, //! - "collation" => null, //! - "privileges" => array("select" => 1, "insert" => 1, "update" => 1), - "primary" => $row["pk"], - ); + function table_status_referencable() { + return table_status(); } - return $return; -} -function indexes($table, $connection2 = null) { - global $connection; - $return = array(); - $primary = array(); - foreach (fields($table) as $field) { - if ($field["primary"]) { - $primary[] = $field["field"]; + function fields($table) { + global $connection; + $return = array(); + $result = $connection->query("PRAGMA table_info(" . idf_escape($table) . ")"); + while ($row = $result->fetch_assoc()) { + $type = strtolower($row["type"]); + $return[$row["name"]] = array( + "field" => $row["name"], + "type" => $type, + "full_type" => $type, + "default" => $row["dflt_value"], + "null" => !$row["notnull"], + "auto_increment" => false, //! + "collation" => null, //! + "privileges" => array("select" => 1, "insert" => 1, "update" => 1), + "primary" => $row["pk"], + ); } + return $return; } - if ($primary) { - $return[""] = array("type" => "PRIMARY", "columns" => $primary, "lengths" => array()); - } - $result = $connection->query("PRAGMA index_list(" . idf_escape($table) . ")"); - if (is_object($result)) { - while ($row = $result->fetch_assoc()) { - $return[$row["name"]]["type"] = ($row["unique"] ? "UNIQUE" : "INDEX"); - $return[$row["name"]]["lengths"] = array(); - $result1 = $connection->query("PRAGMA index_info(" . idf_escape($row["name"]) . ")"); - while ($row1 = $result1->fetch_assoc()) { - $return[$row["name"]]["columns"][$row1["seqno"]] = $row1["name"]; + + function indexes($table, $connection2 = null) { + global $connection; + $return = array(); + $primary = array(); + foreach (fields($table) as $field) { + if ($field["primary"]) { + $primary[] = $field["field"]; } } + if ($primary) { + $return[""] = array("type" => "PRIMARY", "columns" => $primary, "lengths" => array()); + } + $result = $connection->query("PRAGMA index_list(" . idf_escape($table) . ")"); + if (is_object($result)) { + while ($row = $result->fetch_assoc()) { + $return[$row["name"]]["type"] = ($row["unique"] ? "UNIQUE" : "INDEX"); + $return[$row["name"]]["lengths"] = array(); + $result1 = $connection->query("PRAGMA index_info(" . idf_escape($row["name"]) . ")"); + while ($row1 = $result1->fetch_assoc()) { + $return[$row["name"]]["columns"][$row1["seqno"]] = $row1["name"]; + } + } + } + return $return; } - return $return; -} -function foreign_keys($table) { - global $connection; - $return = array(); - $result = $connection->query("PRAGMA foreign_key_list(" . idf_escape($... [truncated message content] |
From: <jak...@us...> - 2009-10-29 21:19:03
|
Revision: 1220 http://adminer.svn.sourceforge.net/adminer/?rev=1220&view=rev Author: jakubvrana Date: 2009-10-29 21:18:55 +0000 (Thu, 29 Oct 2009) Log Message: ----------- Min_DB::result accepting $query Modified Paths: -------------- branches/sqlite/adminer/database.inc.php branches/sqlite/adminer/download.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/dump.inc.php branches/sqlite/adminer/include/editing.inc.php branches/sqlite/adminer/include/export.inc.php branches/sqlite/adminer/include/pdo.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/adminer/user.inc.php branches/sqlite/editor/include/adminer.inc.php Modified: branches/sqlite/adminer/database.inc.php =================================================================== --- branches/sqlite/adminer/database.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/adminer/database.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -55,8 +55,7 @@ break; } } -} elseif (($result = $connection->query("SHOW CREATE DATABASE " . idf_escape(DB)))) { - $create = $connection->result($result, 1); +} elseif (($create = $connection->result("SHOW CREATE DATABASE " . idf_escape(DB), 1))) { if (preg_match('~ COLLATE ([^ ]+)~', $create, $match)) { $collate = $match[1]; } elseif (preg_match('~ CHARACTER SET ([^ ]+)~', $create, $match)) { Modified: branches/sqlite/adminer/download.inc.php =================================================================== --- branches/sqlite/adminer/download.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/adminer/download.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -2,5 +2,5 @@ $TABLE = $_GET["download"]; header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=" . friendly_url("$TABLE-" . implode("_", $_GET["where"])) . "." . friendly_url($_GET["field"])); -echo $connection->result($connection->query("SELECT " . idf_escape($_GET["field"]) . " FROM " . idf_escape($TABLE) . " WHERE " . where($_GET) . " LIMIT 1")); +echo $connection->result("SELECT " . idf_escape($_GET["field"]) . " FROM " . idf_escape($TABLE) . " WHERE " . where($_GET) . " LIMIT 1"); exit; // don't output footer Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -28,7 +28,8 @@ ); } - function result($result, $field = 0) { + function result($query, $field = 0) { + $result = $this->query($query); if (!$result) { return false; } @@ -130,11 +131,12 @@ } /** Get single field from result - * @param Min_Result - * @param int + * @param string + * @param mixed * @return string */ - function result($result, $field = 0) { + function result($query, $field = 0) { + $result = $this->query($query); if (!$result) { return false; } @@ -192,7 +194,7 @@ function connect($server, $username, $password) { $this->dsn("mysql:host=" . str_replace(":", ";unix_socket=", preg_replace('~:([0-9])~', ';port=\\1', $server)), $username, $password); - $this->server_info = $this->result($this->query("SELECT VERSION()")); + $this->server_info = $this->result("SELECT VERSION()"); return true; } @@ -264,7 +266,7 @@ echo "<a href='" . h(ME) . "$key='>$val</a>\n"; } echo "<p>" . lang('%s version: %s through PHP extension %s', "MySQL", "<b" . ($connection->server_info < 4.1 ? " class='binary'" : "") . ">$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; - echo "<p>" . lang('Logged as: %s', "<b>" . h($connection->result($connection->query("SELECT USER()"))) . "</b>") . "\n"; + echo "<p>" . lang('Logged as: %s', "<b>" . h($connection->result("SELECT USER()")) . "</b>") . "\n"; } /** Get tables list @@ -374,9 +376,8 @@ global $connection, $on_actions; static $pattern = '(?:[^`]|``)+'; $return = array(); - $result = $connection->query("SHOW CREATE TABLE " . idf_escape($table)); - if ($result) { - $create_table = $connection->result($result, 1); + $create_table = $connection->result("SHOW CREATE TABLE " . idf_escape($table), 1); + if ($create_table) { preg_match_all("~CONSTRAINT `($pattern)` FOREIGN KEY \\(((?:`$pattern`,? ?)+)\\) REFERENCES `($pattern)`(?:\\.`($pattern)`)? \\(((?:`$pattern`,? ?)+)\\)(?: ON DELETE (" . implode("|", $on_actions) . "))?(?: ON UPDATE (" . implode("|", $on_actions) . "))?~", $create_table, $matches, PREG_SET_ORDER); foreach ($matches as $match) { preg_match_all("~`($pattern)`~", $match[2], $source); @@ -400,7 +401,7 @@ */ function view($name) { global $connection; - return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result($connection->query("SHOW CREATE VIEW " . idf_escape($name)), 1))); + return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result("SHOW CREATE VIEW " . idf_escape($name), 1))); } /** Get sorted grouped list of collations Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -54,7 +54,8 @@ return false; } - function result($result, $field = 0) { + function result($query, $field = 0) { + $result = $this->query($query); if (!$result) { return false; } @@ -101,7 +102,7 @@ function connect($server, $username, $password) { $this->dsn("pgsql:host=" . str_replace(":", " port=", $server), $username, $password); - $this->server_info = $this->result($this->query("SHOW SERVER_VERSION")); + $this->server_info = $this->result("SHOW SERVER_VERSION"); return true; } } @@ -212,32 +213,13 @@ } function foreign_keys($table) { //! - global $connection, $on_actions; - static $pattern = '(?:[^`]|``)+'; $return = array(); - $result = $connection->query("SHOW CREATE TABLE " . idf_escape($table)); - if ($result) { - $create_table = $connection->result($result, 1); - preg_match_all("~CONSTRAINT `($pattern)` FOREIGN KEY \\(((?:`$pattern`,? ?)+)\\) REFERENCES `($pattern)`(?:\\.`($pattern)`)? \\(((?:`$pattern`,? ?)+)\\)(?: ON DELETE (" . implode("|", $on_actions) . "))?(?: ON UPDATE (" . implode("|", $on_actions) . "))?~", $create_table, $matches, PREG_SET_ORDER); - foreach ($matches as $match) { - preg_match_all("~`($pattern)`~", $match[2], $source); - preg_match_all("~`($pattern)`~", $match[5], $target); - $return[$match[1]] = array( - "db" => idf_unescape(strlen($match[4]) ? $match[3] : $match[4]), - "table" => idf_unescape(strlen($match[4]) ? $match[4] : $match[3]), - "source" => array_map('idf_unescape', $source[1]), - "target" => array_map('idf_unescape', $target[1]), - "on_delete" => $match[6], - "on_update" => $match[7], - ); - } - } return $return; } function view($name) { global $connection; - return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result($connection->query("SHOW CREATE VIEW " . idf_escape($name)), 1))); + return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result("SHOW CREATE VIEW " . idf_escape($name), 1))); } function collations() { Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -40,7 +40,8 @@ return "'" . sqlite_escape_string($string) . "'"; } - function result($result, $field = 0) { + function result($query, $field = 0) { + $result = $this->query($query); if (!$result) { return false; } @@ -106,7 +107,8 @@ return "'" . $this->escapeString($string) . "'"; } - function result($result, $field = 0) { + function result($query, $field = 0) { + $result = $this->query($query); if (!$result) { return false; } @@ -189,7 +191,7 @@ $this->__construct(($_GET["driver"] == "sqlite2" ? "sqlite2" : "sqlite") . ":$filename"); restore_exception_handler(); $this->setAttribute(13, array('Min_PDOStatement')); // PDO::ATTR_STATEMENT_CLASS - $this->server_info = $this->result($this->query("SELECT sqlite_version()")); + $this->server_info = $this->result("SELECT sqlite_version()"); return true; } } @@ -229,7 +231,7 @@ while ($row = $result->fetch_assoc()) { $return[$row["name"]] = array( "Name" => $row["name"], - "Rows" => ($row["type"] == "table" ? $connection->result($connection->query("SELECT COUNT(*) FROM " . idf_escape($row["name"]))) : ""), + "Rows" => ($row["type"] == "table" ? $connection->result("SELECT COUNT(*) FROM " . idf_escape($row["name"])) : ""), ); } return (strlen($name) ? $return[$name] : $return); @@ -309,7 +311,7 @@ function view($name) { global $connection; - return array("select" => preg_replace('~^(?:[^`]+|`[^`]*`)* AS ~iU', '', $connection->result($connection->query("SELECT sql FROM sqlite_master WHERE name = " . $connection->quote($name)), 0))); + return array("select" => preg_replace('~^(?:[^`]+|`[^`]*`)* AS ~iU', '', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . $connection->quote($name)))); } function collations() { Modified: branches/sqlite/adminer/dump.inc.php =================================================================== --- branches/sqlite/adminer/dump.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/adminer/dump.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -7,7 +7,7 @@ echo "-- Adminer $VERSION dump SET NAMES utf8; SET foreign_key_checks = 0; -SET time_zone = " . $connection->quote($connection->result($connection->query("SELECT @@time_zone"))) . "; +SET time_zone = " . $connection->quote($connection->result("SELECT @@time_zone")) . "; SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; "; @@ -16,11 +16,10 @@ $style = $_POST["db_style"]; foreach ((strlen(DB) ? array(DB) : (array) $_POST["databases"]) as $db) { if ($connection->select_db($db)) { - if ($_POST["format"] == "sql" && ereg('CREATE', $style) && ($result = $connection->query("SHOW CREATE DATABASE " . idf_escape($db)))) { + if ($_POST["format"] == "sql" && ereg('CREATE', $style) && ($create = $connection->result("SHOW CREATE DATABASE " . idf_escape($db), 1))) { if ($style == "DROP+CREATE") { echo "DROP DATABASE IF EXISTS " . idf_escape($db) . ";\n"; } - $create = $connection->result($result, 1); echo ($style == "CREATE+ALTER" ? preg_replace('~^CREATE DATABASE ~', '\\0IF NOT EXISTS ', $create) : $create) . ";\n"; } if ($_POST["format"] == "sql") { @@ -36,7 +35,7 @@ $result = $connection->query("SHOW $routine STATUS WHERE Db = " . $connection->quote($db)); while ($row = $result->fetch_assoc()) { $out .= ($style != 'DROP+CREATE' ? "DROP $routine IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") - . $connection->result($connection->query("SHOW CREATE $routine " . idf_escape($row["Name"])), 2) . ";;\n\n"; + . $connection->result("SHOW CREATE $routine " . idf_escape($row["Name"]), 2) . ";;\n\n"; } } } @@ -44,7 +43,7 @@ $result = $connection->query("SHOW EVENTS"); while ($row = $result->fetch_assoc()) { $out .= ($style != 'DROP+CREATE' ? "DROP EVENT IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") - . $connection->result($connection->query("SHOW CREATE EVENT " . idf_escape($row["Name"])), 3) . ";;\n\n"; + . $connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3) . ";;\n\n"; } } if ($out) { Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/adminer/include/editing.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -239,7 +239,7 @@ $aliases = array("bit" => "tinyint", "bool" => "tinyint", "boolean" => "tinyint", "integer" => "int", "double precision" => "float", "real" => "float", "dec" => "decimal", "numeric" => "decimal", "fixed" => "decimal", "national char" => "char", "national varchar" => "varchar"); $type_pattern = "(" . implode("|", array_keys($types + $aliases)) . ")(?:\\s*\\(((?:[^'\")]*|$enum_length)+)\\))?\\s*(zerofill\\s*)?(unsigned(?:\\s+zerofill)?)?(?:\\s*(?:CHARSET|CHARACTER\\s+SET)\\s*['\"]?([^'\"\\s]+)['\"]?)?"; $pattern = "\\s*(" . ($type == "FUNCTION" ? "" : implode("|", $inout)) . ")?\\s*(?:`((?:[^`]|``)*)`\\s*|\\b(\\S+)\\s+)$type_pattern"; - $create = $connection->result($connection->query("SHOW CREATE $type " . idf_escape($name)), 2); + $create = $connection->result("SHOW CREATE $type " . idf_escape($name), 2); preg_match("~\\(((?:$pattern\\s*,?)*)\\)" . ($type == "FUNCTION" ? "\\s*RETURNS\\s+$type_pattern" : "") . "\\s*(.*)~is", $create, $match); $fields = array(); preg_match_all("~$pattern\\s*,?~is", $match[1], $matches, PREG_SET_ORDER); Modified: branches/sqlite/adminer/include/export.inc.php =================================================================== --- branches/sqlite/adminer/include/export.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/adminer/include/export.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -32,12 +32,11 @@ dump_csv(array_keys(fields($table))); } } elseif ($style) { - $result = $connection->query("SHOW CREATE TABLE " . idf_escape($table)); - if ($result) { + $create = $connection->result("SHOW CREATE TABLE " . idf_escape($table), 1); + if ($create) { if ($style == "DROP+CREATE") { echo "DROP " . ($is_view ? "VIEW" : "TABLE") . " IF EXISTS " . idf_escape($table) . ";\n"; } - $create = $connection->result($result, 1); echo ($style != "CREATE+ALTER" ? $create : ($is_view ? substr_replace($create, " OR REPLACE", 6, 0) : substr_replace($create, " IF NOT EXISTS", 12, 0))) . ";\n\n"; } if ($style == "CREATE+ALTER" && !$is_view) { Modified: branches/sqlite/adminer/include/pdo.inc.php =================================================================== --- branches/sqlite/adminer/include/pdo.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/adminer/include/pdo.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -47,7 +47,8 @@ return $this->_result->nextRowset(); } - function result($result, $field = 0) { + function result($query, $field = 0) { + $result = $this->query($query); if (!$result) { return false; } Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/adminer/select.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -169,7 +169,7 @@ } else { // use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest) $found_rows = (intval($limit) && $group && count($group) < count($select) - ? $connection->result($connection->query(" SELECT FOUND_ROWS()")) // space to allow mysql.trace_mode + ? $connection->result(" SELECT FOUND_ROWS()") // space to allow mysql.trace_mode : count($rows) ); @@ -248,7 +248,7 @@ // slow with big tables ob_flush(); flush(); - $found_rows = $connection->result($connection->query("SELECT COUNT(*) FROM " . idf_escape($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : ""))); + $found_rows = $connection->result("SELECT COUNT(*) FROM " . idf_escape($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : "")); } echo "<p>"; if (intval($limit) && $found_rows > $limit) { Modified: branches/sqlite/adminer/user.inc.php =================================================================== --- branches/sqlite/adminer/user.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/adminer/user.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -105,7 +105,7 @@ $row = $_POST; $grants = $new_grants; } else { - $row = $_GET + array("host" => $connection->result($connection->query("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', -1)"))); // create user on the same domain by default + $row = $_GET + array("host" => $connection->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', -1)")); // create user on the same domain by default $row["pass"] = $old_pass; if (strlen($old_pass)) { $row["hashed"] = true; Modified: branches/sqlite/editor/include/adminer.inc.php =================================================================== --- branches/sqlite/editor/include/adminer.inc.php 2009-10-28 13:42:51 UTC (rev 1219) +++ branches/sqlite/editor/include/adminer.inc.php 2009-10-29 21:18:55 UTC (rev 1220) @@ -14,7 +14,7 @@ global $connection; $dbs = get_databases(false); return (!$dbs - ? $connection->result($connection->query("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1)")) // username without the database list + ? $connection->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1)") // username without the database list : $dbs[(information_schema($dbs[0]) ? 1 : 0)] // first available database ); } @@ -374,7 +374,7 @@ if (count($foreign_key["source"]) == 1) { $id = idf_escape($foreign_key["target"][0]); $name = $this->rowDescription($foreign_key["table"]); - if (strlen($name) && $connection->result($connection->query("SELECT COUNT(*) FROM " . idf_escape($foreign_key["table"]))) <= 1000) { // optionlist with more than 1000 options would be too big + if (strlen($name) && $connection->result("SELECT COUNT(*) FROM " . idf_escape($foreign_key["table"])) <= 1000) { // optionlist with more than 1000 options would be too big $return = array("" => ""); $result = $connection->query("SELECT $id, $name FROM " . idf_escape($foreign_key["table"]) . " ORDER BY 2"); while ($row = $result->fetch_row()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2009-12-10 13:00:36
|
Revision: 1263 http://adminer.svn.sourceforge.net/adminer/?rev=1263&view=rev Author: jakubvrana Date: 2009-12-10 13:00:23 +0000 (Thu, 10 Dec 2009) Log Message: ----------- Merge from trunk Modified Paths: -------------- branches/sqlite/adminer/create.inc.php branches/sqlite/adminer/database.inc.php branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/foreign.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/include/auth.inc.php branches/sqlite/adminer/include/bootstrap.inc.php branches/sqlite/adminer/include/connect.inc.php branches/sqlite/adminer/include/design.inc.php branches/sqlite/adminer/include/editing.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/include/lang.inc.php branches/sqlite/adminer/lang/cs.inc.php branches/sqlite/adminer/lang/de.inc.php branches/sqlite/adminer/lang/es.inc.php branches/sqlite/adminer/lang/et.inc.php branches/sqlite/adminer/lang/fr.inc.php branches/sqlite/adminer/lang/it.inc.php branches/sqlite/adminer/lang/nl.inc.php branches/sqlite/adminer/lang/ru.inc.php branches/sqlite/adminer/lang/sk.inc.php branches/sqlite/adminer/lang/zh-tw.inc.php branches/sqlite/adminer/lang/zh.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/adminer/sql.inc.php branches/sqlite/adminer/static/default.css branches/sqlite/adminer/static/editing.js branches/sqlite/adminer/table.inc.php branches/sqlite/adminer/user.inc.php branches/sqlite/changes.txt branches/sqlite/compile.php branches/sqlite/editor/include/adminer.inc.php branches/sqlite/editor/include/editing.inc.php branches/sqlite/todo.txt branches/sqlite/version.js Property Changed: ---------------- branches/sqlite/ branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/tests/logout.html Property changes on: branches/sqlite ___________________________________________________________________ Added: svn:mergeinfo + /trunk:1193-1261 Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/create.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -155,8 +155,8 @@ <p> <?php echo lang('Table name'); ?>: <input name="name" maxlength="64" value="<?php echo h($row["name"]); ?>"> <?php echo ($engines ? html_select("Engine", array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) : ""); ?> -<?php echo html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]); ?> -<input type="submit" value="<?php echo lang('Save'); ?>"> + <?php echo html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]); ?> + <input type="submit" value="<?php echo lang('Save'); ?>"> </p> <table cellspacing="0" id="edit-fields"> <?php $column_comments = edit_fields($row["fields"], $collations, "TABLE", $suhosin, $foreign_keys); ?> Modified: branches/sqlite/adminer/database.inc.php =================================================================== --- branches/sqlite/adminer/database.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/database.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -1,10 +1,8 @@ <?php if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP changes add.x to add_x - if ($_POST["drop"]) { - unset($_SESSION["databases"][$_GET["server"]]); - query_redirect("DROP DATABASE " . idf_escape(DB), substr(preg_replace('~db=[^&]*&~', '', ME), 0, -1), lang('Database has been dropped.')); - } elseif (DB !== $_POST["name"]) { + if (DB !== $_POST["name"]) { // create or rename database + restart_session(); unset($_SESSION["databases"][$_GET["server"]]); // clear cache $dbs = explode("\n", str_replace("\r", "", $_POST["name"])); $failed = false; @@ -18,6 +16,7 @@ } } if (query_redirect(queries(), ME . "db=" . urlencode($last), lang('Database has been created.'), !strlen(DB), false, $failed)) { + //! move triggers $result = $connection->query("SHOW TABLES"); while ($row = $result->fetch_row()) { if (!queries("RENAME TABLE " . idf_escape($row[0]) . " TO " . idf_escape($_POST["name"]) . "." . idf_escape($row[0]))) { @@ -26,6 +25,7 @@ } if (!$row) { queries("DROP DATABASE " . idf_escape(DB)); + //! saved to history of removed database } queries_redirect(preg_replace('~db=[^&]*&~', '', ME) . "db=" . urlencode($_POST["name"]), lang('Database has been renamed.'), !$row); } @@ -42,7 +42,7 @@ $collations = collations(); $name = DB; -$collate = array(); +$collate = null; if ($_POST) { $name = $_POST["name"]; $collate = $_POST["collation"]; @@ -55,14 +55,9 @@ break; } } -} elseif (($create = $connection->result("SHOW CREATE DATABASE " . idf_escape(DB), 1))) { - if (preg_match('~ COLLATE ([^ ]+)~', $create, $match)) { - $collate = $match[1]; - } elseif (preg_match('~ CHARACTER SET ([^ ]+)~', $create, $match)) { - // default collation - $collate = $collations[$match[1]][0]; +} else { + $collate = db_collation(DB, $collations); } -} ?> <form action="" method="post"> @@ -75,9 +70,7 @@ <input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="submit" value="<?php echo lang('Save'); ?>"> <?php -if (strlen(DB)) { - echo "<input type='submit' name='drop' value='" . lang('Drop') . "'$confirm>\n"; -} elseif (!$_POST["add_x"]) { +if (!$_POST["add_x"]) { echo "<input type='image' name='add' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>\n"; } ?> Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/db.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -39,7 +39,7 @@ page_header(lang('Database') . ": " . h(DB), $error, false); echo '<p><a href="' . h(ME) . 'database=">' . lang('Alter database') . "</a>\n"; -echo '<p><a href="' . h(ME) . 'schema=">' . lang('Database schema') . "</a>\n"; +echo '<a href="' . h(ME) . 'schema=">' . lang('Database schema') . "</a>\n"; echo "<h3>" . lang('Tables and views') . "</h3>\n"; $table_status = table_status(); @@ -48,7 +48,7 @@ } else { echo "<form action='' method='post'>\n"; echo "<table cellspacing='0' class='nowrap' onclick='table_click(event);'>\n"; - echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="form_check(this, /^(tables|views)\[/);"><th>' . lang('Table') . '<td>' . lang('Engine') . '<td>' . lang('Collation') . '<td>' . lang('Data Length') . '<td>' . lang('Index Length') . '<td>' . lang('Data Free') . '<td>' . lang('Auto Increment') . '<td>' . lang('Rows') . ($comments_support ? '<td>' . lang('Comment') : '') . "</thead>\n"; + echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="form_check(this, /^(tables|views)\[/);" title="' . count($table_status) . '"><th>' . lang('Table') . '<td>' . lang('Engine') . '<td>' . lang('Collation') . '<td>' . lang('Data Length') . '<td>' . lang('Index Length') . '<td>' . lang('Data Free') . '<td>' . lang('Auto Increment') . '<td>' . lang('Rows') . ($comments_support ? '<td>' . lang('Comment') : '') . "</thead>\n"; foreach ($table_status as $row) { $name = $row["Name"]; echo '<tr' . odd() . '><td>' . checkbox((isset($row["Rows"]) ? "tables[]" : "views[]"), $name, in_array($name, $tables_views, true), "", "form_uncheck('check-all');"); Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -199,7 +199,7 @@ } function query($query, $unbuffered = false) { - $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, !$unbuffered); + $this->setAttribute(1000, !$unbuffered); // 1000 - PDO::MYSQL_ATTR_USE_BUFFERED_QUERY return parent::query($query, $unbuffered); } } @@ -229,6 +229,7 @@ // SHOW DATABASES can take a very long time so it is cached $return = &$_SESSION["databases"][$_GET["server"]]; if (!isset($return)) { + restart_session(); $return = get_vals("SHOW DATABASES"); if ($flush) { ob_flush(); @@ -238,9 +239,27 @@ return $return; } - /**Get supported engines + /** Get database collation + * @param string + * @param array result of collations() * @return array */ + function db_collation($db, $collations) { + global $connection; + $return = null; + $create = $connection->result("SHOW CREATE DATABASE " . idf_escape($db), 1); + if (preg_match('~ COLLATE ([^ ]+)~', $create, $match)) { + $return = $match[1]; + } elseif (preg_match('~ CHARACTER SET ([^ ]+)~', $create, $match)) { + // default collation + $return = $collations[$match[1]][0]; + } + return $return; + } + + /** Get supported engines + * @return array + */ function engines() { global $connection; $return = array(); @@ -289,9 +308,12 @@ // ignore internal comment, unnecessary since MySQL 5.1.21 $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); } + if (strlen($name)) { + return $row; + } $return[$row["Name"]] = $row; } - return (strlen($name) ? $return[$name] : $return); + return $return; } /** Property changes on: branches/sqlite/adminer/drivers/mysql.inc.php ___________________________________________________________________ Added: svn:mergeinfo + /trunk/adminer/drivers/mysql.inc.php:1193-1261 /trunk/adminer/include/mysql.inc.php:675-681,1193-1262 Modified: branches/sqlite/adminer/foreign.inc.php =================================================================== --- branches/sqlite/adminer/foreign.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/foreign.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -43,6 +43,7 @@ <form action="" method="post"> <p> +<?php if (!strlen($row["db"])) { ?> <?php echo lang('Target table'); ?>: <?php echo html_select("table", array_keys(table_status_referencable()), $row["table"], "this.form['change-js'].value = '1'; this.form.submit();"); ?> <input type="hidden" name="change-js" value=""> @@ -64,8 +65,9 @@ <?php echo lang('ON DELETE'); ?>: <?php echo html_select("on_delete", array(-1 => "") + $on_actions, $row["on_delete"]); ?> <?php echo lang('ON UPDATE'); ?>: <?php echo html_select("on_update", array(-1 => "") + $on_actions, $row["on_update"]); ?> <p> -<input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="submit" value="<?php echo lang('Save'); ?>"> +<noscript><p><input type="submit" name="add" value="<?php echo lang('Add column'); ?>"></noscript> +<?php } ?> <?php if (strlen($_GET["name"])) { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo $confirm; ?>><?php } ?> -<noscript><p><input type="submit" name="add" value="<?php echo lang('Add column'); ?>"></noscript> +<input type="hidden" name="token" value="<?php echo $token; ?>"> </form> Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/include/adminer.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -70,21 +70,23 @@ /** Print links after select heading * @param array result of SHOW TABLE STATUS - * @param strin new item options, NULL for no new item + * @param string new item options, NULL for no new item * @return null */ function selectLinks($tableStatus, $set = "") { - $TABLE = $tableStatus["Name"]; - echo '<p><a href="' . h(ME) . 'select=' . urlencode($TABLE) . '">' . lang('Select table') . '</a>'; - echo ' <a href="' . h(ME) . 'table=' . urlencode($TABLE) . '">' . lang('Table structure') . '</a>'; + echo '<p class="tabs">'; + $links = array("select" => lang('Select data'), "table" => lang('Show structure')); if (isset($tableStatus["Rows"])) { - echo ' <a href="' . h(ME) . 'create=' . urlencode($TABLE) . '">' . lang('Alter table') . '</a>'; + $links["create"] = lang('Alter table'); } else { - echo ' <a href="' . h(ME) . 'view=' . urlencode($TABLE) . '">' . lang('Alter view') . '</a>'; + $links["view"] = lang('Alter view'); } if (isset($set)) { - echo ' <a href="' . h(ME . 'edit=' . urlencode($TABLE) . $set) . '">' . lang('New item') . '</a>'; + $links["edit"] = lang('New item'); } + foreach ($links as $key => $val) { + echo " <a href='" . h(ME) . "$key=" . urlencode($tableStatus["Name"]) . ($key == "edit" ? $set : "") . "'>" . bold($val, isset($_GET[$key])) . "</a>"; + } echo "\n"; } @@ -138,7 +140,7 @@ * @return string */ function selectVal($val, $link, $field) { - $return = ($field["type"] == "char" ? "<code>$val</code>" : $val); + $return = ($val != "<i>NULL</i>" && $field["type"] == "char" ? "<code>$val</code>" : $val); if (ereg('blob|binary', $field["type"]) && !is_utf8($val)) { $return = lang('%d byte(s)', strlen($val)); } @@ -362,6 +364,7 @@ */ function messageQuery($query) { global $driver; + restart_session(); $id = "sql-" . count($_SESSION["messages"]); $_SESSION["history"][$_GET["server"]][DB][] = $query; return " <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a><div id='$id' class='hidden'><pre class='jush-$driver'>" . shorten_utf8($query, 1000) . '</pre><a href="' . h(ME . 'sql=&history=' . (count($_SESSION["history"][$_GET["server"]][DB]) - 1)) . '">' . lang('Edit') . '</a></div>'; @@ -407,7 +410,12 @@ * @return string custom input field or empty string for default */ function editInput($table, $field, $attrs, $value) { - return ''; + if ($field["type"] == "enum") { + return ($field["null"] ? "<label><input type='radio'$attrs value=''" . (isset($value) || isset($_GET["select"]) ? "" : " checked") . "><em>NULL</em></label> " : "") + . "<input type='radio'$attrs value='0'" . ($value === 0 ? " checked" : "") . ">" + ; + } + return ""; } /** Process sent input @@ -475,9 +483,9 @@ $databases = get_databases(); ?> <form action="" method="post"> -<p> -<a href="<?php echo h(ME); ?>sql="><?php echo lang('SQL command'); ?></a> -<a href="<?php echo h(ME); ?>dump=<?php echo urlencode(isset($_GET["table"]) ? $_GET["table"] : $_GET["select"]); ?>"><?php echo lang('Dump'); ?></a> +<p class="logout"> +<a href="<?php echo h(ME); ?>sql="><?php echo bold(lang('SQL command'), isset($_GET["sql"])); ?></a> +<a href="<?php echo h(ME); ?>dump=<?php echo urlencode(isset($_GET["table"]) ? $_GET["table"] : $_GET["select"]); ?>"><?php echo bold(lang('Dump'), isset($_GET["dump"])); ?></a> <input type="hidden" name="token" value="<?php echo $_SESSION["tokens"][$_GET["server"]]; ?>"> <input type="submit" name="logout" value="<?php echo lang('Logout'); ?>"> </p> @@ -502,7 +510,7 @@ } else { $this->tablesPrint($tables); } - echo '<p><a href="' . h(ME) . 'create=">' . lang('Create new table') . "</a>\n"; + echo '<p><a href="' . h(ME) . 'create=">' . bold(lang('Create new table'), $_GET["create"] === "") . "</a>\n"; } } } @@ -514,8 +522,8 @@ function tablesPrint($tables) { echo "<p id='tables'>\n"; foreach ($tables as $table) { - echo '<a href="' . h(ME) . 'select=' . urlencode($table) . '">' . lang('select') . '</a> '; - echo '<a href="' . h(ME) . 'table=' . urlencode($table) . '">' . $this->tableName(array("Name" => $table)) . "</a><br>\n"; //! Adminer::tableName may work with full table status + echo '<a href="' . h(ME) . 'select=' . urlencode($table) . '">' . bold(lang('select'), $_GET["select"] == $table) . '</a> '; + echo '<a href="' . h(ME) . 'table=' . urlencode($table) . '">' . bold($this->tableName(array("Name" => $table)), $_GET["table"] == $table) . "</a><br>\n"; //! Adminer::tableName may work with full table status } } Modified: branches/sqlite/adminer/include/auth.inc.php =================================================================== --- branches/sqlite/adminer/include/auth.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/include/auth.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -5,26 +5,23 @@ exit; } -$ignore = array("driver", "server", "username", "password"); if (isset($_POST["server"])) { session_regenerate_id(); // defense against session fixation $_SESSION["usernames"][$_POST["server"]] = $_POST["username"]; $_SESSION["passwords"][$_POST["server"]] = $_POST["password"]; $_SESSION["tokens"][$_POST["server"]] = rand(1, 1e6); // defense against cross-site request forgery $same_driver = (string) $_GET["driver"] === $_POST["driver"]; - if (count($_POST) == count($ignore) || !$same_driver) { + if (count($_POST) == 4 || !$same_driver) { // 4 - count($ignore) $location = ((string) $_GET["server"] === $_POST["server"] && $same_driver ? remove_from_uri() : substr(preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]) . "?" . ($_POST["driver"] ? "driver=" . urlencode($_POST["driver"]) . "&" : "") . (strlen($_POST["server"]) ? "server=" . urlencode($_POST["server"]) . "&" : ""), 0, -1)); if (!isset($_COOKIE[session_name()])) { $location .= (strpos($location, "?") === false ? "?" : "&") . SID; } redirect($location); } - if ($_POST["token"]) { - $_POST["token"] = $_SESSION["tokens"][$_POST["server"]]; - } $_GET["server"] = $_POST["server"]; } elseif (isset($_POST["logout"])) { - if ($_POST["token"] != $_SESSION["tokens"][$_GET["server"]]) { + $token = $_SESSION["tokens"][$_GET["server"]]; + if ($token && $_POST["token"] != $token) { page_header(lang('Logout'), lang('Invalid CSRF token. Send the form again.')); page_footer("db"); exit; @@ -32,12 +29,15 @@ foreach (array("usernames", "passwords", "databases", "tokens", "history") as $val) { unset($_SESSION[$val][$_GET["server"]]); } + if (!isset($_SESSION["passwords"])) { // don't require login to logout + $_SESSION["passwords"] = array(); + } redirect(substr(ME, 0, -1), lang('Logout successful.')); } } function auth_error($exception = null) { - global $ignore, $connection, $adminer; + global $connection, $adminer; $session_name = session_name(); $username = $_SESSION["usernames"][$_GET["server"]]; unset($_SESSION["usernames"][$_GET["server"]]); @@ -48,10 +48,7 @@ echo "<form action='' method='post'>\n"; $adminer->loginForm($username); echo "<p>\n"; - hidden_fields($_POST, $ignore); // expired session - foreach ($_FILES as $key => $val) { - echo '<input type="hidden" name="files[' . h($key) . ']" value="' . ($val["error"] ? $val["error"] : base64_encode(file_get_contents($val["tmp_name"]))) . '">'; - } + hidden_fields($_POST, array("driver", "server", "username", "password")); // expired session echo "<input type='submit' value='" . lang('Login') . "'>\n</form>\n"; page_footer("auth"); } @@ -66,3 +63,7 @@ exit; } unset($username); + +if (!$_SESSION["tokens"][$_GET["server"]]) { + $_SESSION["tokens"][$_GET["server"]] = rand(1, 1e6); // defense against cross-site request forgery +} Modified: branches/sqlite/adminer/include/bootstrap.inc.php =================================================================== --- branches/sqlite/adminer/include/bootstrap.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/include/bootstrap.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -43,32 +43,31 @@ $_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"] . (strlen($_SERVER["QUERY_STRING"]) ? "?$_SERVER[QUERY_STRING]" : ""); // IIS 5 compatibility } -if (!ini_get("session.auto_start")) { - @ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled - session_name("adminer_sid"); // use specific session name to get own namespace - $params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $_SERVER["HTTPS"]); - if (version_compare(PHP_VERSION, '5.2.0') >= 0) { - $params[] = true; // HttpOnly - } - call_user_func_array('session_set_cookie_params', $params); - session_start(); +session_write_close(); // disable session.auto_start +@ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled +session_name("adminer_sid"); // use specific session name to get own namespace +$params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $_SERVER["HTTPS"]); +if (version_compare(PHP_VERSION, '5.2.0') >= 0) { + $params[] = true; // HttpOnly } +call_user_func_array('session_set_cookie_params', $params); // ini_set() may be disabled +session_start(); // disable magic quotes to be able to use database escaping function if (get_magic_quotes_gpc()) { - $process = array(&$_GET, &$_POST, &$_COOKIE); - while (list($key, $val) = each($process)) { - foreach ($val as $k => $v) { - unset($process[$key][$k]); - if (is_array($v)) { - $process[$key][stripslashes($k)] = $v; - $process[] = &$process[$key][stripslashes($k)]; - } else { - $process[$key][stripslashes($k)] = ($filter ? $v : stripslashes($v)); - } - } - } - unset($process); + $process = array(&$_GET, &$_POST, &$_COOKIE); + while (list($key, $val) = each($process)) { + foreach ($val as $k => $v) { + unset($process[$key][$k]); + if (is_array($v)) { + $process[$key][stripslashes($k)] = $v; + $process[] = &$process[$key][stripslashes($k)]; + } else { + $process[$key][stripslashes($k)] = ($filter ? $v : stripslashes($v)); + } + } + } + unset($process); } if (function_exists("set_magic_quotes_runtime")) { set_magic_quotes_runtime(false); @@ -94,6 +93,11 @@ include "./include/editing.inc.php"; include "./include/export.inc.php"; +session_cache_limiter(""); // to allow restarting session +if (!ini_get("session.use_cookies") || @ini_set("session.use_cookies", false) !== false) { // @ - may be disabled + session_write_close(); // improves concurrency if a user opens several pages at once, may be restarted later +} + $confirm = " onclick=\"return confirm('" . lang('Are you sure?') . "');\""; $token = $_SESSION["tokens"][$_GET["server"]]; $error = ($_POST Modified: branches/sqlite/adminer/include/connect.inc.php =================================================================== --- branches/sqlite/adminer/include/connect.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/include/connect.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -1,12 +1,39 @@ <?php function connect_error() { - global $connection, $VERSION; + global $connection, $VERSION, $token, $error; if (strlen(DB)) { page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), false); } else { + if ($_POST["db"] && !$error) { + unset($_SESSION["databases"][$_GET["server"]]); + foreach ($_POST["db"] as $db) { + if (!queries("DROP DATABASE " . idf_escape($db))) { + break; + } + } + queries_redirect(substr(ME, 0, -1), lang('Database has been dropped.'), !$connection->error); + } + page_header(lang('Select database'), "", null); echo "<p><a href='" . h(ME) . "database='>" . lang('Create new database') . "</a>\n"; db_info(); + $databases = get_databases(); + if ($databases) { + $collations = collations(); + echo "<form action='' method='post'>\n"; + echo "<table cellspacing='0' onclick='table_click(event);'>\n"; + echo "<thead><tr><td><input type='hidden' name='token' value='$token'> <th>" . lang('Database') . "<td>" . lang('Collation') . "</thead>\n"; + foreach ($databases as $db) { + $root = h(ME) . "db=" . urlencode($db); + echo "<tr" . odd() . "><td>" . checkbox("db[]", $db, false); + echo "<th><a href='$root'>" . h($db) . "</a>"; + echo "<td><a href='$root&database='>" . nbsp(db_collation($db, $collations)) . "</a>"; + echo "\n"; + } + echo "</table>\n"; + echo "<p><input type='submit' name='drop' value='" . lang('Drop') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + form_checked(this, /db/) + ')');\">\n"; + echo "</form>\n"; + } } page_footer("db"); } Modified: branches/sqlite/adminer/include/design.inc.php =================================================================== --- branches/sqlite/adminer/include/design.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/include/design.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -40,6 +40,7 @@ echo "$title\n"; } echo "<h2>$title_all</h2>\n"; + restart_session(); if ($_SESSION["messages"]) { echo "<div class='message'>" . implode("</div>\n<div class='message'>", $_SESSION["messages"]) . "</div>\n"; $_SESSION["messages"] = array(); @@ -51,10 +52,6 @@ if (strlen(DB) && $databases && !in_array(DB, $databases, true)) { $databases = null; } - if (isset($databases) && !isset($_GET["sql"])) { - // improves concurrency if a user opens several pages at once - session_write_close(); - } if ($error) { echo "<div class='error'>$error</div>\n"; } Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/include/editing.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -76,6 +76,10 @@ } } +/** Get referencable tables with single column primary key except self +* @param string +* @return array ($table_name => $field) +*/ function referencable_primary($self) { $return = array(); // table_name => field foreach (table_status_referencable() as $table_name => $table) { @@ -94,21 +98,37 @@ return $return; } +/** Print table columns for type edit +* @param string +* @param array +* @param array +* @param array returned by referencable_primary() +* @return null +*/ function edit_type($key, $field, $collations, $foreign_keys = array()) { global $structured_types, $unsigned, $inout; ?> <td><select name="<?php echo $key; ?>[type]" class="type" onchange="editing_type_change(this);"><?php echo optionlist($structured_types + ($foreign_keys ? array(lang('Foreign keys') => $foreign_keys) : array()), $field["type"]); ?></select> -<td><input name="<?php echo $key; ?>[length]" value="<?php echo h($field["length"]); ?>" size="3"> +<td><input name="<?php echo $key; ?>[length]" value="<?php echo h($field["length"]); ?>" size="3" onfocus="editing_length_focus(this);"> <td><?php echo "<select name='$key" . "[collation]'" . (ereg('(char|text|enum|set)$', $field["type"]) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>'; echo ($unsigned ? " <select name='$key" . "[unsigned]'" . (!$field["type"] || ereg('(int|float|double|decimal)$', $field["type"]) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : ''); } +/** Filter length value including enums +* @param string +* @return string +*/ function process_length($length) { global $enum_length; return (preg_match("~^\\s*(?:$enum_length)(?:\\s*,\\s*(?:$enum_length))*\\s*\$~", $length) && preg_match_all("~$enum_length~", $length, $matches) ? implode(",", $matches[0]) : preg_replace('~[^0-9,+-]~', '', $length)); } +/** Create SQL string from field type +* @param array +* @param string +* @return string +*/ function process_type($field, $collate = "COLLATE") { global $connection, $unsigned; return " $field[type]" @@ -118,6 +138,11 @@ ; } +/** Create SQL string from field +* @param array basic field information +* @param array information about field type +* @return string +*/ function process_field($field, $type_field) { global $connection, $comments_support; return idf_escape($field["field"]) . process_type($type_field) @@ -128,6 +153,10 @@ ; } +/** Get type class to use in CSS +* @param string +* @return string class='' +*/ function type_class($type) { foreach (array( 'char' => 'text', @@ -141,24 +170,33 @@ } } +/** Print table interior for fields editing +* @param array +* @param array +* @param string TABLE or PROCEDURE +* @param int number of fields allowed by Suhosin +* @param array returned by referencable_primary() +* @return bool column comments used +*/ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array()) { global $inout, $comments_support; $column_comments = false; foreach ($fields as $field) { if (strlen($field["comment"])) { $column_comments = true; + break; } } ?> <thead><tr> <?php if ($type == "PROCEDURE") { ?><td> <?php } ?> <th><?php echo ($type == "TABLE" ? lang('Column name') : lang('Parameter name')); ?> -<td><?php echo lang('Type'); ?> +<td><?php echo lang('Type'); ?><textarea id="enum-edit" rows="4" cols="10" style="display: none;" onblur="editing_length_blur(this);"></textarea> <td><?php echo lang('Length'); ?> <td><?php echo lang('Options'); ?> <?php if ($type == "TABLE") { ?> <td>NULL -<td><input type="radio" name="auto_increment_col" value=""><?php echo lang('Auto Increment'); ?> +<td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">A_I</acronym> <td class="hidden"><?php echo lang('Default values'); ?> <?php echo ($comments_support ? "<td" . ($column_comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?> <?php } ?> @@ -193,6 +231,10 @@ return $column_comments; } +/** Move fields up and down or add field +* @param array +* @return null +*/ function process_fields(&$fields) { ksort($fields); $offset = 0; @@ -230,10 +272,19 @@ } } +/** Callback used in routine() +* @param array +* @return string +*/ function normalize_enum($match) { return "'" . str_replace("'", "''", addcslashes(stripcslashes(str_replace($match[0]{0} . $match[0]{0}, $match[0]{0}, substr($match[0], 1, -1))), '\\')) . "'"; } +/** Get information about stored routine +* @param string +* @param string FUNCTION or PROCEDURE +* @return array ("fields" => array("field" => , "type" => , "length" => , "unsigned" => , "inout" => , "collation" => ), "returns" => , "definition" => ) +*/ function routine($name, $type) { global $connection, $enum_length, $inout, $types; $aliases = array("bit" => "tinyint", "bool" => "tinyint", "boolean" => "tinyint", "integer" => "int", "double precision" => "float", "real" => "float", "dec" => "decimal", "numeric" => "decimal", "fixed" => "decimal", "national char" => "char", "national varchar" => "varchar"); @@ -262,6 +313,13 @@ return array("fields" => $fields, "returns" => $returns, "definition" => $match[15]); } +/** Issue grant or revoke commands +* @param string GRANT or REVOKE +* @param array +* @param string +* @param string +* @return +*/ function grant($grant, $privileges, $columns, $on) { if (!$privileges) { return true; @@ -276,6 +334,16 @@ return queries("$grant " . preg_replace('~(GRANT OPTION)\\([^)]*\\)~', '\\1', implode("$columns, ", $privileges) . $columns) . $on); } +/** Drop old object and create a new one +* @param string drop query +* @param string create query +* @param string +* @param string +* @param string +* @param string +* @param string +* @return bool dropped +*/ function drop_create($drop, $create, $location, $message_drop, $message_alter, $message_create, $name) { if ($_POST["drop"]) { return query_redirect($drop, $location, $message_drop, true, !$_POST["dropped"]); @@ -283,6 +351,7 @@ $dropped = strlen($name) && ($_POST["dropped"] || queries($drop)); $created = queries($create); if (!queries_redirect($location, (strlen($name) ? $message_alter : $message_create), $created) && $dropped) { + restart_session(); $_SESSION["messages"][] = $message_drop; } return $dropped; Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/include/functions.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -75,24 +75,6 @@ return (strlen($label) ? "<label for='checkbox-$id'>$return" . h($label) . "</label>" : $return); } -/** Generate HTML radio list -* @param string -* @param array -* @param string -* @param string true for no onchange, false for radio -* @return string -*/ -function html_select($name, $options, $value = "", $onchange = true) { - if ($onchange) { - return "<select name='" . h($name) . "'" . (is_string($onchange) ? " onchange=\"$onchange\"" : "") . ">" . optionlist($options, $value) . "</select>"; - } - $return = ""; - foreach ($options as $key => $val) { - $return .= "<label><input type='radio' name='" . h($name) . "' value='" . h($key) . "'" . ($key == $value ? " checked" : "") . ">" . h($val) . "</label>"; - } - return $return; -} - /** Generate list of HTML options * @param array array of strings or arrays (creates optgroup) * @param mixed @@ -115,6 +97,24 @@ return $return; } +/** Generate HTML radio list +* @param string +* @param array +* @param string +* @param string true for no onchange, false for radio +* @return string +*/ +function html_select($name, $options, $value = "", $onchange = true) { + if ($onchange) { + return "<select name='" . h($name) . "'" . (is_string($onchange) ? " onchange=\"$onchange\"" : "") . ">" . optionlist($options, $value) . "</select>"; + } + $return = ""; + foreach ($options as $key => $val) { + $return .= "<label><input type='radio' name='" . h($name) . "' value='" . h($key) . "'" . ($key == $value ? " checked" : "") . ">" . h($val) . "</label>"; + } + return $return; +} + /** Get list of values from database * @param string * @param mixed @@ -167,7 +167,7 @@ $return = array(); foreach ((array) $where["where"] as $key => $val) { $key = bracket_escape($key, "back"); - $return[] = (preg_match('~^[A-Z0-9_]+\\(`(?:[^`]|``)+`\\)$~', $key) ? $key : idf_escape($key)) . " = " . exact_value($val); //! enum and set, columns looking like functions + $return[] = (preg_match('~^[A-Z0-9_]+\\(`(?:[^`]|``)+`\\)$~', $key) ? $key : idf_escape($key)) . " LIKE " . exact_value(addcslashes($val, "%_")); // LIKE because of floats //! enum and set, columns looking like functions } foreach ((array) $where["null"] as $key) { $key = bracket_escape($key, "back"); @@ -204,6 +204,15 @@ return setcookie($name, $value, time() + 2592000, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"])); // 2592000 = 30 * 24 * 60 * 60 } +/** Restart stopped session +* @return null +*/ +function restart_session() { + if (!ini_get("session.use_cookies")) { + session_start(); + } +} + /** Send Location header and exit * @param string * @param string @@ -211,6 +220,7 @@ */ function redirect($location, $message = null) { if (isset($message)) { + restart_session(); $_SESSION["messages"][] = $message; } header("Location: " . (strlen($location) ? $location : ".")); @@ -228,13 +238,13 @@ */ function query_redirect($query, $location, $message, $redirect = true, $execute = true, $failed = false) { global $connection, $error, $adminer; + if ($execute) { + $failed = !$connection->query($query); + } $sql = ""; if ($query) { $sql = $adminer->messageQuery($query); } - if ($execute) { - $failed = !$connection->query($query); - } if ($failed) { $error = h($connection->error) . $sql; return false; @@ -274,8 +284,7 @@ * @return string */ function remove_from_uri($param = "") { - $param = "($param|" . session_name() . ")"; - return substr(preg_replace("~([?&])$param=[^&]*&~", '\\1', "$_SERVER[REQUEST_URI]&"), 0, -1); + return substr(preg_replace("~(?<=[?&])($param" . (SID ? "" : "|" . session_name()) . ")=[^&]*&~", '', "$_SERVER[REQUEST_URI]&"), 0, -1); } /** Generate page number for pagination @@ -286,22 +295,12 @@ return " " . ($page == $_GET["page"] ? $page + 1 : '<a href="' . h(remove_from_uri("page") . ($page ? "&page=$page" : "")) . '">' . ($page + 1) . "</a>"); } -/** Get file contents from $_FILES or $_POST["files"] +/** Get file contents from $_FILES * @param string * @param bool -* @return string +* @return mixed int for error, string otherwise */ function get_file($key, $decompress = false) { - // returns int for error, string otherwise - $file = $_POST["files"][$key]; - if (isset($file)) { - // get the file from hidden field if the user was logged out - $length = strlen($file); - if ($length && $length < 4) { - return intval($file); - } - return base64_decode($file); - } $file = $_FILES[$key]; if (!$file || $file["error"]) { return $file["error"]; @@ -407,11 +406,8 @@ echo "<td class='function'>"; $functions = (isset($_GET["select"]) ? array("orig" => lang('original')) : array()) + $adminer->editFunctions($field); if ($field["type"] == "enum") { - echo " <td>" . ($functions["orig"] ? "<label><input type='radio' name='fields[$name]' value='-1' checked><em>$functions[orig]</em></label> " : ""); - if (in_array("NULL", $functions)) { - echo "<label><input type='radio' name='fields[$name]' value=''" . (isset($value) || $functions["orig"] ? '' : ' checked') . "><em>NULL</em></label> "; - } - echo "<input type='radio' name='fields[$name]' value='0'" . ($value === 0 ? ' checked' : '') . '>'; + echo nbsp($functions[""]) . "<td>" . ($functions["orig"] ? "<label><input type='radio' name='fields[$name]' value='-1' checked><em>$functions[orig]</em></label> " : ""); + echo $adminer->editInput($_GET["edit"], $field, " name='fields[$name]'", $value); preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches); foreach ($matches[1] as $i => $val) { $val = stripcslashes(str_replace("''", "'", $val)); @@ -427,8 +423,9 @@ $first++; } $onchange = ($first ? " onchange=\"var f = this.form['function[" . addcslashes($name, "\r\n'\\") . "]']; if ($first > f.selectedIndex) f.selectedIndex = $first;\"" : ""); + $attrs = " name='fields[$name]'$onchange"; echo (count($functions) > 1 ? html_select("function[$name]", $functions, !isset($function) || in_array($function, $functions) ? $function : "") : nbsp(reset($functions))) . '<td>'; - $input = $adminer->editInput($_GET["edit"], $field, " name='fields[$name]'$onchange", $value); // usage in call is without a table + $input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table if (strlen($input)) { echo $input; } elseif ($field["type"] == "set") { //! 64 bits @@ -438,14 +435,14 @@ $checked = (is_int($value) ? ($value >> $i) & 1 : in_array($val, explode(",", $value), true)); echo " <label><input type='checkbox' name='fields[$name][$i]' value='" . (1 << $i) . "'" . ($checked ? ' checked' : '') . "$onchange>" . h($val) . '</label>'; } - } elseif (strpos($field["type"], "text") !== false) { - echo "<textarea name='fields[$name]' cols='50' rows='" . ($driver != "sqlite" || ereg("\n", $value) ? 12 : 1) . "'$onchange>" . h($value) . '</textarea>'; - } elseif (ereg('binary|blob', $field["type"])) { - echo (ini_get("file_uploads") ? "<input type='file' name='$name'$onchange>" : lang('File uploads are disabled.')); + } elseif (ereg('binary|blob', $field["type"]) && ini_get("file_uploads")) { + echo "<input type='file' name='fields-$name'$onchange>"; + } elseif (ereg('text|blob', $field["type"])) { + echo "<textarea cols='50' rows='" . ($driver != "sqlite" || ereg("\n", $value) ? 12 : 1) . "'$attrs>" . h($value) . '</textarea>'; } else { // int(3) is only a display hint $maxlength = (!ereg('int', $field["type"]) && preg_match('~^([0-9]+)(,([0-9]+))?$~', $field["length"], $match) ? ($match[1] + ($match[3] ? 1 : 0) + ($match[2] && !$field["unsigned"] ? 1 : 0)) : ($types[$field["type"]] ? $types[$field["type"]] + ($field["unsigned"] ? 0 : 1) : 0)); - echo "<input name='fields[$name]' value='" . h($value) . "'" . ($maxlength ? " maxlength='$maxlength'" : "") . (ereg('char', $field["type"]) && $field["length"] > 20 ? " size='40'" : "") . "$onchange>"; + echo "<input value='" . h($value) . "'" . ($maxlength ? " maxlength='$maxlength'" : "") . (ereg('char', $field["type"]) && $field["length"] > 20 ? " size='40'" : "") . "$attrs>"; } } } @@ -467,12 +464,12 @@ return intval($value); } elseif ($field["type"] == "set") { return array_sum((array) $value); - } elseif (ereg('binary|blob', $field["type"])) { - $file = get_file($idf); + } elseif (ereg('binary|blob', $field["type"]) && ini_get("file_uploads")) { + $file = get_file("fields-$idf"); if (!is_string($file)) { return false; //! report errors } - return "_binary" . $connection->quote($file); + return $connection->quote($file); } else { return $adminer->processInput($field, $value, $function); } @@ -528,3 +525,12 @@ function print_fieldset($id, $legend, $visible = false) { echo "<fieldset><legend><a href='#fieldset-$id' onclick=\"return !toggle('fieldset-$id');\">$legend</a></legend><div id='fieldset-$id'" . ($visible ? "" : " class='hidden'") . ">\n"; } + +/** Enclose $string to <b> if $bold is true +* @param string +* @param bool +* @return string +*/ +function bold($string, $bold) { + return ($bold ? "<b>$string</b>" : $string); +} Modified: branches/sqlite/adminer/include/lang.inc.php =================================================================== --- branches/sqlite/adminer/include/lang.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/include/lang.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -33,7 +33,7 @@ echo "<form action=''>\n<div id='lang'>"; hidden_fields($_GET, array('lang')); echo lang('Language') . ": " . html_select("lang", $langs, $LANG, "this.form.submit();"); - echo "<noscript><div style='display: inline;'><input type='submit' value='" . lang('Use') . "'></div></noscript>\n"; + echo " <input type='submit' value='" . lang('Use') . "' class='hidden'>\n"; echo "</div>\n</form>\n"; } Modified: branches/sqlite/adminer/lang/cs.inc.php =================================================================== --- branches/sqlite/adminer/lang/cs.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/lang/cs.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -197,8 +197,8 @@ '%d row(s) have been imported.' => array('Byl importován %d záznam.', 'Byly importovány %d záznamy.', 'Bylo importováno %d záznamů.'), 'CSV Import' => 'Import CSV', 'Import' => 'Import', - 'Table structure' => 'Struktura tabulky', - 'Select table' => 'Vypsat tabulku', + 'Show structure' => 'Zobrazit strukturu', + 'Select data' => 'Vypsat data', 'Stop on error' => 'Zastavit při chybě', 'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Byl překročen maximální povolený počet polí. Zvyšte prosím %s a %s.', '(anywhere)' => '(kdekoliv)', Modified: branches/sqlite/adminer/lang/de.inc.php =================================================================== --- branches/sqlite/adminer/lang/de.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/lang/de.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -196,12 +196,10 @@ 'Partition name' => 'Name der Partition', 'Values' => 'Werte', '%d row(s) have been imported.' => array('%d Datensatz importiert.', '%d Datensätze wurden importiert.'), - 'Table structure' => 'Tabellenstruktur', '(anywhere)' => '(beliebig)', 'CSV Import' => 'Importiere CSV', 'Import' => 'Importieren', 'Stop on error' => 'Bei Fehler anhaltan', - 'Select table' => 'Tabelle auswählen', '%.3f s' => '%.3f s', '$1-$3-$5' => '$6.$4.$1', '[yyyy]-mm-dd' => 't.m.[jjjj]', Modified: branches/sqlite/adminer/lang/es.inc.php =================================================================== --- branches/sqlite/adminer/lang/es.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/lang/es.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -11,7 +11,7 @@ 'Create new database' => 'Nueva Base de datos', 'Table has been altered.' => 'Tabla modificada.', 'Table has been created.' => 'Tabla creada.', - 'Alter table' => 'Modificar tabla', + 'Alter table' => 'Modificar Estructura', 'Create table' => 'Crear tabla', 'Table name' => 'Nombre de tabla', 'engine' => 'motor', @@ -50,9 +50,9 @@ 'Alter indexes' => 'Modificar indices', 'Add next' => 'Agregar', 'Language' => 'Idioma', - 'Select' => 'Mostrar Registros', + 'Select' => 'Mostrar', 'New item' => 'Nuevo Registro', - 'Search' => 'Buscar', + 'Search' => 'Condición', 'Sort' => 'Ordenar', 'descending' => 'descendiente', 'Limit' => 'Limit', @@ -196,12 +196,10 @@ 'Partition name' => 'Nombre de Partición', 'Values' => 'Valores', '%d row(s) have been imported.' => array('%d registro importado.', '%d registros importados.'), - 'Table structure' => 'Estructura de la Tabla', '(anywhere)' => '(donde sea)', 'CSV Import' => 'Importar CSV', 'Import' => 'Importar', 'Stop on error' => 'Parar en caso de error', - 'Select table' => 'Seleccionar tabla', '%.3f s' => '%.3f s', '$1-$3-$5' => '$5/$3/$1', '[yyyy]-mm-dd' => 'dd/mm/[aaaa]', Modified: branches/sqlite/adminer/lang/et.inc.php =================================================================== --- branches/sqlite/adminer/lang/et.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/lang/et.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -196,12 +196,10 @@ 'Partition name' => 'Partitsiooni nimi', 'Values' => 'Väärtused', '%d row(s) have been imported.' => array('Imporditi %d rida.', 'Imporditi %d rida.'), - 'Table structure' => 'Tabeli struktuur', '(anywhere)' => '(vahet pole)', 'CSV Import' => 'Impordi CSV', 'Import' => 'Impordi', 'Stop on error' => 'Peatuda vea esinemisel', - 'Select table' => 'Vali tabel', '%.3f s' => '%.3f s', '$1-$3-$5' => '$6.$4.$1', '[yyyy]-mm-dd' => 'd.m.[yyyy]', Modified: branches/sqlite/adminer/lang/fr.inc.php =================================================================== --- branches/sqlite/adminer/lang/fr.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/lang/fr.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -196,12 +196,10 @@ 'Partition name' => 'Nom de la partition', 'Values' => 'Valeurs', '%d row(s) have been imported.' => array('%d ligne a été importé','%d lignes ont été importé'), - 'Table structure' => 'Structure de la table', '(anywhere)' => '(n\'importe où)', 'CSV Import' => 'Importation CVS', 'Import' => 'Importer', 'Stop on error' => 'Arrêt sur erreur', - 'Select table' => 'Selectionner la table', '%.3f s' => '%.3f s', '$1-$3-$5' => '$5/$3/$1', '[yyyy]-mm-dd' => 'jj/mm/[aaaa]', Modified: branches/sqlite/adminer/lang/it.inc.php =================================================================== --- branches/sqlite/adminer/lang/it.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/lang/it.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -196,12 +196,10 @@ 'Partition name' => 'Nome partizione', 'Values' => 'Valori', '%d row(s) have been imported.' => array('%d riga importata.','%d righe importate.'), - 'Table structure' => 'Struttura tabella', '(anywhere)' => '(ovunque)', 'CSV Import' => 'Importa da CSV', 'Import' => 'Importa', 'Stop on error' => 'Stop su errore', - 'Select table' => 'Scegli tabella', '%.3f s' => '%.3f s', '$1-$3-$5' => '$5/$3/$1', '[yyyy]-mm-dd' => 'dd/mm/[yyyy]', Modified: branches/sqlite/adminer/lang/nl.inc.php =================================================================== --- branches/sqlite/adminer/lang/nl.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/lang/nl.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -196,12 +196,10 @@ 'Partition name' => 'Partitie naam', 'Values' => 'Waarden', '%d row(s) have been imported.' => array('%d rij werd geïmporteerd.', '%d rijen werden geïmporteerd.'), - 'Table structure' => 'Tabelstructuur', '(anywhere)' => '(overal)', 'CSV Import' => 'CSV Import', 'Import' => 'Importeren', 'Stop on error' => 'Stoppen bij fout', - 'Select table' => 'Selecteer tabel', '%.3f s' => '%.3f s', '$1-$3-$5' => '$5-$3-$1', '[yyyy]-mm-dd' => 'dd-mm-[jjjj]', Modified: branches/sqlite/adminer/lang/ru.inc.php =================================================================== --- branches/sqlite/adminer/lang/ru.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/lang/ru.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -197,8 +197,6 @@ '%d row(s) have been imported.' => array('Импортирована %d строка.', 'Импортировано %d строки.', 'Импортировано %d строк.'), 'CSV Import' => 'Импорт CSV', 'Import' => 'Импорт', - 'Table structure' => 'Структура таблицы', - 'Select table' => 'Выбрать данные из таблицы', 'Stop on error' => 'Остановить при ошибке', 'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Достигнуто максимальное значение количества доступных полей. Увеличьте %s и %s.', '(anywhere)' => '(в любом месте)', Modified: branches/sqlite/adminer/lang/sk.inc.php =================================================================== --- branches/sqlite/adminer/lang/sk.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/lang/sk.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -197,8 +197,6 @@ '%d row(s) have been imported.' => array('Bol importovaný %d záznam.', 'Boli importované %d záznamy.', 'Bolo importovaných %d záznamov.'), 'CSV Import' => 'Import CSV', 'Import' => 'Import', - 'Table structure' => 'Štruktúra tabuľky', - 'Select table' => 'Vypísať tabuľku', 'Stop on error' => 'Zastaviť pri chybe', 'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Bol prekročený maximálny počet povolených polí. Zvýšte prosím %s a %s.', '(anywhere)' => '(kdekoľvek)', Modified: branches/sqlite/adminer/lang/zh-tw.inc.php =================================================================== --- branches/sqlite/adminer/lang/zh-tw.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/lang/zh-tw.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -196,12 +196,10 @@ 'Partition name' => '分區名', 'Values' => '值', '%d row(s) have been imported.' => '%d行已導入。', - 'Table structure' => '資料表結構', '(anywhere)' => '(任意位置)', 'CSV Import' => '匯入 CSV', 'Import' => '匯入', 'Stop on error' => '出錯時停止', - 'Select table' => '選擇資料表', '%.3f s' => '%.3f秒', '$1-$3-$5' => '$1.$3.$5', '[yyyy]-mm-dd' => '[yyyy].mm.dd', Modified: branches/sqlite/adminer/lang/zh.inc.php =================================================================== --- branches/sqlite/adminer/lang/zh.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/lang/zh.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -196,12 +196,10 @@ 'Partition name' => '分区名', 'Values' => '值', '%d row(s) have been imported.' => '%d 行已导入。', - 'Table structure' => '表结构', '(anywhere)' => '(任意位置)', 'CSV Import' => 'CSV 导入', 'Import' => '导入', 'Stop on error' => '出错时停止', - 'Select table' => '选择表', '%.3f s' => '%.3f 秒', '$1-$3-$5' => '$1.$3.$5', '[yyyy]-mm-dd' => '[yyyy].mm.dd', Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/select.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -39,7 +39,14 @@ dump_headers($TABLE); dump_table($TABLE, ""); if ($_POST["format"] != "sql") { // Editor doesn't send format - dump_csv($select ? $select : array_keys($fields)); + $row = array_keys($fields); + if ($select) { + $row = array(); + foreach ($select as $val) { + $row[] = (ereg('^`(.*)`$', $val, $match) ? idf_unescape($match[1]) : $val); //! columns looking like functions + } + } + dump_csv($row); } if (!is_array($_POST["check"]) || $primary === array()) { dump_data($TABLE, "INSERT", "SELECT $from" . (is_array($_POST["check"]) ? ($where ? " AND " : " WHERE ") . "($where_check)" : "") . $group_by); @@ -57,7 +64,7 @@ if (!$_POST["import"]) { // edit $result = true; $affected = 0; - $command = ($_POST["delete"] ? ($_POST["all"] && !$where && $driver == "sql" ? "TRUNCATE " : "DELETE FROM ") : ($_POST["clone"] ? "INSERT INTO " : "UPDATE ")) . idf_escape($TABLE); + $command = ($_POST["delete"] ? "DELETE FROM " : ($_POST["clone"] ? "INSERT INTO " : "UPDATE ")) . idf_escape($TABLE); $set = array(); if (!$_POST["delete"]) { foreach ($columns as $name => $val) { //! should check also for edit or insert privileges @@ -93,6 +100,7 @@ $cols = array_keys($fields); preg_match_all('~("[^"]*"|[^"\\r\\n])+~', $file, $matches); $affected = count($matches[0]); + queries("START TRANSACTION"); foreach ($matches[0] as $key => $val) { preg_match_all('~(("[^"]*")+|[^,]*),~', "$val,", $matches2); if (!$key && !array_diff($matches2[1], $cols)) { //! doesn't work with column names containing ",\n @@ -111,6 +119,7 @@ } } } + queries("COMMIT"); queries_redirect(remove_from_uri("page"), lang('%d row(s) have been imported.', $affected), $result); } else { $error = upload_error($file); @@ -187,7 +196,7 @@ if (strlen($name)) { $order++; $names[$key] = $name; - echo '<th><a href="' . h(remove_from_uri('(order|desc)[^=]*') . '&order%5B0%5D=' . urlencode($key) . ($_GET["order"] == array($key) && !$_GET["desc"][0] ? '&desc%5B0%5D=1' : '')) . '">' . apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions + echo '<th><a href="' . h(remove_from_uri('(order|desc)[^=]*') . '&order%5B0%5D=' . urlencode($key) . ($_GET["order"][0] == $key && !$_GET["desc"][0] ? '&desc%5B0%5D=1' : '')) . '">' . apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions } next($select); } @@ -232,15 +241,15 @@ if (!$link && is_email($val)) { $link = "mailto:$val"; } - if (!$link && is_url($val)) { - $link = "http://www.adminer.org/redirect/?url=" . urlencode($val); // intermediate page to hide Referer + if (!$link && is_url($row[$key])) { + $link = "http://www.adminer.org/redirect/?url=" . urlencode($row[$key]); // intermediate page to hide Referer } $val = $adminer->selectVal($val, $link, $field); echo "<td>$val"; } } $adminer->backwardKeysPrint($backward_keys, $rows[$n]); - echo "\n"; + echo "</tr>\n"; // close to allow white-space: pre } echo "</table>\n"; @@ -250,7 +259,7 @@ flush(); $found_rows = $connection->result("SELECT COUNT(*) FROM " . idf_escape($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : "")); } - echo "<p>"; + echo "<p class='pages'>"; if (intval($limit) && $found_rows > $limit) { // display first, previous 3, next 3 and last page $max_page = floor(($found_rows - 1) / $limit); Modified: branches/sqlite/adminer/sql.inc.php =================================================================== --- branches/sqlite/adminer/sql.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/sql.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -1,4 +1,5 @@ <?php +restart_session(); $history = &$_SESSION["history"][$_GET["server"]][DB]; if (!$error && $_POST["clear"]) { $history = array(); @@ -27,8 +28,8 @@ $space = "(\\s|/\\*.*\\*/|(#|-- )[^\n]*\n|--\n)"; $alter_database = "(CREATE|DROP)$space+(DATABASE|SCHEMA)\\b~isU"; $databases = &$_SESSION["databases"][$_GET["server"]]; - if (isset($databases) && !preg_match("~\\b$alter_database", $query)) { // quick check - may be inside string - //! false positive with $fp + if (!ini_get("session.use_cookies") || (isset($databases) && !preg_match("~\\b$alter_database", $query))) { // quick check - may be inside string + //! false positive with $fp and disabled ini_set() and enabled session.use_cookies session_write_close(); } $delimiter = ";"; Modified: branches/sqlite/adminer/static/default.css =================================================================== --- branches/sqlite/adminer/static/default.css 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/static/default.css 2009-12-10 13:00:23 UTC (rev 1263) @@ -18,8 +18,8 @@ tr:hover td, tr:hover th { background: #ddf; } .version { color: #777; font-size: 67%; } .js .hidden { display: none; } -.nowrap { white-space: pre; } -.wrap { white-space: normal; } +.nowrap td, .nowrap th, td.nowrap { white-space: pre; } +.wrap td { white-space: normal; } .error { color: red; background: #fee; } .message { color: green; background: #efe; } .error, .message { padding: .5em .8em; margin: 0 20px 1em 0; } @@ -31,6 +31,7 @@ .time { color: silver; font-size: 70%; float: right; margin-top: -3em; } .function { text-align: right; } .number { text-align: right; } +.datetime { text-align: right; } .type { width: 15ex; width: auto\9; } #menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; overflow: auto; overflow-y: hidden; white-space: nowrap; } #menu p { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; } Modified: branches/sqlite/adminer/static/editing.js =================================================================== --- branches/sqlite/adminer/static/editing.js 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/static/editing.js 2009-12-10 13:00:23 UTC (rev 1263) @@ -6,8 +6,9 @@ script.src = jush_root + 'jush.js'; script.onload = function () { if (window.jush) { // IE runs in case of an error too + jush.create_links = ' target="_blank"'; jush.style(jush_root + 'jush.css'); - jush.highlight_tag('pre'); + jush.highlight_tag('pre', 0); jush.highlight_tag('code'); } }; @@ -157,6 +158,27 @@ } } +function editing_length_focus(field) { + var td = field.parentNode; + if (/enum|set/.test(select_value(td.previousSibling.firstChild))) { + var edit = document.getElementById('enum-edit'); + var val = field.value; + edit.value = (/^'.+','.+'$/.test(val) ? val.substr(1, val.length - 2).replace(/','/g, "\n").replace(/''/g, "'") : val); + td.appendChild(edit); + field.style.display = 'none'; + edit.style.display = 'inline'; + edit.focus(); + } +} + +function editing_length_blur(edit) { + var field = edit.parentNode.firstChild; + var val = edit.value; + field.value = (/\n/.test(val) ? "'" + val.replace(/\n+$/, '').replace(/'/g, "''").replace(/\n/g, "','") + "'" : val); + field.style.display = 'inline'; + edit.style.display = 'none'; +} + function column_show(checked, column) { var trs = document.getElementById('edit-fields').getElementsByTagName('tr'); for (var i=0; i < trs.length; i++) { Modified: branches/sqlite/adminer/table.inc.php =================================================================== --- branches/sqlite/adminer/table.inc.php 2009-12-10 11:55:59 UTC (rev 1262) +++ branches/sqlite/adminer/table.inc.php 2009-12-10 13:00:23 UTC (rev 1263) @@ -5,16 +5,15 @@ $error = h($connection->error); } $table_status = ($fields ? table_status($TABLE) : array()); -$is_view = !isset($table_status["Rows"]); -page_header(($fields && $is_view ? lang('View') : lang('Table')) . ": " . h($TABLE), $error); -$adminer->selectLinks($table_status, $is_view ? null : ""); +page_header(($fields && !isset($table_status["Rows"]) ? lang('View') : lang('Table')) . ": " . h($TABLE), $error); +$adminer->selectLinks($table_status); if ($fields) { echo "<table cellspacing='0'>\n"; echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . ($comments_support ? "<td>" . lang('Comment') : "") . "</thead>\n"; foreach ($fields as $field) { - echo "<tr><th>" . h($field["field"]); + echo "<tr" . odd() . "><th>" . h($field["field"]); echo "<td>" . h($field["full_type"]) . ($field["null"] ? " <i>NULL</i>" : "") . ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : ""); echo ($comments_support ? "<td>" . nbsp($field["comment"]) : ""); echo "\n"; @@ -49,7 +48,7 @@ echo "<th><i>" . implode("</i>, <i>", array_map('h', $foreign_key["source"])) . "</i>"; echo "<td><a href='" . h(strlen($foreign_key["db"]) ? preg_replace('~db=[^&]*~', "db=" . urlencode($foreign_key["db"]), ME) : ME... [truncated message content] |
From: <jak...@us...> - 2010-02-17 16:25:13
|
Revision: 1315 http://adminer.svn.sourceforge.net/adminer/?rev=1315&view=rev Author: jakubvrana Date: 2010-02-17 16:24:44 +0000 (Wed, 17 Feb 2010) Log Message: ----------- Merge from trunk Modified Paths: -------------- branches/sqlite/adminer/call.inc.php branches/sqlite/adminer/create.inc.php branches/sqlite/adminer/database.inc.php branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/dump.inc.php branches/sqlite/adminer/edit.inc.php branches/sqlite/adminer/event.inc.php branches/sqlite/adminer/foreign.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/include/auth.inc.php branches/sqlite/adminer/include/bootstrap.inc.php branches/sqlite/adminer/include/connect.inc.php branches/sqlite/adminer/include/design.inc.php branches/sqlite/adminer/include/editing.inc.php branches/sqlite/adminer/include/export.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/indexes.inc.php branches/sqlite/adminer/lang/cs.inc.php branches/sqlite/adminer/lang/de.inc.php branches/sqlite/adminer/lang/en.inc.php branches/sqlite/adminer/lang/es.inc.php branches/sqlite/adminer/lang/et.inc.php branches/sqlite/adminer/lang/fr.inc.php branches/sqlite/adminer/lang/it.inc.php branches/sqlite/adminer/lang/nl.inc.php branches/sqlite/adminer/lang/ru.inc.php branches/sqlite/adminer/lang/sk.inc.php branches/sqlite/adminer/lang/zh-tw.inc.php branches/sqlite/adminer/lang/zh.inc.php branches/sqlite/adminer/privileges.inc.php branches/sqlite/adminer/procedure.inc.php branches/sqlite/adminer/processlist.inc.php branches/sqlite/adminer/schema.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/adminer/sql.inc.php branches/sqlite/adminer/static/editing.js branches/sqlite/adminer/static/functions.js branches/sqlite/adminer/table.inc.php branches/sqlite/adminer/trigger.inc.php branches/sqlite/adminer/user.inc.php branches/sqlite/adminer/variables.inc.php branches/sqlite/adminer/view.inc.php branches/sqlite/changes.txt branches/sqlite/editor/db.inc.php branches/sqlite/editor/include/adminer.inc.php branches/sqlite/editor/include/export.inc.php branches/sqlite/editor/static/editing.js branches/sqlite/tests/2-create-table.html branches/sqlite/tests/4-create-table-2.html branches/sqlite/todo.txt Added Paths: ----------- branches/sqlite/adminer/include/xxtea.inc.php Property Changed: ---------------- branches/sqlite/ branches/sqlite/adminer/drivers/mysql.inc.php Property changes on: branches/sqlite ___________________________________________________________________ Modified: svn:mergeinfo - /trunk:1193-1261 + /trunk:1193-1314 Modified: branches/sqlite/adminer/call.inc.php =================================================================== --- branches/sqlite/adminer/call.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/call.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -30,7 +30,7 @@ } $result = $connection->multi_query((isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . idf_escape($PROCEDURE) . "(" . implode(", ", $call) . ")"); if (!$result) { - echo "<p class='error'>" . h($connection->error) . "\n"; + echo "<p class='error'>" . error() . "\n"; } else { do { $result = $connection->store_result(); @@ -55,7 +55,7 @@ $field = $routine["fields"][$key]; echo "<tr><th>" . h($field["field"]); $value = $_POST["fields"][$key]; - if (strlen($value) && ereg("enum|set", $field["type"])) { + if ($value != "" && ereg("enum|set", $field["type"])) { $value = intval($value); } input($field, $value, (string) $_POST["function"][$name]); // param name can be empty Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/create.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -10,7 +10,7 @@ $orig_fields = array(); $orig_status = array(); -if (strlen($TABLE)) { +if ($TABLE != "") { $orig_fields = fields($TABLE); $orig_status = table_status($TABLE); } @@ -18,7 +18,7 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"] && !$_POST["down"]) { $auto_increment_index = " PRIMARY KEY"; // don't overwrite primary key by auto_increment - if (strlen($TABLE) && $_POST["auto_increment_col"]) { + if ($TABLE != "" && $_POST["auto_increment_col"]) { foreach (indexes($TABLE) as $index) { if (in_array($_POST["fields"][$_POST["auto_increment_col"]]["orig"], $index["columns"], true)) { $auto_increment_index = ""; @@ -35,7 +35,7 @@ $after = "FIRST"; foreach ($_POST["fields"] as $key => $field) { $type_field = (isset($types[$field["type"]]) ? $field : $referencable_primary[$foreign_keys[$field["type"]]]); - if (strlen($field["field"])) { + if ($field["field"] != "") { if ($type_field) { $default = eregi_replace(" *on update CURRENT_TIMESTAMP", "", $field["default"]); if ($default != $field["default"]) { // preg_replace $count is available since PHP 5.1.0 @@ -48,47 +48,47 @@ $process_field = process_field($field, $type_field); $auto_increment = ($key == $_POST["auto_increment_col"]); if ($process_field != process_field($orig_field, $orig_field) || $orig_field["auto_increment"] != $auto_increment) { - $fields .= "\n" . (strlen($TABLE) ? (strlen($field["orig"]) ? "CHANGE " . idf_escape($field["orig"]) : "ADD") : " ") + $fields .= "\n" . ($TABLE != "" ? ($field["orig"] != "" ? "CHANGE " . idf_escape($field["orig"]) : "ADD") : " ") . " $process_field" . ($auto_increment ? " AUTO_INCREMENT$auto_increment_index" : "") - . (strlen($TABLE) ? " $after" : "") . "," + . ($TABLE != "" ? " $after" : "") . "," ; } if (!isset($types[$field["type"]])) { - $fields .= (strlen($TABLE) ? "\nADD" : "") . " FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . idf_escape($foreign_keys[$field["type"]]) . " (" . idf_escape($type_field["field"]) . "),"; + $fields .= ($TABLE != "" ? "\nADD" : "") . " FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . idf_escape($foreign_keys[$field["type"]]) . " (" . idf_escape($type_field["field"]) . "),"; } } $after = "AFTER " . idf_escape($field["field"]); //! drop and create foreign keys with renamed columns - } elseif (strlen($field["orig"])) { + } elseif ($field["orig"] != "") { $fields .= "\nDROP " . idf_escape($field["orig"]) . ","; } - if (strlen($field["orig"])) { + if ($field["orig"] != "") { $orig_field = next($orig_fields); } } $status = ($comments_support ? "COMMENT=" . $connection->quote($_POST["Comment"]) : "") . ($_POST["Engine"] && $_POST["Engine"] != $orig_status["Engine"] ? " ENGINE=" . $connection->quote($_POST["Engine"]) : "") . ($_POST["Collation"] && $_POST["Collation"] != $orig_status["Collation"] ? " COLLATE " . $connection->quote($_POST["Collation"]) : "") - . (strlen($_POST["auto_increment"]) ? " AUTO_INCREMENT=" . preg_replace('~[^0-9]+~', '', $_POST["auto_increment"]) : "") + . ($_POST["Auto_increment"] != "" ? " AUTO_INCREMENT=" . preg_replace('~[^0-9]+~', '', $_POST["Auto_increment"]) : "") ; if (in_array($_POST["partition_by"], $partition_by)) { $partitions = array(); if ($_POST["partition_by"] == 'RANGE' || $_POST["partition_by"] == 'LIST') { foreach (array_filter($_POST["partition_names"]) as $key => $val) { $value = $_POST["partition_values"][$key]; - $partitions[] = "\nPARTITION " . idf_escape($val) . " VALUES " . ($_POST["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . (strlen($value) ? " ($value)" : " MAXVALUE"); //! SQL injection + $partitions[] = "\nPARTITION " . idf_escape($val) . " VALUES " . ($_POST["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection } } $status .= "\nPARTITION BY $_POST[partition_by]($_POST[partition])" . ($partitions // $_POST["partition"] can be expression, not only column ? " (" . implode(",", $partitions) . "\n)" : ($_POST["partitions"] ? " PARTITIONS " . intval($_POST["partitions"]) : "") ); - } elseif ($connection->server_info >= 5.1 && strlen($TABLE)) { + } elseif ($connection->server_info >= 5.1 && $TABLE != "") { $status .= "\nREMOVE PARTITIONING"; } $location = ME . "table=" . urlencode($_POST["name"]); - if (strlen($TABLE)) { + if ($TABLE != "") { query_redirect("ALTER TABLE " . idf_escape($TABLE) . "$fields\nRENAME TO " . idf_escape($_POST["name"]) . ($status ? ",\n$status" : ""), $location, lang('Table has been altered.')); } else { cookie("adminer_engine", $_POST["Engine"]); @@ -96,7 +96,7 @@ } } -page_header((strlen($TABLE) ? lang('Alter table') : lang('Create table')), $error, array("table" => $TABLE), $TABLE); +page_header(($TABLE != "" ? lang('Alter table') : lang('Create table')), $error, array("table" => $TABLE), $TABLE); $row = array( "Engine" => $_COOKIE["adminer_engine"], @@ -109,10 +109,13 @@ $row["fields"][$row["auto_increment_col"]]["auto_increment"] = true; } process_fields($row["fields"]); -} elseif (strlen($TABLE)) { +} elseif ($TABLE != "") { $row = $orig_status; $row["name"] = $TABLE; $row["fields"] = array(); + if (!$_GET["auto_increment"]) { // don't prefill by original Auto_increment for the sake of performance and not reusing deleted ids + $row["Auto_increment"] = ""; + } foreach ($orig_fields as $field) { $field["has_default"] = isset($field["default"]); if ($field["on_update"]) { @@ -158,16 +161,16 @@ <?php echo html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]); ?> <input type="submit" value="<?php echo lang('Save'); ?>"> </p> -<table cellspacing="0" id="edit-fields"> +<table cellspacing="0" id="edit-fields" class="nowrap"> <?php $column_comments = edit_fields($row["fields"], $collations, "TABLE", $suhosin, $foreign_keys); ?> </table> <p> -<?php echo lang('Auto Increment'); ?>: <input name="auto_increment" size="6" value="<?php echo h($row["auto_increment"]); // don't prefill by original Auto_increment for the sake of performance and not reusing deleted ids ?>"> +<?php echo lang('Auto Increment'); ?>: <input name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>"> <?php echo ($comments_support ? lang('Comment') . '<input name="Comment" value="' . h($row["Comment"]) . '" maxlength="60">' : ''); ?> <script type="text/javascript"> -document.write('<label><input type="checkbox" onclick="column_show(this.checked, 5);"><?php echo lang('Default values'); ?><\/label>'); +document.write('<label><input type="checkbox" onclick="columnShow(this.checked, 5);"><?php echo lang('Default values'); ?><\/label>'); <?php if ($comments_support) { ?> -document.write('<label><input type="checkbox"<?php if ($column_comments) { ?> checked<?php } ?> onclick="column_show(this.checked, 6);"><?php echo lang('Show column comments'); ?><\/label>'); +document.write('<label><input type="checkbox"<?php if ($column_comments) { ?> checked<?php } ?> onclick="columnShow(this.checked, 6);"><?php echo lang('Show column comments'); ?><\/label>'); <?php } ?> </script> <p> @@ -179,7 +182,7 @@ ?> <fieldset><legend><?php echo lang('Partition by'); ?></legend> <p> -<?php echo html_select("partition_by", array(-1 => "") + $partition_by, $row["partition_by"], "partition_by_change(this);"); ?> +<?php echo html_select("partition_by", array(-1 => "") + $partition_by, $row["partition_by"], "partitionByChange(this);"); ?> (<input name="partition" value="<?php echo h($row["partition"]); ?>">) <?php echo lang('Partitions'); ?>: <input name="partitions" size="2" value="<?php echo h($row["partitions"]); ?>"<?php echo ($partition_table || !$row["partition_by"] ? " class='hidden'" : ""); ?>> <table cellspacing="0" id="partition-table"<?php echo ($partition_table ? "" : " class='hidden'"); ?>> @@ -187,7 +190,7 @@ <?php foreach ($row["partition_names"] as $key => $val) { echo '<tr>'; - echo '<td><input name="partition_names[]" value="' . h($val) . '"' . ($key == count($row["partition_names"]) - 1 ? ' onchange="partition_name_change(this);"' : '') . '>'; + echo '<td><input name="partition_names[]" value="' . h($val) . '"' . ($key == count($row["partition_names"]) - 1 ? ' onchange="partitionNameChange(this);"' : '') . '>'; echo '<td><input name="partition_values[]" value="' . h($row["partition_values"][$key]) . '">'; } ?> Modified: branches/sqlite/adminer/database.inc.php =================================================================== --- branches/sqlite/adminer/database.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/database.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -8,14 +8,14 @@ $failed = false; $last = ""; foreach ($dbs as $db) { - if (count($dbs) == 1 || strlen($db)) { // ignore empty lines but always try to create single database + if (count($dbs) == 1 || $db != "") { // ignore empty lines but always try to create single database if (!queries("CREATE DATABASE " . idf_escape($db) . ($_POST["collation"] ? " COLLATE " . $connection->quote($_POST["collation"]) : ""))) { $failed = true; } $last = $db; } } - if (query_redirect(queries(), ME . "db=" . urlencode($last), lang('Database has been created.'), !strlen(DB), false, $failed)) { + if (query_redirect(queries(), ME . "db=" . urlencode($last), lang('Database has been created.'), DB == "", false, $failed)) { //! move triggers $result = $connection->query("SHOW TABLES"); while ($row = $result->fetch_row()) { @@ -38,7 +38,7 @@ } } -page_header(strlen(DB) ? lang('Alter database') : lang('Create database'), $error, array(), DB); +page_header(DB != "" ? lang('Alter database') : lang('Create database'), $error, array(), DB); $collations = collations(); $name = DB; @@ -46,7 +46,7 @@ if ($_POST) { $name = $_POST["name"]; $collate = $_POST["collation"]; -} elseif (!strlen(DB)) { +} elseif (DB == "") { // propose database name with limited privileges $result = $connection->query("SHOW GRANTS"); while ($row = $result->fetch_row()) { @@ -70,7 +70,7 @@ <input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="submit" value="<?php echo lang('Save'); ?>"> <?php -if (!$_POST["add_x"]) { +if (!$_POST["add_x"] && $_GET["db"] == "") { echo "<input type='image' name='add' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>\n"; } ?> Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/db.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -1,7 +1,7 @@ <?php $tables_views = array_merge((array) $_POST["tables"], (array) $_POST["views"]); -if ($tables_views && !$error) { +if ($tables_views && !$error && !$_POST["search"]) { $result = true; $message = ""; if (count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"])) { @@ -24,7 +24,7 @@ //! move triggers $message = lang('Tables have been moved.'); } elseif ((!isset($_POST["drop"]) || !$_POST["views"] || queries("DROP VIEW " . implode(", ", array_map('idf_escape', $_POST["views"])))) - && (!$_POST["tables"] || ($result = queries((isset($_POST["optimize"]) ? "OPTIMIZE" : (isset($_POST["check"]) ? "CHECK" : (isset($_POST["repair"]) ? "REPAIR" : (isset($_POST["drop"]) ? "DROP" : "ANALYZE")))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"]))))) + && (!$_POST["tables"] || ($result = queries((isset($_POST["optimize"]) ? "OPTIMIZE" : (isset($_POST["check"]) ? "CHECK" : (isset($_POST["repair"]) ? "REPAIR" : (isset($_POST["drop"]) ? "DROP" : "ANALYZE")))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"]))))) ) { if (isset($_POST["drop"])) { $message = lang('Tables have been dropped.'); @@ -47,17 +47,25 @@ echo "<p class='message'>" . lang('No tables.') . "\n"; } else { echo "<form action='' method='post'>\n"; - echo "<table cellspacing='0' class='nowrap' onclick='table_click(event);'>\n"; - echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="form_check(this, /^(tables|views)\[/);" title="' . count($table_status) . '"><th>' . lang('Table') . '<td>' . lang('Engine') . '<td>' . lang('Collation') . '<td>' . lang('Data Length') . '<td>' . lang('Index Length') . '<td>' . lang('Data Free') . '<td>' . lang('Auto Increment') . '<td>' . lang('Rows') . ($comments_support ? '<td>' . lang('Comment') : '') . "</thead>\n"; + echo "<p><input name='query' value='" . h($_POST["query"]) . "'> <input type='submit' name='search' value='" . lang('Search') . "'>\n"; + if ($_POST["search"] && $_POST["query"] != "") { + $_GET["where"][0]["op"] = "LIKE"; + $_GET["where"][0]["val"] = "%$_POST[query]%"; + search_tables(); + } + echo "<table cellspacing='0' class='nowrap' onclick='tableClick(event);'>\n"; + echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);"><th>' . lang('Table') . '<td>' . lang('Engine') . '<td>' . lang('Collation') . '<td>' . lang('Data Length') . '<td>' . lang('Index Length') . '<td>' . lang('Data Free') . '<td>' . lang('Auto Increment') . '<td>' . lang('Rows') . ($comments_support ? '<td>' . lang('Comment') : '') . "</thead>\n"; + $sums = array(); foreach ($table_status as $row) { $name = $row["Name"]; - echo '<tr' . odd() . '><td>' . checkbox((isset($row["Rows"]) ? "tables[]" : "views[]"), $name, in_array($name, $tables_views, true), "", "form_uncheck('check-all');"); + echo '<tr' . odd() . '><td>' . checkbox((isset($row["Rows"]) ? "tables[]" : "views[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');"); echo '<th><a href="' . h(ME) . 'table=' . urlencode($name) . '">' . h($name) . '</a>'; if (isset($row["Rows"])) { echo "<td>$row[Engine]<td>$row[Collation]"; - foreach (array("Data_length" => "create", "Index_length" => "indexes", "Data_free" => "edit", "Auto_increment" => "create", "Rows" => "select") as $key => $link) { + foreach (array("Data_length" => "create", "Index_length" => "indexes", "Data_free" => "edit", "Auto_increment" => "auto_increment=1&create", "Rows" => "select") as $key => $link) { $val = number_format($row[$key], 0, '.', lang(',')); - echo '<td align="right">' . (strlen($row[$key]) ? '<a href="' . h(ME . "$link=") . urlencode($name) . '">' . str_replace(" ", " ", ($key == "Rows" && $row["Engine"] == "InnoDB" && $val ? lang('~ %s', $val) : $val)) . '</a>' : ' '); + echo '<td align="right">' . ($row[$key] != "" ? '<a href="' . h(ME . "$link=") . urlencode($name) . '">' . str_replace(" ", " ", ($key == "Rows" && $row["Engine"] == "InnoDB" && $val ? lang('~ %s', $val) : $val)) . '</a>' : ' '); + $sums[$link] += ($row["Engine"] != "InnoDB" || $link != "edit" ? $row[$key] : 0); } echo ($comments_support ? "<td>" . nbsp($row["Comment"]) : ""); } else { @@ -66,8 +74,14 @@ echo ($comments_support ? '<td> ' : ''); } } + echo "<tr><td> <th>" . lang('%d in total', count($table_status)); + echo "<td>" . $connection->result($connection->query("SELECT @@storage_engine")); + echo "<td>" . db_collation(DB, collations()); + foreach (array("create", "indexes", "edit") as $val) { + echo "<td align='right'>" . number_format($sums[$val], 0, '.', lang(',')); + } echo "</table>\n"; - echo "<p><input type='hidden' name='token' value='$token'><input type='submit' value='" . lang('Analyze') . "'> <input type='submit' name='optimize' value='" . lang('Optimize') . "'> <input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> <input type='submit' name='truncate' value='" . lang('Truncate') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + form_checked(this, /tables/) + ')');\"> <input type='submit' name='drop' value='" . lang('Drop') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + form_checked(this, /tables|views/) + ')');\">\n"; + echo "<p><input type='hidden' name='token' value='$token'><input type='submit' value='" . lang('Analyze') . "'> <input type='submit' name='optimize' value='" . lang('Optimize') . "'> <input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> <input type='submit' name='truncate' value='" . lang('Truncate') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables/) + ')');\"> <input type='submit' name='drop' value='" . lang('Drop') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables|views/) + ')');\">\n"; $dbs = get_databases(); if (count($dbs) != 1) { $db = (isset($_POST["target"]) ? $_POST["target"] : DB); Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -177,7 +177,7 @@ function table_status($name = "") { global $connection; $return = array(); - $result = $connection->query("SELECT TABLE_NAME AS Name, TABLE_TYPE AS Engine FROM information_schema.TABLES" . (strlen($name) ? " WHERE TABLE_NAME = " . $connection->quote($name) : "")); + $result = $connection->query("SELECT TABLE_NAME AS Name, TABLE_TYPE AS Engine FROM information_schema.TABLES" . ($name != "" ? " WHERE TABLE_NAME = " . $connection->quote($name) : "")); while ($row = $result->fetch_assoc()) { if ($row["Engine"] != "VIEW") { $row["Rows"] = -1; @@ -199,7 +199,7 @@ $return = array(); $result = $connection->query("SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME = " . $connection->quote($table)); while ($row = $result->fetch_assoc()) { - $return[$row["Field"]] = array( + $return[$row["COLUMN_NAME"]] = array( "field" => $row["COLUMN_NAME"], "full_type" => $row["DATA_TYPE"], "type" => $row["DATA_TYPE"], //! unsigned? @@ -207,7 +207,7 @@ "default" => $row["COLUMN_DEFAULT"], "null" => ($row["IS_NULLABLE"] == "YES"), "collation" => $row["COLLATION_NAME"], - "privileges" => array("insert" => 1, "select" => 1), + "privileges" => array("insert" => 1, "select" => 1, "update" => 1), ); } return $return; @@ -263,6 +263,11 @@ return ($db == "information_schema"); } + function error() { + global $connection; + return h($connection->error); + } + function exact_value($val) { global $connection; return $connection->quote($val); Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -19,9 +19,9 @@ function connect($server, $username, $password) { list($host, $port) = explode(":", $server, 2); // part after : is used for port or socket return @$this->real_connect( - (strlen($server) ? $host : ini_get("mysqli.default_host")), - (strlen("$server$username") ? $username : ini_get("mysqli.default_user")), - (strlen("$server$username$password") ? $password : ini_get("mysqli.default_pw")), + ($server != "" ? $host : ini_get("mysqli.default_host")), + ("$server$username" != "" ? $username : ini_get("mysqli.default_user")), + ("$server$username$password" != "" ? $password : ini_get("mysqli.default_pw")), null, (is_numeric($port) ? $port : ini_get("mysqli.default_port")), (!is_numeric($port) ? $port : null) @@ -60,9 +60,9 @@ */ function connect($server, $username, $password) { $this->_link = @mysql_connect( - (strlen($server) ? $server : ini_get("mysql.default_host")), - (strlen("$server$username") ? $username : ini_get("mysql.default_user")), - (strlen("$server$username$password") ? $password : ini_get("mysql.default_password")), + ($server != "" ? $server : ini_get("mysql.default_host")), + ("$server$username" != "" ? $username : ini_get("mysql.default_user")), + ("$server$username$password" != "" ? $password : ini_get("mysql.default_password")), true, 131072 // CLIENT_MULTI_RESULTS for CALL ); @@ -102,6 +102,7 @@ return false; } elseif ($result === true) { $this->affected_rows = mysql_affected_rows($this->_link); + $this->info = mysql_info($this->_link); return true; } return new Min_Result($result); @@ -289,6 +290,7 @@ 'privileges' => lang('Privileges'), 'processlist' => lang('Process list'), 'variables' => lang('Variables'), + 'status' => lang('Status'), ) as $key => $val) { echo "<a href='" . h(ME) . "$key='>$val</a>\n"; } @@ -310,13 +312,13 @@ function table_status($name = "") { global $connection; $return = array(); - $result = $connection->query("SHOW TABLE STATUS" . (strlen($name) ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); + $result = $connection->query("SHOW TABLE STATUS" . ($name != "" ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); while ($row = $result->fetch_assoc()) { if ($row["Engine"] == "InnoDB") { // ignore internal comment, unnecessary since MySQL 5.1.21 $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); } - if (strlen($name)) { + if ($name != "") { return $row; } $return[$row["Name"]] = $row; @@ -349,7 +351,7 @@ "type" => $match[1], "length" => $match[2], "unsigned" => ltrim($match[3] . $match[4]), - "default" => (strlen($row["Default"]) || ereg("char", $match[1]) ? $row["Default"] : null), + "default" => ($row["Default"] != "" || ereg("char", $match[1]) ? $row["Default"] : null), "null" => ($row["Null"] == "YES"), "auto_increment" => ($row["Extra"] == "auto_increment"), "on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23 @@ -400,8 +402,8 @@ preg_match_all("~`($pattern)`~", $match[2], $source); preg_match_all("~`($pattern)`~", $match[5], $target); $return[$match[1]] = array( - "db" => idf_unescape(strlen($match[4]) ? $match[3] : $match[4]), - "table" => idf_unescape(strlen($match[4]) ? $match[4] : $match[3]), + "db" => idf_unescape($match[4] != "" ? $match[3] : $match[4]), + "table" => idf_unescape($match[4] != "" ? $match[4] : $match[3]), "source" => array_map('idf_unescape', $source[1]), "target" => array_map('idf_unescape', $target[1]), "on_delete" => $match[6], @@ -447,6 +449,14 @@ return ($connection->server_info >= 5 && $db == "information_schema"); } + /** Get escaped error message + * @return string + */ + function error() { + global $connection; + return h(preg_replace('~^You have an error.*syntax to use~U', "Syntax error", $connection->error)); + } + /** Return expression for binary comparison * @param string * @return string @@ -461,7 +471,7 @@ $types = array(); ///< @var array ($type => $maximum_unsigned_length, ...) $structured_types = array(); ///< @var array ($description => array($type, ...), ...) foreach (array( - lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "float" => 12, "double" => 21, "decimal" => 66), + 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("binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), Property changes on: branches/sqlite/adminer/drivers/mysql.inc.php ___________________________________________________________________ Modified: svn:mergeinfo - /trunk/adminer/drivers/mysql.inc.php:1193-1261 /trunk/adminer/include/mysql.inc.php:675-681,1193-1262 + /trunk/adminer/drivers/mysql.inc.php:1193-1314 /trunk/adminer/include/mysql.inc.php:675-681,1193-1314 Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -153,7 +153,7 @@ function table_status($name = "") { //! global $connection; $return = array(); - $result = $connection->query("SHOW TABLE STATUS" . (strlen($name) ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); + $result = $connection->query("SHOW TABLE STATUS" . ($name != "" ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); while ($row = $result->fetch_assoc()) { if ($row["Engine"] == "InnoDB") { // ignore internal comment, unnecessary since MySQL 5.1.21 @@ -161,7 +161,7 @@ } $return[$row["Name"]] = $row; } - return (strlen($name) ? $return[$name] : $return); + return ($name != "" ? $return[$name] : $return); } function fk_support($table_status) { @@ -181,7 +181,7 @@ "type" => $match[1], "length" => $match[2], "unsigned" => ltrim($match[3] . $match[4]), - "default" => (strlen($row["Default"]) || ereg("char", $match[1]) ? $row["Default"] : null), + "default" => ($row["Default"] != "" || ereg("char", $match[1]) ? $row["Default"] : null), "null" => ($row["Null"] == "YES"), "auto_increment" => ($row["Extra"] == "auto_increment"), "on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23 @@ -240,6 +240,11 @@ return ($db == "information_schema"); } + function error() { + global $connection; + return h($connection->error); + } + function exact_value($val) { global $connection; return "BINARY " . $connection->quote($val); Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -231,14 +231,14 @@ function table_status($name = "") { global $connection; $return = array(); - $result = $connection->query("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')" . (strlen($name) ? " AND name = " . $connection->quote($name) : "")); + $result = $connection->query("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')" . ($name != "" ? " AND name = " . $connection->quote($name) : "")); while ($row = $result->fetch_assoc()) { $return[$row["name"]] = array( "Name" => $row["name"], "Rows" => ($row["type"] == "table" ? $connection->result("SELECT COUNT(*) FROM " . idf_escape($row["name"])) : ""), ); } - return (strlen($name) ? $return[$name] : $return); + return ($name != "" ? $return[$name] : $return); } function fk_support($table_status) { @@ -322,6 +322,11 @@ return false; } + function error() { + global $connection; + return h($connection->error); + } + function exact_value($val) { global $connection; return $connection->quote($val); Modified: branches/sqlite/adminer/dump.inc.php =================================================================== --- branches/sqlite/adminer/dump.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/dump.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -2,7 +2,7 @@ $TABLE = $_GET["dump"]; if ($_POST) { - $ext = dump_headers((strlen($TABLE) ? $TABLE : DB), (!strlen(DB) || count((array) $_POST["tables"] + (array) $_POST["data"]) > 1)); + $ext = dump_headers(($TABLE != "" ? $TABLE : DB), (DB == "" || count((array) $_POST["tables"] + (array) $_POST["data"]) > 1)); if ($_POST["format"] == "sql") { echo "-- Adminer $VERSION dump SET NAMES utf8; @@ -14,7 +14,7 @@ } $style = $_POST["db_style"]; - foreach ((strlen(DB) ? array(DB) : (array) $_POST["databases"]) as $db) { + foreach ((DB != "" ? array(DB) : (array) $_POST["databases"]) as $db) { if ($connection->select_db($db)) { if ($_POST["format"] == "sql" && ereg('CREATE', $style) && ($create = $connection->result("SHOW CREATE DATABASE " . idf_escape($db), 1))) { if ($style == "DROP+CREATE") { @@ -41,9 +41,11 @@ } if ($_POST["events"]) { $result = $connection->query("SHOW EVENTS"); - while ($row = $result->fetch_assoc()) { - $out .= ($style != 'DROP+CREATE' ? "DROP EVENT IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") - . $connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3) . ";;\n\n"; + if ($result) { + while ($row = $result->fetch_assoc()) { + $out .= ($style != 'DROP+CREATE' ? "DROP EVENT IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") + . $connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3) . ";;\n\n"; + } } } if ($out) { @@ -54,8 +56,8 @@ if ($_POST["table_style"] || $_POST["data_style"]) { $views = array(); foreach (table_status() as $row) { - $table = (!strlen(DB) || in_array($row["Name"], (array) $_POST["tables"])); - $data = (!strlen(DB) || in_array($row["Name"], (array) $_POST["data"])); + $table = (DB == "" || in_array($row["Name"], (array) $_POST["tables"])); + $data = (DB == "" || in_array($row["Name"], (array) $_POST["data"])); if ($table || $data) { if (isset($row["Engine"])) { if ($ext == "tar") { @@ -69,7 +71,7 @@ dump_triggers($row["Name"], $_POST["table_style"]); } if ($ext == "tar") { - echo tar_file((strlen(DB) ? "" : "$db/") . "$row[Name].csv", ob_get_clean()); + echo tar_file((DB != "" ? "" : "$db/") . "$row[Name].csv", ob_get_clean()); } elseif ($_POST["format"] == "sql") { echo "\n"; } @@ -131,7 +133,7 @@ exit; } -page_header(lang('Export'), "", (strlen($_GET["export"]) ? array("table" => $_GET["export"]) : array()), DB); +page_header(lang('Export'), "", ($_GET["export"] != "" ? array("table" => $_GET["export"]) : array()), DB); ?> <form action="" method="post"> @@ -144,11 +146,11 @@ $db_style[] = 'CREATE+ALTER'; $table_style[] = 'CREATE+ALTER'; } -echo "<tr><th>" . lang('Output') . "<td><input type='hidden' name='token' value='$token'>" . $adminer->dumpOutput(0) . "\n"; // token is not needed but checked in bootstrap for all POST data +echo "<tr><th>" . lang('Output') . "<td><input type='hidden' name='token' value='$token'>" . $adminer->dumpOutput(0) . "\n"; // token is not needed but checked in bootstrap for all POST data //! read from cookie echo "<tr><th>" . lang('Format') . "<td>" . $adminer->dumpFormat(0) . "\n"; -echo "<tr><th>" . lang('Database') . "<td>" . html_select('db_style', $db_style, (strlen(DB) ? '' : 'CREATE')); +echo "<tr><th>" . lang('Database') . "<td>" . html_select('db_style', $db_style, (DB != "" ? '' : 'CREATE')); if ($connection->server_info >= 5) { - $checked = !strlen($_GET["dump"]); + $checked = $_GET["dump"] == ""; echo checkbox("routines", 1, $checked, lang('Routines')); if ($connection->server_info >= 5.1) { echo checkbox("events", 1, $checked, lang('Events')); @@ -162,31 +164,45 @@ <table cellspacing="0"> <?php -if (strlen(DB)) { - $checked = (strlen($TABLE) ? "" : " checked"); +$prefixes = array(); +if (DB != "") { + $checked = ($TABLE != "" ? "" : " checked"); echo "<thead><tr>"; - echo "<th style='text-align: left;'><label><input type='checkbox' id='check-tables'$checked onclick='form_check(this, /^tables\\[/);'>" . lang('Tables') . "</label>"; - echo "<th style='text-align: right;'><label>" . lang('Data') . "<input type='checkbox' id='check-data'$checked onclick='form_check(this, /^data\\[/);'></label>"; + echo "<th style='text-align: left;'><label><input type='checkbox' id='check-tables'$checked onclick='formCheck(this, /^tables\\[/);'>" . lang('Tables') . "</label>"; + echo "<th style='text-align: right;'><label>" . lang('Data') . "<input type='checkbox' id='check-data'$checked onclick='formCheck(this, /^data\\[/);'></label>"; echo "</thead>\n"; $views = ""; foreach (table_status() as $row) { - $checked = !strlen($TABLE) || $row["Name"] == $TABLE; - $print = "<tr><td>" . checkbox("tables[]", $row["Name"], $checked, $row["Name"], "form_uncheck('check-tables');"); + $name = $row["Name"]; + $prefix = ereg_replace("_.*", "", $name); + $checked = ($TABLE == "" || $TABLE == (substr($TABLE, -1) == "%" ? "$prefix%" : $name)); //! % may be part of table name + $print = "<tr><td>" . checkbox("tables[]", $name, $checked, $name, "formUncheck('check-tables');"); if (!$row["Engine"]) { $views .= "$print\n"; } else { - echo "$print<td align='right'><label>" . ($row["Engine"] == "InnoDB" && $row["Rows"] ? lang('~ %s', $row["Rows"]) : $row["Rows"]) . checkbox("data[]", $row["Name"], $checked, "", "form_uncheck('check-data');") . "</label>\n"; + echo "$print<td align='right'><label>" . ($row["Engine"] == "InnoDB" && $row["Rows"] ? lang('~ %s', $row["Rows"]) : $row["Rows"]) . checkbox("data[]", $name, $checked, "", "formUncheck('check-data');") . "</label>\n"; } + $prefixes[$prefix]++; } echo $views; } else { - echo "<thead><tr><th style='text-align: left;'><label><input type='checkbox' id='check-databases' checked onclick='form_check(this, /^databases\\[/);'>" . lang('Database') . "</label></thead>\n"; + echo "<thead><tr><th style='text-align: left;'><label><input type='checkbox' id='check-databases'" . ($TABLE == "" ? " checked" : "") . " onclick='formCheck(this, /^databases\\[/);'>" . lang('Database') . "</label></thead>\n"; foreach (get_databases() as $db) { if (!information_schema($db)) { - echo "<tr><td>" . checkbox("databases[]", $db, 1, $db, "form_uncheck('check-databases');") . "</label>\n"; + $prefix = ereg_replace("_.*", "", $db); + echo "<tr><td>" . checkbox("databases[]", $db, $TABLE == "" || $TABLE == "$prefix%", $db, "formUncheck('check-databases');") . "</label>\n"; + $prefixes[$prefix]++; } } } ?> </table> </form> +<?php +$first = true; +foreach ($prefixes as $key => $val) { + if ($key != "" && $val > 1) { + echo ($first ? "<p>" : " ") . "<a href='" . h(ME) . "dump=" . urlencode("$key%") . "'>" . h($key) . "</a>"; + $first = false; + } +} Modified: branches/sqlite/adminer/edit.inc.php =================================================================== --- branches/sqlite/adminer/edit.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/edit.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -4,7 +4,7 @@ $update = (isset($_GET["select"]) ? $_POST["edit"] : $where); $fields = fields($TABLE); foreach ($fields as $name => $field) { - if (!isset($field["privileges"][$update ? "update" : "insert"]) || !strlen($adminer->fieldName($field))) { + if (!isset($field["privileges"][$update ? "update" : "insert"]) || $adminer->fieldName($field) == "") { unset($fields[$name]); } } @@ -19,23 +19,27 @@ } } } - $set = array(); - foreach ($fields as $name => $field) { - $val = process_input($field); - if (!$update) { - $set[idf_escape($name)] = ($val !== false ? $val : "''"); - } elseif ($val !== false) { - $set[] = "\n" . idf_escape($name) . " = $val"; + if (isset($_POST["delete"])) { + query_redirect("DELETE FROM " . idf_escape($_GET["edit"]) . " WHERE $where LIMIT 1", $location, lang('Item has been deleted.')); + } else { + $set = array(); + foreach ($fields as $name => $field) { + $val = process_input($field); + if (!$update) { + $set[idf_escape($name)] = ($val !== false ? $val : "''"); + } elseif ($val !== false) { + $set[] = "\n" . idf_escape($name) . " = $val"; + } } + if (!$set) { + redirect($location); + } + if ($update) { + query_redirect("UPDATE " . idf_escape($TABLE) . " SET" . implode(",", $set) . "\nWHERE $where\nLIMIT 1", $location, lang('Item has been updated.')); + } else { + query_redirect("INSERT INTO " . idf_escape($TABLE) . " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")", $location, lang('Item has been inserted.')); + } } - if (!$set) { - redirect($location); - } - if ($update) { - query_redirect("UPDATE " . idf_escape($TABLE) . " SET" . implode(",", $set) . "\nWHERE $where\nLIMIT 1", $location, lang('Item has been updated.')); - } else { - query_redirect("INSERT INTO " . idf_escape($TABLE) . " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")", $location, lang('Item has been inserted.')); - } } $table_name = $adminer->tableName(table_status($TABLE)); @@ -76,13 +80,13 @@ echo "<tr><th>" . $adminer->fieldName($field); $default = $_GET["set"][bracket_escape($name)]; $value = (isset($row) - ? (strlen($row[$name]) && ereg("enum|set", $field["type"]) ? intval($row[$name]) : $row[$name]) + ? ($row[$name] != "" && ereg("enum|set", $field["type"]) ? intval($row[$name]) : $row[$name]) : ($_POST["clone"] && $field["auto_increment"] ? "" : (isset($_GET["select"]) ? false : (isset($default) ? $default : $field["default"]))) ); if (!$_POST["save"] && is_string($value)) { $value = $adminer->editVal($value, $field); } - $function = ($_POST["save"] ? (string) $_POST["function"][$name] : ($update && $field["on_update"] == "CURRENT_TIMESTAMP" ? "now" : ($value === false ? null : (isset($value) ? '' : 'NULL')))); + $function = ($_POST["save"] ? (string) $_POST["function"][$name] : ($where && $field["on_update"] == "CURRENT_TIMESTAMP" ? "now" : ($value === false ? null : (isset($value) ? '' : 'NULL')))); if ($field["type"] == "timestamp" && $value == "CURRENT_TIMESTAMP") { $value = ""; $function = "now"; @@ -106,5 +110,8 @@ echo "<input type='submit' name='insert' value='" . ($update ? lang('Save and continue edit') : lang('Save and insert next')) . "'>\n"; } } +if ($update) { + echo "<input type='submit' name='delete' value='" . lang('Delete') . "'$confirm>\n"; +} ?> </form> Modified: branches/sqlite/adminer/event.inc.php =================================================================== --- branches/sqlite/adminer/event.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/event.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -14,22 +14,22 @@ : "AT " . $connection->quote($_POST["STARTS"]) ) . " ON COMPLETION" . ($_POST["ON_COMPLETION"] ? "" : " NOT") . " PRESERVE" ; - query_redirect((strlen($EVENT) + query_redirect(($EVENT != "" ? "ALTER EVENT " . idf_escape($EVENT) . $schedule . ($EVENT != $_POST["EVENT_NAME"] ? "\nRENAME TO " . idf_escape($_POST["EVENT_NAME"]) : "") : "CREATE EVENT " . idf_escape($_POST["EVENT_NAME"]) . $schedule ) . "\n" . $statuses[$_POST["STATUS"]] . " COMMENT " . $connection->quote($_POST["EVENT_COMMENT"]) . " DO\n$_POST[EVENT_DEFINITION]" - , substr(ME, 0, -1), (strlen($EVENT) ? lang('Event has been altered.') : lang('Event has been created.'))); + , substr(ME, 0, -1), ($EVENT != "" ? lang('Event has been altered.') : lang('Event has been created.'))); } } -page_header((strlen($EVENT) ? lang('Alter event') . ": " . h($EVENT) : lang('Create event')), $error); +page_header(($EVENT != "" ? lang('Alter event') . ": " . h($EVENT) : lang('Create event')), $error); $row = array(); if ($_POST) { $row = $_POST; -} elseif (strlen($EVENT)) { +} elseif ($EVENT != "") { $result = $connection->query("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = " . $connection->quote(DB) . " AND EVENT_NAME = " . $connection->quote($EVENT)); $row = $result->fetch_assoc(); } @@ -49,5 +49,5 @@ <p> <input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="submit" value="<?php echo lang('Save'); ?>"> -<?php if (strlen($EVENT)) { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo $confirm; ?>><?php } ?> +<?php if ($EVENT != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo $confirm; ?>><?php } ?> </form> Modified: branches/sqlite/adminer/foreign.inc.php =================================================================== --- branches/sqlite/adminer/foreign.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/foreign.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -11,11 +11,11 @@ $target[$key] = $_POST["target"][$key]; } query_redirect("ALTER TABLE " . idf_escape($TABLE) - . (strlen($_GET["name"]) ? "\nDROP FOREIGN KEY " . idf_escape($_GET["name"]) . "," : "") + . ($_GET["name"] != "" ? "\nDROP FOREIGN KEY " . idf_escape($_GET["name"]) . "," : "") . "\nADD FOREIGN KEY (" . implode(", ", array_map('idf_escape', $source)) . ") REFERENCES " . idf_escape($_POST["table"]) . " (" . implode(", ", array_map('idf_escape', $target)) . ")" . (in_array($_POST["on_delete"], $on_actions) ? " ON DELETE $_POST[on_delete]" : "") . (in_array($_POST["on_update"], $on_actions) ? " ON UPDATE $_POST[on_update]" : "") - , ME . "table=" . urlencode($TABLE), (strlen($_GET["name"]) ? lang('Foreign key has been altered.') : lang('Foreign key has been created.'))); + , ME . "table=" . urlencode($TABLE), ($_GET["name"] != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.'))); $error = lang('Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.') . "<br>$error"; //! no partitioning } } @@ -31,7 +31,7 @@ } elseif ($_POST["change"] || $_POST["change-js"]) { $row["target"] = array(); } -} elseif (strlen($_GET["name"])) { +} elseif ($_GET["name"] != "") { $foreign_keys = foreign_keys($TABLE); $row = $foreign_keys[$_GET["name"]]; $row["source"][] = ""; @@ -49,7 +49,7 @@ <form action="" method="post"> <p> -<?php if (!strlen($row["db"])) { ?> +<?php if ($row["db"] == "") { ?> <?php echo lang('Target table'); ?>: <?php echo html_select("table", $referencable, $row["table"], "this.form['change-js'].value = '1'; this.form.submit();"); ?> <input type="hidden" name="change-js" value=""> @@ -61,7 +61,7 @@ $j = 0; foreach ($row["source"] as $key => $val) { echo "<tr>"; - echo "<td>" . html_select("source[" . intval($key) . "]", array(-1 => "") + $source, $val, ($j == count($row["source"]) - 1 ? "foreign_add_row(this);" : 1)); + echo "<td>" . html_select("source[" . intval($key) . "]", array(-1 => "") + $source, $val, ($j == count($row["source"]) - 1 ? "foreignAddRow(this);" : 1)); echo "<td>" . html_select("target[" . intval($key) . "]", $target, $row["target"][$key]); $j++; } @@ -74,6 +74,6 @@ <input type="submit" value="<?php echo lang('Save'); ?>"> <noscript><p><input type="submit" name="add" value="<?php echo lang('Add column'); ?>"></noscript> <?php } ?> -<?php if (strlen($_GET["name"])) { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo $confirm; ?>><?php } ?> +<?php if ($_GET["name"] != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo $confirm; ?>><?php } ?> <input type="hidden" name="token" value="<?php echo $token; ?>"> </form> Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/include/adminer.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -1,7 +1,12 @@ <?php class Adminer { + /** @var array functions used in select */ var $functions = array("char_length", "from_unixtime", "hex", "lower", "round", "sec_to_time", "time_to_sec", "unix_timestamp", "upper"); + + /** @var array grouping functions used in select */ var $grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"); + + /** @var array operators used in select */ var $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "REGEXP", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL"); /** Name in title and navigation @@ -18,6 +23,13 @@ return array($_GET["server"], $_SESSION["usernames"][$_GET["server"]], $_SESSION["passwords"][$_GET["server"]]); } + /** Get key used for permanent login + * @return string cryptic string which gets combined with password + */ + function permanentLogin() { + return ""; + } + /** Identifier of selected database * @return string */ @@ -40,6 +52,10 @@ <tr><th><?php echo lang('Password'); ?><td><input type="password" name="password"> </table> <?php + echo "<p><input type='submit' value='" . lang('Login') . "'>\n"; + if ($this->permanentLogin()) { + echo checkbox("permanent", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n"; + } } /** Authorize the user @@ -172,7 +188,7 @@ $i++; } echo "<div>" . html_select("columns[$i][fun]", array(-1 => "") + $fun_group, "", "this.nextSibling.onchange();"); - echo "<select name='columns[$i][col]' onchange='select_add_row(this);'><option>" . optionlist($columns, null, true) . "</select></div>\n"; + echo "<select name='columns[$i][col]' onchange='selectAddRow(this);'><option>" . optionlist($columns, null, true) . "</select></div>\n"; echo "</div></fieldset>\n"; } @@ -194,14 +210,14 @@ } $i = 0; foreach ((array) $_GET["where"] as $val) { - if (strlen("$val[col]$val[val]") && in_array($val["op"], $this->operators)) { + if ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators)) { echo "<div><select name='where[$i][col]'><option value=''>" . lang('(anywhere)') . optionlist($columns, $val["col"], true) . "</select>"; echo html_select("where[$i][op]", $this->operators, $val["op"]); echo "<input name='where[$i][val]' value='" . h($val["val"]) . "'></div>\n"; $i++; } } - echo "<div><select name='where[$i][col]' onchange='select_add_row(this);'><option value=''>" . lang('(anywhere)') . optionlist($columns, null, true) . "</select>"; + echo "<div><select name='where[$i][col]' onchange='selectAddRow(this);'><option value=''>" . lang('(anywhere)') . optionlist($columns, null, true) . "</select>"; echo html_select("where[$i][op]", $this->operators); echo "<input name='where[$i][val]'></div>\n"; echo "</div></fieldset>\n"; @@ -223,7 +239,7 @@ $i++; } } - echo "<div><select name='order[$i]' onchange='select_add_row(this);'><option>" . optionlist($columns, null, true) . "</select>"; + echo "<div><select name='order[$i]' onchange='selectAddRow(this);'><option>" . optionlist($columns, null, true) . "</select>"; echo checkbox("desc[$i]", 1, 0, lang('descending')) . "</div>\n"; echo "</div></fieldset>\n"; } @@ -295,25 +311,26 @@ global $connection; $return = array(); foreach ($indexes as $i => $index) { - if ($index["type"] == "FULLTEXT" && strlen($_GET["fulltext"][$i])) { + if ($index["type"] == "FULLTEXT" && $_GET["fulltext"][$i] != "") { $return[] = "MATCH (" . implode(", ", array_map('idf_escape', $index["columns"])) . ") AGAINST (" . $connection->quote($_GET["fulltext"][$i]) . (isset($_GET["boolean"][$i]) ? " IN BOOLEAN MODE" : "") . ")"; } } foreach ((array) $_GET["where"] as $val) { - if (strlen("$val[col]$val[val]") && in_array($val["op"], $this->operators)) { + if ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators)) { $in = process_length($val["val"]); - $cond = " $val[op]" . (ereg('NULL$', $val["op"]) ? "" : (ereg('IN$', $val["op"]) ? " (" . (strlen($in) ? $in : "NULL") . ")" : " " . $this->processInput($fields[$val["col"]], $val["val"]))); - if (strlen($val["col"])) { + $cond = " $val[op]" . (ereg('NULL$', $val["op"]) ? "" : (ereg('IN$', $val["op"]) ? " (" . ($in != "" ? $in : "NULL") . ")" : " " . $this->processInput($fields[$val["col"]], $val["val"]))); + if ($val["col"] != "") { $return[] = idf_escape($val["col"]) . $cond; } else { // find anywhere $cols = array(); foreach ($fields as $name => $field) { if (is_numeric($val["val"]) || !ereg('int|float|double|decimal', $field["type"])) { - $cols[] = $name; + $name = idf_escape($name); + $cols[] = (ereg('char|text|enum|set', $field["type"]) && !ereg('^utf8', $field["collation"]) ? "CONVERT($name USING utf8)" : $name); } } - $return[] = ($cols ? "(" . implode("$cond OR ", array_map('idf_escape', $cols)) . "$cond)" : "0"); + $return[] = ($cols ? "(" . implode("$cond OR ", $cols) . "$cond)" : "0"); } } } @@ -492,9 +509,9 @@ </form> <form action=""> <p> -<?php if (SID) { ?><input type="hidden" name="<?php echo session_name(); ?>" value="<?php echo h(session_id()); ?>"><?php } ?> -<?php if (strlen($_GET["driver"])) { ?><input type="hidden" name="driver" value="<?php echo h($_GET["driver"]); ?>"><?php } ?> -<?php if (strlen($_GET["server"])) { ?><input type="hidden" name="server" value="<?php echo h($_GET["server"]); ?>"><?php } ?> +<?php echo SID_FORM; ?> +<?php if ($_GET["driver"] != "") { ?><input type="hidden" name="driver" value="<?php echo h($_GET["driver"]); ?>"><?php } ?> +<?php if ($_GET["server"] != "") { ?><input type="hidden" name="server" value="<?php echo h($_GET["server"]); ?>"><?php } ?> <?php echo ($databases ? html_select("db", array("" => "(" . lang('database') . ")") + $databases, DB, "this.form.submit();") : '<input name="db" value="' . h(DB) . '">'); ?> <?php if (isset($_GET["sql"])) { ?><input type="hidden" name="sql" value=""><?php } ?> <?php if (isset($_GET["schema"])) { ?><input type="hidden" name="schema" value=""><?php } ?> @@ -503,7 +520,7 @@ </p> </form> <?php - if ($missing != "db" && strlen(DB) && $connection->select_db(DB)) { + if ($missing != "db" && DB != "" && $connection->select_db(DB)) { $tables = tables_list(); if (!$tables) { echo "<p class='message'>" . lang('No tables.') . "\n"; Modified: branches/sqlite/adminer/include/auth.inc.php =================================================================== --- branches/sqlite/adminer/include/auth.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/include/auth.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -9,17 +9,24 @@ session_regenerate_id(); // defense against session fixation $_SESSION["usernames"][$_POST["server"]] = $_POST["username"]; $_SESSION["passwords"][$_POST["server"]] = $_POST["password"]; - $_SESSION["tokens"][$_POST["server"]] = rand(1, 1e6); // defense against cross-site request forgery + if ($_POST["permanent"]) { + cookie("adminer_permanent", + base64_encode($_POST["server"]) + . ":" . base64_encode($_POST["username"]) + . ":" . base64_encode(encrypt_string($_POST["password"], $adminer->permanentLogin())) + ); + } $same_driver = (string) $_GET["driver"] === $_POST["driver"]; - if (count($_POST) == 4 || !$same_driver) { // 4 - count($ignore) - $location = ((string) $_GET["server"] === $_POST["server"] && $same_driver ? remove_from_uri() : substr(preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]) . "?" . ($_POST["driver"] ? "driver=" . urlencode($_POST["driver"]) . "&" : "") . (strlen($_POST["server"]) ? "server=" . urlencode($_POST["server"]) . "&" : ""), 0, -1)); - if (!isset($_COOKIE[session_name()])) { - $location .= (strpos($location, "?") === false ? "?" : "&") . SID; + if (count($_POST) == ($_POST["permanent"] ? 5 : 4) || !$same_driver) { // 4 - driver, server, username, password + $location = ((string) $_GET["server"] === $_POST["server"] && $same_driver ? remove_from_uri(session_name()) : substr(preg_replace('~\\?.*~', '', ME) . "?" . ($_POST["driver"] ? "driver=" . urlencode($_POST["driver"]) . "&" : "") . ($_POST["server"] != "" ? "server=" . urlencode($_POST["server"]) . "&" : ""), 0, -1)); + if (SID_FORM) { + $pos = strpos($location, '?'); + $location = ($pos ? substr_replace($location, SID . "&", $pos + 1, 0) : "$location?" . SID); } redirect($location); } $_GET["server"] = $_POST["server"]; -} elseif (isset($_POST["logout"])) { +} elseif ($_POST["logout"]) { $token = $_SESSION["tokens"][$_GET["server"]]; if ($token && $_POST["token"] != $token) { page_header(lang('Logout'), lang('Invalid CSRF token. Send the form again.')); @@ -32,8 +39,19 @@ if (!isset($_SESSION["passwords"])) { // don't require login to logout $_SESSION["passwords"] = array(); } + cookie("adminer_permanent", ""); redirect(substr(ME, 0, -1), lang('Logout successful.')); } +} elseif ($_COOKIE["adminer_permanent"] && !isset($_SESSION["usernames"][$_GET["server"]])) { + list($server, $username, $cipher) = array_map('base64_decode', explode(":", $_COOKIE["adminer_permanent"])); + if ($_GET["server"] == "" || $server == $_GET["server"]) { + session_regenerate_id(); // defense against session fixation + $_SESSION["usernames"][$server] = $username; + $_SESSION["passwords"][$server] = decrypt_string($cipher, $adminer->permanentLogin()); + if (!$_POST && $server != $_GET["server"]) { + redirect(preg_replace('~^([^?]*).*~', '\\1', ME) . '?server=' . urlencode($server)); + } + } } function auth_error($exception = null) { @@ -47,9 +65,10 @@ : ""))), null); echo "<form action='' method='post'>\n"; $adminer->loginForm($username); - echo "<p>\n"; + echo "<div>"; hidden_fields($_POST, array("driver", "server", "username", "password")); // expired session - echo "<input type='submit' value='" . lang('Login') . "'>\n</form>\n"; + echo "</div>\n"; + echo "</form>\n"; page_footer("auth"); } Modified: branches/sqlite/adminer/include/bootstrap.inc.php =================================================================== --- branches/sqlite/adminer/include/bootstrap.inc.php 2010-02-17 15:24:17 UTC (rev 1314) +++ branches/sqlite/adminer/include/bootstrap.inc.php 2010-02-17 16:24:44 UTC (rev 1315) @@ -40,13 +40,13 @@ } if (!isset($_SERVER["REQUEST_URI"])) { - $_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"] . (strlen($_SERVER["QUERY_STRING"]) ? "?$_SERVER[QUERY_STRING]" : ""); // IIS 5 compatibility + $_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"] . ($_SERVER["QUERY_STRING"] != "" ? "?$_SERVER[QUERY_STRING]" : ""); // IIS 5 compatibility } session_write_close(); // disable session.auto_start @ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled session_name("adminer_sid"); // use specific session name to get own namespace -$params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $_SERVER["HTTPS"]); +$params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $_SERVER["HTTPS"] && $_SERVER["HTTPS"] != "off"); if (version_compare(PHP_VERSION, '5.2.0') >= 0) { $params[] = true; // HttpOnly } @@ -75,8 +75,8 @@ @set_time_limit(0); // @ - can be disabled define("DB", $_GET["db"]); // for the sake of speed and size -define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\\1', $_SERVER["REQUEST_URI"]) . '?' . (SID ? SID . '&' : '') . ($_GET["driver"] ? "driver=" . urlencode($_GET["driver"]) . '&' : '') . (strlen($_GET["server"]) ? "server=" . urlencode($_GET["server"]) . '&' : '') . (strlen(DB) ? 'db=' . urlencode(DB) . '&' : '')); -$on_actions = array("RESTRICT", "CASCADE", "SET NULL", "NO ACTION"); // used in foreign_keys() +define("SID_FORM", SID && !ini_get("session.use_only_cookies") ? '<input type="hidden" name="' . session_name() . '" value="' . h(session_id()) . '">' : ''); +define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\\1', $_SERVER["REQUEST_URI"]) . '?' . (SID_FORM ? SID . '&' : '') . ($_GET["driver"] ? "driver=" . urlencode($_GET["driver"]) . '&' : '') . ($_GET["server"] != "" ? "server=" . urle... [truncated message content] |
From: <jak...@us...> - 2010-02-17 16:49:50
|
Revision: 1317 http://adminer.svn.sourceforge.net/adminer/?rev=1317&view=rev Author: jakubvrana Date: 2010-02-17 16:49:43 +0000 (Wed, 17 Feb 2010) Log Message: ----------- SELECT LIMIT abstraction Modified Paths: -------------- branches/sqlite/adminer/create.inc.php branches/sqlite/adminer/download.inc.php branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/edit.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/editor/include/adminer.inc.php Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2010-02-17 16:47:50 UTC (rev 1316) +++ branches/sqlite/adminer/create.inc.php 2010-02-17 16:49:43 UTC (rev 1317) @@ -125,7 +125,7 @@ } if ($connection->server_info >= 5.1) { $from = "FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = " . $connection->quote(DB) . " AND TABLE_NAME = " . $connection->quote($TABLE); - $result = $connection->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $from ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1"); + $result = $connection->query(select_limit("PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $from ORDER BY PARTITION_ORDINAL_POSITION", 1)); list($row["partition_by"], $row["partitions"], $row["partition"]) = $result->fetch_row(); $row["partition_names"] = array(); $row["partition_values"] = array(); Modified: branches/sqlite/adminer/download.inc.php =================================================================== --- branches/sqlite/adminer/download.inc.php 2010-02-17 16:47:50 UTC (rev 1316) +++ branches/sqlite/adminer/download.inc.php 2010-02-17 16:49:43 UTC (rev 1317) @@ -2,5 +2,5 @@ $TABLE = $_GET["download"]; header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=" . friendly_url("$TABLE-" . implode("_", $_GET["where"])) . "." . friendly_url($_GET["field"])); -echo $connection->result("SELECT " . idf_escape($_GET["field"]) . " FROM " . idf_escape($TABLE) . " WHERE " . where($_GET) . " LIMIT 1"); +echo $connection->result(select_limit(idf_escape($_GET["field"]) . " FROM " . idf_escape($TABLE) . " WHERE " . where($_GET), 1)); exit; // don't output footer Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-02-17 16:47:50 UTC (rev 1316) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-02-17 16:49:43 UTC (rev 1317) @@ -70,7 +70,7 @@ function result($query, $field = 0) { $result = $this->query($query); - if (!is_resource($result)) { + if (!is_object($result)) { $this->_get_error(); } return sqlsrv_get_field($result->_result, 0); @@ -138,6 +138,10 @@ return $return; } + function select_limit($query, $limit, $offset = 0) { + return "SELECT TOP $limit $query"; //! offset + } + /** Get database collation * @param string * @param array result of collations() @@ -159,15 +163,7 @@ */ function db_info() { global $connection; - foreach (array( - 'privileges' => lang('Privileges'), - 'processlist' => lang('Process list'), - 'variables' => lang('Variables'), - ) as $key => $val) { - echo "<a href='" . h(ME) . "$key='>$val</a>\n"; - } echo "<p>" . lang('%s version: %s through PHP extension %s', "MS SQL", "<b>$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; - # echo "<p>" . lang('Logged as: %s', "<b>" . h($connection->result("SELECT USER()")) . "</b>") . "\n"; } function tables_list() { @@ -219,20 +215,7 @@ * @return array array($key_name => array("type" => , "columns" => array(), "lengths" => array())) */ function indexes($table, $connection2 = null) { - global $connection; - if (!is_object($connection2)) { // use the main connection if the separate connection is unavailable - $connection2 = $connection; - } - $return = array(); - $result = $connection2->query("SHOW INDEX FROM " . idf_escape($table)); - if ($result) { - while ($row = $result->fetch_assoc()) { - $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE"))); - $return[$row["Key_name"]]["columns"][$row["Seq_in_index"]] = $row["Column_name"]; - $return[$row["Key_name"]]["lengths"][$row["Seq_in_index"]] = $row["Sub_part"]; - } - } - return $return; + return array(); } /** Get foreign keys in table @@ -248,8 +231,7 @@ * @return array array("select" => ) */ function view($name) { - global $connection; - return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result("SHOW CREATE VIEW " . idf_escape($name), 1))); + return array("select" => ""); } /** Get sorted grouped list of collations Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-02-17 16:47:50 UTC (rev 1316) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-02-17 16:49:43 UTC (rev 1317) @@ -248,6 +248,16 @@ return $return; } + /** Formulate SQL query with limit + * @param string everything after SELECT + * @param int + * @param int + * @return string + */ + function select_limit($query, $limit, $offset = 0) { + return "SELECT $query" . (isset($limit) ? " LIMIT $limit OFFSET $offset" : ""); + } + /** Get database collation * @param string * @param array result of collations() Modified: branches/sqlite/adminer/edit.inc.php =================================================================== --- branches/sqlite/adminer/edit.inc.php 2010-02-17 16:47:50 UTC (rev 1316) +++ branches/sqlite/adminer/edit.inc.php 2010-02-17 16:49:43 UTC (rev 1317) @@ -62,7 +62,7 @@ } $row = array(); if ($select) { - $result = $connection->query("SELECT " . implode(", ", $select) . " FROM " . idf_escape($TABLE) . " WHERE $where LIMIT " . (isset($_GET["select"]) ? 2 : 1)); + $result = $connection->query(select_limit(implode(", ", $select) . " FROM " . idf_escape($TABLE) . " WHERE $where", (isset($_GET["select"]) ? 2 : 1))); $row = $result->fetch_assoc(); if (isset($_GET["select"]) && $result->fetch_assoc()) { $row = false; Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-02-17 16:47:50 UTC (rev 1316) +++ branches/sqlite/adminer/include/functions.inc.php 2010-02-17 16:49:43 UTC (rev 1317) @@ -482,7 +482,7 @@ foreach (table_status() as $table => $table_status) { $name = $adminer->tableName($table_status); if (isset($table_status["Engine"]) && $name != "" && (!$_POST["tables"] || in_array($table, $_POST["tables"]))) { - $result = $connection->query($q = "SELECT 1 FROM " . idf_escape($table) . " WHERE " . implode(" AND ", $adminer->selectSearchProcess(fields($table), array())) . " LIMIT 1"); + $result = $connection->query(select_limit("1 FROM " . idf_escape($table) . " WHERE " . implode(" AND ", $adminer->selectSearchProcess(fields($table), array())), 1)); if ($result->num_rows) { if (!$found) { echo "<ul>\n"; Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2010-02-17 16:47:50 UTC (rev 1316) +++ branches/sqlite/adminer/select.inc.php 2010-02-17 16:49:43 UTC (rev 1317) @@ -54,7 +54,7 @@ $union = array(); foreach ($_POST["check"] as $val) { // where is not unique so OR can't be used - $union[] = "(SELECT $from " . ($where ? "AND " : "WHERE ") . where_check($val) . $group_by . " LIMIT 1)"; + $union[] = "(" . select_limit("$from " . ($where ? "AND " : "WHERE ") . where_check($val) . $group_by, 1) . ")"; } dump_data($TABLE, "INSERT", implode(" UNION ALL ", $union)); } @@ -161,7 +161,7 @@ $adminer->selectActionPrint($text_length); echo "</form>\n"; - $query = "SELECT " . (intval($limit) && $group && count($group) < count($select) ? "SQL_CALC_FOUND_ROWS " : "") . $from . $group_by . ($limit != "" ? " LIMIT " . intval($limit) . ($_GET["page"] ? " OFFSET " . ($limit * $_GET["page"]) : "") : ""); + $query = select_limit((intval($limit) && $group && count($group) < count($select) ? "SQL_CALC_FOUND_ROWS " : "") . $from . $group_by, ($limit != "" ? intval($limit) : null), ($_GET["page"] ? $limit * $_GET["page"] : 0)); echo $adminer->selectQuery($query); $result = $connection->query($query); Modified: branches/sqlite/editor/include/adminer.inc.php =================================================================== --- branches/sqlite/editor/include/adminer.inc.php 2010-02-17 16:47:50 UTC (rev 1316) +++ branches/sqlite/editor/include/adminer.inc.php 2010-02-17 16:49:43 UTC (rev 1317) @@ -490,7 +490,7 @@ if ($name != "") { $return = &$this->values[$foreignKey["table"]]; if (!isset($return)) { - $return = array("" => "") + get_key_vals("SELECT $id, $name FROM " . idf_escape($foreignKey["table"]) . " ORDER BY 2 LIMIT 1001"); + $return = array("" => "") + get_key_vals(select_limit("$id, $name FROM " . idf_escape($foreignKey["table"]) . " ORDER BY 2", 1001)); if (count($return) > 1001) { $return = array(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-02-18 16:47:35
|
Revision: 1320 http://adminer.svn.sourceforge.net/adminer/?rev=1320&view=rev Author: jakubvrana Date: 2010-02-18 16:47:25 +0000 (Thu, 18 Feb 2010) Log Message: ----------- MSSQL driver Modified Paths: -------------- branches/sqlite/adminer/create.inc.php branches/sqlite/adminer/database.inc.php branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/download.inc.php branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/edit.inc.php branches/sqlite/adminer/include/bootstrap.inc.php branches/sqlite/adminer/include/editing.inc.php branches/sqlite/adminer/include/export.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/include/lang.inc.php branches/sqlite/adminer/lang/de.inc.php branches/sqlite/adminer/lang/es.inc.php branches/sqlite/adminer/lang/et.inc.php branches/sqlite/adminer/lang/nl.inc.php branches/sqlite/adminer/lang/ru.inc.php branches/sqlite/adminer/lang/sk.inc.php branches/sqlite/adminer/lang/zh-tw.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/adminer/sql.inc.php branches/sqlite/editor/include/adminer.inc.php Property Changed: ---------------- branches/sqlite/ branches/sqlite/adminer/drivers/mysql.inc.php Property changes on: branches/sqlite ___________________________________________________________________ Modified: svn:mergeinfo - /trunk:1193-1314 + /trunk:1193-1317 Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/create.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -61,7 +61,7 @@ $after = "AFTER " . idf_escape($field["field"]); //! drop and create foreign keys with renamed columns } elseif ($field["orig"] != "") { - $fields .= "\nDROP " . idf_escape($field["orig"]) . ","; + $fields .= "\nDROP COLUMN " . idf_escape($field["orig"]) . ","; } if ($field["orig"] != "") { $orig_field = next($orig_fields); @@ -84,7 +84,7 @@ ? " (" . implode(",", $partitions) . "\n)" : ($_POST["partitions"] ? " PARTITIONS " . intval($_POST["partitions"]) : "") ); - } elseif ($connection->server_info >= 5.1 && $TABLE != "") { + } elseif ($driver == "sql" && $connection->server_info >= 5.1 && $TABLE != "") { $status .= "\nREMOVE PARTITIONING"; } $location = ME . "table=" . urlencode($_POST["name"]); @@ -123,9 +123,9 @@ } $row["fields"][] = $field; } - if ($connection->server_info >= 5.1) { + if ($driver == "sql" && $connection->server_info >= 5.1) { $from = "FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = " . $connection->quote(DB) . " AND TABLE_NAME = " . $connection->quote($TABLE); - $result = $connection->query(select_limit("PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $from ORDER BY PARTITION_ORDINAL_POSITION", 1)); + $result = $connection->query("SELECT" . limit("PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $from ORDER BY PARTITION_ORDINAL_POSITION", 1)); list($row["partition_by"], $row["partitions"], $row["partition"]) = $result->fetch_row(); $row["partition_names"] = array(); $row["partition_values"] = array(); @@ -177,7 +177,7 @@ <input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="submit" value="<?php echo lang('Save'); ?>"> <?php -if ($connection->server_info >= 5.1) { +if ($driver == "sql" && $connection->server_info >= 5.1) { $partition_table = ereg('RANGE|LIST', $row["partition_by"]); ?> <fieldset><legend><?php echo lang('Partition by'); ?></legend> Modified: branches/sqlite/adminer/database.inc.php =================================================================== --- branches/sqlite/adminer/database.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/database.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -4,31 +4,22 @@ // create or rename database restart_session(); unset($_SESSION["databases"][$_GET["server"]]); // clear cache - $dbs = explode("\n", str_replace("\r", "", $_POST["name"])); - $failed = false; - $last = ""; - foreach ($dbs as $db) { - if (count($dbs) == 1 || $db != "") { // ignore empty lines but always try to create single database - if (!queries("CREATE DATABASE " . idf_escape($db) . ($_POST["collation"] ? " COLLATE " . $connection->quote($_POST["collation"]) : ""))) { - $failed = true; + if (DB != "") { + queries_redirect(preg_replace('~db=[^&]*&~', '', ME) . "db=" . urlencode($_POST["name"]), lang('Database has been renamed.'), rename_database($_POST["name"], $_POST["collation"])); + } else { + $dbs = explode("\n", str_replace("\r", "", $_POST["name"])); + $success = true; + $last = ""; + foreach ($dbs as $db) { + if (count($dbs) == 1 || $db != "") { // ignore empty lines but always try to create single database + if (!queries("CREATE DATABASE " . idf_escape($db) . ($_POST["collation"] ? " COLLATE " . $connection->quote($_POST["collation"]) : ""))) { + $success = false; + } + $last = $db; } - $last = $db; } + queries_redirect(ME . "db=" . urlencode($last), lang('Database has been created.'), $success); } - if (query_redirect(queries(), ME . "db=" . urlencode($last), lang('Database has been created.'), DB == "", false, $failed)) { - //! move triggers - $result = $connection->query("SHOW TABLES"); - while ($row = $result->fetch_row()) { - if (!queries("RENAME TABLE " . idf_escape($row[0]) . " TO " . idf_escape($_POST["name"]) . "." . idf_escape($row[0]))) { - break; - } - } - if (!$row) { - queries("DROP DATABASE " . idf_escape(DB)); - //! saved to history of removed database - } - queries_redirect(preg_replace('~db=[^&]*&~', '', ME) . "db=" . urlencode($_POST["name"]), lang('Database has been renamed.'), !$row); - } } else { // alter database if (!$_POST["collation"]) { @@ -47,17 +38,16 @@ $name = $_POST["name"]; $collate = $_POST["collation"]; } elseif (DB == "") { - // propose database name with limited privileges - $result = $connection->query("SHOW GRANTS"); - while ($row = $result->fetch_row()) { - if (preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~', $row[0], $match) && $match[1]) { + // propose database name with limited privileges //! MySQL only + foreach (get_vals("SHOW GRANTS") as $grant) { + if (preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~', $grant, $match) && $match[1]) { $name = stripcslashes(idf_unescape($match[2])); break; } } } else { $collate = db_collation(DB, $collations); - } +} ?> <form action="" method="post"> Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/db.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -9,7 +9,7 @@ } if (isset($_POST["truncate"])) { foreach ((array) $_POST["tables"] as $table) { - if (!queries("TRUNCATE " . idf_escape($table))) { + if (!queries("TRUNCATE TABLE " . idf_escape($table))) { $result = false; break; } @@ -60,6 +60,7 @@ $name = $row["Name"]; echo '<tr' . odd() . '><td>' . checkbox((isset($row["Rows"]) ? "tables[]" : "views[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');"); echo '<th><a href="' . h(ME) . 'table=' . urlencode($name) . '">' . h($name) . '</a>'; + //! driver specific columns and operations if (isset($row["Rows"])) { echo "<td>$row[Engine]<td>$row[Collation]"; foreach (array("Data_length" => "create", "Index_length" => "indexes", "Data_free" => "edit", "Auto_increment" => "auto_increment=1&create", "Rows" => "select") as $key => $link) { Modified: branches/sqlite/adminer/download.inc.php =================================================================== --- branches/sqlite/adminer/download.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/download.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -2,5 +2,5 @@ $TABLE = $_GET["download"]; header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=" . friendly_url("$TABLE-" . implode("_", $_GET["where"])) . "." . friendly_url($_GET["field"])); -echo $connection->result(select_limit(idf_escape($_GET["field"]) . " FROM " . idf_escape($TABLE) . " WHERE " . where($_GET), 1)); +echo $connection->result("SELECT" . limit(idf_escape($_GET["field"]) . " FROM " . idf_escape($TABLE) . " WHERE " . where($_GET), 1)); exit; // don't output footer Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -1,10 +1,12 @@ <?php -/** -* @author Jakub Cernohuby +/** +* @author Jakub Černohubý +* @author Vladimír Šťástka */ $possible_drivers[] = "SQLSRV"; -if (extension_loaded("sqlsrv")) { +$possible_drivers[] = "MSSQL"; +if (extension_loaded("sqlsrv") || extension_loaded("mssql")) { $drivers["mssql"] = "MS SQL"; } @@ -16,7 +18,7 @@ function _get_error() { $this->error = ""; foreach (sqlsrv_errors() as $error) { - $this->error .= "SQLSTATE: $error[SQLSTATE] code: $error[code] message: $error[message]\n"; + $this->error .= "$error[message]\n"; } } @@ -36,36 +38,41 @@ } function select_db($database) { - $return = sqlsrv_query($this->_link, "USE $database"); - if (!$return) { - $this->_get_error(); - } - return $return; + return $this->query("USE $database"); } function query($query, $unbuffered = false) { - $result = sqlsrv_query($this->_link, $query); //! , array(), ($unbuffered ? array() : array("Scrollable" => SQLSRV_CURSOR_KEYSET)) + $result = sqlsrv_query($this->_link, $query); //! , array(), ($unbuffered ? array() : array("Scrollable" => "keyset")) if (!$result) { $this->_get_error(); return false; - } elseif ($result === true) { - $this->affected_rows = sqlsrv_rows_affected($this->_link); - return true; } - return new Min_Result($result); + return $this->store_result($result); } function multi_query($query) { - return $this->_result = $this->query($query); + $this->_result = sqlsrv_query($this->_link, $query); + if (!$this->_result) { + $this->_get_error(); + return false; + } + return true; } - function store_result() { - return $this->_result; + function store_result($result = null) { + if (!$result) { + $result = $this->_result; + } + if (sqlsrv_field_metadata($result)) { + return new Min_Result($result); + } + $this->affected_rows = sqlsrv_rows_affected($result); + return true; } function next_result() { - return sqlsrv_next_result($this->_result->_result); + return sqlsrv_next_result($this->_result); } function result($query, $field = 0) { @@ -110,6 +117,98 @@ } } + } elseif (extension_loaded("mssql")) { + class Min_DB { + var $extension = "MSSQL", $_link, $_result, $server_info, $affected_rows, $error; + + function connect($server, $username, $password) { + $this->_link = @mssql_connect($server, $username, $password); + if ($this->_link) { + $result = $this->query("SELECT SERVERPROPERTY('ProductLevel'), SERVERPROPERTY('Edition')"); + $row = $result->fetch_row(); + $this->server_info = $this->result("sp_server_info 2", 2)." [$row[0]] $row[1]"; + } else { + $this->error = mssql_get_last_message(); + } + return (bool) $this->_link; + } + + function quote($string) { + return "'" . str_replace("'", "''", $string) . "'"; + } + + function select_db($database) { + return mssql_select_db($database); + } + + function query($query, $unbuffered = false) { + $result = mssql_query($query, $this->_link); //! $unbuffered + if (!$result) { + $this->error = mssql_get_last_message(); + return false; + } + if ($result === true) { + $this->affected_rows = mssql_rows_affected($this->_link); + return true; + } + return new Min_Result($result); + } + + function multi_query($query) { + return $this->_result = $this->query($query); + } + + function store_result() { + return $this->_result; + } + + function next_result() { + return mssql_next_result($this->_result); + } + + function result($query, $field = 0) { + $result = $this->query($query); + if (!is_object($result)) { + return false; + } + return mssql_result($result->_result, 0, $field); + } + } + + class Min_Result { + var $_result, $_offset = 0, $_fields, $num_rows; + + function Min_Result($result) { + $this->_result = $result; + $this->num_rows = mssql_num_rows($result); + } + + function fetch_assoc(){ + return mssql_fetch_assoc($this->_result); + } + + function fetch_row() { + return mssql_fetch_row($this->_result); + } + + function num_rows() { + return mssql_num_rows($this->_result); + } + + + function fetch_field() { + $return = mssql_fetch_field($this->_result); + $return->orgtable = $return->table; + $return->orgname = $return->name; + return $return; + } + + + function __destruct() { + mssql_free_result($this->_result); + } + } + } function idf_escape($idf) { @@ -138,22 +237,15 @@ return $return; } - function select_limit($query, $limit, $offset = 0) { - return "SELECT TOP $limit $query"; //! offset + function limit($query, $limit, $offset = 0) { + return " TOP $limit $query"; //! offset } - /** Get database collation - * @param string - * @param array result of collations() - * @return array - */ function db_collation($db, $collations) { - return null; + global $connection; + return $connection->result("SELECT collation_name FROM sys.databases WHERE name = " . $connection->quote($db)); } - /** Get supported engines - * @return array - */ function engines() { return array(); } @@ -164,6 +256,7 @@ function db_info() { global $connection; echo "<p>" . lang('%s version: %s through PHP extension %s', "MS SQL", "<b>$connection->server_info</b>", "<b>$connection->extension</b>") . "\n"; + echo "<p>" . lang('Logged as: %s', "<b>" . h($connection->result("SELECT SUSER_NAME()")) . "</b>") . "\n"; } function tables_list() { @@ -176,7 +269,7 @@ $result = $connection->query("SELECT TABLE_NAME AS Name, TABLE_TYPE AS Engine FROM information_schema.TABLES" . ($name != "" ? " WHERE TABLE_NAME = " . $connection->quote($name) : "")); while ($row = $result->fetch_assoc()) { if ($row["Engine"] != "VIEW") { - $row["Rows"] = -1; + $row["Rows"] = -1; //! } if ($name != "") { return $row; @@ -216,6 +309,20 @@ */ function indexes($table, $connection2 = null) { return array(); + global $connection; + if (!is_object($connection2)) { + $connection2 = $connection; + } + $return = array(); + $result = $connection2->query("SELECT k.COLUMN_NAME AS Column_name, k.ORDINAL_POSITION AS Seq_in_index, t.CONSTRAINT_TYPE AS Key_name FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS t LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE k ON t.CONSTRAINT_NAME = k.CONSTRAINT_NAME WHERE t.TABLE_NAME = " . $connection2->quote($table)); + if ($result) { + while ($row = $result->fetch_assoc()) { + $return[$row["Key_name"]]["columns"][$row["Seq_in_index"]] = $row["Column_name"]; + $return[$row["Key_name"]]["lengths"][$row2["Seq_in_index"]] = $row2["Sub_part"]; + $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY KEY" ? "PRIMARY" : ($row["Non_unique"] ? "INDEX" : "UNIQUE")); + } + } + return $return; } /** Get foreign keys in table @@ -234,11 +341,12 @@ return array("select" => ""); } - /** Get sorted grouped list of collations - * @return array - */ function collations() { - return array(); + $return = array(); + foreach (get_vals("SELECT name FROM fn_helpcollations()") as $collation) { + $return[ereg_replace("_.*", "", $collation)][] = $collation; + } + return $return; } function information_schema($db) { @@ -247,7 +355,7 @@ function error() { global $connection; - return h($connection->error); + return h(ereg_replace("^(\\[[^]]*])+", "", $connection->error)); } function exact_value($val) { @@ -255,18 +363,25 @@ return $connection->quote($val); } - // value means maximum unsigned length + function rename_database($name, $collation) { + if ($collation) { + queries("ALTER DATABASE " . idf_escape(DB) . " COLLATE " . idf_escape($collation)); + } + return queries("ALTER DATABASE " . idf_escape(DB) . " MODIFY NAME = " . idf_escape($name)); //! false negative "The database name 'test2' has been set." + } + + $driver = "mssql"; + $comments_support = false; $types = array(); $structured_types = array(); foreach (array( - lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "float" => 12, "double" => 21, "decimal" => 66), - 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("binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), - lang('Lists') => array("enum" => 65535, "set" => 64), + lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "int" => 10, "bigint" => 20, "float" => 53, "real" => 12, "bit" => 1, "money" => 20, "smallmoney" => 10), + lang('Date and time') => array("date" => 10, "datetime" => 19, "datetime2" => 19, "datetimeoffset" => 10, "time" => 8, "smalldatetime" => 19), + lang('Strings') => array("char" => 8000, "varchar" => 8000, "text" => 2147483647, "nchar" => 4000, "nvarchar" => 4000, "ntext" => 1073741823), + lang('Binary') => array("binary" => 8000, "varbinary" => 8000, "image" => 2147483647), ) as $key => $val) { $types += $val; $structured_types[$key] = array_keys($val); } - $unsigned = array("unsigned", "zerofill", "unsigned zerofill"); + $unsigned = array(); } Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -100,7 +100,8 @@ if (!$result) { $this->error = mysql_error($this->_link); return false; - } elseif ($result === true) { + } + if ($result === true) { $this->affected_rows = mysql_affected_rows($this->_link); $this->info = mysql_info($this->_link); return true; @@ -148,7 +149,7 @@ class Min_Result { var $num_rows, ///< @var int number of rows in the result - $_result, $_offset = 0 ///< @access private + $_result ///< @access private ; /** @@ -177,11 +178,11 @@ * @return object properties: name, type, orgtable, orgname, charsetnr */ function fetch_field() { - $row = mysql_fetch_field($this->_result, $this->_offset++); - $row->orgtable = $row->table; - $row->orgname = $row->name; - $row->charsetnr = ($row->blob ? 63 : 0); - return $row; + $return = mysql_fetch_field($this->_result); + $return->orgtable = $return->table; + $return->orgname = $return->name; + $return->charsetnr = ($return->blob ? 63 : 0); + return $return; } function __destruct() { @@ -254,14 +255,14 @@ * @param int * @return string */ - function select_limit($query, $limit, $offset = 0) { - return "SELECT $query" . (isset($limit) ? " LIMIT $limit OFFSET $offset" : ""); + function limit($query, $limit, $offset = 0) { + return " $query" . (isset($limit) ? " LIMIT $limit OFFSET $offset" : ""); } /** Get database collation * @param string * @param array result of collations() - * @return array + * @return string */ function db_collation($db, $collations) { global $connection; @@ -276,7 +277,7 @@ return $return; } - /** Get supported engines + /** Get supported engines * @return array */ function engines() { @@ -476,6 +477,30 @@ return "BINARY " . $connection->quote($val); } + /** Rename database from DB + * @param string new name + * @return string + * @return bool + */ + function rename_database($name, $collation) { + $return = false; + if (queries("CREATE DATABASE " . idf_escape($name) . ($collation ? " COLLATE " . $connection->quote($collation) : ""))) { + //! move triggers + $return = true; // table list may by empty + foreach (tables_list() as $table) { + if (!queries("RENAME TABLE " . idf_escape($table) . " TO " . idf_escape($_POST["name"]) . "." . idf_escape($table))) { + $return = false; + break; + } + } + if ($return) { + queries("DROP DATABASE " . idf_escape(DB)); + //! saved to history of removed database + } + } + return $return; + } + $driver = "sql"; ///< @var string JUSH identifier $comments_support = true; ///< @var bool $types = array(); ///< @var array ($type => $maximum_unsigned_length, ...) Property changes on: branches/sqlite/adminer/drivers/mysql.inc.php ___________________________________________________________________ Modified: svn:mergeinfo - /trunk/adminer/drivers/mysql.inc.php:1193-1314 /trunk/adminer/include/mysql.inc.php:675-681,1193-1314 + /trunk/adminer/drivers/mysql.inc.php:1193-1317 /trunk/adminer/include/mysql.inc.php:675-681,1193-1314 Modified: branches/sqlite/adminer/edit.inc.php =================================================================== --- branches/sqlite/adminer/edit.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/edit.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -20,7 +20,7 @@ } } if (isset($_POST["delete"])) { - query_redirect("DELETE FROM " . idf_escape($_GET["edit"]) . " WHERE $where LIMIT 1", $location, lang('Item has been deleted.')); + query_redirect("DELETE" . limit("FROM " . idf_escape($_GET["edit"]) . " WHERE $where", 1), $location, lang('Item has been deleted.')); } else { $set = array(); foreach ($fields as $name => $field) { @@ -35,7 +35,7 @@ redirect($location); } if ($update) { - query_redirect("UPDATE " . idf_escape($TABLE) . " SET" . implode(",", $set) . "\nWHERE $where\nLIMIT 1", $location, lang('Item has been updated.')); + query_redirect("UPDATE" . limit(idf_escape($TABLE) . " SET" . implode(",", $set) . "\nWHERE $where\n", 1), $location, lang('Item has been updated.')); } else { query_redirect("INSERT INTO " . idf_escape($TABLE) . " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")", $location, lang('Item has been inserted.')); } @@ -62,7 +62,7 @@ } $row = array(); if ($select) { - $result = $connection->query(select_limit(implode(", ", $select) . " FROM " . idf_escape($TABLE) . " WHERE $where", (isset($_GET["select"]) ? 2 : 1))); + $result = $connection->query("SELECT" . limit(implode(", ", $select) . " FROM " . idf_escape($TABLE) . " WHERE $where", (isset($_GET["select"]) ? 2 : 1))); $row = $result->fetch_assoc(); if (isset($_GET["select"]) && $result->fetch_assoc()) { $row = false; Modified: branches/sqlite/adminer/include/bootstrap.inc.php =================================================================== --- branches/sqlite/adminer/include/bootstrap.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/include/bootstrap.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -74,12 +74,13 @@ } @set_time_limit(0); // @ - can be disabled +include "../adminer/include/version.inc.php"; +include "../adminer/include/functions.inc.php"; + define("DB", $_GET["db"]); // for the sake of speed and size define("SID_FORM", SID && !ini_get("session.use_only_cookies") ? '<input type="hidden" name="' . session_name() . '" value="' . h(session_id()) . '">' : ''); define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\\1', $_SERVER["REQUEST_URI"]) . '?' . (SID_FORM ? SID . '&' : '') . ($_GET["driver"] ? "driver=" . urlencode($_GET["driver"]) . '&' : '') . ($_GET["server"] != "" ? "server=" . urlencode($_GET["server"]) . '&' : '') . (DB != "" ? 'db=' . urlencode(DB) . '&' : '')); -include "../adminer/include/version.inc.php"; -include "../adminer/include/functions.inc.php"; include "../adminer/include/lang.inc.php"; include "../adminer/lang/$LANG.inc.php"; include "./include/adminer.inc.php"; Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/include/editing.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -112,7 +112,7 @@ <td><input name="<?php echo $key; ?>[length]" value="<?php echo h($field["length"]); ?>" size="3" onfocus="editingLengthFocus(this);"> <td><?php echo "<select name='$key" . "[collation]'" . (ereg('(char|text|enum|set)$', $field["type"]) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>'; - echo ($unsigned ? " <select name='$key" . "[unsigned]'" . (!$field["type"] || ereg('(int|float|double|decimal)$', $field["type"]) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : ''); + echo ($unsigned ? "<select name='$key" . "[unsigned]'" . (!$field["type"] || ereg('(int|float|double|decimal)$', $field["type"]) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : ''); } /** Filter length value including enums Modified: branches/sqlite/adminer/include/export.inc.php =================================================================== --- branches/sqlite/adminer/include/export.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/include/export.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -166,7 +166,7 @@ } function dump_headers($identifier, $multi_table = false) { - $filename = ($identifier != "" ? friendly_url($identifier) : "dump"); + $filename = ($identifier != "" ? friendly_url($identifier) : "adminer"); $output = $_POST["output"]; $ext = ($_POST["format"] == "sql" ? "sql" : ($multi_table ? "tar" : "csv")); // multiple CSV packed to TAR header("Content-Type: " . Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/include/functions.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -482,7 +482,7 @@ foreach (table_status() as $table => $table_status) { $name = $adminer->tableName($table_status); if (isset($table_status["Engine"]) && $name != "" && (!$_POST["tables"] || in_array($table, $_POST["tables"]))) { - $result = $connection->query(select_limit("1 FROM " . idf_escape($table) . " WHERE " . implode(" AND ", $adminer->selectSearchProcess(fields($table), array())), 1)); + $result = $connection->query("SELECT" . limit("1 FROM " . idf_escape($table) . " WHERE " . implode(" AND ", $adminer->selectSearchProcess(fields($table), array())), 1)); if ($result->num_rows) { if (!$found) { echo "<ul>\n"; Modified: branches/sqlite/adminer/include/lang.inc.php =================================================================== --- branches/sqlite/adminer/include/lang.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/include/lang.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -4,7 +4,7 @@ $langs = array( 'en' => 'English', // Jakub Vrána - http://php.vrana.cz 'cs' => 'Čeština', // Jakub Vrána - http://php.vrana.cz - 'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com + 'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz 'nl' => 'Nederlands', // Maarten Balliauw - http://blog.maartenballiauw.be 'es' => 'Español', // Klemens Häckel - http://clickdimension.wordpress.com 'de' => 'Deutsch', // Klemens Häckel - http://clickdimension.wordpress.com Modified: branches/sqlite/adminer/lang/de.inc.php =================================================================== --- branches/sqlite/adminer/lang/de.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/lang/de.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -224,4 +224,6 @@ '%d e-mail(s) have been sent.' => array('%d e-mail abgeschickt.', '%d e-mails abgeschickt.'), 'Webserver file %s' => 'Webserver Datei %s', 'File does not exist.' => 'Datei existiert nicht.', + '%d in total' => '%d insgesamt', + 'Permanent login' => 'Passwort speichern', ); Modified: branches/sqlite/adminer/lang/es.inc.php =================================================================== --- branches/sqlite/adminer/lang/es.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/lang/es.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -224,4 +224,6 @@ '%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'), 'Webserver file %s' => 'Archivo de servidor web %s', 'File does not exist.' => 'Archivo no existe.', + '%d in total' => '%d en total', + 'Permanent login' => 'Guardar contraseña', ); Modified: branches/sqlite/adminer/lang/et.inc.php =================================================================== --- branches/sqlite/adminer/lang/et.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/lang/et.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -224,4 +224,6 @@ '%d e-mail(s) have been sent.' => array('Saadetud kirju: %d.', 'Saadetud kirju: %d.'), 'Webserver file %s' => 'Fail serveris: %s', 'File does not exist.' => 'Faili ei leitud.', + '%d in total' => 'Kokku: %d', + 'Permanent login' => 'Jäta mind meelde', ); Modified: branches/sqlite/adminer/lang/nl.inc.php =================================================================== --- branches/sqlite/adminer/lang/nl.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/lang/nl.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -224,4 +224,6 @@ '%d e-mail(s) have been sent.' => array('%d e-mail verzonden.', '%d e-mails verzonden.'), 'Webserver file %s' => 'Webserver bestand %s', 'File does not exist.' => 'Bestand niet gevonden.', + '%d in total' => '%d in totaal', + 'Permanent login' => 'Blijf aangemeld', ); Modified: branches/sqlite/adminer/lang/ru.inc.php =================================================================== --- branches/sqlite/adminer/lang/ru.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/lang/ru.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -224,4 +224,6 @@ '%d e-mail(s) have been sent.' => array('Было отправлено %d письмо.', 'Было отправлено %d письма.', 'Было отправлено %d писем.'), 'Webserver file %s' => 'Файл %s на вебсервере', 'File does not exist.' => 'Такого файла не существует.', + '%d in total' => 'Всего %d', + 'Permanent login' => 'Оставаться в системе', ); Modified: branches/sqlite/adminer/lang/sk.inc.php =================================================================== --- branches/sqlite/adminer/lang/sk.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/lang/sk.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -224,4 +224,6 @@ 'Editor' => 'Editor', 'Webserver file %s' => 'Súbor %s na webovom serveri', 'File does not exist.' => 'Súbor neexistuje.', + 'Permanent login' => 'Trvalé prihlásenie', + '%d in total' => '%d celkom', ); Modified: branches/sqlite/adminer/lang/zh-tw.inc.php =================================================================== --- branches/sqlite/adminer/lang/zh-tw.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/lang/zh-tw.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -224,4 +224,6 @@ 'Webserver file %s' => '網頁伺服器檔案 %s', 'File does not exist.' => '檔案不存在', 'Item has been deleted.' => '該項目已被刪除', + '%d in total' => '總共 %d 個', + 'Permanent login' => '永久登入', ); Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/select.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -54,7 +54,7 @@ $union = array(); foreach ($_POST["check"] as $val) { // where is not unique so OR can't be used - $union[] = "(" . select_limit("$from " . ($where ? "AND " : "WHERE ") . where_check($val) . $group_by, 1) . ")"; + $union[] = "(SELECT" . limit("$from " . ($where ? "AND " : "WHERE ") . where_check($val) . $group_by, 1) . ")"; } dump_data($TABLE, "INSERT", implode(" UNION ALL ", $union)); } @@ -84,7 +84,7 @@ } else { foreach ((array) $_POST["check"] as $val) { // where is not unique so OR can't be used - $result = queries($command . "\nWHERE " . where_check($val) . (count($group) < count($select) ? "" : "\nLIMIT 1")); + $result = queries($command . "\nWHERE " . where_check($val) . (count($group) < count($select) ? "" : "\nLIMIT 1")); //! LIMIT if (!$result) { break; } @@ -161,7 +161,7 @@ $adminer->selectActionPrint($text_length); echo "</form>\n"; - $query = select_limit((intval($limit) && $group && count($group) < count($select) ? "SQL_CALC_FOUND_ROWS " : "") . $from . $group_by, ($limit != "" ? intval($limit) : null), ($_GET["page"] ? $limit * $_GET["page"] : 0)); + $query = "SELECT" . limit((intval($limit) && $group && count($group) < count($select) ? "SQL_CALC_FOUND_ROWS " : "") . $from . $group_by, ($limit != "" ? intval($limit) : null), ($_GET["page"] ? $limit * $_GET["page"] : 0)); echo $adminer->selectQuery($query); $result = $connection->query($query); @@ -254,11 +254,11 @@ } echo "</table>\n"; - if (intval($limit) && count($group) >= count($select)) { + if (intval($limit) && count($group) >= count($select) && ($found_rows >= $limit || $_GET["page"])) { // slow with big tables ob_flush(); flush(); - $found_rows = $connection->result("SELECT COUNT(*) FROM " . idf_escape($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : "")); + $found_rows = $connection->result("SELECT COUNT(*) FROM " . idf_escape($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : "")); //! MS SQL } echo "<p class='pages'>"; if (intval($limit) && $found_rows > $limit) { Modified: branches/sqlite/adminer/sql.inc.php =================================================================== --- branches/sqlite/adminer/sql.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/adminer/sql.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -91,7 +91,6 @@ } echo "<p class='message' title='" . h($connection->info) . "'>" . lang('Query executed OK, %d row(s) affected.', $connection->affected_rows) . "\n"; } - unset($result); // free resultset } while ($connection->next_result()); } $query = substr($query, $offset); Modified: branches/sqlite/editor/include/adminer.inc.php =================================================================== --- branches/sqlite/editor/include/adminer.inc.php 2010-02-18 16:39:00 UTC (rev 1319) +++ branches/sqlite/editor/include/adminer.inc.php 2010-02-18 16:47:25 UTC (rev 1320) @@ -490,7 +490,7 @@ if ($name != "") { $return = &$this->values[$foreignKey["table"]]; if (!isset($return)) { - $return = array("" => "") + get_key_vals(select_limit("$id, $name FROM " . idf_escape($foreignKey["table"]) . " ORDER BY 2", 1001)); + $return = array("" => "") + get_key_vals("SELECT" . limit("$id, $name FROM " . idf_escape($foreignKey["table"]) . " ORDER BY 2", 1001)); if (count($return) > 1001) { $return = array(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-03-24 10:02:54
|
Revision: 1352 http://adminer.svn.sourceforge.net/adminer/?rev=1352&view=rev Author: jakubvrana Date: 2010-03-24 10:02:46 +0000 (Wed, 24 Mar 2010) Log Message: ----------- Merge from trunk Modified Paths: -------------- branches/sqlite/adminer/call.inc.php branches/sqlite/adminer/create.inc.php branches/sqlite/adminer/database.inc.php branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/dump.inc.php branches/sqlite/adminer/edit.inc.php branches/sqlite/adminer/foreign.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/include/auth.inc.php branches/sqlite/adminer/include/bootstrap.inc.php branches/sqlite/adminer/include/connect.inc.php branches/sqlite/adminer/include/design.inc.php branches/sqlite/adminer/include/editing.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/include/pdo.inc.php branches/sqlite/adminer/lang/cs.inc.php branches/sqlite/adminer/lang/de.inc.php branches/sqlite/adminer/lang/es.inc.php branches/sqlite/adminer/lang/et.inc.php branches/sqlite/adminer/lang/fr.inc.php branches/sqlite/adminer/lang/it.inc.php branches/sqlite/adminer/lang/nl.inc.php branches/sqlite/adminer/lang/ru.inc.php branches/sqlite/adminer/lang/sk.inc.php branches/sqlite/adminer/lang/zh.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/adminer/sql.inc.php branches/sqlite/adminer/static/default.css branches/sqlite/adminer/static/editing.js branches/sqlite/adminer/static/functions.js branches/sqlite/adminer/user.inc.php branches/sqlite/changes.txt branches/sqlite/editor/include/adminer.inc.php branches/sqlite/editor/include/editing.inc.php branches/sqlite/tests/0-login.html branches/sqlite/todo.txt branches/sqlite/version.js Property Changed: ---------------- branches/sqlite/ branches/sqlite/adminer/drivers/mysql.inc.php Property changes on: branches/sqlite ___________________________________________________________________ Modified: svn:mergeinfo - /trunk:1193-1317 + /trunk:1193-1351 Added: bugtraq:url + https://sourceforge.net/tracker/?func=detail&aid=%BUGID%&group_id=264133&atid=1127745 Added: bugtraq:logregex + bug #(\d+) Modified: branches/sqlite/adminer/call.inc.php =================================================================== --- branches/sqlite/adminer/call.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/call.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -28,8 +28,7 @@ } $call[] = (isset($out[$key]) ? "@" . idf_escape($field["field"]) : $val); } - $result = $connection->multi_query((isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . idf_escape($PROCEDURE) . "(" . implode(", ", $call) . ")"); - if (!$result) { + if (!$connection->multi_query((isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . idf_escape($PROCEDURE) . "(" . implode(", ", $call) . ")")) { echo "<p class='error'>" . error() . "\n"; } else { do { Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/create.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -16,84 +16,88 @@ } if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"] && !$_POST["down"]) { - $auto_increment_index = " PRIMARY KEY"; - // don't overwrite primary key by auto_increment - if ($TABLE != "" && $_POST["auto_increment_col"]) { - foreach (indexes($TABLE) as $index) { - if (in_array($_POST["fields"][$_POST["auto_increment_col"]]["orig"], $index["columns"], true)) { - $auto_increment_index = ""; - break; + if ($_POST["drop"]) { + query_redirect("DROP TABLE " . idf_escape($_GET["create"]), substr(ME, 0, -1), lang('Table has been dropped.')); + } else { + $auto_increment_index = " PRIMARY KEY"; + // don't overwrite primary key by auto_increment + if ($TABLE != "" && $_POST["auto_increment_col"]) { + foreach (indexes($TABLE) as $index) { + if (in_array($_POST["fields"][$_POST["auto_increment_col"]]["orig"], $index["columns"], true)) { + $auto_increment_index = ""; + break; + } + if ($index["type"] == "PRIMARY") { + $auto_increment_index = " UNIQUE"; + } } - if ($index["type"] == "PRIMARY") { - $auto_increment_index = " UNIQUE"; + } + $fields = ""; + ksort($_POST["fields"]); + $orig_field = reset($orig_fields); + $after = "FIRST"; + foreach ($_POST["fields"] as $key => $field) { + $type_field = (isset($types[$field["type"]]) ? $field : $referencable_primary[$foreign_keys[$field["type"]]]); + if ($field["field"] != "") { + if ($type_field) { + $default = eregi_replace(" *on update CURRENT_TIMESTAMP", "", $field["default"]); + if ($default != $field["default"]) { // preg_replace $count is available since PHP 5.1.0 + $field["on_update"] = "CURRENT_TIMESTAMP"; + $field["default"] = $default; + } + if (!$field["has_default"]) { + $field["default"] = null; + } + $process_field = process_field($field, $type_field); + $auto_increment = ($key == $_POST["auto_increment_col"]); + if ($process_field != process_field($orig_field, $orig_field) || $orig_field["auto_increment"] != $auto_increment) { + $fields .= "\n" . ($TABLE != "" ? ($field["orig"] != "" ? "CHANGE " . idf_escape($field["orig"]) : "ADD") : " ") + . " $process_field" + . ($auto_increment ? " AUTO_INCREMENT$auto_increment_index" : "") + . ($TABLE != "" ? " $after" : "") . "," + ; + } + if (!isset($types[$field["type"]])) { + $fields .= ($TABLE != "" ? "\nADD" : "") . " FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . idf_escape($foreign_keys[$field["type"]]) . " (" . idf_escape($type_field["field"]) . "),"; + } + } + $after = "AFTER " . idf_escape($field["field"]); + //! drop and create foreign keys with renamed columns + } elseif ($field["orig"] != "") { + $fields .= "\nDROP COLUMN " . idf_escape($field["orig"]) . ","; } + if ($field["orig"] != "") { + $orig_field = next($orig_fields); + } } - } - $fields = ""; - ksort($_POST["fields"]); - $orig_field = reset($orig_fields); - $after = "FIRST"; - foreach ($_POST["fields"] as $key => $field) { - $type_field = (isset($types[$field["type"]]) ? $field : $referencable_primary[$foreign_keys[$field["type"]]]); - if ($field["field"] != "") { - if ($type_field) { - $default = eregi_replace(" *on update CURRENT_TIMESTAMP", "", $field["default"]); - if ($default != $field["default"]) { // preg_replace $count is available since PHP 5.1.0 - $field["on_update"] = "CURRENT_TIMESTAMP"; - $field["default"] = $default; + $status = ($comments_support ? "COMMENT=" . $connection->quote($_POST["Comment"]) : "") + . ($_POST["Engine"] && $_POST["Engine"] != $orig_status["Engine"] ? " ENGINE=" . $connection->quote($_POST["Engine"]) : "") + . ($_POST["Collation"] && $_POST["Collation"] != $orig_status["Collation"] ? " COLLATE " . $connection->quote($_POST["Collation"]) : "") + . ($_POST["Auto_increment"] != "" ? " AUTO_INCREMENT=" . preg_replace('~[^0-9]+~', '', $_POST["Auto_increment"]) : "") + ; + if (in_array($_POST["partition_by"], $partition_by)) { + $partitions = array(); + if ($_POST["partition_by"] == 'RANGE' || $_POST["partition_by"] == 'LIST') { + foreach (array_filter($_POST["partition_names"]) as $key => $val) { + $value = $_POST["partition_values"][$key]; + $partitions[] = "\nPARTITION " . idf_escape($val) . " VALUES " . ($_POST["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection } - if (!$field["has_default"]) { - $field["default"] = null; - } - $process_field = process_field($field, $type_field); - $auto_increment = ($key == $_POST["auto_increment_col"]); - if ($process_field != process_field($orig_field, $orig_field) || $orig_field["auto_increment"] != $auto_increment) { - $fields .= "\n" . ($TABLE != "" ? ($field["orig"] != "" ? "CHANGE " . idf_escape($field["orig"]) : "ADD") : " ") - . " $process_field" - . ($auto_increment ? " AUTO_INCREMENT$auto_increment_index" : "") - . ($TABLE != "" ? " $after" : "") . "," - ; - } - if (!isset($types[$field["type"]])) { - $fields .= ($TABLE != "" ? "\nADD" : "") . " FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . idf_escape($foreign_keys[$field["type"]]) . " (" . idf_escape($type_field["field"]) . "),"; - } } - $after = "AFTER " . idf_escape($field["field"]); - //! drop and create foreign keys with renamed columns - } elseif ($field["orig"] != "") { - $fields .= "\nDROP COLUMN " . idf_escape($field["orig"]) . ","; + $status .= "\nPARTITION BY $_POST[partition_by]($_POST[partition])" . ($partitions // $_POST["partition"] can be expression, not only column + ? " (" . implode(",", $partitions) . "\n)" + : ($_POST["partitions"] ? " PARTITIONS " . intval($_POST["partitions"]) : "") + ); + } elseif ($driver == "sql" && $connection->server_info >= 5.1 && $TABLE != "") { + $status .= "\nREMOVE PARTITIONING"; } - if ($field["orig"] != "") { - $orig_field = next($orig_fields); + $location = ME . "table=" . urlencode($_POST["name"]); + if ($TABLE != "") { + query_redirect("ALTER TABLE " . idf_escape($TABLE) . "$fields\nRENAME TO " . idf_escape($_POST["name"]) . ($status ? ",\n$status" : ""), $location, lang('Table has been altered.')); + } else { + cookie("adminer_engine", $_POST["Engine"]); + query_redirect("CREATE TABLE " . idf_escape($_POST["name"]) . " (" . substr($fields, 0, -1) . "\n) $status", $location, lang('Table has been created.')); } } - $status = ($comments_support ? "COMMENT=" . $connection->quote($_POST["Comment"]) : "") - . ($_POST["Engine"] && $_POST["Engine"] != $orig_status["Engine"] ? " ENGINE=" . $connection->quote($_POST["Engine"]) : "") - . ($_POST["Collation"] && $_POST["Collation"] != $orig_status["Collation"] ? " COLLATE " . $connection->quote($_POST["Collation"]) : "") - . ($_POST["Auto_increment"] != "" ? " AUTO_INCREMENT=" . preg_replace('~[^0-9]+~', '', $_POST["Auto_increment"]) : "") - ; - if (in_array($_POST["partition_by"], $partition_by)) { - $partitions = array(); - if ($_POST["partition_by"] == 'RANGE' || $_POST["partition_by"] == 'LIST') { - foreach (array_filter($_POST["partition_names"]) as $key => $val) { - $value = $_POST["partition_values"][$key]; - $partitions[] = "\nPARTITION " . idf_escape($val) . " VALUES " . ($_POST["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection - } - } - $status .= "\nPARTITION BY $_POST[partition_by]($_POST[partition])" . ($partitions // $_POST["partition"] can be expression, not only column - ? " (" . implode(",", $partitions) . "\n)" - : ($_POST["partitions"] ? " PARTITIONS " . intval($_POST["partitions"]) : "") - ); - } elseif ($driver == "sql" && $connection->server_info >= 5.1 && $TABLE != "") { - $status .= "\nREMOVE PARTITIONING"; - } - $location = ME . "table=" . urlencode($_POST["name"]); - if ($TABLE != "") { - query_redirect("ALTER TABLE " . idf_escape($TABLE) . "$fields\nRENAME TO " . idf_escape($_POST["name"]) . ($status ? ",\n$status" : ""), $location, lang('Table has been altered.')); - } else { - cookie("adminer_engine", $_POST["Engine"]); - query_redirect("CREATE TABLE " . idf_escape($_POST["name"]) . " (" . substr($fields, 0, -1) . "\n) $status", $location, lang('Table has been created.')); - } } page_header(($TABLE != "" ? lang('Alter table') : lang('Create table')), $error, array("table" => $TABLE), $TABLE); @@ -160,7 +164,6 @@ <?php echo ($engines ? html_select("Engine", array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) : ""); ?> <?php echo html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]); ?> <input type="submit" value="<?php echo lang('Save'); ?>"> -</p> <table cellspacing="0" id="edit-fields" class="nowrap"> <?php $column_comments = edit_fields($row["fields"], $collations, "TABLE", $suhosin, $foreign_keys); ?> </table> @@ -176,11 +179,12 @@ <p> <input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="submit" value="<?php echo lang('Save'); ?>"> +<?php if (strlen($_GET["create"])) { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo $confirm; ?>><?php } ?> <?php if ($driver == "sql" && $connection->server_info >= 5.1) { $partition_table = ereg('RANGE|LIST', $row["partition_by"]); + print_fieldset("partition", lang('Partition by'), $row["partition_by"]); ?> -<fieldset><legend><?php echo lang('Partition by'); ?></legend> <p> <?php echo html_select("partition_by", array(-1 => "") + $partition_by, $row["partition_by"], "partitionByChange(this);"); ?> (<input name="partition" value="<?php echo h($row["partition"]); ?>">) @@ -195,6 +199,6 @@ } ?> </table> -</fieldset> +</div></fieldset> <?php } ?> </form> Modified: branches/sqlite/adminer/database.inc.php =================================================================== --- branches/sqlite/adminer/database.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/database.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -1,8 +1,11 @@ <?php if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP changes add.x to add_x - if (DB !== $_POST["name"]) { + restart_session(); + if ($_POST["drop"]) { + unset($_SESSION["databases"][$_GET["server"]]); + query_redirect("DROP DATABASE " . idf_escape(DB), remove_from_uri("db|database"), lang('Database has been dropped.')); + } elseif (DB !== $_POST["name"]) { // create or rename database - restart_session(); unset($_SESSION["databases"][$_GET["server"]]); // clear cache if (DB != "") { queries_redirect(preg_replace('~db=[^&]*&~', '', ME) . "db=" . urlencode($_POST["name"]), lang('Database has been renamed.'), rename_database($_POST["name"], $_POST["collation"])); @@ -60,7 +63,9 @@ <input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="submit" value="<?php echo lang('Save'); ?>"> <?php -if (!$_POST["add_x"] && $_GET["db"] == "") { +if (strlen(DB)) { + echo "<input type='submit' name='drop' value='" . lang('Drop') . "'$confirm>\n"; +} elseif (!$_POST["add_x"] && $_GET["db"] == "") { echo "<input type='image' name='add' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>\n"; } ?> Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/db.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -76,23 +76,26 @@ } } echo "<tr><td> <th>" . lang('%d in total', count($table_status)); - echo "<td>" . $connection->result($connection->query("SELECT @@storage_engine")); + echo "<td>" . $connection->result("SELECT @@storage_engine"); echo "<td>" . db_collation(DB, collations()); foreach (array("create", "indexes", "edit") as $val) { echo "<td align='right'>" . number_format($sums[$val], 0, '.', lang(',')); } echo "</table>\n"; - echo "<p><input type='hidden' name='token' value='$token'><input type='submit' value='" . lang('Analyze') . "'> <input type='submit' name='optimize' value='" . lang('Optimize') . "'> <input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> <input type='submit' name='truncate' value='" . lang('Truncate') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables/) + ')');\"> <input type='submit' name='drop' value='" . lang('Drop') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables|views/) + ')');\">\n"; - $dbs = get_databases(); - if (count($dbs) != 1) { - $db = (isset($_POST["target"]) ? $_POST["target"] : DB); - echo "<p>" . lang('Move to other database') . ($dbs ? ": " . html_select("target", $dbs, $db) : ': <input name="target" value="' . h($db) . '">') . " <input type='submit' name='move' value='" . lang('Move') . "'>\n"; + if (!information_schema(DB)) { + echo "<p><input type='hidden' name='token' value='$token'><input type='submit' value='" . lang('Analyze') . "'> <input type='submit' name='optimize' value='" . lang('Optimize') . "'> <input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> <input type='submit' name='truncate' value='" . lang('Truncate') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables/) + ')');\"> <input type='submit' name='drop' value='" . lang('Drop') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables|views/) + ')');\">\n"; + $dbs = get_databases(); + if (count($dbs) != 1) { + $db = (isset($_POST["target"]) ? $_POST["target"] : DB); + echo "<p>" . lang('Move to other database') . ($dbs ? ": " . html_select("target", $dbs, $db) : ': <input name="target" value="' . h($db) . '">') . " <input type='submit' name='move' value='" . lang('Move') . "'>\n"; + } } echo "</form>\n"; } +echo '<p><a href="' . h(ME) . 'create=">' . lang('Create table') . "</a>\n"; if ($connection->server_info >= 5) { - echo '<p><a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n"; + echo ' <a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n"; echo "<h3>" . lang('Routines') . "</h3>\n"; $result = $connection->query("SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = " . $connection->quote(DB)); if ($result->num_rows) { Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -258,7 +258,7 @@ * @return string */ function limit($query, $limit, $offset = 0) { - return " $query" . (isset($limit) ? " LIMIT $limit OFFSET $offset" : ""); + return " $query" . (isset($limit) ? "\nLIMIT $limit" . ($offset ? " OFFSET $offset" : "") : ""); } /** Get database collation Property changes on: branches/sqlite/adminer/drivers/mysql.inc.php ___________________________________________________________________ Modified: svn:mergeinfo - /trunk/adminer/drivers/mysql.inc.php:1193-1317 /trunk/adminer/include/mysql.inc.php:675-681,1193-1314 + /trunk/adminer/drivers/mysql.inc.php:1193-1351 /trunk/adminer/include/mysql.inc.php:675-681,1193-1351 Modified: branches/sqlite/adminer/dump.inc.php =================================================================== --- branches/sqlite/adminer/dump.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/dump.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -160,7 +160,7 @@ echo "<tr><th>" . lang('Data') . "<td>" . html_select('data_style', $data_style, 'INSERT'); ?> </table> -<p><input type="submit" value="<?php echo lang('Export'); ?>"></p> +<p><input type="submit" value="<?php echo lang('Export'); ?>"> <table cellspacing="0"> <?php Modified: branches/sqlite/adminer/edit.inc.php =================================================================== --- branches/sqlite/adminer/edit.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/edit.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -9,8 +9,10 @@ } } if ($_POST && !$error && !isset($_GET["select"])) { - $location = $_SERVER["REQUEST_URI"]; // continue edit or insert - if (!$_POST["insert"]) { + $location = $_POST["referer"]; + if ($_POST["insert"]) { // continue edit or insert + $location = $_SERVER["REQUEST_URI"]; //! doesn't work with change in &where field + } elseif (!ereg('^.+&select=.+$', $location)) { $location = ME . "select=" . urlencode($TABLE); $i = 0; // append &set converted to &where foreach ((array) $_GET["set"] as $key => $val) { @@ -99,6 +101,7 @@ ?> <p> <input type="hidden" name="token" value="<?php echo $token; ?>"> +<input type="hidden" name="referer" value="<?php echo h(isset($_POST["referer"]) ? $_POST["referer"] : $_SERVER["HTTP_REFERER"]); ?>"> <input type="hidden" name="save" value="1"> <?php if (isset($_GET["select"])) { Modified: branches/sqlite/adminer/foreign.inc.php =================================================================== --- branches/sqlite/adminer/foreign.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/foreign.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -53,7 +53,6 @@ <?php echo lang('Target table'); ?>: <?php echo html_select("table", $referencable, $row["table"], "this.form['change-js'].value = '1'; this.form.submit();"); ?> <input type="hidden" name="change-js" value=""> -</p> <noscript><p><input type="submit" name="change" value="<?php echo lang('Change'); ?>"></noscript> <table cellspacing="0"> <thead><tr><th><?php echo lang('Source'); ?><th><?php echo lang('Target'); ?></thead> Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/include/adminer.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -129,7 +129,7 @@ */ function selectQuery($query) { global $driver; - return "<p><code class='jush-$driver'>" . h($query) . "</code> <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a></p>\n"; + return "<p><code class='jush-$driver'>" . h(str_replace("\n", " ", $query)) . "</code> <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a>\n"; } /** Description of a row in a table @@ -383,7 +383,7 @@ global $driver; restart_session(); $id = "sql-" . count($_SESSION["messages"]); - $_SESSION["history"][$_GET["server"]][DB][] = $query; + $_SESSION["history"][$_GET["server"]][DB][] = (strlen($query) > 1e6 ? ereg_replace('[\x80-\xFF]+$', '', substr($query, 0, 1e6)) . "\n..." : $query); // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment return " <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a><div id='$id' class='hidden'><pre class='jush-$driver'>" . shorten_utf8($query, 1000) . '</pre><a href="' . h(ME . 'sql=&history=' . (count($_SESSION["history"][$_GET["server"]][DB]) - 1)) . '">' . lang('Edit') . '</a></div>'; } @@ -394,7 +394,7 @@ function editFunctions($field) { $return = array(""); if (ereg('char|date|time', $field["type"])) { - $return = (ereg('char', $field["type"]) ? array("", "md5", "sha1", "password", "uuid") : array("", "now")); //! JavaScript for disabling maxlength + $return = (ereg('char', $field["type"]) ? array("", "md5", "sha1", "password", "encrypt", "uuid") : array("", "now")); //! JavaScript for disabling maxlength } if (!isset($_GET["call"]) && (isset($_GET["select"]) || where($_GET))) { // relative functions @@ -453,7 +453,7 @@ $return = idf_escape($name) . " $function " . (preg_match("~^([0-9]+|'[0-9.: -]') [A-Z_]+$~i", $value) ? $value : $return); } elseif (ereg('^(addtime|subtime|concat)$', $function)) { $return = "$function(" . idf_escape($name) . ", $return)"; - } elseif (ereg('^(md5|sha1|password)$', $function)) { + } elseif (ereg('^(md5|sha1|password|encrypt)$', $function)) { $return = "$function($return)"; } return $return; Modified: branches/sqlite/adminer/include/auth.inc.php =================================================================== --- branches/sqlite/adminer/include/auth.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/include/auth.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -25,7 +25,7 @@ } redirect($location); } - $_GET["server"] = $_POST["server"]; + $_GET["server"] = $_POST["server"]; //! used also in ME } elseif ($_POST["logout"]) { $token = $_SESSION["tokens"][$_GET["server"]]; if ($token && $_POST["token"] != $token) { @@ -44,11 +44,11 @@ } } elseif ($_COOKIE["adminer_permanent"] && !isset($_SESSION["usernames"][$_GET["server"]])) { list($server, $username, $cipher) = array_map('base64_decode', explode(":", $_COOKIE["adminer_permanent"])); - if ($_GET["server"] == "" || $server == $_GET["server"]) { + if (($_GET["server"] == "" && !$_POST) || $server == $_GET["server"]) { session_regenerate_id(); // defense against session fixation $_SESSION["usernames"][$server] = $username; $_SESSION["passwords"][$server] = decrypt_string($cipher, $adminer->permanentLogin()); - if (!$_POST && $server != $_GET["server"]) { + if ($server != $_GET["server"]) { redirect(preg_replace('~^([^?]*).*~', '\\1', ME) . '?server=' . urlencode($server)); //! store and respect driver } } @@ -86,3 +86,11 @@ if (!$_SESSION["tokens"][$_GET["server"]]) { $_SESSION["tokens"][$_GET["server"]] = rand(1, 1e6); // defense against cross-site request forgery } +if (isset($_POST["server"]) && $_POST["token"]) { + $_POST["token"] = $_SESSION["tokens"][$_GET["server"]]; +} +$token = $_SESSION["tokens"][$_GET["server"]]; ///< @var string CSRF protection +$error = ($_POST ///< @var string + ? ($_POST["token"] == $token ? "" : lang('Invalid CSRF token. Send the form again.')) + : ($_SERVER["REQUEST_METHOD"] != "POST" ? "" : lang('Too big POST data. Reduce the data or increase the %s configuration directive.', '"post_max_size"')) // posted form with no data means that post_max_size exceeded because Adminer always sends token at least +); Modified: branches/sqlite/adminer/include/bootstrap.inc.php =================================================================== --- branches/sqlite/adminer/include/bootstrap.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/include/bootstrap.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -46,7 +46,7 @@ session_write_close(); // disable session.auto_start @ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled session_name("adminer_sid"); // use specific session name to get own namespace -$params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $_SERVER["HTTPS"] && $_SERVER["HTTPS"] != "off"); +$params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off")); if (version_compare(PHP_VERSION, '5.2.0') >= 0) { $params[] = true; // HttpOnly } @@ -103,9 +103,3 @@ $on_actions = array("RESTRICT", "CASCADE", "SET NULL", "NO ACTION"); ///< @var array used in foreign_keys() $confirm = " onclick=\"return confirm('" . lang('Are you sure?') . "');\""; ///< @var string -$token = $_SESSION["tokens"][$_GET["server"]]; ///< @var string CSRF protection -/** @var string */ -$error = ($_POST - ? ($_POST["token"] == $token ? "" : lang('Invalid CSRF token. Send the form again.')) - : ($_SERVER["REQUEST_METHOD"] != "POST" ? "" : lang('Too big POST data. Reduce the data or increase the %s configuration directive.', '"post_max_size"')) // posted form with no data means that post_max_size exceeded because Adminer always sends token at least -); Modified: branches/sqlite/adminer/include/connect.inc.php =================================================================== --- branches/sqlite/adminer/include/connect.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/include/connect.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -14,7 +14,7 @@ queries_redirect(substr(ME, 0, -1), lang('Database has been dropped.'), !$connection->error); } - page_header(lang('Select database'), "", null); + page_header(lang('Select database'), $error, null); echo "<p><a href='" . h(ME) . "database='>" . lang('Create new database') . "</a>\n"; db_info(); $databases = get_databases(); @@ -25,7 +25,7 @@ echo "<thead><tr><td><input type='hidden' name='token' value='$token'> <th>" . lang('Database') . "<td>" . lang('Collation') . "</thead>\n"; foreach ($databases as $db) { $root = h(ME) . "db=" . urlencode($db); - echo "<tr" . odd() . "><td>" . checkbox("db[]", $db, false); + echo "<tr" . odd() . "><td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"])); echo "<th><a href='$root'>" . h($db) . "</a>"; echo "<td><a href='$root&database='>" . nbsp(db_collation($db, $collations)) . "</a>"; echo "\n"; Modified: branches/sqlite/adminer/include/design.inc.php =================================================================== --- branches/sqlite/adminer/include/design.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/include/design.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -10,7 +10,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta name="robots" content="noindex"> -<title><?php echo $title_all . ($_GET["server"] != "" && $_GET["server"] != "localhost" ? h("- $_GET[server]") : "") . " - " . $adminer->name(); ?></title> +<title><?php echo $title_all . ($_GET["server"] != "" && $_GET["server"] != "localhost" ? h(" - $_GET[server]") : "") . " - " . $adminer->name(); ?></title> <link rel="shortcut icon" type="image/x-icon" href="../adminer/static/favicon.ico"> <link rel="stylesheet" type="text/css" href="../adminer/static/default.css<?php // Ondrej Valka, http://valka.info ?>"> <?php if (file_exists("adminer.css")) { ?> Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/include/editing.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -20,29 +20,31 @@ echo "<thead><tr>"; for ($j=0; $j < count($row); $j++) { $field = $result->fetch_field(); - if ($field->orgtable != "") { - if (!isset($indexes[$field->orgtable])) { + $orgtable = $field->orgtable; + $orgname = $field->orgname; + if ($orgtable != "") { + if (!isset($indexes[$orgtable])) { // find primary key in each table - $indexes[$field->orgtable] = array(); - foreach (indexes($field->orgtable, $connection2) as $index) { + $indexes[$orgtable] = array(); + foreach (indexes($orgtable, $connection2) as $index) { if ($index["type"] == "PRIMARY") { - $indexes[$field->orgtable] = array_flip($index["columns"]); + $indexes[$orgtable] = array_flip($index["columns"]); break; } } - $columns[$field->orgtable] = $indexes[$field->orgtable]; + $columns[$orgtable] = $indexes[$orgtable]; } - if (isset($columns[$field->orgtable][$field->orgname])) { - unset($columns[$field->orgtable][$field->orgname]); - $indexes[$field->orgtable][$field->orgname] = $j; - $links[$j] = $field->orgtable; + if (isset($columns[$orgtable][$orgname])) { + unset($columns[$orgtable][$orgname]); + $indexes[$orgtable][$orgname] = $j; + $links[$j] = $orgtable; } } if ($field->charsetnr == 63) { $blobs[$j] = true; } $types[$j] = $field->type; - echo "<th>" . h($field->name); + echo "<th" . ($orgtable != "" || $field->name != $orgname ? " title='" . h(($orgtable != "" ? "$orgtable." : "") . $orgname) . "'" : "") . ">" . h($field->name); } echo "</thead>\n"; } @@ -109,10 +111,9 @@ global $structured_types, $unsigned, $inout; ?> <td><select name="<?php echo $key; ?>[type]" class="type" onfocus="lastType = selectValue(this);" onchange="editingTypeChange(this);"><?php echo optionlist($structured_types + ($foreign_keys ? array(lang('Foreign keys') => $foreign_keys) : array()), $field["type"]); ?></select> -<td><input name="<?php echo $key; ?>[length]" value="<?php echo h($field["length"]); ?>" size="3" onfocus="editingLengthFocus(this);"> -<td><?php +<td><input name="<?php echo $key; ?>[length]" value="<?php echo h($field["length"]); ?>" size="3" onfocus="editingLengthFocus(this);"><td><?php echo "<select name='$key" . "[collation]'" . (ereg('(char|text|enum|set)$', $field["type"]) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>'; - echo ($unsigned ? "<select name='$key" . "[unsigned]'" . (!$field["type"] || ereg('(int|float|double|decimal)$', $field["type"]) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : ''); + echo ($unsigned ? "<select name='$key" . "[unsigned]'" . (!$field["type"] || ereg('(int|float|double|decimal)$', $field["type"]) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select> ' : ' '); // space for IE } /** Filter length value including enums @@ -191,7 +192,7 @@ <thead><tr class="wrap"> <?php if ($type == "PROCEDURE") { ?><td> <?php } ?> <th><?php echo ($type == "TABLE" ? lang('Column name') : lang('Parameter name')); ?> -<td><?php echo lang('Type'); ?><textarea id="enum-edit" rows="4" cols="10" style="display: none;" onblur="editingLengthBlur(this);"></textarea> +<td><?php echo lang('Type'); ?><textarea id="enum-edit" rows="4" cols="12" wrap="off" style="display: none;" onblur="editingLengthBlur(this);"></textarea> <td><?php echo lang('Length'); ?> <td><?php echo lang('Options'); ?> <?php if ($type == "TABLE") { ?> Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/include/functions.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -193,7 +193,7 @@ * @return bool */ function cookie($name, $value) { - $params = array($name, $value, time() + 2592000, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $_SERVER["HTTPS"] && $_SERVER["HTTPS"] != "off"); // 2592000 = 30 * 24 * 60 * 60 + $params = array($name, $value, time() + 2592000, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off")); // 2592000 = 30 * 24 * 60 * 60 if (version_compare(PHP_VERSION, '5.2.0') >= 0) { $params[] = true; // HttpOnly } Modified: branches/sqlite/adminer/include/pdo.inc.php =================================================================== --- branches/sqlite/adminer/include/pdo.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/include/pdo.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -26,21 +26,24 @@ $this->error = $errorInfo[2]; return false; } - $this->_result = $result; - if (!$result->columnCount()) { - $this->affected_rows = $result->rowCount(); - return true; - } - $result->num_rows = $result->rowCount(); // is not guaranteed to work with all drivers + $this->store_result($result); return $result; } function multi_query($query) { - return $this->query($query); + return $this->_result = $this->query($query); } - function store_result() { - return ($this->_result->columnCount() ? $this->_result : true); + function store_result($result = null) { + if (!$result) { + $result = $this->_result; + } + if ($result->columnCount()) { + $result->num_rows = $result->rowCount(); // is not guaranteed to work with all drivers + return $result; + } + $this->affected_rows = $result->rowCount(); + return true; } function next_result() { Modified: branches/sqlite/adminer/lang/cs.inc.php =================================================================== --- branches/sqlite/adminer/lang/cs.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/lang/cs.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -9,6 +9,7 @@ 'Select database' => 'Vybrat databázi', 'Invalid database.' => 'Nesprávná databáze.', 'Create new database' => 'Vytvořit novou databázi', + 'Table has been dropped.' => 'Tabulka byla odstraněna.', 'Table has been altered.' => 'Tabulka byla změněna.', 'Table has been created.' => 'Tabulka byla vytvořena.', 'Alter table' => 'Pozměnit tabulku', Modified: branches/sqlite/adminer/lang/de.inc.php =================================================================== --- branches/sqlite/adminer/lang/de.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/lang/de.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -9,6 +9,7 @@ 'Select database' => 'Datenbank auswählen', 'Invalid database.' => 'Datenbank ungültig.', 'Create new database' => 'Neue Datenbank', + 'Table has been dropped.' => 'Tabelle entfernt.', 'Table has been altered.' => 'Tabelle geändert.', 'Table has been created.' => 'Tabelle erstellt.', 'Alter table' => 'Tabelle ändern', Modified: branches/sqlite/adminer/lang/es.inc.php =================================================================== --- branches/sqlite/adminer/lang/es.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/lang/es.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -9,6 +9,7 @@ 'Select database' => 'Seleccionar Base de datos', 'Invalid database.' => 'Base de datos inválida.', 'Create new database' => 'Nueva Base de datos', + 'Table has been dropped.' => 'Tabla eliminada.', 'Table has been altered.' => 'Tabla modificada.', 'Table has been created.' => 'Tabla creada.', 'Alter table' => 'Modificar Estructura', Modified: branches/sqlite/adminer/lang/et.inc.php =================================================================== --- branches/sqlite/adminer/lang/et.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/lang/et.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -9,6 +9,7 @@ 'Select database' => 'Vali andmebaas', 'Invalid database.' => 'Tundmatu andmebaas.', 'Create new database' => 'Loo uus andmebaas', + 'Table has been dropped.' => 'Tabel on edukalt kustutatud.', 'Table has been altered.' => 'Tabeli andmed on edukalt muudetud.', 'Table has been created.' => 'Tabel on edukalt loodud.', 'Alter table' => 'Muuda tabeli struktuuri', Modified: branches/sqlite/adminer/lang/fr.inc.php =================================================================== --- branches/sqlite/adminer/lang/fr.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/lang/fr.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -2,14 +2,15 @@ $translations = array( 'Login' => 'Authentification', 'Logout successful.' => 'Aurevoir!', - 'Invalid credentials.' => 'Authentification échouée', + 'Invalid credentials.' => 'Authentification échouée.', 'Server' => 'Serveur', 'Username' => 'Utilisateur', 'Password' => 'Mot de passe', 'Select database' => 'Selectionner la base de donnée', - 'Invalid database.' => 'Base de donnée invalide', + 'Invalid database.' => 'Base de donnée invalide.', 'Create new database' => 'Créer une base de donnée', - 'Table has been altered.' => 'Table modifiée', + 'Table has been dropped.' => 'Table effacée.', + 'Table has been altered.' => 'Table modifiée.', 'Table has been created.' => 'Table créée.', 'Alter table' => 'Modifier la table', 'Create table' => 'Créer une table', @@ -57,7 +58,7 @@ 'Sort' => 'Ordonner', 'descending' => 'décroissant', 'Limit' => 'Limit', - 'No rows.' => 'Aucun résultat', + 'No rows.' => 'Aucun résultat.', 'Action' => 'Action', 'edit' => 'modifier', 'Page' => 'Page', @@ -170,9 +171,9 @@ 'At given time' => 'À un moment précis', 'Save and continue edit' => 'Sauvegarder et continuer l\'édition', 'original' => 'original', - 'Tables have been truncated.' => 'Les tables ont été tronquées', - 'Tables have been moved.' => 'Les tables ont été déplacées', - 'Tables have been dropped.' => 'Les tables ont été effacées', + 'Tables have been truncated.' => 'Les tables ont été tronquées.', + 'Tables have been moved.' => 'Les tables ont été déplacées.', + 'Tables have been dropped.' => 'Les tables ont été effacées.', 'Tables and views' => 'Tables et vues', 'Engine' => 'Moteur', 'Collation' => 'Collation', @@ -191,12 +192,12 @@ '%d item(s) have been affected.' => array('%d élément ont été modifié.', '%d éléments ont été modifié.'), 'whole result' => 'résultat entier', 'Clone' => 'Cloner', - 'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Le nombre de champs maximum est dépassé. Veuillez augmenter %s et %s', + 'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Le nombre de champs maximum est dépassé. Veuillez augmenter %s et %s.', 'Partition by' => 'Partitionné par', 'Partitions' => 'Partitions', 'Partition name' => 'Nom de la partition', 'Values' => 'Valeurs', - '%d row(s) have been imported.' => array('%d ligne a été importé','%d lignes ont été importé'), + '%d row(s) have been imported.' => array('%d ligne a été importé.','%d lignes ont été importé.'), '(anywhere)' => '(n\'importe où)', 'CSV Import' => 'Importation CVS', 'Import' => 'Importer', @@ -224,4 +225,6 @@ '%d e-mail(s) have been sent.' => array('%d message a été envoyé.', '%d messages ont été envoyés.'), 'Webserver file %s' => '%s fichier du serveur Web', 'File does not exist.' => 'Le fichier est introuvable.', + '%d in total' => '%d au total', + 'Permanent login' => 'Authentification permanente', ); Modified: branches/sqlite/adminer/lang/it.inc.php =================================================================== --- branches/sqlite/adminer/lang/it.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/lang/it.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -9,6 +9,7 @@ 'Select database' => 'Seleziona database', 'Invalid database.' => 'Database non valido.', 'Create new database' => 'Crea nuovo database', + 'Table has been dropped.' => 'Tabella eliminata.', 'Table has been altered.' => 'Tabella modificata.', 'Table has been created.' => 'Tabella creata.', 'Alter table' => 'Modifica tabella', @@ -224,4 +225,6 @@ '%d e-mail(s) have been sent.' => array('%d e-mail inviata.','%d e-mail inviate.'), 'Webserver file %s' => 'Webserver file %s', 'File does not exist.' => 'Il file non esiste.', + '%d in total' => '%d in totale', + 'Permanent login' => 'Login permanente', ); Modified: branches/sqlite/adminer/lang/nl.inc.php =================================================================== --- branches/sqlite/adminer/lang/nl.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/lang/nl.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -9,6 +9,7 @@ 'Select database' => 'Database selecteren', 'Invalid database.' => 'Ongeldige database.', 'Create new database' => 'Nieuwe database', + 'Table has been dropped.' => 'Tabel verwijderd.', 'Table has been altered.' => 'Tabel aangepast.', 'Table has been created.' => 'Tabel aangemaakt.', 'Alter table' => 'Tabel aanpassen', Modified: branches/sqlite/adminer/lang/ru.inc.php =================================================================== --- branches/sqlite/adminer/lang/ru.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/lang/ru.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -9,6 +9,7 @@ 'Select database' => 'Выбрать базу данных', 'Invalid database.' => 'Плохая база данных.', 'Create new database' => 'Создать новую базу данных', + 'Table has been dropped.' => 'Таблица была удалена.', 'Table has been altered.' => 'Таблица была изменена.', 'Table has been created.' => 'Таблица была создана.', 'Alter table' => 'Изменить таблицу', Modified: branches/sqlite/adminer/lang/sk.inc.php =================================================================== --- branches/sqlite/adminer/lang/sk.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/lang/sk.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -9,6 +9,7 @@ 'Select database' => 'Vybrať databázu', 'Invalid database.' => 'Nesprávna databáza.', 'Create new database' => 'Vytvoriť novú databázu', + 'Table has been dropped.' => 'Tabuľka bola odstránená.', 'Table has been altered.' => 'Tabuľka bola zmenená.', 'Table has been created.' => 'Tabuľka bola vytvorená.', 'Alter table' => 'Zmeniť tabuľku', Modified: branches/sqlite/adminer/lang/zh.inc.php =================================================================== --- branches/sqlite/adminer/lang/zh.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/lang/zh.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -9,6 +9,7 @@ 'Select database' => '选择数据库', 'Invalid database.' => '无效数据库。', 'Create new database' => '创建新数据库', + 'Table has been dropped.' => '已丢弃表。', 'Table has been altered.' => '已更改表。', 'Table has been created.' => '已创建表。', 'Alter table' => '更改表', @@ -30,7 +31,7 @@ 'Alter database' => '更改数据库', 'Create database' => '创建数据库', 'SQL command' => 'SQL命令', - 'Dump' => '导入/导出', + 'Dump' => '导出', 'Logout' => '注销', 'database' => '数据库', 'Use' => '使用', @@ -224,4 +225,6 @@ '%d e-mail(s) have been sent.' => '%d 封邮件已发送。', 'Webserver file %s' => 'Web服务器文件 %s', 'File does not exist.' => '文件不存在', + '%d in total' => '共计 %d', + 'Permanent login' => '保持登录', ); Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/select.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -23,8 +23,8 @@ $where = $adminer->selectSearchProcess($fields, $indexes); $order = $adminer->selectOrderProcess($fields, $indexes); $limit = $adminer->selectLimitProcess(); -$from = ($select ? implode(", ", $select) : "*") . " FROM " . idf_escape($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : ""); -$group_by = ($group && count($group) < count($select) ? " GROUP BY " . implode(", ", $group) : "") . ($order ? " ORDER BY " . implode(", ", $order) : ""); +$from = ($select ? implode(", ", $select) : "*") . "\nFROM " . idf_escape($TABLE) . ($where ? "\nWHERE " . implode(" AND ", $where) : ""); +$group_by = ($group && count($group) < count($select) ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : ""); if ($_POST && !$error) { $where_check = "(" . implode(") OR (", array_map('where_check', (array) $_POST["check"])) . ")"; @@ -98,7 +98,7 @@ $file = preg_replace("~^\xEF\xBB\xBF~", '', $file); //! character set $result = true; $cols = array_keys($fields); - preg_match_all('~("[^"]*"|[^"\\r\\n])+~', $file, $matches); + preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~', $file, $matches); $affected = count($matches[0]); queries("START TRANSACTION"); foreach ($matches[0] as $key => $val) { @@ -119,8 +119,11 @@ } } } + if ($result) { queries("COMMIT"); + } queries_redirect(remove_from_uri("page"), lang('%d row(s) have been imported.', $affected), $result); + queries("ROLLBACK"); } else { $error = upload_error($file); } @@ -197,7 +200,7 @@ if ($name != "") { $order++; $names[$key] = $name; - echo '<th><a href="' . h(remove_from_uri('(order|desc)[^=]*') . '&order%5B0%5D=' . urlencode($key) . ($_GET["order"][0] == $key && !$_GET["desc"][0] ? '&desc%5B0%5D=1' : '')) . '">' . apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions + echo '<th><a href="' . h(remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key) . ($_GET["order"][0] == $key && !$_GET["desc"][0] ? '&desc%5B0%5D=1' : '')) . '">' . apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions } next($select); } Modified: branches/sqlite/adminer/sql.inc.php =================================================================== --- branches/sqlite/adminer/sql.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/sql.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -21,15 +21,15 @@ $query = get_file("sql_file", true); } if (is_string($query)) { // get_file() returns error as number, fread() as false - @ini_set("memory_limit", 2 * strlen($query) + memory_get_usage() + 8e6); // @ - may be disabled, 2 - substr and trim, 8e6 - other variables + if (function_exists('memory_get_usage')) { + @ini_set("memory_limit", 2 * strlen($query) + memory_get_usage() + 8e6); // @ - may be disabled, 2 - substr and trim, 8e6 - other variables + } if ($query != "" && strlen($query) < 1e6 && (!$history || end($history) != $query)) { // don't add repeated and big queries $history[] = $query; } $space = "(\\s|/\\*.*\\*/|(#|-- )[^\n]*\n|--\n)"; $alter_database = "(CREATE|DROP)$space+(DATABASE|SCHEMA)\\b~isU"; - $databases = &$_SESSION["databases"][$_GET["server"]]; - if (!ini_get("session.use_cookies") || (isset($databases) && !preg_match("~\\b$alter_database", $query))) { // quick check - may be inside string - //! false positive with $fp and disabled ini_set() and enabled session.use_cookies + if (!ini_get("session.use_cookies")) { session_write_close(); } $delimiter = ";"; @@ -87,7 +87,9 @@ } } else { if (preg_match("~^$space*$alter_database", $query)) { - $databases = null; // clear cache + restart_session(); + $_SESSION["databases"][$_GET["server"]] = null; // clear cache + session_write_close(); } echo "<p class='message' title='" . h($connection->info) . "'>" . lang('Query executed OK, %d row(s) affected.', $connection->affected_rows) . "\n"; } Modified: branches/sqlite/adminer/static/default.css =================================================================== --- branches/sqlite/adminer/static/default.css 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/static/default.css 2010-03-24 10:02:46 UTC (rev 1352) @@ -6,7 +6,7 @@ h2 { font-size: 150%; margin: 0 0 20px -18px; padding: .8em 1em; border-bottom: 1px solid #000; color: #000; font-weight: normal; background: #ddf; } h3 { font-weight: normal; font-size: 130%; margin: .8em 0; } form { margin: 0; } -table { margin: 0 20px .8em 0; border: 0; border-top: 1px solid #999; border-left: 1px solid #999; font-size: 90%; } +table { margin: 1em 20px .8em 0; border: 0; border-top: 1px solid #999; border-left: 1px solid #999; font-size: 90%; } td, th { margin-bottom: 1em; border: 0; border-right: 1px solid #999; border-bottom: 1px solid #999; padding: .2em .3em; } th { background: #eee; text-align: left; } thead th { text-align: center; } @@ -14,6 +14,7 @@ fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: 0 .5em .5em 0; border: 1px solid #999; } p { margin: 0 20px 1em 0; } img { vertical-align: middle; border: 0; } +td img { max-width: 200px; max-height: 200px; } code { background: #eee; } tr:hover td, tr:hover th { background: #ddf; } .version { color: #777; font-size: 67%; } Modified: branches/sqlite/adminer/static/editing.js =================================================================== --- branches/sqlite/adminer/static/editing.js 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/static/editing.js 2010-03-24 10:02:46 UTC (rev 1352) @@ -388,12 +388,10 @@ ev = ev || event; tablePos[that.firstChild.firstChild.firstChild.data] = [ (ev.clientY - y) / em, (ev.clientX - x) / em ]; that = undefined; - var date = new Date(); - date.setMonth(date.getMonth() + 1); var s = ''; for (var key in tablePos) { s += '_' + key + ':' + Math.round(tablePos[key][0] * 10000) / 10000 + 'x' + Math.round(tablePos[key][1] * 10000) / 10000; } - document.cookie = 'adminer_schema=' + encodeURIComponent(s.substr(1)) + '; expires=' + date + '; path="' + location.pathname + location.search + '"'; + cookie('adminer_schema=' + encodeURIComponent(s.substr(1)), 30, '; path="' + location.pathname + location.search + '"'); } } Modified: branches/sqlite/adminer/static/functions.js =================================================================== --- branches/sqlite/adminer/static/functions.js 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/static/functions.js 2010-03-24 10:02:46 UTC (rev 1352) @@ -11,10 +11,21 @@ return true; } +/** Set permanent cookie +* @param string +* @param number +* @param string optional +*/ +function cookie(assign, days, params) { + var date = new Date(); + date.setDate(date.getDate() + days); + document.cookie = assign + '; expires=' + date + (params || ''); +} + /** Verify current Adminer version */ function verifyVersion() { - document.cookie = 'adminer_version=0'; + cookie('adminer_version=0', 1); var script = document.createElement('script'); script.src = 'https://adminer.svn.sourceforge.net/svnroot/adminer/trunk/version.js'; document.body.appendChild(script); Modified: branches/sqlite/adminer/user.inc.php =================================================================== --- branches/sqlite/adminer/user.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/adminer/user.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -22,7 +22,7 @@ $new_grants = array(); if ($_POST) { foreach ($_POST["objects"] as $key => $val) { - $new_grants[$val] = ((array) $new_grants[$val]) + ((array) $_POST["grants"][$key]); + $new_grants[$val] = (array) $new_grants[$val] + (array) $_POST["grants"][$key]; } } $grants = array(); @@ -31,7 +31,9 @@ while ($row = $result->fetch_row()) { if (preg_match('~GRANT (.*) ON (.*) TO ~', $row[0], $match) && preg_match_all('~ *([^(,]*[^ ,(])( *\\([^)]+\\))?~', $match[1], $matches, PREG_SET_ORDER)) { //! escape the part between ON and TO foreach ($matches as $val) { - $grants["$match[2]$val[2]"][$val[1]] = true; + if ($val[1] != "USAGE") { + $grants["$match[2]$val[2]"][$val[1]] = true; + } if (ereg(' WITH GRANT OPTION', $row[0])) { //! don't check inside strings and identifiers $grants["$match[2]$val[2]"]["GRANT OPTION"] = true; } @@ -50,10 +52,10 @@ if ($_POST["drop"]) { query_redirect("DROP USER $old_user", ME . "privileges=", lang('User has been dropped.')); } else { - if ($old_user == $new_user) { + if ($old_user != $new_user) { + $error = !queries(($connection->server_info < 5 ? "GRANT USAGE ON *.* TO" : "CREATE USER") . " $new_user IDENTIFIED BY" . ($_POST["hashed"] ? " PASSWORD" : "") . " $pass"); + } elseif ($_POST["pass"] != $old_pass || !$_POST["hashed"]) { queries("SET PASSWORD FOR $new_user = " . ($_POST["hashed"] ? $pass : "PASSWORD($pass)")); - } else { - $error = !queries(($connection->server_info < 5 ? "GRANT USAGE ON *.* TO" : "CREATE USER") . " $new_user IDENTIFIED BY" . ($_POST["hashed"] ? " PASSWORD" : "") . " $pass"); } if (!$error) { $revoke = array(); @@ -86,7 +88,7 @@ } elseif (!isset($_GET["grant"])) { foreach ($grants as $object => $revoke) { if (preg_match('~^(.+)(\\(.*\\))?$~U', $object, $match)) { - queries("REVOKE " . grant(array_keys($revoke), $match[2]) . " ON $match[1] FROM $new_user"); + grant("REVOKE", array_keys($revoke), $match[2], " ON $match[1] FROM $new_user"); } } } @@ -107,9 +109,7 @@ } else { $row = $_GET + array("host" => $connection->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', -1)")); // create user on the same domain by default $row["pass"] = $old_pass; - if ($old_pass != "") { - $row["hashed"] = true; - } + $row["hashed"] = true; $grants[""] = true; } @@ -126,7 +126,7 @@ <?php //! MAX_* limits, REQUIRE echo "<table cellspacing='0'>\n"; -echo "<thead><tr><th colspan='2'>" . lang('Privileges'); +echo "<thead><tr><th colspan='2'><a href='http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/grant.html'>" . lang('Privileges') . "</a>"; $i = 0; foreach ($grants as $object => $grant) { echo '<th>' . ($object != "*.*" ? "<input name='objects[$i]' value='" . h($object) . "' size='10'>" : "<input type='hidden' name='objects[$i]' value='*.*' size='10'>*.*"); //! separate db, table, columns, PROCEDURE|FUNCTION, routine Modified: branches/sqlite/changes.txt =================================================================== --- branches/sqlite/changes.txt 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/changes.txt 2010-03-24 10:02:46 UTC (rev 1352) @@ -1,4 +1,8 @@ -Adminer 2.3.0-dev: +Adminer 2.3.1-dev: +Add Drop button to Alter pages (regression from 2.0.0) +Return to referer after edit + +Adminer 2.3.0 (released 2010-02-26): Support for permanent login (customization required) Search in all tables Show status variables Modified: branches/sqlite/editor/include/adminer.inc.php =================================================================== --- branches/sqlite/editor/include/adminer.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/editor/include/adminer.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -105,7 +105,7 @@ } function selectQuery($query) { - return "<!-- " . str_replace("--", "--><!--", $query) . " -->\n"; + return "<!--\n" . str_replace("--", "--><!--", $query) . "\n-->\n"; } function rowDescription($table) { Modified: branches/sqlite/editor/include/editing.inc.php =================================================================== --- branches/sqlite/editor/include/editing.inc.php 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/editor/include/editing.inc.php 2010-03-24 10:02:46 UTC (rev 1352) @@ -1,9 +1,17 @@ <?php +/** Encode e-mail header in UTF-8 +* @param string +* @return string +*/ function email_header($header) { // iconv_mime_encode requires PHP 5, imap_8bit requires IMAP extension return "=?UTF-8?B?" . base64_encode($header) . "?="; //! split long lines } +/** Get keys from first column and values from second +* @param string +* @return array +*/ function get_key_vals($query) { global $connection; $return = array(); Modified: branches/sqlite/tests/0-login.html =================================================================== --- branches/sqlite/tests/0-login.html 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/tests/0-login.html 2010-03-24 10:02:46 UTC (rev 1352) @@ -4,12 +4,12 @@ <head profile="http://selenium-ide.openqa.org/profiles/test-case"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="selenium.base" href="" /> -<title>Create database</title> +<title>Login</title> </head> <body> <table cellpadding="1" cellspacing="1" border="1"> <thead> -<tr><td rowspan="1" colspan="3">Create database</td></tr> +<tr><td rowspan="1" colspan="3">Login</td></tr> </thead><tbody> <tr> <td>open</td> @@ -18,7 +18,7 @@ </tr> <tr> <td>open</td> - <td>/adminer/adminer/?lang=en&username=</td> + <td>/adminer/adminer/?lang=en&username=ODBC</td> <td></td> </tr> <tr> Modified: branches/sqlite/todo.txt =================================================================== --- branches/sqlite/todo.txt 2010-03-24 09:36:37 UTC (rev 1351) +++ branches/sqlite/todo.txt 2010-03-24 10:02:46 UTC (rev 1352) @@ -1,7 +1,6 @@ MySQL 5 BIT data type Transactions in export Create view and routine options -Highlight SQL textarea - may use external CodePress Mass editation of individual rows Offer enum and set items in search - whisperer Variables editation, especially timezone @@ -9,8 +8,11 @@ Optionally check IP address Disable spell checking in SQL textareas - spellcheck="false" Accept Tab in SQL textareas, Ctrl+Enter to send form +Highlight SQL textarea, then display query inside textarea in select - may use external CodePress Blob download and image display in edit form (important for Editor with hidden fields in select) Add title to Logout, edit (in select) and select (in menu) in style "hever" +Shift-click in checkboxes to select range +? LIKE %% operator ? Column and table names auto-completition in SQL textarea ? Aliasing of built-in functions can save 7 KB, function minification can save 7 KB, substitution of repetitive $a["a"] can save 4 KB, substitution of $_GET and friends can save 2 KB, JS packer can save 1 KB, not enclosing HTML attribute values can save 1.2 KB, replacing \\n by \n can save .3 KB ? Branch binary_compile: LZW compression of translations can save 30 KB, LZW compression of all texts can save 11 KB, remove of base64_decode() + using chars 127-255 in minif... [truncated message content] |
From: <jak...@us...> - 2010-03-24 17:28:24
|
Revision: 1353 http://adminer.svn.sourceforge.net/adminer/?rev=1353&view=rev Author: jakubvrana Date: 2010-03-24 17:28:18 +0000 (Wed, 24 Mar 2010) Log Message: ----------- Update drivers Modified Paths: -------------- branches/sqlite/adminer/create.inc.php branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/edit.inc.php branches/sqlite/adminer/include/editing.inc.php branches/sqlite/adminer/table.inc.php branches/sqlite/compile.php Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2010-03-24 10:02:46 UTC (rev 1352) +++ branches/sqlite/adminer/create.inc.php 2010-03-24 17:28:18 UTC (rev 1353) @@ -70,7 +70,7 @@ $orig_field = next($orig_fields); } } - $status = ($comments_support ? "COMMENT=" . $connection->quote($_POST["Comment"]) : "") + $status = (support("comment") ? "COMMENT=" . $connection->quote($_POST["Comment"]) : "") . ($_POST["Engine"] && $_POST["Engine"] != $orig_status["Engine"] ? " ENGINE=" . $connection->quote($_POST["Engine"]) : "") . ($_POST["Collation"] && $_POST["Collation"] != $orig_status["Collation"] ? " COLLATE " . $connection->quote($_POST["Collation"]) : "") . ($_POST["Auto_increment"] != "" ? " AUTO_INCREMENT=" . preg_replace('~[^0-9]+~', '', $_POST["Auto_increment"]) : "") @@ -169,10 +169,10 @@ </table> <p> <?php echo lang('Auto Increment'); ?>: <input name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>"> -<?php echo ($comments_support ? lang('Comment') . '<input name="Comment" value="' . h($row["Comment"]) . '" maxlength="60">' : ''); ?> +<?php echo (support("comment") ? lang('Comment') . '<input name="Comment" value="' . h($row["Comment"]) . '" maxlength="60">' : ''); ?> <script type="text/javascript"> document.write('<label><input type="checkbox" onclick="columnShow(this.checked, 5);"><?php echo lang('Default values'); ?><\/label>'); -<?php if ($comments_support) { ?> +<?php if (support("comment")) { ?> document.write('<label><input type="checkbox"<?php if ($column_comments) { ?> checked<?php } ?> onclick="columnShow(this.checked, 6);"><?php echo lang('Show column comments'); ?><\/label>'); <?php } ?> </script> Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-03-24 10:02:46 UTC (rev 1352) +++ branches/sqlite/adminer/db.inc.php 2010-03-24 17:28:18 UTC (rev 1353) @@ -54,7 +54,7 @@ search_tables(); } echo "<table cellspacing='0' class='nowrap' onclick='tableClick(event);'>\n"; - echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);"><th>' . lang('Table') . '<td>' . lang('Engine') . '<td>' . lang('Collation') . '<td>' . lang('Data Length') . '<td>' . lang('Index Length') . '<td>' . lang('Data Free') . '<td>' . lang('Auto Increment') . '<td>' . lang('Rows') . ($comments_support ? '<td>' . lang('Comment') : '') . "</thead>\n"; + echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);"><th>' . lang('Table') . '<td>' . lang('Engine') . '<td>' . lang('Collation') . '<td>' . lang('Data Length') . '<td>' . lang('Index Length') . '<td>' . lang('Data Free') . '<td>' . lang('Auto Increment') . '<td>' . lang('Rows') . (support("comment") ? '<td>' . lang('Comment') : '') . "</thead>\n"; $sums = array(); foreach ($table_status as $row) { $name = $row["Name"]; @@ -68,11 +68,11 @@ echo '<td align="right">' . ($row[$key] != "" ? '<a href="' . h(ME . "$link=") . urlencode($name) . '">' . str_replace(" ", " ", ($key == "Rows" && $row["Engine"] == "InnoDB" && $val ? lang('~ %s', $val) : $val)) . '</a>' : ' '); $sums[$link] += ($row["Engine"] != "InnoDB" || $link != "edit" ? $row[$key] : 0); } - echo ($comments_support ? "<td>" . nbsp($row["Comment"]) : ""); + echo (support("comment") ? "<td>" . nbsp($row["Comment"]) : ""); } else { echo '<td colspan="6"><a href="' . h(ME) . "view=" . urlencode($name) . '">' . lang('View') . '</a>'; echo '<td align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '">?</a>'; - echo ($comments_support ? '<td> ' : ''); + echo (support("comment") ? '<td> ' : ''); } } echo "<tr><td> <th>" . lang('%d in total', count($table_status)); @@ -94,8 +94,10 @@ } echo '<p><a href="' . h(ME) . 'create=">' . lang('Create table') . "</a>\n"; -if ($connection->server_info >= 5) { - echo ' <a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n"; +if (support("view")) { + echo '<a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n"; +} +if (support("routine")) { echo "<h3>" . lang('Routines') . "</h3>\n"; $result = $connection->query("SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = " . $connection->quote(DB)); if ($result->num_rows) { @@ -111,9 +113,10 @@ echo '<p><a href="' . h(ME) . 'procedure=">' . lang('Create procedure') . '</a> <a href="' . h(ME) . 'function=">' . lang('Create function') . "</a>\n"; } -if ($connection->server_info >= 5.1 && ($result = $connection->query("SHOW EVENTS"))) { +if (support("event")) { echo "<h3>" . lang('Events') . "</h3>\n"; - if ($result->num_rows) { + $result = $connection->query("SHOW EVENTS"); + if ($result && $result->num_rows) { echo "<table cellspacing='0'>\n"; echo "<thead><tr><th>" . lang('Name') . "<td>" . lang('Schedule') . "<td>" . lang('Start') . "<td>" . lang('End') . "</thead>\n"; while ($row = $result->fetch_assoc()) { Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-03-24 10:02:46 UTC (rev 1352) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-03-24 17:28:18 UTC (rev 1353) @@ -241,6 +241,10 @@ return " TOP $limit $query"; //! offset } + function limit1($query, $limit, $offset = 0) { + return limit($query, 1); + } + function db_collation($db, $collations) { global $connection; return $connection->result("SELECT collation_name FROM sys.databases WHERE name = " . $connection->quote($db)); @@ -269,7 +273,7 @@ $result = $connection->query("SELECT TABLE_NAME AS Name, TABLE_TYPE AS Engine FROM information_schema.TABLES" . ($name != "" ? " WHERE TABLE_NAME = " . $connection->quote($name) : "")); while ($row = $result->fetch_assoc()) { if ($row["Engine"] != "VIEW") { - $row["Rows"] = -1; //! + $row["Rows"] = 0; } if ($name != "") { return $row; @@ -370,8 +374,11 @@ return queries("ALTER DATABASE " . idf_escape(DB) . " MODIFY NAME = " . idf_escape($name)); //! false negative "The database name 'test2' has been set." } + function support($feature) { + return ($feature == "view" || $feature == "routine"); + } + $driver = "mssql"; - $comments_support = false; $types = array(); $structured_types = array(); foreach (array( Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-03-24 10:02:46 UTC (rev 1352) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-03-24 17:28:18 UTC (rev 1353) @@ -261,6 +261,14 @@ return " $query" . (isset($limit) ? "\nLIMIT $limit" . ($offset ? " OFFSET $offset" : "") : ""); } + /** Formulate SQL modification query with limit 1 + * @param string everything after UPDATE or DELETE + * @return string + */ + function limit1($query) { + return limit($query, 1); + } + /** Get database collation * @param string * @param array result of collations() @@ -490,7 +498,7 @@ //! move triggers $return = true; // table list may by empty foreach (tables_list() as $table) { - if (!queries("RENAME TABLE " . idf_escape($table) . " TO " . idf_escape($_POST["name"]) . "." . idf_escape($table))) { + if (!queries("RENAME TABLE " . idf_escape($table) . " TO " . idf_escape($name) . "." . idf_escape($table))) { $return = false; break; } @@ -502,9 +510,23 @@ } return $return; } + + /** Check whether a feature is supported + * @param string + * @return bool + */ + function support($feature) { + global $connection; + $features = array( + "comment" => true, + "view" => ($connection->server_info >= 5), + "routine" => ($connection->server_info >= 5), + "event" => ($connection->server_info >= 5.1), + ); + return $features[$feature]; + } $driver = "sql"; ///< @var string JUSH identifier - $comments_support = true; ///< @var bool $types = array(); ///< @var array ($type => $maximum_unsigned_length, ...) $structured_types = array(); ///< @var array ($description => array($type, ...), ...) foreach (array( Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-03-24 10:02:46 UTC (rev 1352) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-03-24 17:28:18 UTC (rev 1353) @@ -136,6 +136,14 @@ return $return; } + function limit($query, $limit, $offset = 0) { + return " $query" . (isset($limit) ? "\nLIMIT $limit" . ($offset ? " OFFSET $offset" : "") : ""); + } + + function limit1($query) { + return " $query"; + } + function engines() { return array(); } @@ -147,17 +155,16 @@ function tables_list() { global $connection; - return get_vals("SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema = " . $connection->quote(DB)); + return get_vals("SELECT table_name FROM information_schema.tables WHERE table_schema = " . $connection->quote(DB)); } - function table_status($name = "") { //! + function table_status($name = "") { global $connection; $return = array(); - $result = $connection->query("SHOW TABLE STATUS" . ($name != "" ? " LIKE " . $connection->quote(addcslashes($name, "%_")) : "")); + $result = $connection->query("SELECT table_name AS Name, table_type AS Engine FROM information_schema.tables WHERE table_schema = " . $connection->quote(DB) . ($name != "" ? " WHERE table_name = " . $connection->quote($name) : "")); while ($row = $result->fetch_assoc()) { - if ($row["Engine"] == "InnoDB") { - // ignore internal comment, unnecessary since MySQL 5.1.21 - $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); + if ($row["Engine"] != "VIEW") { + $row["Rows"] = 0; } $return[$row["Name"]] = $row; } @@ -250,8 +257,11 @@ return "BINARY " . $connection->quote($val); } + function support($feature) { + return ($feature != "event"); + } + $driver = "pgsql"; - $comments_support = true; // value means maximum unsigned length $types = array(); $structured_types = array(); Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-03-24 10:02:46 UTC (rev 1352) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-03-24 17:28:18 UTC (rev 1353) @@ -215,6 +215,19 @@ return array(); } + function limit($query, $limit, $offset = 0) { + return " $query" . (isset($limit) ? "\nLIMIT $limit" . ($offset ? " OFFSET $offset" : "") : ""); + } + + function limit1($query) { + global $connection; + return ($connection->result("SELECT sqlite_compileoption_used('ENABLE_UPDATE_DELETE_LIMIT')") ? limit($query, 1) : " $query"); + } + + function db_collation($db, $collations) { + return null; + } + function engines() { return array(); } @@ -231,12 +244,12 @@ function table_status($name = "") { global $connection; $return = array(); - $result = $connection->query("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')" . ($name != "" ? " AND name = " . $connection->quote($name) : "")); + $result = $connection->query("SELECT name AS Name, type AS Engine FROM sqlite_master WHERE type IN ('table', 'view')" . ($name != "" ? " AND name = " . $connection->quote($name) : "")); while ($row = $result->fetch_assoc()) { - $return[$row["name"]] = array( - "Name" => $row["name"], - "Rows" => ($row["type"] == "table" ? $connection->result("SELECT COUNT(*) FROM " . idf_escape($row["name"])) : ""), - ); + if ($row["Engine"] != "view") { + $row["Rows"] = 0; + } + $return[$row["Name"]] = $row; } return ($name != "" ? $return[$name] : $return); } @@ -332,8 +345,17 @@ return $connection->quote($val); } + function rename_database($name, $collation) { + global $connection; + $connection->close(); //! not available with all extensions + return rename(DB, $name); + } + + function support($feature) { + return ($feature == "view"); + } + $driver = "sqlite"; - $comments_support = false; $types = array("text" => 0, "numeric" => 0, "integer" => 0, "real" => 0, "blob" => 0); $structured_types = array_keys($types); $unsigned = array(); Modified: branches/sqlite/adminer/edit.inc.php =================================================================== --- branches/sqlite/adminer/edit.inc.php 2010-03-24 10:02:46 UTC (rev 1352) +++ branches/sqlite/adminer/edit.inc.php 2010-03-24 17:28:18 UTC (rev 1353) @@ -22,7 +22,7 @@ } } if (isset($_POST["delete"])) { - query_redirect("DELETE" . limit("FROM " . idf_escape($_GET["edit"]) . " WHERE $where", 1), $location, lang('Item has been deleted.')); + query_redirect("DELETE" . limit1("FROM " . idf_escape($_GET["edit"]) . "\nWHERE $where"), $location, lang('Item has been deleted.')); } else { $set = array(); foreach ($fields as $name => $field) { @@ -37,7 +37,7 @@ redirect($location); } if ($update) { - query_redirect("UPDATE" . limit(idf_escape($TABLE) . " SET" . implode(",", $set) . "\nWHERE $where\n", 1), $location, lang('Item has been updated.')); + query_redirect("UPDATE" . limit1(idf_escape($TABLE) . " SET" . implode(",", $set) . "\nWHERE $where"), $location, lang('Item has been updated.')); } else { query_redirect("INSERT INTO " . idf_escape($TABLE) . " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")", $location, lang('Item has been inserted.')); } Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2010-03-24 10:02:46 UTC (rev 1352) +++ branches/sqlite/adminer/include/editing.inc.php 2010-03-24 17:28:18 UTC (rev 1353) @@ -145,12 +145,12 @@ * @return string */ function process_field($field, $type_field) { - global $connection, $comments_support; + global $connection; return idf_escape($field["field"]) . process_type($type_field) . ($field["null"] ? " NULL" : " NOT NULL") // NULL for timestamp . (!isset($field["default"]) ? "" : " DEFAULT " . ($field["type"] == "timestamp" && eregi("^CURRENT_TIMESTAMP$", $field["default"]) ? $field["default"] : $connection->quote($field["default"]))) . ($field["on_update"] ? " ON UPDATE $field[on_update]" : "") - . ($comments_support ? " COMMENT " . $connection->quote($field["comment"]) : ""); + . (support("comment") ? " COMMENT " . $connection->quote($field["comment"]) : ""); ; } @@ -180,7 +180,7 @@ * @return bool column comments used */ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array()) { - global $inout, $comments_support; + global $inout; $column_comments = false; foreach ($fields as $field) { if ($field["comment"] != "") { @@ -199,7 +199,7 @@ <td>NULL <td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">A_I</acronym> <td class="hidden"><?php echo lang('Default values'); ?> -<?php echo ($comments_support ? "<td" . ($column_comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?> +<?php echo (support("comment") ? "<td" . ($column_comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?> <?php } ?> <td><?php echo "<input type='image' name='add[0]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?><script type="text/javascript">row_count = <?php echo count($fields); ?>;</script> </thead> @@ -220,7 +220,7 @@ <td><?php echo checkbox("fields[$i][null]", 1, $field["null"]); ?> <td><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?>> <td class="hidden"><?php echo checkbox("fields[$i][has_default]", 1, $field["has_default"]); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" onchange="this.previousSibling.checked = true;"> -<?php echo ($comments_support ? "<td" . ($column_comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='255'>" : ""); ?> +<?php echo (support("comment") ? "<td" . ($column_comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='255'>" : ""); ?> <?php } ?> <?php echo "<td><input type='image' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, $allowed, 1);'>"; Modified: branches/sqlite/adminer/table.inc.php =================================================================== --- branches/sqlite/adminer/table.inc.php 2010-03-24 10:02:46 UTC (rev 1352) +++ branches/sqlite/adminer/table.inc.php 2010-03-24 17:28:18 UTC (rev 1353) @@ -11,11 +11,11 @@ if ($fields) { echo "<table cellspacing='0'>\n"; - echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . ($comments_support ? "<td>" . lang('Comment') : "") . "</thead>\n"; + echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . (support("comment") ? "<td>" . lang('Comment') : "") . "</thead>\n"; foreach ($fields as $field) { echo "<tr" . odd() . "><th>" . h($field["field"]); echo "<td>" . h($field["full_type"]) . ($field["null"] ? " <i>NULL</i>" : "") . ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : ""); - echo ($comments_support ? "<td>" . nbsp($field["comment"]) : ""); + echo (support("comment") ? "<td>" . nbsp($field["comment"]) : ""); echo "\n"; } echo "</table>\n"; Modified: branches/sqlite/compile.php =================================================================== --- branches/sqlite/compile.php 2010-03-24 10:02:46 UTC (rev 1352) +++ branches/sqlite/compile.php 2010-03-24 17:28:18 UTC (rev 1353) @@ -216,7 +216,7 @@ $file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file); $file = php_shrink($file); - $filename = $project . ($_SESSION["lang"] ? "-$_SESSION[lang]" : "") . ".php"; // "$project-$VERSION" + $filename = $project . ($driver ? "-$driver" : "") . ($_SESSION["lang"] ? "-$_SESSION[lang]" : "") . ".php"; // . "-$VERSION" fwrite(fopen($filename, "w"), $file); // file_put_contents() since PHP 5 echo "$filename created.\n"; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-02 21:01:56
|
Revision: 1364 http://adminer.svn.sourceforge.net/adminer/?rev=1364&view=rev Author: jakubvrana Date: 2010-04-02 21:01:49 +0000 (Fri, 02 Apr 2010) Log Message: ----------- Detect table and view (regression from previous revision) Modified Paths: -------------- branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/include/design.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/index.php branches/sqlite/adminer/static/editing.js branches/sqlite/editor/include/editing.inc.php Removed Paths: ------------- branches/sqlite/adminer/js.inc.php Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/adminer/db.inc.php 2010-04-02 21:01:49 UTC (rev 1364) @@ -1,33 +1,37 @@ <?php -if ($_POST["tables"] && !$error && !$_POST["search"]) { +$tables_views = array_merge((array) $_POST["tables"], (array) $_POST["views"]); + +if ($tables_views && !$error && !$_POST["search"]) { $result = true; $message = ""; - $tables = implode(", ", array_map('idf_escape', $_POST["tables"])); if (count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"])) { queries("SET foreign_key_checks = 0"); // allows to truncate or drop several tables at once } - if (isset($_POST["truncate"])) { - foreach ($_POST["tables"] as $table) { + if ($_POST["truncate"]) { + foreach ((array) $_POST["tables"] as $table) { if (!queries("TRUNCATE TABLE " . idf_escape($table))) { $result = false; break; } } $message = lang('Tables have been truncated.'); - } elseif (isset($_POST["move"])) { + } elseif ($_POST["move"]) { $rename = array(); - foreach ($_POST["tables"] as $table) { + foreach ($tables_views as $table) { $rename[] = idf_escape($table) . " TO " . idf_escape($_POST["target"]) . "." . idf_escape($table); } $result = queries("RENAME TABLE " . implode(", ", $rename)); //! move triggers $message = lang('Tables have been moved.'); - } elseif (isset($_POST["drop"])) { - $result = queries("DROP VIEW IF EXISTS $tables") && queries("DROP TABLE IF EXISTS $tables"); - $message = lang('Tables have been dropped.'); - } elseif ($result = queries((isset($_POST["optimize"]) ? "OPTIMIZE" : (isset($_POST["check"]) ? "CHECK" : (isset($_POST["repair"]) ? "REPAIR" : "ANALYZE"))) . " TABLE $tables")) { - while ($row = $result->fetch_assoc()) { - $message .= h("$row[Table]: $row[Msg_text]") . "<br>"; + } elseif ((!$_POST["drop"] || !$_POST["views"] || queries("DROP VIEW " . implode(", ", array_map('idf_escape', $_POST["views"])))) + && (!$_POST["tables"] || ($result = queries(($_POST["optimize"] ? "OPTIMIZE" : ($_POST["check"] ? "CHECK" : ($_POST["repair"] ? "REPAIR" : ($_POST["drop"] ? "DROP" : "ANALYZE")))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"]))))) + ) { + if (isset($_POST["drop"])) { + $message = lang('Tables have been dropped.'); + } else { + while ($row = $result->fetch_assoc()) { + $message .= h("$row[Table]: $row[Msg_text]") . "<br>"; + } } } queries_redirect(substr(ME, 0, -1), $message, $result); @@ -36,6 +40,7 @@ page_header(lang('Database') . ": " . h(DB), $error, true); echo '<p><a href="' . h(ME) . 'database=">' . lang('Alter database') . "</a>\n"; echo '<a href="' . h(ME) . 'schema=">' . lang('Database schema') . "</a>\n"; +$sums = array("Data_length" => 0, "Index_length" => 0, "Data_free" => 0); echo "<h3>" . lang('Tables and views') . "</h3>\n"; $tables_list = tables_list(); @@ -50,28 +55,32 @@ search_tables(); } echo "<table cellspacing='0' class='nowrap' onclick='tableClick(event);'>\n"; - echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^tables\[/);"><th>' . lang('Table') . '<td>' . lang('Engine') . '<td>' . lang('Collation') . '<td>' . lang('Data Length') . '<td>' . lang('Index Length') . '<td>' . lang('Data Free') . '<td>' . lang('Auto Increment') . '<td>' . lang('Rows') . (support("comment") ? '<td>' . lang('Comment') : '') . "</thead>\n"; - $sums = array(); - foreach ($tables_list as $name) { - echo '<tr' . odd() . '><td>' . checkbox("tables[]", $name, in_array($name, (array) $_POST["tables"], true), "", "formUncheck('check-all');"); + echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);"><th>' . lang('Table') . '<td>' . lang('Engine') . '<td>' . lang('Collation') . '<td>' . lang('Data Length') . '<td>' . lang('Index Length') . '<td>' . lang('Data Free') . '<td>' . lang('Auto Increment') . '<td>' . lang('Rows') . (support("comment") ? '<td>' . lang('Comment') : '') . "</thead>\n"; + foreach ($tables_list as $name => $type) { + $view = (isset($type) && $type != "BASE TABLE"); + echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');"); echo '<th><a href="' . h(ME) . 'table=' . urlencode($name) . '">' . h($name) . '</a>'; - echo "<td id='Engine-" . h($name) . "'> <td id='Collation-" . h($name) . "'> "; - foreach (array("Data_length" => "create", "Index_length" => "indexes", "Data_free" => "edit", "Auto_increment" => "auto_increment=1&create", "Rows" => "select") as $key => $link) { - echo "<td align='right'><a href='" . h(ME . "$link=") . urlencode($name) . "' id='$key-" . h($name) . "'>?</a>"; + if ($view) { + echo '<td colspan="6"><a href="' . h(ME) . "view=" . urlencode($name) . '">' . lang('View') . '</a>'; + echo '<td align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '">?</a>'; + } else { + echo "<td id='Engine-" . h($name) . "'> <td id='Collation-" . h($name) . "'> "; + foreach (array("Data_length" => "create", "Index_length" => "indexes", "Data_free" => "edit", "Auto_increment" => "auto_increment=1&create", "Rows" => "select") as $key => $link) { + echo "<td align='right'><a href='" . h(ME . "$link=") . urlencode($name) . "' id='$key-" . h($name) . "'>?</a>"; + } } echo (support("comment") ? "<td id='Comment-" . h($name) . "'> " : ""); } echo "<tr><td> <th>" . lang('%d in total', count($tables_list)); echo "<td>" . $connection->result("SELECT @@storage_engine"); echo "<td>" . db_collation(DB, collations()); - foreach (array("Data_length", "Index_length", "Data_free") as $key) { + foreach ($sums as $key => $val) { echo "<td align='right' id='sum-$key'> "; } echo "</table>\n"; if (!information_schema(DB)) { //! driver specific operations - $onclick = " onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables/) + ')');\""; - echo "<p><input type='hidden' name='token' value='$token'><input type='submit' value='" . lang('Analyze') . "'> <input type='submit' name='optimize' value='" . lang('Optimize') . "'> <input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> <input type='submit' name='truncate' value='" . lang('Truncate') . "'$onclick> <input type='submit' name='drop' value='" . lang('Drop') . "'$onclick>\n"; + echo "<p><input type='hidden' name='token' value='$token'><input type='submit' value='" . lang('Analyze') . "'> <input type='submit' name='optimize' value='" . lang('Optimize') . "'> <input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> <input type='submit' name='truncate' value='" . lang('Truncate') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables/) + ')');\"> <input type='submit' name='drop' value='" . lang('Drop') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables|views/) + ')');\">\n"; $dbs = get_databases(); if (count($dbs) != 1) { $db = (isset($_POST["target"]) ? $_POST["target"] : DB); @@ -118,4 +127,30 @@ echo '<p><a href="' . h(ME) . 'event=">' . lang('Create event') . "</a>\n"; } -echo "<script type='text/javascript'>loadScript('" . ME . "js=status');</script>\n"; // not h(ME) +page_footer(); +echo "<script type='text/javascript'>\n"; +$table_status = table_status(); +foreach ($table_status as $row) { + if (isset($row["Rows"])) { + $id = addcslashes($row["Name"], "\\'"); + foreach (array("Engine", "Collation", "Comment") as $key) { + echo "document.getElementById('$key-$id').innerHTML = '" . nbsp($row[$key]) . "';\n"; + } + foreach ($sums + array("Auto_increment" => 0, "Rows" => 0) as $key => $val) { + if ($row[$key] != "") { + $val = number_format($row[$key], 0, '.', lang(',')); + echo "document.getElementById('$key-$id').innerHTML = '" . ($key == "Rows" && $row["Engine"] == "InnoDB" && $val ? lang('~ %s', $val) : $val) . "';\n"; + if (isset($sums[$key])) { + $sums[$key] += ($row["Engine"] != "InnoDB" || $key != "Data_free" ? $row[$key] : 0); + } + } else { + echo "document.getElementById('$key-$id').parentNode.innerHTML = ' ';\n"; + } + } + } +} +foreach ($sums as $key => $val) { + echo "document.getElementById('sum-$key').innerHTML = '" . number_format($val, 0, '.', lang(',')) . "';\n"; +} +echo "</script>\n"; +exit; // page_footer() already called Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-02 21:01:49 UTC (rev 1364) @@ -265,7 +265,7 @@ } function tables_list() { - return get_vals("SELECT TABLE_NAME FROM information_schema.TABLES"); + return get_key_vals("SELECT TABLE_NAME, TABLE_TYPE FROM information_schema.TABLES"); } function table_status($name = "") { Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-02 21:01:49 UTC (rev 1364) @@ -323,7 +323,8 @@ * @return array */ function tables_list() { - return get_vals("SHOW TABLES"); + global $connection; + return get_key_vals("SHOW" . ($connection->server_info >= 5 ? " FULL" : "") . " TABLES"); } /** Get table status Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-02 21:01:49 UTC (rev 1364) @@ -155,7 +155,7 @@ function tables_list() { global $connection; - return get_vals("SELECT table_name FROM information_schema.tables WHERE table_schema = " . $connection->quote(DB)); + return get_key_vals("SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = " . $connection->quote(DB)); } function table_status($name = "") { Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-02 21:01:49 UTC (rev 1364) @@ -238,7 +238,7 @@ } function tables_list() { - return get_vals("SELECT * FROM sqlite_master WHERE type IN ('table', 'view')", 1); + return get_key_vals("SELECT name, REPLACE(type, 'table', 'BASE TABLE') FROM sqlite_master WHERE type IN ('table', 'view')", 1); } function table_status($name = "") { Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/adminer/include/adminer.inc.php 2010-04-02 21:01:49 UTC (rev 1364) @@ -538,7 +538,7 @@ */ function tablesPrint($tables) { echo "<p id='tables'>\n"; - foreach ($tables as $table) { + foreach ($tables as $table => $type) { echo '<a href="' . h(ME) . 'select=' . urlencode($table) . '">' . bold(lang('select'), $_GET["select"] == $table) . '</a> '; echo '<a href="' . h(ME) . 'table=' . urlencode($table) . '">' . bold($this->tableName(array("Name" => $table)), $_GET["table"] == $table) . "</a><br>\n"; //! Adminer::tableName may work with full table status } Modified: branches/sqlite/adminer/include/design.inc.php =================================================================== --- branches/sqlite/adminer/include/design.inc.php 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/adminer/include/design.inc.php 2010-04-02 21:01:49 UTC (rev 1364) @@ -84,4 +84,7 @@ <?php $adminer->navigation($missing); ?> </div> <?php + // don't wait for code after footer + ob_flush(); + flush(); } Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-02 21:01:49 UTC (rev 1364) @@ -124,6 +124,20 @@ return $return; } +/** Get keys from first column and values from second +* @param string +* @return array +*/ +function get_key_vals($query) { + global $connection; + $return = array(); + $result = $connection->query($query); + while ($row = $result->fetch_row()) { + $return[$row[0]] = $row[1]; + } + return $return; +} + /** Find unique identifier of a row * @param array * @param array result of indexes() Modified: branches/sqlite/adminer/index.php =================================================================== --- branches/sqlite/adminer/index.php 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/adminer/index.php 2010-04-02 21:01:49 UTC (rev 1364) @@ -22,8 +22,6 @@ } if (isset($_GET["download"])) { include "./download.inc.php"; -} elseif (isset($_GET["js"])) { - include "./js.inc.php"; } elseif (isset($_GET["table"])) { include "./table.inc.php"; } elseif (isset($_GET["schema"])) { Deleted: branches/sqlite/adminer/js.inc.php =================================================================== --- branches/sqlite/adminer/js.inc.php 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/adminer/js.inc.php 2010-04-02 21:01:49 UTC (rev 1364) @@ -1,24 +0,0 @@ -<?php -header("Content-Type: text/javascript"); -$table_status = table_status(); -foreach ($table_status as $row) { - $id = addcslashes($row["Name"], "\\'"); - if (isset($row["Rows"])) { - foreach (array("Engine", "Collation", "Comment") as $key) { - echo "document.getElementById('$key-$id').innerHTML = '" . nbsp($row[$key]) . "';\n"; - } - } - foreach (array("Data_length", "Index_length", "Data_free", "Auto_increment", "Rows") as $key) { - if ($row[$key] != "") { - $val = number_format($row[$key], 0, '.', lang(',')); - echo "document.getElementById('$key-$id').innerHTML = '" . ($key == "Rows" && $row["Engine"] == "InnoDB" && $val ? lang('~ %s', $val) : $val) . "';\n"; - $sums[$key] += ($row["Engine"] != "InnoDB" || $key != "Data_free" ? $row[$key] : 0); - } elseif (isset($row["Rows"]) || $key != "Rows") { - echo "document.getElementById('$key-$id').parentNode.innerHTML = '" . (isset($row["Rows"]) || $key != "Data_length" ? " " : '<a href="' . h(ME) . "view=" . urlencode($row["Name"]) . '">' . lang('View') . '</a>') . "';\n"; - } - } -} -foreach (array("Data_length", "Index_length", "Data_free") as $key) { - echo "document.getElementById('sum-$key').innerHTML = '" . number_format($sums[$key], 0, '.', lang(',')) . "';\n"; -} -exit; // don't call page_footer Modified: branches/sqlite/adminer/static/editing.js =================================================================== --- branches/sqlite/adminer/static/editing.js 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/adminer/static/editing.js 2010-04-02 21:01:49 UTC (rev 1364) @@ -26,17 +26,6 @@ document.body.appendChild(script); } -/** Load external JavaScript -* @param string -*/ -function loadScript(src) { - var script = document.createElement('script'); - script.src = src; - document.body.appendChild(script); -} - - - /** Get value of select * @param HTMLSelectElement * @return string Modified: branches/sqlite/editor/include/editing.inc.php =================================================================== --- branches/sqlite/editor/include/editing.inc.php 2010-04-02 15:27:37 UTC (rev 1363) +++ branches/sqlite/editor/include/editing.inc.php 2010-04-02 21:01:49 UTC (rev 1364) @@ -7,17 +7,3 @@ // iconv_mime_encode requires PHP 5, imap_8bit requires IMAP extension return "=?UTF-8?B?" . base64_encode($header) . "?="; //! split long lines } - -/** Get keys from first column and values from second -* @param string -* @return array -*/ -function get_key_vals($query) { - global $connection; - $return = array(); - $result = $connection->query($query); - while ($row = $result->fetch_row()) { - $return[$row[0]] = $row[1]; - } - return $return; -} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-02 21:11:50
|
Revision: 1365 http://adminer.svn.sourceforge.net/adminer/?rev=1365&view=rev Author: jakubvrana Date: 2010-04-02 21:11:44 +0000 (Fri, 02 Apr 2010) Log Message: ----------- Show number of tables in database overview Modified Paths: -------------- branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/dump.inc.php branches/sqlite/adminer/include/connect.inc.php branches/sqlite/changes.txt Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-02 21:01:49 UTC (rev 1364) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-02 21:11:44 UTC (rev 1365) @@ -327,6 +327,18 @@ return get_key_vals("SHOW" . ($connection->server_info >= 5 ? " FULL" : "") . " TABLES"); } + /** Count tables in all databases + * @param array + * @return array $db in keys, number of tables in values + */ + function count_tables($databases) { + $return = array(); + foreach ($databases as $db) { + $return[$db] = count(get_vals("SHOW TABLES IN " . idf_escape($db))); + } + return $return; + } + /** Get table status * @param string * @return array Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-02 21:01:49 UTC (rev 1364) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-02 21:11:44 UTC (rev 1365) @@ -158,6 +158,10 @@ return get_key_vals("SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = " . $connection->quote(DB)); } + function count_tables($databases) { + return get_key_vals("SELECT table_schema, COUNT(*) FROM information_schema.tables GROUP BY table_schema"); + } + function table_status($name = "") { global $connection; $return = array(); Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-02 21:01:49 UTC (rev 1364) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-02 21:11:44 UTC (rev 1365) @@ -241,6 +241,10 @@ return get_key_vals("SELECT name, REPLACE(type, 'table', 'BASE TABLE') FROM sqlite_master WHERE type IN ('table', 'view')", 1); } + function count_tables($databases) { + return array(); + } + function table_status($name = "") { global $connection; $return = array(); Modified: branches/sqlite/adminer/dump.inc.php =================================================================== --- branches/sqlite/adminer/dump.inc.php 2010-04-02 21:01:49 UTC (rev 1364) +++ branches/sqlite/adminer/dump.inc.php 2010-04-02 21:11:44 UTC (rev 1365) @@ -55,6 +55,7 @@ if ($_POST["table_style"] || $_POST["data_style"]) { $views = array(); + //! defer number of rows to JavaScript foreach (table_status() as $row) { $table = (DB == "" || in_array($row["Name"], (array) $_POST["tables"])); $data = (DB == "" || in_array($row["Name"], (array) $_POST["data"])); Modified: branches/sqlite/adminer/include/connect.inc.php =================================================================== --- branches/sqlite/adminer/include/connect.inc.php 2010-04-02 21:01:49 UTC (rev 1364) +++ branches/sqlite/adminer/include/connect.inc.php 2010-04-02 21:11:44 UTC (rev 1365) @@ -1,6 +1,7 @@ <?php function connect_error() { global $connection, $VERSION, $token, $error; + $databases = array(); if (DB != "") { page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), true); } else { @@ -22,12 +23,13 @@ $collations = collations(); echo "<form action='' method='post'>\n"; echo "<table cellspacing='0' onclick='tableClick(event);'>\n"; - echo "<thead><tr><td><input type='hidden' name='token' value='$token'> <th>" . lang('Database') . "<td>" . lang('Collation') . "</thead>\n"; + echo "<thead><tr><td><input type='hidden' name='token' value='$token'> <th>" . lang('Database') . "<td>" . lang('Collation') . "<td>" . lang('Tables') . "</thead>\n"; foreach ($databases as $db) { $root = h(ME) . "db=" . urlencode($db); echo "<tr" . odd() . "><td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"])); echo "<th><a href='$root'>" . h($db) . "</a>"; echo "<td><a href='$root&database='>" . nbsp(db_collation($db, $collations)) . "</a>"; + echo "<td align='right'><a href='$root&schema=' id='tables-" . h($db) . "'>?</a>"; echo "\n"; } echo "</table>\n"; @@ -36,6 +38,11 @@ } } page_footer("db"); + echo "<script type='text/javascript'>\n"; + foreach (count_tables($databases) as $db => $val) { + echo "document.getElementById('tables-" . addcslashes($db, "\\'") . "').innerHTML = '$val';\n"; + } + echo "</script>\n"; } if (isset($_GET["status"])) { Modified: branches/sqlite/changes.txt =================================================================== --- branches/sqlite/changes.txt 2010-04-02 21:01:49 UTC (rev 1364) +++ branches/sqlite/changes.txt 2010-04-02 21:11:44 UTC (rev 1365) @@ -1,3 +1,8 @@ +Adminer 3.0.0-dev: +Drivers for MS SQL, SQLite, PostgreSQL +Show number of tables in server overview +Defer table information in database overview to JavaScript (performance) + Adminer 2.3.1-dev: Add Drop button to Alter pages (regression from 2.0.0) Return to referer after edit This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-02 22:31:03
|
Revision: 1366 http://adminer.svn.sourceforge.net/adminer/?rev=1366&view=rev Author: jakubvrana Date: 2010-04-02 22:30:57 +0000 (Fri, 02 Apr 2010) Log Message: ----------- Allow concurrent logins on the same server (pass username in URL) Modified Paths: -------------- branches/sqlite/adminer/database.inc.php branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/include/auth.inc.php branches/sqlite/adminer/include/bootstrap.inc.php branches/sqlite/adminer/include/connect.inc.php branches/sqlite/adminer/include/design.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/sql.inc.php branches/sqlite/changes.txt branches/sqlite/editor/include/adminer.inc.php Modified: branches/sqlite/adminer/database.inc.php =================================================================== --- branches/sqlite/adminer/database.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/adminer/database.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -2,11 +2,11 @@ if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP changes add.x to add_x restart_session(); if ($_POST["drop"]) { - unset($_SESSION["databases"][$_GET["server"]]); + set_session("databases", null); query_redirect("DROP DATABASE " . idf_escape(DB), remove_from_uri("db|database"), lang('Database has been dropped.')); } elseif (DB !== $_POST["name"]) { // create or rename database - unset($_SESSION["databases"][$_GET["server"]]); // clear cache + set_session("databases", null); // clear cache if (DB != "") { queries_redirect(preg_replace('~db=[^&]*&~', '', ME) . "db=" . urlencode($_POST["name"]), lang('Database has been renamed.'), rename_database($_POST["name"], $_POST["collation"])); } else { Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -227,7 +227,7 @@ } function get_databases($flush = true) { - $return = &$_SESSION["databases"][$_GET["server"]]; + $return = &get_session("databases"); if (!isset($return)) { $return = get_vals("EXEC sp_databases"); if ($flush) { Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -239,7 +239,7 @@ */ function get_databases($flush = true) { // SHOW DATABASES can take a very long time so it is cached - $return = &$_SESSION["databases"][$_GET["server"]]; + $return = &get_session("databases"); if (!isset($return)) { restart_session(); $return = get_vals("SHOW DATABASES"); Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -125,7 +125,7 @@ } function get_databases($flush = true) { - $return = &$_SESSION["databases"][$_GET["server"]]; + $return = &get_session("databases"); if (!isset($return)) { $return = get_vals("SELECT datname FROM pg_database"); if ($flush) { Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/adminer/include/adminer.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -20,7 +20,7 @@ * @return array ($server, $username, $password) */ function credentials() { - return array($_GET["server"], $_SESSION["usernames"][$_GET["server"]], $_SESSION["passwords"][$_GET["server"]]); + return array($_GET["server"], $_GET["username"], get_session("passwords")); } /** Get key used for permanent login @@ -39,16 +39,15 @@ } /** Print login form - * @param string * @return null */ - function loginForm($username) { + function loginForm() { global $drivers; ?> <table cellspacing="0"> <tr><th><?php echo lang('Driver'); ?><td><?php echo (count($drivers) > 1 ? html_select("driver", $drivers, $_GET["driver"]) : "<input type='hidden' name='driver' value='" . key($drivers) . "'>" . reset($drivers)); ?></tr> <tr><th><?php echo lang('Server'); ?><td><input name="server" value="<?php echo h($_GET["server"]); ?>"> -<tr><th><?php echo lang('Username'); ?><td><input name="username" value="<?php echo h($username); ?>"> +<tr><th><?php echo lang('Username'); ?><td><input name="username" value="<?php echo h($_GET["username"]); ?>"> <tr><th><?php echo lang('Password'); ?><td><input type="password" name="password"> </table> <?php @@ -383,8 +382,9 @@ global $driver; restart_session(); $id = "sql-" . count($_SESSION["messages"]); - $_SESSION["history"][$_GET["server"]][DB][] = (strlen($query) > 1e6 ? ereg_replace('[\x80-\xFF]+$', '', substr($query, 0, 1e6)) . "\n..." : $query); // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment - return " <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a><div id='$id' class='hidden'><pre class='jush-$driver'>" . shorten_utf8($query, 1000) . '</pre><a href="' . h(ME . 'sql=&history=' . (count($_SESSION["history"][$_GET["server"]][DB]) - 1)) . '">' . lang('Edit') . '</a></div>'; + $history = &get_session("history"); + $history[DB][] = (strlen($query) > 1e6 ? ereg_replace('[\x80-\xFF]+$', '', substr($query, 0, 1e6)) . "\n..." : $query); // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment + return " <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a><div id='$id' class='hidden'><pre class='jush-$driver'>" . shorten_utf8($query, 1000) . '</pre><a href="' . h(ME . 'sql=&history=' . (count($history[DB]) - 1)) . '">' . lang('Edit') . '</a></div>'; } /** Functions displayed in edit form @@ -503,7 +503,7 @@ <p class="logout"> <a href="<?php echo h(ME); ?>sql="><?php echo bold(lang('SQL command'), isset($_GET["sql"])); ?></a> <a href="<?php echo h(ME); ?>dump=<?php echo urlencode(isset($_GET["table"]) ? $_GET["table"] : $_GET["select"]); ?>"><?php echo bold(lang('Dump'), isset($_GET["dump"])); ?></a> -<input type="hidden" name="token" value="<?php echo $_SESSION["tokens"][$_GET["server"]]; ?>"> +<input type="hidden" name="token" value="<?php echo $_SESSION["token"]; ?>"> <input type="submit" name="logout" value="<?php echo lang('Logout'); ?>"> </p> </form> Modified: branches/sqlite/adminer/include/auth.inc.php =================================================================== --- branches/sqlite/adminer/include/auth.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/adminer/include/auth.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -7,49 +7,46 @@ if (isset($_POST["server"])) { session_regenerate_id(); // defense against session fixation - $_SESSION["usernames"][$_POST["server"]] = $_POST["username"]; - $_SESSION["passwords"][$_POST["server"]] = $_POST["password"]; + $_SESSION["passwords"][$_POST["server"]][$_POST["username"]] = $_POST["password"]; if ($_POST["permanent"]) { - cookie("adminer_permanent", + cookie("adminer_permanent", //! store separately for each driver, server and username to allow several permanent logins base64_encode($_POST["server"]) . ":" . base64_encode($_POST["username"]) . ":" . base64_encode(encrypt_string($_POST["password"], $adminer->permanentLogin())) ); } - $same_driver = (string) $_GET["driver"] === $_POST["driver"]; - if (count($_POST) == ($_POST["permanent"] ? 5 : 4) || !$same_driver) { // 4 - driver, server, username, password - $location = ((string) $_GET["server"] === $_POST["server"] && $same_driver ? remove_from_uri("login|" . session_name()) : substr(preg_replace('~\\?.*~', '', ME) . "?" . ($_POST["driver"] ? "driver=" . urlencode($_POST["driver"]) . "&" : "") . ($_POST["server"] != "" ? "server=" . urlencode($_POST["server"]) . "&" : ""), 0, -1)); + $same_connection = ((string) $_GET["driver"] === $_POST["driver"] && (string) $_GET["server"] === $_POST["server"] && $_GET["username"] === $_POST["username"]); + if (count($_POST) == ($_POST["permanent"] ? 5 : 4) || !$same_connection) { // 4 - driver, server, username, password + $location = ($same_connection ? remove_from_uri(session_name()) : preg_replace('~\\?.*~', '', ME) . "?" . ($_POST["driver"] ? "driver=" . urlencode($_POST["driver"]) . "&" : "") . ($_POST["server"] != "" ? "server=" . urlencode($_POST["server"]) . "&" : "") . "username=" . urlencode($_POST["username"])); if (SID_FORM) { - $pos = strpos($location, '?'); - $location = ($pos ? substr_replace($location, SID . "&", $pos + 1, 0) : "$location?" . SID); + $location = substr_replace($location, SID . "&", strpos($location, '?') + 1, 0); } redirect($location); } - $_GET["server"] = $_POST["server"]; //! used also in ME } elseif ($_POST["logout"]) { - $token = $_SESSION["tokens"][$_GET["server"]]; + $token = $_SESSION["token"]; if ($token && $_POST["token"] != $token) { page_header(lang('Logout'), lang('Invalid CSRF token. Send the form again.')); page_footer("db"); exit; } else { - foreach (array("usernames", "passwords", "databases", "tokens", "history") as $val) { - unset($_SESSION[$val][$_GET["server"]]); + foreach (array("passwords", "databases", "history") as $key) { + set_session($key, null); } - if (!isset($_SESSION["passwords"])) { // don't require login to logout + if (!$_SESSION["passwords"]) { // don't require login to logout $_SESSION["passwords"] = array(); } cookie("adminer_permanent", ""); - redirect(substr(ME, 0, -1), lang('Logout successful.')); + redirect(substr(preg_replace('~username=[^&]*&~', '', ME), 0, -1), lang('Logout successful.')); } -} elseif ($_COOKIE["adminer_permanent"] && !isset($_SESSION["usernames"][$_GET["server"]])) { +} elseif ($_COOKIE["adminer_permanent"]) { list($server, $username, $cipher) = array_map('base64_decode', explode(":", $_COOKIE["adminer_permanent"])); - if (($_GET["server"] == "" && !$_POST) || $server == $_GET["server"]) { + if (!isset($_GET["username"]) || ($server == $_GET["server"] && $username == $_GET["username"])) { session_regenerate_id(); // defense against session fixation - $_SESSION["usernames"][$server] = $username; - $_SESSION["passwords"][$server] = decrypt_string($cipher, $adminer->permanentLogin()); - if ($server != $_GET["server"]) { - redirect(preg_replace('~^([^?]*).*~', '\\1', ME) . '?server=' . urlencode($server)); //! store and respect driver + $_SESSION["passwords"][$server][$username] = decrypt_string($cipher, $adminer->permanentLogin()); + if (!isset($_GET["username"])) { + // cookies are allowed - no need to pass SID in URL + redirect(preg_replace('~\\?.*~', '', ME) . '?server=' . urlencode($server) . '&username=' . urlencode($server)); //! respect driver } } } @@ -57,41 +54,32 @@ function auth_error($exception = null) { global $connection, $adminer; $session_name = session_name(); - $username = $_SESSION["usernames"][$_GET["server"]]; - if (!$_GET["login"]) { - unset($_SESSION["usernames"][$_GET["server"]]); - } - page_header(lang('Login'), (isset($username) ? h($exception ? $exception->getMessage() : (is_string($connection) ? $connection : lang('Invalid credentials.'))) + page_header(lang('Login'), (isset($_GET["username"]) ? h($exception ? $exception->getMessage() : (is_string($connection) ? $connection : lang('Invalid credentials.'))) : (!$_COOKIE[$session_name] && $_GET[$session_name] && ini_get("session.use_only_cookies") ? lang('Session support must be enabled.') : (($_COOKIE[$session_name] || $_GET[$session_name]) && !isset($_SESSION["passwords"]) ? lang('Session expired, please login again.') : ""))), null); echo "<form action='' method='post'>\n"; - $adminer->loginForm($username); + $adminer->loginForm(); echo "<div>"; - hidden_fields($_POST, array("driver", "server", "username", "password")); // expired session + hidden_fields($_POST, array("driver", "server", "username", "password", "permanent")); // expired session echo "</div>\n"; echo "</form>\n"; page_footer("auth"); } -$username = &$_SESSION["usernames"][$_GET["server"]]; -if (!isset($username)) { - $username = $_GET["username"]; // default username can be passed in URL -} -$connection = (!$_GET["login"] && isset($username) ? connect() : ''); -if (is_string($connection) || !$adminer->login($username, $_SESSION["passwords"][$_GET["server"]])) { +$connection = (isset($_GET["username"]) ? connect() : ''); +if (is_string($connection) || !$adminer->login($_GET["username"], $_SESSION["passwords"][$_GET["server"]])) { auth_error(); exit; } -unset($username); -if (!$_SESSION["tokens"][$_GET["server"]]) { - $_SESSION["tokens"][$_GET["server"]] = rand(1, 1e6); // defense against cross-site request forgery +if (!$_SESSION["token"]) { + $_SESSION["token"] = rand(1, 1e6); // defense against cross-site request forgery } if (isset($_POST["server"]) && $_POST["token"]) { - $_POST["token"] = $_SESSION["tokens"][$_GET["server"]]; + $_POST["token"] = $_SESSION["token"]; // reset token after explicit login } -$token = $_SESSION["tokens"][$_GET["server"]]; ///< @var string CSRF protection +$token = $_SESSION["token"]; ///< @var string CSRF protection $error = ($_POST ///< @var string ? ($_POST["token"] == $token ? "" : lang('Invalid CSRF token. Send the form again.')) : ($_SERVER["REQUEST_METHOD"] != "POST" ? "" : lang('Too big POST data. Reduce the data or increase the %s configuration directive.', '"post_max_size"')) // posted form with no data means that post_max_size exceeded because Adminer always sends token at least Modified: branches/sqlite/adminer/include/bootstrap.inc.php =================================================================== --- branches/sqlite/adminer/include/bootstrap.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/adminer/include/bootstrap.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -79,7 +79,7 @@ define("DB", $_GET["db"]); // for the sake of speed and size define("SID_FORM", SID && !ini_get("session.use_only_cookies") ? '<input type="hidden" name="' . session_name() . '" value="' . h(session_id()) . '">' : ''); -define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\\1', $_SERVER["REQUEST_URI"]) . '?' . (SID_FORM ? SID . '&' : '') . ($_GET["driver"] ? "driver=" . urlencode($_GET["driver"]) . '&' : '') . ($_GET["server"] != "" ? "server=" . urlencode($_GET["server"]) . '&' : '') . (DB != "" ? 'db=' . urlencode(DB) . '&' : '')); +define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\\1', $_SERVER["REQUEST_URI"]) . '?' . (SID_FORM ? SID . '&' : '') . ($_GET["driver"] ? "driver=" . urlencode($_GET["driver"]) . '&' : '') . ($_GET["server"] != "" ? "server=" . urlencode($_GET["server"]) . '&' : '') . (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '') . (DB != "" ? 'db=' . urlencode(DB) . '&' : '')); include "../adminer/include/lang.inc.php"; include "../adminer/lang/$LANG.inc.php"; Modified: branches/sqlite/adminer/include/connect.inc.php =================================================================== --- branches/sqlite/adminer/include/connect.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/adminer/include/connect.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -6,7 +6,7 @@ page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), true); } else { if ($_POST["db"] && !$error) { - unset($_SESSION["databases"][$_GET["server"]]); + set_session("databases", null); foreach ($_POST["db"] as $db) { if (!queries("DROP DATABASE " . idf_escape($db))) { break; @@ -50,7 +50,7 @@ } if (!(DB != "" ? $connection->select_db(DB) : isset($_GET["sql"]) || isset($_GET["dump"]) || isset($_GET["database"]) || isset($_GET["processlist"]) || isset($_GET["privileges"]) || isset($_GET["user"]) || isset($_GET["variables"]))) { if (DB != "") { - unset($_SESSION["databases"][$_GET["server"]]); + set_session("databases", null); } connect_error(); // separate function to catch SQLite error exit; Modified: branches/sqlite/adminer/include/design.inc.php =================================================================== --- branches/sqlite/adminer/include/design.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/adminer/include/design.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -31,13 +31,14 @@ <div id="content"> <?php if (isset($breadcrumb)) { + $link = substr(preg_replace('~(driver|server|username|db)=[^&]*&~', '', ME), 0, -1); + echo '<p id="breadcrumb"><a href="' . ($link ? h($link) : ".") . '">' . $drivers[$_GET["driver"]] . '</a> » '; //! hide in Editor $link = substr(preg_replace('~db=[^&]*&~', '', ME), 0, -1); - echo '<p id="breadcrumb"><a href="' . h(preg_replace('~(driver|server|db)=[^&]*&~', '', ME)) . 'login=1">' . $drivers[$_GET["driver"]] . '</a> » '; //! hide in Editor $server = (isset($_GET["server"]) ? h($_GET["server"]) : lang('Server')); if ($breadcrumb === false) { echo "$server\n"; } else { - echo "<a href='" . ($link != "" ? h($link) : ".") . "'>$server</a> » "; + echo "<a href='" . ($link ? h($link) : ".") . "'>$server</a> » "; if (is_array($breadcrumb)) { if (DB != "") { echo '<a href="' . h(substr(ME, 0, -1)) . '">' . h(DB) . '</a> » '; @@ -61,7 +62,7 @@ if (!$_POST && !isset($_SESSION["passwords"])) { // used in auth $_SESSION["passwords"] = array(); } - $databases = &$_SESSION["databases"][$_GET["server"]]; + $databases = &get_session("databases"); if (DB != "" && $databases && !in_array(DB, $databases, true)) { $databases = null; } Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -223,6 +223,23 @@ } } +/** Get session variable for current server +* @param string +* @return mixed +*/ +function &get_session($key) { + return $_SESSION[$key][$_GET["server"]][$_GET["username"]]; +} + +/** Set session variable for current server +* @param string +* @param mixed +* @return mixed +*/ +function set_session($key, $val) { + $_SESSION[$key][$_GET["server"]][$_GET["username"]] = $val; +} + /** Send Location header and exit * @param string * @param string Modified: branches/sqlite/adminer/sql.inc.php =================================================================== --- branches/sqlite/adminer/sql.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/adminer/sql.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -1,6 +1,7 @@ <?php restart_session(); -$history = &$_SESSION["history"][$_GET["server"]][DB]; +$history_all = &get_session("history"); +$history = &$history_all[DB]; if (!$error && $_POST["clear"]) { $history = array(); redirect(remove_from_uri("history")); @@ -88,7 +89,7 @@ } else { if (preg_match("~^$space*$alter_database", $query)) { restart_session(); - $_SESSION["databases"][$_GET["server"]] = null; // clear cache + set_session("databases", null); // clear cache session_write_close(); } echo "<p class='message' title='" . h($connection->info) . "'>" . lang('Query executed OK, %d row(s) affected.', $connection->affected_rows) . "\n"; Modified: branches/sqlite/changes.txt =================================================================== --- branches/sqlite/changes.txt 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/changes.txt 2010-04-02 22:30:57 UTC (rev 1366) @@ -1,6 +1,7 @@ Adminer 3.0.0-dev: Drivers for MS SQL, SQLite, PostgreSQL Show number of tables in server overview +Allow concurrent logins on the same server Defer table information in database overview to JavaScript (performance) Adminer 2.3.1-dev: Modified: branches/sqlite/editor/include/adminer.inc.php =================================================================== --- branches/sqlite/editor/include/adminer.inc.php 2010-04-02 21:11:44 UTC (rev 1365) +++ branches/sqlite/editor/include/adminer.inc.php 2010-04-02 22:30:57 UTC (rev 1366) @@ -7,6 +7,8 @@ return lang('Editor'); } + //! driver + function credentials() { return array(); // default INI settings } @@ -24,10 +26,10 @@ ); } - function loginForm($username) { + function loginForm() { ?> <table cellspacing="0"> -<tr><th><?php echo lang('Username'); ?><td><input type="hidden" name="driver" value=""><input type="hidden" name="server" value=""><input name="username" value="<?php echo h($username); //! driver ?>"> +<tr><th><?php echo lang('Username'); ?><td><input type="hidden" name="driver" value=""><input type="hidden" name="server" value=""><input name="username" value="<?php echo h($_GET["username"]); ?>"> <tr><th><?php echo lang('Password'); ?><td><input type="password" name="password"> </table> <?php @@ -454,7 +456,7 @@ ?> <form action="" method="post"> <p class="logout"> -<input type="hidden" name="token" value="<?php echo $_SESSION["tokens"][$_GET["server"]]; ?>"> +<input type="hidden" name="token" value="<?php echo $_SESSION["token"]; ?>"> <input type="submit" name="logout" value="<?php echo lang('Logout'); ?>"> </p> </form> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-02 22:50:22
|
Revision: 1367 http://adminer.svn.sourceforge.net/adminer/?rev=1367&view=rev Author: jakubvrana Date: 2010-04-02 22:50:16 +0000 (Fri, 02 Apr 2010) Log Message: ----------- Merge from trunk Modified Paths: -------------- branches/sqlite/adminer/create.inc.php branches/sqlite/adminer/edit.inc.php branches/sqlite/adminer/include/auth.inc.php branches/sqlite/adminer/include/bootstrap.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/adminer/sql.inc.php branches/sqlite/adminer/static/default.css branches/sqlite/adminer/static/editing.js branches/sqlite/changes.txt Property Changed: ---------------- branches/sqlite/ branches/sqlite/adminer/drivers/mysql.inc.php Property changes on: branches/sqlite ___________________________________________________________________ Modified: svn:mergeinfo - /trunk:1193-1351 + /trunk:1193-1366 Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2010-04-02 22:30:57 UTC (rev 1366) +++ branches/sqlite/adminer/create.inc.php 2010-04-02 22:50:16 UTC (rev 1367) @@ -40,14 +40,14 @@ $type_field = (isset($types[$field["type"]]) ? $field : $referencable_primary[$foreign_keys[$field["type"]]]); if ($field["field"] != "") { if ($type_field) { + if (!$field["has_default"]) { + $field["default"] = null; + } $default = eregi_replace(" *on update CURRENT_TIMESTAMP", "", $field["default"]); if ($default != $field["default"]) { // preg_replace $count is available since PHP 5.1.0 $field["on_update"] = "CURRENT_TIMESTAMP"; $field["default"] = $default; } - if (!$field["has_default"]) { - $field["default"] = null; - } $process_field = process_field($field, $type_field); $auto_increment = ($key == $_POST["auto_increment_col"]); if ($process_field != process_field($orig_field, $orig_field) || $orig_field["auto_increment"] != $auto_increment) { Property changes on: branches/sqlite/adminer/drivers/mysql.inc.php ___________________________________________________________________ Modified: svn:mergeinfo - /trunk/adminer/drivers/mysql.inc.php:1193-1351 /trunk/adminer/include/mysql.inc.php:675-681,1193-1351 + /trunk/adminer/drivers/mysql.inc.php:1193-1366 /trunk/adminer/include/mysql.inc.php:675-681,1193-1366 Modified: branches/sqlite/adminer/edit.inc.php =================================================================== --- branches/sqlite/adminer/edit.inc.php 2010-04-02 22:30:57 UTC (rev 1366) +++ branches/sqlite/adminer/edit.inc.php 2010-04-02 22:50:16 UTC (rev 1367) @@ -11,7 +11,7 @@ if ($_POST && !$error && !isset($_GET["select"])) { $location = $_POST["referer"]; if ($_POST["insert"]) { // continue edit or insert - $location = $_SERVER["REQUEST_URI"]; //! doesn't work with change in &where field + $location = ($update ? ME . "&edit=" . urlencode($TABLE) . unique_idf($_POST["fields"], indexes($TABLE)) : $_SERVER["REQUEST_URI"]); //! doesn't work with functions } elseif (!ereg('^.+&select=.+$', $location)) { $location = ME . "select=" . urlencode($TABLE); $i = 0; // append &set converted to &where Modified: branches/sqlite/adminer/include/auth.inc.php =================================================================== --- branches/sqlite/adminer/include/auth.inc.php 2010-04-02 22:30:57 UTC (rev 1366) +++ branches/sqlite/adminer/include/auth.inc.php 2010-04-02 22:50:16 UTC (rev 1367) @@ -37,7 +37,7 @@ $_SESSION["passwords"] = array(); } cookie("adminer_permanent", ""); - redirect(substr(preg_replace('~username=[^&]*&~', '', ME), 0, -1), lang('Logout successful.')); + redirect(substr(preg_replace('~(username|db)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.')); } } elseif ($_COOKIE["adminer_permanent"]) { list($server, $username, $cipher) = array_map('base64_decode', explode(":", $_COOKIE["adminer_permanent"])); Modified: branches/sqlite/adminer/include/bootstrap.inc.php =================================================================== --- branches/sqlite/adminer/include/bootstrap.inc.php 2010-04-02 22:30:57 UTC (rev 1366) +++ branches/sqlite/adminer/include/bootstrap.inc.php 2010-04-02 22:50:16 UTC (rev 1367) @@ -43,15 +43,16 @@ $_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"] . ($_SERVER["QUERY_STRING"] != "" ? "?$_SERVER[QUERY_STRING]" : ""); // IIS 5 compatibility } -session_write_close(); // disable session.auto_start @ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled -session_name("adminer_sid"); // use specific session name to get own namespace -$params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off")); -if (version_compare(PHP_VERSION, '5.2.0') >= 0) { - $params[] = true; // HttpOnly +if (!ini_get("session.auto_start")) { + session_name("adminer_sid"); // use specific session name to get own namespace + $params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off")); + if (version_compare(PHP_VERSION, '5.2.0') >= 0) { + $params[] = true; // HttpOnly + } + call_user_func_array('session_set_cookie_params', $params); // ini_set() may be disabled + session_start(); } -call_user_func_array('session_set_cookie_params', $params); // ini_set() may be disabled -session_start(); // disable magic quotes to be able to use database escaping function if (get_magic_quotes_gpc()) { Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-04-02 22:30:57 UTC (rev 1366) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-02 22:50:16 UTC (rev 1367) @@ -141,9 +141,9 @@ /** Find unique identifier of a row * @param array * @param array result of indexes() -* @return string query string +* @return array */ -function unique_idf($row, $indexes) { +function unique_array($row, $indexes) { foreach ($indexes as $index) { if (ereg("PRIMARY|UNIQUE", $index["type"])) { $return = array(); @@ -151,7 +151,7 @@ if (!isset($row[$key])) { // NULL is ambiguous continue 2; } - $return[] = urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($row[$key]); + $return[$key] = $row[$key]; } return $return; } @@ -159,12 +159,25 @@ $return = array(); foreach ($row as $key => $val) { if (!preg_match('~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~', $key)) { //! columns looking like functions - $return[] = (isset($val) ? urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($val) : "null%5B%5D=" . urlencode($key)); + $return[$key] = $val; } } return $return; } +/** Get query string for unique identifier of a row +* @param array +* @param array result of indexes() +* @return string +*/ +function unique_idf($row, $indexes) { + $return = ""; + foreach (unique_array($row, $indexes) as $key => $val) { + $return .= "&" . (isset($val) ? urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($val) : "null%5B%5D=" . urlencode($key)); + } + return $return; +} + /** Create SQL condition from parsed query string * @param array parsed query string * @return string Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2010-04-02 22:30:57 UTC (rev 1366) +++ branches/sqlite/adminer/select.inc.php 2010-04-02 22:50:16 UTC (rev 1367) @@ -206,8 +206,8 @@ } echo ($backward_keys ? "<th>" . lang('Relations') : "") . "</thead>\n"; foreach ($adminer->rowDescriptions($rows, $foreign_keys) as $n => $row) { - $unique_idf = implode('&', unique_idf($rows[$n], $indexes)); - echo "<tr" . odd() . "><td>" . checkbox("check[]", $unique_idf, in_array($unique_idf, (array) $_POST["check"]), "", "this.form['all'].checked = false; formUncheck('all-page');") . (count($select) != count($group) || information_schema(DB) ? '' : " <a href='" . h(ME . "edit=" . urlencode($TABLE) . "&$unique_idf") . "'>" . lang('edit') . "</a>"); + $unique_idf = unique_idf($row, $indexes); + echo "<tr" . odd() . "><td>" . checkbox("check[]", substr($unique_idf, 1), in_array(substr($unique_idf, 1), (array) $_POST["check"]), "", "this.form['all'].checked = false; formUncheck('all-page');") . (count($select) != count($group) || information_schema(DB) ? '' : " <a href='" . h(ME . "edit=" . urlencode($TABLE) . $unique_idf) . "'>" . lang('edit') . "</a>"); foreach ($row as $key => $val) { if (isset($names[$key])) { $field = $fields[$key]; @@ -220,7 +220,7 @@ $val = "<i>NULL</i>"; } else { if (ereg('blob|binary', $field["type"]) && $val != "") { - $link = h(ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . "&$unique_idf"); + $link = h(ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf); } if ($val == "") { $val = " "; @@ -241,6 +241,14 @@ } } } + if ($key == "COUNT(*)") { //! columns looking like functions + $link = h(ME . "select=" . urlencode($TABLE)); + $i = 0; + foreach (unique_array($row, $indexes) as $k => $v) { + $link .= h("&where[$i][col]=" . urlencode($k) . "&where[$i][op]=" . (isset($v) ? "%3D&where[$i][val]=" . urlencode($v) : "IS+NULL")); + $i++; + } + } } if (!$link && is_email($val)) { $link = "mailto:$val"; Modified: branches/sqlite/adminer/sql.inc.php =================================================================== --- branches/sqlite/adminer/sql.inc.php 2010-04-02 22:30:57 UTC (rev 1366) +++ branches/sqlite/adminer/sql.inc.php 2010-04-02 22:50:16 UTC (rev 1367) @@ -72,16 +72,16 @@ break; } } else { - $end = explode(" ", microtime()); - echo "<p class='time'>" . lang('%.3f s', max(0, $end[0] - $start[0] + $end[1] - $start[1])) . "</p>\n"; do { $result = $connection->store_result(); + $end = explode(" ", microtime()); + $time = " <span class='time'>(" . lang('%.3f s', max(0, $end[0] - $start[0] + $end[1] - $start[1])) . ")</span>"; if (is_object($result)) { select($result, $connection2); + echo "<p>" . ($result->num_rows ? lang('%d row(s)', $result->num_rows) : "") . $time; if ($connection2 && preg_match("~^($space|\\()*SELECT\\b~isU", $q)) { $id = "explain-$queries"; - echo "<p>" . ($result->num_rows ? lang('%d row(s)', $result->num_rows) . ", " : ""); - echo "<a href='#$id' onclick=\"return !toggle('$id');\">EXPLAIN</a>\n"; + echo ", <a href='#$id' onclick=\"return !toggle('$id');\">EXPLAIN</a>\n"; echo "<div id='$id' class='hidden'>\n"; select($connection2->query("EXPLAIN $q")); echo "</div>\n"; @@ -92,8 +92,9 @@ set_session("databases", null); // clear cache session_write_close(); } - echo "<p class='message' title='" . h($connection->info) . "'>" . lang('Query executed OK, %d row(s) affected.', $connection->affected_rows) . "\n"; + echo "<p class='message' title='" . h($connection->info) . "'>" . lang('Query executed OK, %d row(s) affected.', $connection->affected_rows) . "$time\n"; } + $start = $end; } while ($connection->next_result()); } $query = substr($query, $offset); Modified: branches/sqlite/adminer/static/default.css =================================================================== --- branches/sqlite/adminer/static/default.css 2010-04-02 22:30:57 UTC (rev 1366) +++ branches/sqlite/adminer/static/default.css 2010-04-02 22:50:16 UTC (rev 1367) @@ -29,7 +29,7 @@ .enum { color: #007F7F; } .binary { color: red; } .odd td { background: #F5F5F5; } -.time { color: silver; font-size: 70%; float: right; margin-top: -3em; } +.time { color: silver; font-size: 70%; } .function { text-align: right; } .number { text-align: right; } .datetime { text-align: right; } Modified: branches/sqlite/adminer/static/editing.js =================================================================== --- branches/sqlite/adminer/static/editing.js 2010-04-02 22:30:57 UTC (rev 1366) +++ branches/sqlite/adminer/static/editing.js 2010-04-02 22:50:16 UTC (rev 1367) @@ -198,6 +198,9 @@ )) { el.value = ''; } + if (lastType == 'timestamp' && el.name == name + '[has_default]' && /timestamp/i.test(formField(type.form, name + '[default]').value)) { + el.checked = false; + } if (el.name == name + '[collation]') { el.className = (/(char|text|enum|set)$/.test(text) ? '' : 'hidden'); } Modified: branches/sqlite/changes.txt =================================================================== --- branches/sqlite/changes.txt 2010-04-02 22:30:57 UTC (rev 1366) +++ branches/sqlite/changes.txt 2010-04-02 22:50:16 UTC (rev 1367) @@ -6,6 +6,8 @@ Adminer 2.3.1-dev: Add Drop button to Alter pages (regression from 2.0.0) +Link COUNT(*) result to listing +Newlines in select query edit Return to referer after edit Adminer 2.3.0 (released 2010-02-26): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-02 23:03:20
|
Revision: 1368 http://adminer.svn.sourceforge.net/adminer/?rev=1368&view=rev Author: jakubvrana Date: 2010-04-02 23:03:14 +0000 (Fri, 02 Apr 2010) Log Message: ----------- Pass username in GET forms Modified Paths: -------------- branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/privileges.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/editor/db.inc.php Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2010-04-02 22:50:16 UTC (rev 1367) +++ branches/sqlite/adminer/include/adminer.inc.php 2010-04-02 23:03:14 UTC (rev 1368) @@ -509,9 +509,7 @@ </form> <form action=""> <p> -<?php echo SID_FORM; ?> -<?php if ($_GET["driver"] != "") { ?><input type="hidden" name="driver" value="<?php echo h($_GET["driver"]); ?>"><?php } ?> -<?php if ($_GET["server"] != "") { ?><input type="hidden" name="server" value="<?php echo h($_GET["server"]); ?>"><?php } ?> +<?php hidden_fields_get(); ?> <?php echo ($databases ? html_select("db", array("" => "(" . lang('database') . ")") + $databases, DB, "this.form.submit();") : '<input name="db" value="' . h(DB) . '">'); ?> <?php if (isset($_GET["sql"])) { ?><input type="hidden" name="sql" value=""><?php } ?> <?php if (isset($_GET["schema"])) { ?><input type="hidden" name="schema" value=""><?php } ?> Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-04-02 22:50:16 UTC (rev 1367) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-02 23:03:14 UTC (rev 1368) @@ -420,6 +420,16 @@ } } +/** Print hidden fields for GET forms +* @return null +*/ +function hidden_fields_get() { + echo SID_FORM; + echo ($_GET["driver"] != "" ? '<input type="hidden" name="driver" value="' . h($_GET["driver"]) . '">' : ""); + echo ($_GET["server"] != "" ? '<input type="hidden" name="server" value="' . h($_GET["server"]) . '">' : ""); + echo '<input type="hidden" name="username" value="' . h($_GET["username"]) . '">'; +} + /** Find out foreign keys for each column * @param string * @return array array($col => array()) Modified: branches/sqlite/adminer/privileges.inc.php =================================================================== --- branches/sqlite/adminer/privileges.inc.php 2010-04-02 22:50:16 UTC (rev 1367) +++ branches/sqlite/adminer/privileges.inc.php 2010-04-02 23:03:14 UTC (rev 1368) @@ -5,9 +5,7 @@ if (!$result) { ?> <form action=""><p> -<?php echo SID_FORM; ?> -<?php if ($_GET["driver"] != "") { ?><input type="hidden" name="driver" value="<?php echo h($_GET["driver"]); ?>"><?php } ?> -<?php if ($_GET["server"] != "") { ?><input type="hidden" name="server" value="<?php echo h($_GET["server"]); ?>"><?php } ?> +<?php hidden_fields_get(); ?> <?php echo lang('Username'); ?>: <input name="user"> <?php echo lang('Server'); ?>: <input name="host" value="localhost"> <input type="hidden" name="grant" value=""> Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2010-04-02 22:50:16 UTC (rev 1367) +++ branches/sqlite/adminer/select.inc.php 2010-04-02 23:03:14 UTC (rev 1368) @@ -151,8 +151,7 @@ } else { echo "<form action='' id='form'>\n"; echo "<div style='display: none;'>"; - echo ($_GET["driver"] != "" ? '<input type="hidden" name="driver" value="' . h($_GET["driver"]) . '">' : ""); - echo ($_GET["server"] != "" ? '<input type="hidden" name="server" value="' . h($_GET["server"]) . '">' : ""); + hidden_fields_get(); echo (DB != "" ? '<input type="hidden" name="db" value="' . h(DB) . '">' : ""); // not used in Editor echo '<input type="hidden" name="select" value="' . h($TABLE) . '">'; echo "</div>\n"; Modified: branches/sqlite/editor/db.inc.php =================================================================== --- branches/sqlite/editor/db.inc.php 2010-04-02 22:50:16 UTC (rev 1367) +++ branches/sqlite/editor/db.inc.php 2010-04-02 23:03:14 UTC (rev 1368) @@ -4,6 +4,7 @@ ?> <form action=""><p> <?php echo SID_FORM; ?> +<input type="hidden" name="username" value="<?php echo h($_GET["username"]); ?>"> <input name="where[0][val]" value="<?php echo h($_GET["where"][0]["val"]); ?>"> <input type="submit" value="<?php echo lang('Search'); ?>" /> </form> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-03 07:16:35
|
Revision: 1370 http://adminer.svn.sourceforge.net/adminer/?rev=1370&view=rev Author: jakubvrana Date: 2010-04-03 07:16:29 +0000 (Sat, 03 Apr 2010) Log Message: ----------- Use [] instead of {} for string positions Modified Paths: -------------- branches/sqlite/adminer/include/editing.inc.php branches/sqlite/compile.php branches/sqlite/coverage.php Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2010-04-03 07:15:24 UTC (rev 1369) +++ branches/sqlite/adminer/include/editing.inc.php 2010-04-03 07:16:29 UTC (rev 1370) @@ -278,7 +278,7 @@ * @return string */ function normalize_enum($match) { - return "'" . str_replace("'", "''", addcslashes(stripcslashes(str_replace($match[0]{0} . $match[0]{0}, $match[0]{0}, substr($match[0], 1, -1))), '\\')) . "'"; + return "'" . str_replace("'", "''", addcslashes(stripcslashes(str_replace($match[0][0] . $match[0][0], $match[0][0], substr($match[0], 1, -1))), '\\')) . "'"; } /** Get information about stored routine Modified: branches/sqlite/compile.php =================================================================== --- branches/sqlite/compile.php 2010-04-03 07:15:24 UTC (rev 1369) +++ branches/sqlite/compile.php 2010-04-03 07:16:29 UTC (rev 1370) @@ -138,7 +138,7 @@ } elseif ($token[0] === T_VARIABLE && !isset($special_variables[$token[1]])) { $token[1] = '$' . $short_variables[$token[1]]; } - if (isset($set[substr($output, -1)]) || isset($set[$token[1]{0}])) { + if (isset($set[substr($output, -1)]) || isset($set[$token[1][0]])) { $space = ''; } $output .= $space . $token[1]; Modified: branches/sqlite/coverage.php =================================================================== --- branches/sqlite/coverage.php 2010-04-03 07:15:24 UTC (rev 1369) +++ branches/sqlite/coverage.php 2010-04-03 07:16:29 UTC (rev 1370) @@ -13,7 +13,7 @@ $return = array(); preg_match_all('~<([^>]+)~', $s, $matches); foreach ($matches[1] as $val) { - if ($val{0} == "/") { + if ($val[0] == "/") { array_pop($return); } elseif (substr($val, -1) != "/") { $return[] = $val; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-05 00:17:26
|
Revision: 1375 http://adminer.svn.sourceforge.net/adminer/?rev=1375&view=rev Author: jakubvrana Date: 2010-04-05 00:17:13 +0000 (Mon, 05 Apr 2010) Log Message: ----------- Improve PostgreSQL Modified Paths: -------------- branches/sqlite/adminer/database.inc.php branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/static/editing.js branches/sqlite/adminer/table.inc.php branches/sqlite/editor/include/adminer.inc.php branches/sqlite/todo.txt Modified: branches/sqlite/adminer/database.inc.php =================================================================== --- branches/sqlite/adminer/database.inc.php 2010-04-05 00:09:26 UTC (rev 1374) +++ branches/sqlite/adminer/database.inc.php 2010-04-05 00:17:13 UTC (rev 1375) @@ -40,16 +40,16 @@ if ($_POST) { $name = $_POST["name"]; $collate = $_POST["collation"]; -} elseif (DB == "") { - // propose database name with limited privileges //! MySQL only +} elseif (DB != "") { + $collate = db_collation(DB, $collations); +} elseif ($driver == "sql") { + // propose database name with limited privileges foreach (get_vals("SHOW GRANTS") as $grant) { if (preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~', $grant, $match) && $match[1]) { $name = stripcslashes(idf_unescape($match[2])); break; } } -} else { - $collate = db_collation(DB, $collations); } ?> Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-05 00:09:26 UTC (rev 1374) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-05 00:17:13 UTC (rev 1375) @@ -273,9 +273,6 @@ $return = array(); $result = $connection->query("SELECT TABLE_NAME AS Name, TABLE_TYPE AS Engine FROM information_schema.TABLES" . ($name != "" ? " WHERE TABLE_NAME = " . $connection->quote($name) : "")); while ($row = $result->fetch_assoc()) { - if ($row["Engine"] != "VIEW") { - $row["Rows"] = 0; - } if ($name != "") { return $row; } Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-05 00:09:26 UTC (rev 1374) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-05 00:17:13 UTC (rev 1375) @@ -352,6 +352,9 @@ // ignore internal comment, unnecessary since MySQL 5.1.21 $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]); } + if (!isset($row["Rows"])) { + $row["Engine"] = "VIEW"; + } if ($name != "") { return $row; } Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-05 00:09:26 UTC (rev 1374) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-05 00:17:13 UTC (rev 1375) @@ -8,15 +8,23 @@ if ($_GET["driver"] == "pgsql") { if (extension_loaded("pgsql")) { class Min_DB { - var $extension = "PgSQL", $_link, $_result, $server_info, $affected_rows, $error; + var $extension = "PgSQL", $_link, $_result, $_string, $_database = true, $server_info, $affected_rows, $error; function connect($server, $username, $password) { - $this->_link = @pg_connect("host=" . str_replace(":", " port=", $server) . " user=$username password=$password", PGSQL_CONNECT_FORCE_NEW); //! escaping + @ini_set("track_errors", true); // @ - may be disabled + $this->_string = "host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' user='" . addcslashes($username, "'\\") . "' password='" . addcslashes($password, "'\\") . "'"; + $this->_link = @pg_connect($this->_string . (DB != "" ? " dbname='" . addcslashes(DB, "'\\") . "'" : ""), PGSQL_CONNECT_FORCE_NEW); + if (!$this->_link && DB != "") { + // try to connect directly with database for performance + $this->_database = false; + $this->_link = @pg_connect($this->_string, PGSQL_CONNECT_FORCE_NEW); + } if ($this->_link) { $version = pg_version($this->_link); - $this->server_info = $version["server_version"]; + $this->server_info = $version["server"]; + pg_set_client_encoding($this->_link, "UTF8"); } else { - //! $this->error = pg_last_error(); + $this->error = ($php_errormsg ? $php_errormsg : lang('Unable to connect.')); //! substr, unescape } return (bool) $this->_link; } @@ -26,11 +34,18 @@ } function select_db($database) { - //! reconnect or query USE + if ($database == DB) { + return $this->_database; + } + $link = @pg_connect($this->_connection . " dbname='" . addcslashes($database, "'\\") . "'", PGSQL_CONNECT_FORCE_NEW); + if ($link) { + $this->_link = $link; + } + return $link; } function query($query, $unbuffered = false) { - $result = pg_query($this->_link, $query); + $result = @pg_query($this->_link, $query); if (!$result) { $this->error = pg_last_error($this->_link); return false; @@ -118,7 +133,6 @@ $connection = new Min_DB; $credentials = $adminer->credentials(); if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) { - pg_set_client_encoding($connection, "UTF8"); return $connection; } return $connection->error; @@ -144,6 +158,11 @@ return " $query"; } + function db_collation($db, $collations) { + global $connection; + return $connection->result("SHOW LC_COLLATE"); //! respect $db + } + function engines() { return array(); } @@ -155,21 +174,18 @@ function tables_list() { global $connection; - return get_key_vals("SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = " . $connection->quote(DB)); + return get_key_vals("SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = 'public'"); } function count_tables($databases) { - return get_key_vals("SELECT table_schema, COUNT(*) FROM information_schema.tables GROUP BY table_schema"); + return array(); // would require reconnect } function table_status($name = "") { global $connection; $return = array(); - $result = $connection->query("SELECT table_name AS Name, table_type AS Engine FROM information_schema.tables WHERE table_schema = " . $connection->quote(DB) . ($name != "" ? " WHERE table_name = " . $connection->quote($name) : "")); + $result = $connection->query("SELECT table_name AS \"Name\", table_type AS \"Engine\" FROM information_schema.tables WHERE table_schema = 'public'" . ($name != "" ? " AND table_name = " . $connection->quote($name) : "")); while ($row = $result->fetch_assoc()) { - if ($row["Engine"] != "VIEW") { - $row["Rows"] = 0; - } $return[$row["Name"]] = $row; } return ($name != "" ? $return[$name] : $return); @@ -179,27 +195,24 @@ return true; } - function fields($table) { //! + function fields($table) { global $connection; $return = array(); - $result = $connection->query("SHOW FULL COLUMNS FROM " . idf_escape($table)); + $result = $connection->query("SELECT * FROM information_schema.columns WHERE table_name = " . $connection->quote($table) . " ORDER BY ordinal_position"); if ($result) { while ($row = $result->fetch_assoc()) { - preg_match('~^([^( ]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match); - $return[$row["Field"]] = array( - "field" => $row["Field"], - "full_type" => $row["Type"], - "type" => $match[1], - "length" => $match[2], - "unsigned" => ltrim($match[3] . $match[4]), - "default" => ($row["Default"] != "" || ereg("char", $match[1]) ? $row["Default"] : null), - "null" => ($row["Null"] == "YES"), - "auto_increment" => ($row["Extra"] == "auto_increment"), - "on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23 - "collation" => $row["Collation"], - "privileges" => array_flip(explode(",", $row["Privileges"])), - "comment" => $row["Comment"], - "primary" => ($row["Key"] == "PRI"), + $return[$row["column_name"]] = array( + "field" => $row["column_name"], + "full_type" => $row["data_type"], + "type" => $row["data_type"], + "length" => $row["character_maximum_length"], + "default" => $row["column_default"], + "null" => ($row["is_nullable"] == "YES"), + "auto_increment" => ($row["is_identity"] == "YES"), + "on_update" => "", //! + "collation" => $row["collation_name"], + "privileges" => array("insert" => 1, "select" => 1, "update" => 1), //! is_updatable + "primary" => ($row["is_identity"] == "YES"), //! ); } } @@ -233,18 +246,8 @@ return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result("SHOW CREATE VIEW " . idf_escape($name), 1))); } - function collations() { - global $connection; - $return = array(); - $result = $connection->query("SHOW COLLATION"); - while ($row = $result->fetch_assoc()) { - $return[$row["Charset"]][] = $row["Collation"]; - } - ksort($return); - foreach ($return as $key => $val) { - sort($return[$key]); - } - return $return; + function collations() { //! + return array(); } function information_schema($db) { @@ -262,22 +265,23 @@ } function support($feature) { - return ($feature != "event"); + return ($feature != "event" && $feature != "comment"); } $driver = "pgsql"; // value means maximum unsigned length $types = array(); $structured_types = array(); - foreach (array( - lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "float" => 12, "double" => 21, "decimal" => 66), - 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("binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295), - lang('Lists') => array("enum" => 65535, "set" => 64), + foreach (array( //! lengths //! arrays + lang('Numbers') => array("bigint" => 0, "bigserial" => 0, "boolean" => 0, "double precision" => 0, "integer" => 0, "money" => 0, "numeric" => 0, "real" => 0, "smallint" => 0, "serial" => 0), + lang('Date and time') => array("date" => 0, "interval" => 0, "time" => 0, "timestamp" => 0), + lang('Strings') => array("character varying" => 0, "character" => 0, "text" => 0, "tsquery" => 0, "tsvector" => 0, "uuid" => 0, "xml" => 0), + lang('Binary') => array("bit" => 0, "bit varying" => 0, "bytea" => 0), + lang('Network') => array("cidr" => 0, "inet" => 0, "macaddr" => 0, "txid_snapshot" => 0), + lang('Plane') => array("box" => 0, "circle" => 0, "line" => 0, "lseg" => 0, "path" => 0, "point" => 0, "polygon" => 0), ) as $key => $val) { $types += $val; $structured_types[$key] = array_keys($val); } - $unsigned = array("unsigned", "zerofill", "unsigned zerofill"); + $unsigned = array(); } Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-05 00:09:26 UTC (rev 1374) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-05 00:17:13 UTC (rev 1375) @@ -250,9 +250,6 @@ $return = array(); $result = $connection->query("SELECT name AS Name, type AS Engine FROM sqlite_master WHERE type IN ('table', 'view')" . ($name != "" ? " AND name = " . $connection->quote($name) : "")); while ($row = $result->fetch_assoc()) { - if ($row["Engine"] != "view") { - $row["Rows"] = 0; - } $return[$row["Name"]] = $row; } return ($name != "" ? $return[$name] : $return); Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2010-04-05 00:09:26 UTC (rev 1374) +++ branches/sqlite/adminer/include/adminer.inc.php 2010-04-05 00:17:13 UTC (rev 1375) @@ -91,7 +91,7 @@ function selectLinks($tableStatus, $set = "") { echo '<p class="tabs">'; $links = array("select" => lang('Select data'), "table" => lang('Show structure')); - if (isset($tableStatus["Rows"])) { + if ($tableStatus["Engine"] != "VIEW") { $links["create"] = lang('Alter table'); } else { $links["view"] = lang('Alter view'); Modified: branches/sqlite/adminer/static/editing.js =================================================================== --- branches/sqlite/adminer/static/editing.js 2010-04-05 00:09:26 UTC (rev 1374) +++ branches/sqlite/adminer/static/editing.js 2010-04-05 00:17:13 UTC (rev 1375) @@ -1,7 +1,7 @@ // Adminer specific functions /** Load syntax highlighting -* @param string first three characters of MySQL version +* @param string first three characters of database system version */ function bodyLoad(version) { var jushRoot = '../externals/jush/'; @@ -10,6 +10,7 @@ script.onload = function () { if (window.jush) { // IE runs in case of an error too jush.create_links = ' target="_blank"'; + jush.urls.pgsql[0] = 'http://www.postgresql.org/docs/' + version + '/static/$key'; jush.urls.sql[0] = 'http://dev.mysql.com/doc/refman/' + version + '/en/$key'; jush.urls.sqlset[0] = jush.urls.sql[0]; jush.urls.sqlstatus[0] = jush.urls.sql[0]; Modified: branches/sqlite/adminer/table.inc.php =================================================================== --- branches/sqlite/adminer/table.inc.php 2010-04-05 00:09:26 UTC (rev 1374) +++ branches/sqlite/adminer/table.inc.php 2010-04-05 00:17:13 UTC (rev 1375) @@ -6,7 +6,7 @@ } $table_status = ($fields ? table_status($TABLE) : array()); -page_header(($fields && !isset($table_status["Rows"]) ? lang('View') : lang('Table')) . ": " . h($TABLE), $error); +page_header(($fields && $table_status["Engine"] == "VIEW" ? lang('View') : lang('Table')) . ": " . h($TABLE), $error); $adminer->selectLinks($table_status); if ($fields) { @@ -20,7 +20,7 @@ } echo "</table>\n"; - if (isset($table_status["Rows"])) { + if ($table_status["Engine"] != "VIEW") { echo "<h3>" . lang('Indexes') . "</h3>\n"; $indexes = indexes($TABLE); if ($indexes) { Modified: branches/sqlite/editor/include/adminer.inc.php =================================================================== --- branches/sqlite/editor/include/adminer.inc.php 2010-04-05 00:09:26 UTC (rev 1374) +++ branches/sqlite/editor/include/adminer.inc.php 2010-04-05 00:17:13 UTC (rev 1375) @@ -187,7 +187,6 @@ } function selectSearchPrint($where, $columns, $indexes) { - //! foreign keys echo '<fieldset><legend>' . lang('Search') . "</legend><div>\n"; $keys = array(); foreach ((array) $_GET["where"] as $key => $val) { Modified: branches/sqlite/todo.txt =================================================================== --- branches/sqlite/todo.txt 2010-04-05 00:09:26 UTC (rev 1374) +++ branches/sqlite/todo.txt 2010-04-05 00:17:13 UTC (rev 1375) @@ -26,6 +26,7 @@ Add whisperer to fields with foreign key to big table SQLite: +Remove $connection->server_info ALTER TABLE ADD INDEX change to CREATE INDEX and DROP INDEX SQL functions - user defined char_length, from_unixtime, lower, sec_to_time, time_to_sec, unix_timestamp, upper CREATE DATABASE - PRAGMA encoding = "UTF-8" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-06 09:37:30
|
Revision: 1378 http://adminer.svn.sourceforge.net/adminer/?rev=1378&view=rev Author: jakubvrana Date: 2010-04-06 09:37:24 +0000 (Tue, 06 Apr 2010) Log Message: ----------- Merge from trunk Modified Paths: -------------- branches/sqlite/adminer/lang/zh-tw.inc.php branches/sqlite/changes.txt branches/sqlite/version.js Property Changed: ---------------- branches/sqlite/ branches/sqlite/adminer/drivers/mysql.inc.php Property changes on: branches/sqlite ___________________________________________________________________ Modified: svn:mergeinfo - /trunk:1193-1366 + /trunk:1193-1377 Property changes on: branches/sqlite/adminer/drivers/mysql.inc.php ___________________________________________________________________ Modified: svn:mergeinfo - /trunk/adminer/drivers/mysql.inc.php:1193-1366 /trunk/adminer/include/mysql.inc.php:675-681,1193-1366 + /trunk/adminer/drivers/mysql.inc.php:1193-1377 /trunk/adminer/include/mysql.inc.php:675-681,1193-1377 Modified: branches/sqlite/adminer/lang/zh-tw.inc.php =================================================================== --- branches/sqlite/adminer/lang/zh-tw.inc.php 2010-04-06 08:47:37 UTC (rev 1377) +++ branches/sqlite/adminer/lang/zh-tw.inc.php 2010-04-06 09:37:24 UTC (rev 1378) @@ -226,4 +226,5 @@ 'Item has been deleted.' => '該項目已被刪除', '%d in total' => '總共 %d 個', 'Permanent login' => '永久登入', + 'Table has been dropped.' => '已經刪除資料表。', ); Modified: branches/sqlite/changes.txt =================================================================== --- branches/sqlite/changes.txt 2010-04-06 08:47:37 UTC (rev 1377) +++ branches/sqlite/changes.txt 2010-04-06 09:37:24 UTC (rev 1378) @@ -4,11 +4,12 @@ Allow concurrent logins on the same server Defer table information in database overview to JavaScript (performance) -Adminer 2.3.1-dev: +Adminer 2.3.1 (released 2010-04-06): Add Drop button to Alter pages (regression from 2.0.0) Link COUNT(*) result to listing Newlines in select query edit Return to referer after edit +Respect session.auto_start (bug #2967284) Adminer 2.3.0 (released 2010-02-26): Support for permanent login (customization required) Modified: branches/sqlite/version.js =================================================================== --- branches/sqlite/version.js 2010-04-06 08:47:37 UTC (rev 1377) +++ branches/sqlite/version.js 2010-04-06 09:37:24 UTC (rev 1378) @@ -2,5 +2,5 @@ (function () { // cookie function is not defined in older versions var date = new Date(); date.setDate(date.getDate() + 7); // valid for 7 days - document.cookie = 'adminer_version=2.3.0; expires=' + date; // last released version + document.cookie = 'adminer_version=2.3.1; expires=' + date; // last released version })(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-07 11:43:47
|
Revision: 1386 http://adminer.svn.sourceforge.net/adminer/?rev=1386&view=rev Author: jakubvrana Date: 2010-04-07 11:43:41 +0000 (Wed, 07 Apr 2010) Log Message: ----------- Remove unsupported features from single language version Modified Paths: -------------- branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/compile.php Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-07 08:26:35 UTC (rev 1385) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-07 11:43:41 UTC (rev 1386) @@ -272,7 +272,7 @@ } function support($feature) { - return ($feature != "event" && $feature != "comment"); + return ($feature == "view" || $feature == "routine"); } $driver = "pgsql"; Modified: branches/sqlite/compile.php =================================================================== --- branches/sqlite/compile.php 2010-04-07 08:26:35 UTC (rev 1385) +++ branches/sqlite/compile.php 2010-04-07 11:43:41 UTC (rev 1386) @@ -157,9 +157,9 @@ return call_user_func($match[2], file_get_contents(dirname(__FILE__) . "/$project/$match[1]")); } -$driver = ""; +$_GET["driver"] = ""; if (file_exists(dirname(__FILE__) . "/adminer/drivers/" . $_SERVER["argv"][1] . ".inc.php")) { - $driver = $_SERVER["argv"][1]; + $_GET["driver"] = $_SERVER["argv"][1]; array_shift($_SERVER["argv"]); } @@ -179,7 +179,7 @@ preg_match_all('~\\bfunction ([^(]+)~', file_get_contents($filename), $matches); //! respect context (extension, class) $functions = array_combine($matches[1], $matches[0]); unset($functions["__destruct"], $functions["Min_DB"], $functions["Min_Result"]); -foreach (glob(dirname(__FILE__) . "/adminer/drivers/" . ($driver ? $driver : "*") . ".inc.php") as $filename) { +foreach (glob(dirname(__FILE__) . "/adminer/drivers/" . ($_GET["driver"] ? $_GET["driver"] : "*") . ".inc.php") as $filename) { if ($filename != "mysql.inc.php") { $file = file_get_contents($filename); foreach ($functions as $val) { @@ -193,10 +193,23 @@ foreach (array("adminer", "editor") as $project) { $lang_ids = array(); // global variable simplifies usage in a callback function $file = file_get_contents(dirname(__FILE__) . "/$project/index.php"); + if ($_GET["driver"] && $_GET["driver"] != "mysql") { + include_once dirname(__FILE__) . "/adminer/drivers/$_GET[driver].inc.php"; + foreach (array("view", "event", "privileges", "user", "processlist", "variables") as $feature) { + if (!support($feature)) { + $file = str_replace("} elseif (isset(\$_GET[\"$feature\"])) {\n\tinclude \"./$feature.inc.php\";\n", "", $file); + } + } + if (!support("routine")) { + $file = str_replace("} elseif (isset(\$_GET[\"procedure\"])) {\n\tinclude \"./procedure.inc.php\";\n", "", $file); + $file = str_replace("} elseif (isset(\$_GET[\"call\"])) {\n\tinclude \"./call.inc.php\";\n", "", $file); + $file = str_replace("if (isset(\$_GET[\"callf\"])) {\n\t\$_GET[\"call\"] = \$_GET[\"callf\"];\n}\nif (isset(\$_GET[\"function\"])) {\n\t\$_GET[\"procedure\"] = \$_GET[\"function\"];\n}\n", "", $file); + } + } $file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file); $file = str_replace('include "../adminer/include/coverage.inc.php";', '', $file); - if ($driver) { - $file = preg_replace('(include "../adminer/drivers/(?!' . preg_quote($driver) . ').*\\s*)', '', $file); + if ($_GET["driver"]) { + $file = preg_replace('(include "../adminer/drivers/(?!' . preg_quote($_GET["driver"]) . ').*\\s*)', '', $file); } $file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file); // bootstrap.inc.php $file = preg_replace_callback("~lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])~s", 'lang_ids', $file); @@ -216,7 +229,7 @@ $file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file); $file = php_shrink($file); - $filename = $project . ($driver ? "-$driver" : "") . ($_SESSION["lang"] ? "-$_SESSION[lang]" : "") . ".php"; // . "-$VERSION" + $filename = $project . ($_GET["driver"] ? "-$_GET[driver]" : "") . ($_SESSION["lang"] ? "-$_SESSION[lang]" : "") . ".php"; // . "-$VERSION" fwrite(fopen($filename, "w"), $file); // file_put_contents() since PHP 5 echo "$filename created.\n"; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-07 13:40:02
|
Revision: 1389 http://adminer.svn.sourceforge.net/adminer/?rev=1389&view=rev Author: jakubvrana Date: 2010-04-07 13:39:56 +0000 (Wed, 07 Apr 2010) Log Message: ----------- Utilize support function Modified Paths: -------------- branches/sqlite/adminer/dump.inc.php branches/sqlite/adminer/include/export.inc.php branches/sqlite/adminer/table.inc.php branches/sqlite/compile.php branches/sqlite/editor/include/adminer.inc.php branches/sqlite/todo.txt Modified: branches/sqlite/adminer/dump.inc.php =================================================================== --- branches/sqlite/adminer/dump.inc.php 2010-04-07 13:38:43 UTC (rev 1388) +++ branches/sqlite/adminer/dump.inc.php 2010-04-07 13:39:56 UTC (rev 1389) @@ -143,7 +143,7 @@ $db_style = array('', 'USE', 'DROP+CREATE', 'CREATE'); $table_style = array('', 'DROP+CREATE', 'CREATE'); $data_style = array('', 'TRUNCATE+INSERT', 'INSERT', 'INSERT+UPDATE'); -if ($connection->server_info >= 5) { +if (support("routine")) { $db_style[] = 'CREATE+ALTER'; $table_style[] = 'CREATE+ALTER'; } Modified: branches/sqlite/adminer/include/export.inc.php =================================================================== --- branches/sqlite/adminer/include/export.inc.php 2010-04-07 13:38:43 UTC (rev 1388) +++ branches/sqlite/adminer/include/export.inc.php 2010-04-07 13:39:56 UTC (rev 1389) @@ -11,7 +11,7 @@ function dump_triggers($table, $style) { global $connection; - if ($_POST["format"] == "sql" && $style && $connection->server_info >= 5) { + if ($_POST["format"] == "sql" && $style && support("trigger")) { $result = $connection->query("SHOW TRIGGERS LIKE " . $connection->quote(addcslashes($table, "%_"))); if ($result->num_rows) { $s = "\nDELIMITER ;;\n"; Modified: branches/sqlite/adminer/table.inc.php =================================================================== --- branches/sqlite/adminer/table.inc.php 2010-04-07 13:38:43 UTC (rev 1388) +++ branches/sqlite/adminer/table.inc.php 2010-04-07 13:39:56 UTC (rev 1389) @@ -55,7 +55,7 @@ echo '<p><a href="' . h(ME) . 'foreign=' . urlencode($TABLE) . '">' . lang('Add foreign key') . "</a>\n"; } - if ($connection->server_info >= 5) { + if (support("trigger")) { echo "<h3>" . lang('Triggers') . "</h3>\n"; $result = $connection->query("SHOW TRIGGERS LIKE " . $connection->quote(addcslashes($TABLE, "%_"))); if ($result->num_rows) { Modified: branches/sqlite/compile.php =================================================================== --- branches/sqlite/compile.php 2010-04-07 13:38:43 UTC (rev 1388) +++ branches/sqlite/compile.php 2010-04-07 13:39:56 UTC (rev 1389) @@ -195,7 +195,7 @@ $file = file_get_contents(dirname(__FILE__) . "/$project/index.php"); if ($_GET["driver"] && $_GET["driver"] != "mysql") { include_once dirname(__FILE__) . "/adminer/drivers/$_GET[driver].inc.php"; - foreach (array("view", "event", "privileges", "user", "processlist", "variables") as $feature) { + foreach (array("view", "event", "privileges", "user", "processlist", "variables", "trigger") as $feature) { if (!support($feature)) { $file = str_replace("} elseif (isset(\$_GET[\"$feature\"])) {\n\tinclude \"./$feature.inc.php\";\n", "", $file); } @@ -231,5 +231,5 @@ $filename = $project . ($_GET["driver"] ? "-$_GET[driver]" : "") . ($_SESSION["lang"] ? "-$_SESSION[lang]" : "") . ".php"; // . "-$VERSION" fwrite(fopen($filename, "w"), $file); // file_put_contents() since PHP 5 - echo "$filename created.\n"; + echo "$filename created (" . strlen($file) . " B).\n"; } Modified: branches/sqlite/editor/include/adminer.inc.php =================================================================== --- branches/sqlite/editor/include/adminer.inc.php 2010-04-07 13:38:43 UTC (rev 1388) +++ branches/sqlite/editor/include/adminer.inc.php 2010-04-07 13:39:56 UTC (rev 1389) @@ -61,13 +61,13 @@ function backwardKeys($table, $tableName) { global $connection; $return = array(); - if ($connection->server_info >= 5) { //! requires MySQL 5 - $result = $connection->query("SELECT TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_COLUMN_NAME + $result = $connection->query("SELECT TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = " . $connection->quote($this->database()) . " AND REFERENCED_TABLE_SCHEMA = " . $connection->quote($this->database()) . " AND REFERENCED_TABLE_NAME = " . $connection->quote($table) . " ORDER BY ORDINAL_POSITION"); + if ($result) { //! requires MySQL 5 while ($row = $result->fetch_assoc()) { $return[$row["TABLE_NAME"]]["keys"][$row["CONSTRAINT_NAME"]][$row["COLUMN_NAME"]] = $row["REFERENCED_COLUMN_NAME"]; } Modified: branches/sqlite/todo.txt =================================================================== --- branches/sqlite/todo.txt 2010-04-07 13:38:43 UTC (rev 1388) +++ branches/sqlite/todo.txt 2010-04-07 13:39:56 UTC (rev 1389) @@ -26,13 +26,9 @@ Add whisperer to fields with foreign key to big table SQLite: -Remove $connection->server_info -ALTER TABLE ADD INDEX change to CREATE INDEX and DROP INDEX SQL functions - user defined char_length, from_unixtime, lower, sec_to_time, time_to_sec, unix_timestamp, upper CREATE DATABASE - PRAGMA encoding = "UTF-8" -ALTER TABLE Detecion of non-existing database -RENAME and DROP DATABASE by file operations -Links in tables list +DROP DATABASE by file operations CSV import Export This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-08 00:00:05
|
Revision: 1397 http://adminer.svn.sourceforge.net/adminer/?rev=1397&view=rev Author: jakubvrana Date: 2010-04-07 23:59:59 +0000 (Wed, 07 Apr 2010) Log Message: ----------- Update PostgreSQL Modified Paths: -------------- branches/sqlite/adminer/create.inc.php branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/foreign.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/sql.inc.php branches/sqlite/adminer/trigger.inc.php branches/sqlite/compile.php branches/sqlite/todo.txt Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2010-04-07 19:27:36 UTC (rev 1396) +++ branches/sqlite/adminer/create.inc.php 2010-04-07 23:59:59 UTC (rev 1397) @@ -161,7 +161,7 @@ <p> <?php echo lang('Table name'); ?>: <input name="name" maxlength="64" value="<?php echo h($row["name"]); ?>"> <?php echo ($engines ? html_select("Engine", array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) : ""); ?> - <?php echo html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]); ?> + <?php echo ($collations ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?> <input type="submit" value="<?php echo lang('Save'); ?>"> <table cellspacing="0" id="edit-fields" class="nowrap"> <?php $column_comments = edit_fields($row["fields"], $collations, "TABLE", $suhosin, $foreign_keys); ?> Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-07 19:27:36 UTC (rev 1396) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-07 23:59:59 UTC (rev 1397) @@ -1,7 +1,8 @@ <?php /** -* @author Jakub Černohubý -* @author Vladimír Šťástka +* @author Jakub Cernohuby +* @author Vladimir Stastka +* @author Jakub Vrana */ $possible_drivers[] = "SQLSRV"; @@ -393,15 +394,15 @@ } function support($feature) { - return in_array($feature, array("view", "routine", "trigger")); + return ereg('^(view|routine|trigger)$', $feature); } $driver = "mssql"; $types = array(); $structured_types = array(); foreach (array( - lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "int" => 10, "bigint" => 20, "float" => 53, "real" => 12, "bit" => 1, "money" => 20, "smallmoney" => 10), - lang('Date and time') => array("date" => 10, "datetime" => 19, "datetime2" => 19, "datetimeoffset" => 10, "time" => 8, "smalldatetime" => 19), + lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "int" => 10, "bigint" => 20, "bit" => 1, "decimal" => 0, "real" => 12, "float" => 53, "smallmoney" => 10, "money" => 20), + lang('Date and time') => array("date" => 10, "smalldatetime" => 19, "datetime" => 19, "datetime2" => 19, "time" => 8, "datetimeoffset" => 10), lang('Strings') => array("char" => 8000, "varchar" => 8000, "text" => 2147483647, "nchar" => 4000, "nvarchar" => 4000, "ntext" => 1073741823), lang('Binary') => array("binary" => 8000, "varbinary" => 8000, "image" => 2147483647), ) as $key => $val) { Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-07 19:27:36 UTC (rev 1396) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-07 23:59:59 UTC (rev 1397) @@ -438,8 +438,8 @@ preg_match_all("~`($pattern)`~", $match[2], $source); preg_match_all("~`($pattern)`~", $match[5], $target); $return[$match[1]] = array( - "db" => idf_unescape($match[4] != "" ? $match[3] : $match[4]), - "table" => idf_unescape($match[4] != "" ? $match[4] : $match[3]), + "db" => idf_unescape($match[4] != "" ? $match[3] : $match[4]), + "table" => idf_unescape($match[4] != "" ? $match[4] : $match[3]), "source" => array_map('idf_unescape', $source[1]), "target" => array_map('idf_unescape', $target[1]), "on_delete" => $match[6], @@ -571,12 +571,12 @@ /** Get information about trigger * @param string trigger name - * @return array array("Timing" => , "Event" => , "Trigger" => , "Statement" => ) + * @return array array("Trigger" => , "Timing" => , "Event" => , "Statement" => ) */ function trigger($name) { global $connection; $result = $connection->query("SHOW TRIGGERS WHERE `Trigger` = " . $connection->quote($name)); - $row = $result->fetch_assoc(); + return $result->fetch_assoc(); } /** Get defined triggers Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-07 19:27:36 UTC (rev 1396) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-07 23:59:59 UTC (rev 1397) @@ -102,8 +102,7 @@ } function fetch_field() { - static $column = -1; - $column++; + $column = $this->_offset++; $row = new stdClass; $row->orgtable = pg_field_table($this->_result, $column); $row->name = pg_field_name($this->_result, $column); @@ -180,7 +179,7 @@ function tables_list() { global $connection; - return get_key_vals("SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = 'public'"); + return get_key_vals("SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name"); } function count_tables($databases) { @@ -218,32 +217,50 @@ "on_update" => "", //! "collation" => $row["collation_name"], "privileges" => array("insert" => 1, "select" => 1, "update" => 1), //! is_updatable - "primary" => ($row["is_identity"] == "YES"), //! + "primary" => ($row["is_identity"] == "YES"), //! possible false negative ); } } return $return; } - function indexes($table, $connection2 = null) { //! + function indexes($table, $connection2 = null) { global $connection; - if (!is_object($connection2)) { // use the main connection if the separate connection is unavailable + if (!is_object($connection2)) { $connection2 = $connection; } $return = array(); - $result = $connection2->query("SHOW INDEX FROM " . idf_escape($table)); - if ($result) { - while ($row = $result->fetch_assoc()) { - $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE"))); - $return[$row["Key_name"]]["columns"][$row["Seq_in_index"]] = $row["Column_name"]; - $return[$row["Key_name"]]["lengths"][$row["Seq_in_index"]] = $row["Sub_part"]; + $table_oid = $connection2->result("SELECT oid FROM pg_class WHERE relname = " . $connection2->quote($table)); + $columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = 16418 AND attnum > 0", $connection2); + $result = $connection2->query("SELECT relname, indisunique, indisprimary, indkey FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid"); + while ($row = $result->fetch_assoc()) { + $return[$row["relname"]]["type"] = ($row["indisprimary"] == "t" ? "PRIMARY" : ($row["indisunique"] == "t" ? "UNIQUE" : "INDEX")); + $return[$row["relname"]]["columns"] = array(); + foreach (explode(" ", $row["indkey"]) as $indkey) { + $return[$row["relname"]]["columns"][] = $columns[$indkey]; } + $return[$row["relname"]]["lengths"] = array(); } return $return; } - function foreign_keys($table) { //! + function foreign_keys($table) { + global $connection; $return = array(); + $result = $connection->query("SELECT tc.constraint_name, kcu.column_name, rc.update_rule AS on_update, rc.delete_rule AS on_delete, ccu.table_name AS table, ccu.column_name AS ref +FROM information_schema.table_constraints tc +LEFT JOIN information_schema.key_column_usage kcu USING (constraint_catalog, constraint_schema, constraint_name) +LEFT JOIN information_schema.referential_constraints rc USING (constraint_catalog, constraint_schema, constraint_name) +LEFT JOIN information_schema.constraint_column_usage ccu ON rc.unique_constraint_catalog = ccu.constraint_catalog AND rc.unique_constraint_schema = ccu.constraint_schema AND rc.unique_constraint_name = ccu.constraint_name +WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . $connection->quote($table)); //! there can be more unique_constraint_name + while ($row = $result->fetch_assoc()) { + $foreign_key = &$return[$row["constraint_name"]]; + if (!$foreign_key) { + $foreign_key = $row; + } + $foreign_key["source"][] = $row["column_name"]; + $foreign_key["target"][] = $row["ref"]; + } return $return; } @@ -252,7 +269,8 @@ return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result("SHOW CREATE VIEW " . idf_escape($name), 1))); } - function collations() { //! + function collations() { + //! supported in CREATE DATABASE return array(); } @@ -262,20 +280,69 @@ function error() { global $connection; - return h($connection->error); + $return = $connection->error; + if (preg_match('~^(.*\\n)?([^\\n]*)\\n( *)\\^(\\n.*)?$~s', $return, $match)) { + $return = h($match[1]) . str_replace("\x17", "<b>", h(substr_replace($match[2], "\x17", strlen($match[3]), 0))) . "</b>" . h($match[4]); + } else { + $return = h($return); + } + return str_replace("\n", "<br>", $return); } function exact_value($val) { global $connection; - return "BINARY " . $connection->quote($val); + return $connection->quote($val); } + function rename_database($name, $collation) { + //! current database cannot be renamed + return queries("ALTER DATABASE " . idf_escape(DB) . " RENAME TO " . idf_escape($name)); + } + function auto_increment($type) { return (ereg("^bigint", $type) ? "BIG" : "") . "SERIAL"; } + function alter_table($table, $alter) { + //! separate rename table, rename column, CHANGE to several ALTER + return queries("ALTER TABLE " . idf_escape($table) . "\n" . implode(",\n", $alter)); + } + + function alter_indexes($table, $alter) { + $create = array(); + $drop = array(); + foreach ($alter as $val) { + if ($val[0] == "DROP") { + $drop[] = $val[1]; //! UNIQUE and PRIMARY must use ALTER TABLE tab DROP CONSTRAINT + } elseif ($val[0] != "INDEX") { + $create[] = "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . $val[1]; + } elseif (!queries("CREATE INDEX " . idf_escape(uniqid($table . "_")) . " ON " . idf_escape($table) . " $val[1]")) { + return false; + } + } + return ((!$create || queries("ALTER TABLE " . idf_escape($table) . implode(",", $create))) + && (!$drop || queries("DROP INDEX " . implode(", ", $drop))) + ); + } + + function trigger($name) { + global $connection; + $result = $connection->query('SELECT trigger_name AS "Trigger", condition_timing AS "Timing", event_manipulation AS "Event", action_statement AS "Statement" FROM information_schema.triggers WHERE event_object_table = ' . $connection->quote($_GET["trigger"]) . ' AND trigger_name = ' . $connection->quote($name)); + return $result->fetch_assoc(); + } + + function triggers($table) { + global $connection; + $return = array(); + $result = $connection->query("SELECT * FROM information_schema.triggers WHERE event_object_table = " . $connection->quote($table)); + while ($row = $result->fetch_assoc()) { + $return[$row["trigger_name"]] = array($row["condition_timing"], $row["event_manipulation"]); + } + return $return; + } + function support($feature) { - return in_array($feature, array("view", "routine", "trigger")); + return ereg('^(view|routine|trigger)$', $feature); } $driver = "pgsql"; @@ -283,9 +350,9 @@ $types = array(); $structured_types = array(); foreach (array( //! lengths //! arrays - lang('Numbers') => array("bigint" => 0, "bigserial" => 0, "boolean" => 0, "double precision" => 0, "integer" => 0, "money" => 0, "numeric" => 0, "real" => 0, "smallint" => 0, "serial" => 0), - lang('Date and time') => array("date" => 0, "interval" => 0, "time" => 0, "timestamp" => 0), - lang('Strings') => array("character varying" => 0, "character" => 0, "text" => 0, "tsquery" => 0, "tsvector" => 0, "uuid" => 0, "xml" => 0), + lang('Numbers') => array("smallint" => 0, "integer" => 0, "bigint" => 0, "boolean" => 0, "numeric" => 0, "real" => 0, "double precision" => 0, "money" => 0), + lang('Date and time') => array("date" => 0, "time" => 0, "timestamp" => 0, "interval" => 0), + lang('Strings') => array("character" => 0, "character varying" => 0, "text" => 0, "tsquery" => 0, "tsvector" => 0, "uuid" => 0, "xml" => 0), lang('Binary') => array("bit" => 0, "bit varying" => 0, "bytea" => 0), lang('Network') => array("cidr" => 0, "inet" => 0, "macaddr" => 0, "txid_snapshot" => 0), lang('Plane') => array("box" => 0, "circle" => 0, "line" => 0, "lseg" => 0, "path" => 0, "point" => 0, "polygon" => 0), Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-07 19:27:36 UTC (rev 1396) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-07 23:59:59 UTC (rev 1397) @@ -51,7 +51,7 @@ } class Min_Result { - var $_result, $num_rows; + var $_result, $_offset = 0, $num_rows; function __construct($result) { $this->_result = $result; @@ -67,10 +67,8 @@ } function fetch_field() { - static $column = -1; - $column++; return (object) array( - "name" => $this->fieldName($column), + "name" => $this->fieldName($this->_offset++), //! type, orgtable, charsetnr ); } @@ -80,7 +78,7 @@ } else { class Min_SQLite extends SQLite3 { - var $extension = "SQLite3"; + var $_offset = 0, $extension = "SQLite3"; function __construct() { $version = $this->version(); @@ -118,7 +116,7 @@ } class Min_Result { - var $_result, $num_rows; + var $_result, $_offset = 0, $num_rows; function __construct($result) { $this->_result = $result; @@ -134,8 +132,7 @@ } function fetch_field() { - static $column = -1; - $column++; + $column = $this->_offset++; return (object) array( "name" => $this->_result->columnName($column), "type" => $this->_result->columnType($column), @@ -374,7 +371,7 @@ function alter_indexes($table, $alter) { foreach ($alter as $val) { - if (!queries(($val[0] == "DROP" ? "DROP INDEX" : "CREATE" . ($val[0] != "INDEX" ? " UNIQUE" : "") . " INDEX " . idf_escape(uniqid($table . "_")) . " ON " . idf_escape($table)) . " $val[1]")) { //! primary + if (!queries(($val[0] == "DROP" ? "DROP INDEX" : "CREATE" . ($val[0] != "INDEX" ? " UNIQUE" : "") . " INDEX " . idf_escape(uniqid($table . "_")) . " ON " . idf_escape($table)) . " $val[1]")) { //! primary key must be created in CREATE TABLE return false; } } @@ -404,7 +401,7 @@ } function support($feature) { - return ($feature == "view" || $feature == "trigger"); + return ereg('^(view|trigger)$', $feature); } $driver = "sqlite"; Modified: branches/sqlite/adminer/foreign.inc.php =================================================================== --- branches/sqlite/adminer/foreign.inc.php 2010-04-07 19:27:36 UTC (rev 1396) +++ branches/sqlite/adminer/foreign.inc.php 2010-04-07 23:59:59 UTC (rev 1397) @@ -2,7 +2,7 @@ $TABLE = $_GET["foreign"]; if ($_POST && !$error && !$_POST["add"] && !$_POST["change"] && !$_POST["change-js"]) { if ($_POST["drop"]) { - query_redirect("ALTER TABLE " . idf_escape($TABLE) . "\nDROP FOREIGN KEY " . idf_escape($_GET["name"]), ME . "table=" . urlencode($TABLE), lang('Foreign key has been dropped.')); + query_redirect("ALTER TABLE " . idf_escape($TABLE) . "\nDROP " . ($driver == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($_GET["name"]), ME . "table=" . urlencode($TABLE), lang('Foreign key has been dropped.')); } else { $source = array_filter($_POST["source"], 'strlen'); ksort($source); // enforce input order Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-04-07 19:27:36 UTC (rev 1396) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-07 23:59:59 UTC (rev 1397) @@ -126,12 +126,16 @@ /** Get keys from first column and values from second * @param string +* @param Min_DB * @return array */ -function get_key_vals($query) { +function get_key_vals($query, $connection2 = null) { global $connection; + if (!$connection2) { + $connection2 = $connection; + } $return = array(); - $result = $connection->query($query); + $result = $connection2->query($query); while ($row = $result->fetch_row()) { $return[$row[0]] = $row[1]; } Modified: branches/sqlite/adminer/sql.inc.php =================================================================== --- branches/sqlite/adminer/sql.inc.php 2010-04-07 19:27:36 UTC (rev 1396) +++ branches/sqlite/adminer/sql.inc.php 2010-04-07 23:59:59 UTC (rev 1397) @@ -29,7 +29,7 @@ $history[] = $query; } $space = "(\\s|/\\*.*\\*/|(#|-- )[^\n]*\n|--\n)"; - $alter_database = "(CREATE|DROP)$space+(DATABASE|SCHEMA)\\b~isU"; + $alter_database = "(CREATE|DROP|ALTER)$space+(DATABASE|SCHEMA)\\b~isU"; if (!ini_get("session.use_cookies")) { session_write_close(); } Modified: branches/sqlite/adminer/trigger.inc.php =================================================================== --- branches/sqlite/adminer/trigger.inc.php 2010-04-07 19:27:36 UTC (rev 1396) +++ branches/sqlite/adminer/trigger.inc.php 2010-04-07 23:59:59 UTC (rev 1397) @@ -6,8 +6,8 @@ $dropped = false; if ($_POST && !$error && in_array($_POST["Timing"], $trigger_time) && in_array($_POST["Event"], $trigger_event)) { $dropped = drop_create( - "DROP TRIGGER " . idf_escape($_GET["name"]), - "CREATE TRIGGER " . idf_escape($_POST["Trigger"]) . " $_POST[Timing] $_POST[Event] ON " . idf_escape($TABLE) . " FOR EACH ROW\n$_POST[Statement]", + "DROP TRIGGER " . idf_escape($_GET["name"]) . ($driver == "pgsql" ? " ON " . idf_escape($TABLE) : ""), + "CREATE TRIGGER " . idf_escape($_POST["Trigger"]) . " $_POST[Timing] $_POST[Event] ON " . idf_escape($TABLE) . " FOR EACH ROW\n$_POST[Statement]", //! FOR EACH STATEMENT ME . "table=" . urlencode($TABLE), lang('Trigger has been dropped.'), lang('Trigger has been altered.'), Modified: branches/sqlite/compile.php =================================================================== --- branches/sqlite/compile.php 2010-04-07 19:27:36 UTC (rev 1396) +++ branches/sqlite/compile.php 2010-04-07 23:59:59 UTC (rev 1397) @@ -165,8 +165,8 @@ unset($_COOKIE["adminer_lang"]); $_SESSION["lang"] = $_SERVER["argv"][1]; // Adminer functions read language from session +include dirname(__FILE__) . "/adminer/include/lang.inc.php"; if (isset($_SESSION["lang"])) { - include dirname(__FILE__) . "/adminer/include/lang.inc.php"; if (isset($_SERVER["argv"][2]) || !isset($langs[$_SESSION["lang"]])) { echo "Usage: php compile.php [lang]\nPurpose: Compile adminer[-lang].php and editor[-lang].php.\n"; exit(1); Modified: branches/sqlite/todo.txt =================================================================== --- branches/sqlite/todo.txt 2010-04-07 19:27:36 UTC (rev 1396) +++ branches/sqlite/todo.txt 2010-04-07 23:59:59 UTC (rev 1397) @@ -14,7 +14,7 @@ Shift-click in checkboxes to select range ? LIKE %% operator ? Column and table names auto-completition in SQL textarea -? Aliasing of built-in functions can save 7 KB, function minification can save 7 KB, substitution of repetitive $a["a"] can save 4 KB, substitution of $_GET and friends can save 2 KB, JS packer can save 1 KB, not enclosing HTML attribute values can save 1.2 KB, replacing \\n by \n can save .3 KB +? Aliasing of built-in functions can save 7 KB, function minification can save 7 KB, substitution of repetitive $a["a"] can save 4 KB, substitution of $_GET and friends can save 2 KB, aliasing of $connection->query, $connection->result and $connection->quote can save ~ 3 KB, JS packer can save 1 KB, not enclosing HTML attribute values can save 1.2 KB, replacing \\n by \n can save .3 KB ? Branch binary_compile: LZW compression of translations can save 30 KB, LZW compression of all texts can save 11 KB, remove of base64_decode() + using chars 127-255 in minification can save 1 KB ? AJAX editing - select page has all data to display edit form Translations - database(s) have been dropped @@ -32,3 +32,12 @@ DROP DATABASE by file operations CSV import Export + +PostgreSQL: +Users - SELECT * FROM pg_user +Table schema +boolean (bit in MS SQL) +Export - http://www.postgresql.org/docs/8.4/static/functions-info.html +Table status - http://www.postgresql.org/docs/8.4/static/functions-admin.html +Comments - http://www.postgresql.org/docs/8.4/static/sql-comment.html +Column rights - http://www.postgresql.org/docs/8.4/static/functions-info.html This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-08 11:23:48
|
Revision: 1401 http://adminer.svn.sourceforge.net/adminer/?rev=1401&view=rev Author: jakubvrana Date: 2010-04-08 11:23:38 +0000 (Thu, 08 Apr 2010) Log Message: ----------- Update drivers Modified Paths: -------------- branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/edit.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/include/editing.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/editor/include/adminer.inc.php branches/sqlite/todo.txt Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/adminer/db.inc.php 2010-04-08 11:23:38 UTC (rev 1401) @@ -4,16 +4,11 @@ if ($tables_views && !$error && !$_POST["search"]) { $result = true; $message = ""; - if (count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"])) { + if ($driver == "sql" && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"])) { queries("SET foreign_key_checks = 0"); // allows to truncate or drop several tables at once } if ($_POST["truncate"]) { - foreach ((array) $_POST["tables"] as $table) { - if (!queries("TRUNCATE TABLE " . idf_escape($table))) { - $result = false; - break; - } - } + $result = truncate_tables((array) $_POST["tables"]); $message = lang('Tables have been truncated.'); } elseif ($_POST["move"]) { $rename = array(); @@ -23,16 +18,18 @@ $result = queries("RENAME TABLE " . implode(", ", $rename)); //! move triggers $message = lang('Tables have been moved.'); - } elseif ((!$_POST["drop"] || !$_POST["views"] || queries("DROP VIEW " . implode(", ", array_map('idf_escape', $_POST["views"])))) - && (!$_POST["tables"] || ($result = queries(($_POST["optimize"] ? "OPTIMIZE" : ($_POST["check"] ? "CHECK" : ($_POST["repair"] ? "REPAIR" : ($_POST["drop"] ? "DROP" : "ANALYZE")))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"]))))) - ) { - if (isset($_POST["drop"])) { - $message = lang('Tables have been dropped.'); - } else { - while ($row = $result->fetch_assoc()) { - $message .= h("$row[Table]: $row[Msg_text]") . "<br>"; - } + } elseif ($_POST["drop"]) { + if ($_POST["views"]) { + $result = drop_views($_POST["views"]); } + if ($result && $_POST["tables"]) { + $result = drop_tables($_POST["tables"]); + } + $message = lang('Tables have been dropped.'); + } elseif ($_POST["tables"] && ($result = queries(($_POST["optimize"] ? "OPTIMIZE" : ($_POST["check"] ? "CHECK" : ($_POST["repair"] ? "REPAIR" : "ANALYZE"))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"]))))) { + while ($row = $result->fetch_assoc()) { + $message .= h("$row[Table]: $row[Msg_text]") . "<br>"; + } } queries_redirect(substr(ME, 0, -1), $message, $result); } Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-08 11:23:38 UTC (rev 1401) @@ -208,7 +208,6 @@ return mssql_num_rows($this->_result); } - function fetch_field() { $return = mssql_fetch_field($this->_result); $return->orgtable = $return->table; @@ -216,7 +215,6 @@ return $return; } - function __destruct() { mssql_free_result($this->_result); } @@ -260,7 +258,7 @@ function db_collation($db, $collations) { global $connection; - return $connection->result("SELECT collation_name FROM sys.databases WHERE name = " . $connection->quote($db)); + return $connection->result("SELECT collation_name FROM sys.databases WHERE name = " . $connection->quote($db)); } function engines() { @@ -345,22 +343,6 @@ return $return; } - /** Get foreign keys in table - * @param string - * @return array array($name => array("db" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => )) - */ - function foreign_keys($table) { - return array(); - } - - /** Get view SELECT - * @param string - * @return array array("select" => ) - */ - function view($name) { - return array("select" => ""); - } - function collations() { $return = array(); foreach (get_vals("SELECT name FROM fn_helpcollations()") as $collation) { Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-08 11:23:38 UTC (rev 1401) @@ -569,6 +569,35 @@ return queries("ALTER TABLE " . idf_escape($table) . implode(",", $alter)); } + /** Run commands to truncate tables + * @param array + * @return bool + */ + function truncate_tables($tables) { + foreach ($tables as $table) { + if (!queries("TRUNCATE TABLE " . idf_escape($table))) { + return false; + } + } + return true; + } + + /** Drop views + * @param array + * @return bool + */ + function drop_views($views) { + return queries("DROP VIEW " . implode(", ", array_map('idf_escape', $views))); + } + + /** Drop tables + * @param array + * @return bool + */ + function drop_tables($tables) { + return queries("DROP TABLE " . implode(", ", array_map('idf_escape', $tables))); + } + /** Get information about trigger * @param string trigger name * @return array array("Trigger" => , "Timing" => , "Event" => , "Statement" => ) Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-08 11:23:38 UTC (rev 1401) @@ -213,7 +213,7 @@ "length" => $row["character_maximum_length"], "default" => $row["column_default"], "null" => ($row["is_nullable"] == "YES"), - "auto_increment" => ($row["is_identity"] == "YES"), + "auto_increment" => eregi("^nextval\\(", $row["column_default"]), "on_update" => "", //! "collation" => $row["collation_name"], "privileges" => array("insert" => 1, "select" => 1, "update" => 1), //! is_updatable @@ -231,7 +231,7 @@ } $return = array(); $table_oid = $connection2->result("SELECT oid FROM pg_class WHERE relname = " . $connection2->quote($table)); - $columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = 16418 AND attnum > 0", $connection2); + $columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = $table_oid AND attnum > 0", $connection2); $result = $connection2->query("SELECT relname, indisunique, indisprimary, indkey FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid"); while ($row = $result->fetch_assoc()) { $return[$row["relname"]]["type"] = ($row["indisprimary"] == "t" ? "PRIMARY" : ($row["indisunique"] == "t" ? "UNIQUE" : "INDEX")); @@ -323,6 +323,21 @@ ); } + function truncate_tables($tables) { + if ($tables) { + return queries("TRUNCATE " . implode(", ", array_map('idf_escape', $tables))); + } + return true; + } + + function drop_views($views) { + return queries("DROP VIEW " . implode(", ", array_map('idf_escape', $views))); + } + + function drop_tables($tables) { + return queries("DROP TABLE " . implode(", ", array_map('idf_escape', $tables))); + } + function trigger($name) { global $connection; $result = $connection->query('SELECT trigger_name AS "Trigger", condition_timing AS "Timing", event_manipulation AS "Event", action_statement AS "Statement" FROM information_schema.triggers WHERE event_object_table = ' . $connection->quote($_GET["trigger"]) . ' AND trigger_name = ' . $connection->quote($name)); @@ -347,12 +362,12 @@ // value means maximum unsigned length $types = array(); $structured_types = array(); - foreach (array( //! lengths //! arrays - lang('Numbers') => array("smallint" => 0, "integer" => 0, "bigint" => 0, "boolean" => 0, "numeric" => 0, "real" => 0, "double precision" => 0, "money" => 0), - lang('Date and time') => array("date" => 0, "time" => 0, "timestamp" => 0, "interval" => 0), + foreach (array( //! arrays + lang('Numbers') => array("smallint" => 5, "integer" => 10, "bigint" => 19, "boolean" => 1, "numeric" => 0, "real" => 7, "double precision" => 16, "money" => 20), + lang('Date and time') => array("date" => 13, "time" => 17, "timestamp" => 20, "interval" => 0), lang('Strings') => array("character" => 0, "character varying" => 0, "text" => 0, "tsquery" => 0, "tsvector" => 0, "uuid" => 0, "xml" => 0), lang('Binary') => array("bit" => 0, "bit varying" => 0, "bytea" => 0), - lang('Network') => array("cidr" => 0, "inet" => 0, "macaddr" => 0, "txid_snapshot" => 0), + lang('Network') => array("cidr" => 43, "inet" => 43, "macaddr" => 17, "txid_snapshot" => 0), lang('Plane') => array("box" => 0, "circle" => 0, "line" => 0, "lseg" => 0, "path" => 0, "point" => 0, "polygon" => 0), ) as $key => $val) { $types += $val; Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-08 11:23:38 UTC (rev 1401) @@ -378,6 +378,33 @@ return true; } + function truncate_tables($tables) { + foreach ($tables as $table) { + if (!queries("DELETE FROM " . idf_escape($table))) { + return false; + } + } + return true; + } + + function drop_views($views) { + foreach ($views as $view) { + if (!queries("DROP VIEW " . idf_escape($view))) { + return false; + } + } + return true; + } + + function drop_tables($tables) { + foreach ($tables as $table) { + if (!queries("DROP TABLE " . idf_escape($table))) { + return false; + } + } + return true; + } + function trigger($name) { global $connection; preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`\\s]+|`[^`]*`)+\\s*([a-z]+)\\s+([a-z]+)\\s+ON\\s*(?:[^`\\s]+|`[^`]*`)+\\s*(?:FOR\\s*EACH\\s*ROW\\s)?(.*)~is', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . $connection->quote($name)), $match); Modified: branches/sqlite/adminer/edit.inc.php =================================================================== --- branches/sqlite/adminer/edit.inc.php 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/adminer/edit.inc.php 2010-04-08 11:23:38 UTC (rev 1401) @@ -21,10 +21,8 @@ $set = array(); foreach ($fields as $name => $field) { $val = process_input($field); - if (!$update) { - $set[idf_escape($name)] = ($val !== false ? $val : "''"); - } elseif ($val !== false) { - $set[] = "\n" . idf_escape($name) . " = $val"; + if ($val !== false) { + $set[idf_escape($name)] = ($update ? "\n" . idf_escape($name) . " = $val" : $val); } } if (!$set) { @@ -77,7 +75,7 @@ $default = $_GET["set"][bracket_escape($name)]; $value = (isset($row) ? ($row[$name] != "" && ereg("enum|set", $field["type"]) ? intval($row[$name]) : $row[$name]) - : ($_POST["clone"] && $field["auto_increment"] ? "" : (isset($_GET["select"]) ? false : (isset($default) ? $default : $field["default"]))) + : (!$update && $field["auto_increment"] ? "" : (isset($_GET["select"]) ? false : (isset($default) ? $default : $field["default"]))) ); if (!$_POST["save"] && is_string($value)) { $value = $adminer->editVal($value, $field); Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/adminer/include/adminer.inc.php 2010-04-08 11:23:38 UTC (rev 1401) @@ -156,7 +156,7 @@ */ function selectVal($val, $link, $field) { $return = ($val != "<i>NULL</i>" && $field["type"] == "char" ? "<code>$val</code>" : $val); - if (ereg('blob|binary', $field["type"]) && !is_utf8($val)) { + if (ereg('binary|blob|bytea', $field["type"]) && !is_utf8($val)) { $return = lang('%d byte(s)', strlen($val)); } return ($link ? "<a href='$link'>$return</a>" : $return); Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/adminer/include/editing.inc.php 2010-04-08 11:23:38 UTC (rev 1401) @@ -210,11 +210,7 @@ $display = (isset($_POST["add"][$i-1]) || (isset($field["field"]) && !$_POST["drop_col"][$i])); ?> <tr<?php echo ($display ? "" : " style='display: none;'"); ?>> -<?php -if ($type == "PROCEDURE") { - echo "<td>" . html_select("fields[$i][inout]", $inout, $field["inout"]); -} -?> +<?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", $inout, $field["inout"]) : ""); ?> <th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" onchange="<?php echo ($field["field"] != "" || count($fields) > 1 ? "" : "editingAddRow(this, $allowed); "); ?>editingNameChange(this);" maxlength="64"><?php } ?><input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($field[($_POST ? "orig" : "field")]); ?>"> <?php edit_type("fields[$i]", $field, $collations, $foreign_keys); ?> <?php if ($type == "TABLE") { ?> Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-08 11:23:38 UTC (rev 1401) @@ -139,7 +139,7 @@ */ function get_key_vals($query, $connection2 = null) { global $connection; - if (!$connection2) { + if (!is_object($connection2)) { $connection2 = $connection; } $return = array(); @@ -497,7 +497,7 @@ $checked = (is_int($value) ? ($value >> $i) & 1 : in_array($val, explode(",", $value), true)); echo " <label><input type='checkbox' name='fields[$name][$i]' value='" . (1 << $i) . "'" . ($checked ? ' checked' : '') . "$onchange>" . h($val) . '</label>'; } - } elseif (ereg('binary|blob', $field["type"]) && ini_get("file_uploads")) { + } elseif (ereg('binary|blob|bytea', $field["type"]) && ini_get("file_uploads")) { echo "<input type='file' name='fields-$name'$onchange>"; } elseif (ereg('text|blob', $field["type"])) { echo "<textarea cols='50' rows='" . ($driver != "sqlite" || ereg("\n", $value) ? 12 : 1) . "'$attrs>" . h($value) . '</textarea>'; @@ -518,23 +518,32 @@ $idf = bracket_escape($field["field"]); $function = $_POST["function"][$idf]; $value = $_POST["fields"][$idf]; - if ($field["type"] == "enum" ? $value == -1 : $function == "orig") { + if ($field["type"] == "enum") { + if ($value == -1) { + return false; + } + if ($value == "") { + return "NULL"; + } + return intval($value); + } + if ($function == "orig" || ($field["auto_increment"] && $value == "")) { return false; - } elseif ($field["type"] == "enum" || $field["auto_increment"] ? $value == "" : $function == "NULL") { + } + if ($function == "NULL") { return "NULL"; - } elseif ($field["type"] == "enum") { - return intval($value); - } elseif ($field["type"] == "set") { + } + if ($field["type"] == "set") { return array_sum((array) $value); - } elseif (ereg('binary|blob', $field["type"]) && ini_get("file_uploads")) { + } + if (ereg('binary|blob|bytea', $field["type"]) && ini_get("file_uploads")) { $file = get_file("fields-$idf"); if (!is_string($file)) { return false; //! report errors } return $connection->quote($file); - } else { - return $adminer->processInput($field, $value, $function); } + return $adminer->processInput($field, $value, $function); } /** Print results of search in all tables Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/adminer/select.inc.php 2010-04-08 11:23:38 UTC (rev 1401) @@ -227,7 +227,7 @@ if (!isset($val)) { $val = "<i>NULL</i>"; } else { - if (ereg('blob|binary', $field["type"]) && $val != "") { + if (ereg('binary|blob|bytea', $field["type"]) && $val != "") { $link = h(ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf); } if ($val == "") { Modified: branches/sqlite/editor/include/adminer.inc.php =================================================================== --- branches/sqlite/editor/include/adminer.inc.php 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/editor/include/adminer.inc.php 2010-04-08 11:23:38 UTC (rev 1401) @@ -155,7 +155,7 @@ function selectVal($val, $link, $field) { $return = ($val == "<i>NULL</i>" ? " " : $val); - if (ereg('blob|binary', $field["type"]) && !is_utf8($val)) { + if (ereg('binary|blob|bytea', $field["type"]) && !is_utf8($val)) { $return = lang('%d byte(s)', strlen($val)); if (ereg("^(GIF|\xFF\xD8\xFF|\x89\x50\x4E\x47\x0D\x0A\x1A\x0A)", $val)) { // GIF|JPG|PNG, getimagetype() works with filename $return = "<img src='$link' alt='$return'>"; Modified: branches/sqlite/todo.txt =================================================================== --- branches/sqlite/todo.txt 2010-04-08 08:49:47 UTC (rev 1400) +++ branches/sqlite/todo.txt 2010-04-08 11:23:38 UTC (rev 1401) @@ -36,7 +36,6 @@ PostgreSQL: Users - SELECT * FROM pg_user Table schema -boolean (bit in MS SQL) Export - http://www.postgresql.org/docs/8.4/static/functions-info.html Table status - http://www.postgresql.org/docs/8.4/static/functions-admin.html Comments - http://www.postgresql.org/docs/8.4/static/sql-comment.html This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-08 15:51:41
|
Revision: 1403 http://adminer.svn.sourceforge.net/adminer/?rev=1403&view=rev Author: jakubvrana Date: 2010-04-08 15:51:34 +0000 (Thu, 08 Apr 2010) Log Message: ----------- PostgreSQL ALTER TABLE Modified Paths: -------------- branches/sqlite/adminer/create.inc.php branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/include/editing.inc.php branches/sqlite/todo.txt Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2010-04-08 11:40:32 UTC (rev 1402) +++ branches/sqlite/adminer/create.inc.php 2010-04-08 15:51:34 UTC (rev 1403) @@ -41,29 +41,21 @@ } $process_field = process_field($field, $type_field); if ($process_field != process_field($orig_field, $orig_field)) { - $fields[] = ($TABLE != "" ? ($field["orig"] != "" ? "CHANGE " . idf_escape($field["orig"]) : "ADD") : " ") - . " $process_field" - . (support("after") && $TABLE != "" ? " $after" : "") - ; + $fields[] = array($field["orig"], $process_field, $after); } if (!isset($types[$field["type"]])) { - $foreign[] = ($TABLE != "" ? "ADD " : "") . "FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . idf_escape($foreign_keys[$field["type"]]) . " (" . idf_escape($type_field["field"]) . ")"; + $foreign[] = ($TABLE != "" ? "ADD " : " ") . "FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . idf_escape($foreign_keys[$field["type"]]) . " (" . idf_escape($type_field["field"]) . ")"; } } $after = "AFTER " . idf_escape($field["field"]); } elseif ($field["orig"] != "") { - $fields[] = "DROP COLUMN " . idf_escape($field["orig"]); + $fields[] = array($field["orig"]); } if ($field["orig"] != "") { $orig_field = next($orig_fields); } } - $fields = array_merge($fields, $foreign); - $status = (support("comment") ? "COMMENT=" . $connection->quote($_POST["Comment"]) : "") - . ($_POST["Engine"] && $_POST["Engine"] != $orig_status["Engine"] ? " ENGINE=" . $connection->quote($_POST["Engine"]) : "") - . ($_POST["Collation"] && $_POST["Collation"] != $orig_status["Collation"] ? " COLLATE " . $connection->quote($_POST["Collation"]) : "") - . ($_POST["Auto_increment"] != "" ? " AUTO_INCREMENT=" . preg_replace('~[^0-9]+~', '', $_POST["Auto_increment"]) : "") - ; + $partitioning = ""; if (in_array($_POST["partition_by"], $partition_by)) { $partitions = array(); if ($_POST["partition_by"] == 'RANGE' || $_POST["partition_by"] == 'LIST') { @@ -72,30 +64,29 @@ $partitions[] = "\nPARTITION " . idf_escape($val) . " VALUES " . ($_POST["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection } } - $status .= "\nPARTITION BY $_POST[partition_by]($_POST[partition])" . ($partitions // $_POST["partition"] can be expression, not only column + $partitioning .= "\nPARTITION BY $_POST[partition_by]($_POST[partition])" . ($partitions // $_POST["partition"] can be expression, not only column ? " (" . implode(",", $partitions) . "\n)" : ($_POST["partitions"] ? " PARTITIONS " . intval($_POST["partitions"]) : "") ); - } elseif (support("partitioning") && $TABLE != "") { - $status .= "\nREMOVE PARTITIONING"; + } elseif ($TABLE != "") { + $partitioning .= "\nREMOVE PARTITIONING"; } - $location = ME . "table=" . urlencode($_POST["name"]); - if ($TABLE != "") { - if ($TABLE != $_POST["name"]) { - $fields[] = "RENAME TO " . idf_escape($_POST["name"]); - } - if ($status) { - $fields[] = $status; - } - if (!$fields) { - redirect($location); - } - ; - queries_redirect($location, lang('Table has been altered.'), alter_table($TABLE, $fields)); - } else { + $message = lang('Table has been altered.'); + if ($TABLE == "") { cookie("adminer_engine", $_POST["Engine"]); - query_redirect("CREATE TABLE " . idf_escape($_POST["name"]) . " (\n" . implode(",\n", $fields) . "\n) $status", $location, lang('Table has been created.')); + $message = lang('Table has been created.'); } + queries_redirect(ME . "table=" . urlencode($_POST["name"]), $message, alter_table( + $TABLE, + $_POST["name"], + $fields, + $foreign, + $_POST["Comment"], + ($_POST["Engine"] && $_POST["Engine"] != $orig_status["Engine"] ? $_POST["Engine"] : ""), + ($_POST["Collation"] && $_POST["Collation"] != $orig_status["Collation"] ? $_POST["Collation"] : ""), + ($_POST["Auto_increment"] != "" ? preg_replace('~[^0-9]+~', '', $_POST["Auto_increment"]) : ""), + $partitioning + )); } } @@ -168,7 +159,7 @@ </table> <p> <?php echo lang('Auto Increment'); ?>: <input name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>"> -<?php echo (support("comment") ? lang('Comment') . '<input name="Comment" value="' . h($row["Comment"]) . '" maxlength="60">' : ''); ?> +<?php echo (support("comment") ? lang('Comment') . ': <input name="Comment" value="' . h($row["Comment"]) . '" maxlength="60">' : ''); ?> <script type="text/javascript"> document.write('<label><input type="checkbox" onclick="columnShow(this.checked, 5);"><?php echo lang('Default values'); ?><\/label>'); <?php if (support("comment")) { ?> Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-08 11:40:32 UTC (rev 1402) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-08 15:51:34 UTC (rev 1403) @@ -372,8 +372,8 @@ return queries("ALTER DATABASE " . idf_escape(DB) . " MODIFY NAME = " . idf_escape($name)); //! false negative "The database name 'test2' has been set." } - function auto_increment($type) { - return "$type IDENTITY"; + function auto_increment() { + return " IDENTITY"; } function support($feature) { Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-08 11:40:32 UTC (rev 1402) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-08 15:51:34 UTC (rev 1403) @@ -528,10 +528,9 @@ } /** Generate modifier for auto increment column - * @param string * @return string */ - function auto_increment($type) { + function auto_increment() { $auto_increment_index = " PRIMARY KEY"; // don't overwrite primary key by auto_increment if ($_GET["create"] != "" && $_POST["auto_increment_col"]) { @@ -545,15 +544,44 @@ } } } - return "$type AUTO_INCREMENT$auto_increment_index"; + return " AUTO_INCREMENT$auto_increment_index"; } - /** Run commands to alter table + /** Run commands to create or alter table + * @param string "" to create + * @param string new name + * @param array of array($orig, $process_field, $after) + * @param array of strings * @param string - * @param array of string commands + * @param string + * @param string + * @param int + * @param string * @return bool */ - function alter_table($table, $alter) { + function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) { + global $connection; + $alter = array(); + foreach ($fields as $field) { + $alter[] = ($field[1] + ? ($table != "" ? ($field[0] != "" ? "CHANGE " . idf_escape($field[0]) : "ADD ") : " ") . implode("", $field[1]) . ($table != "" ? " $field[2]" : "") + : "DROP " . idf_escape($field[0]) + ); + } + $alter = array_merge($alter, $foreign); + $status = "COMMENT=" . $connection->quote($comment) + . ($engine ? " ENGINE=" . $connection->quote($engine) : "") + . ($collation ? " COLLATE " . $connection->quote($collation) : "") + . ($auto_increment != "" ? " AUTO_INCREMENT=$auto_increment" : "") + . $partitioning + ; + if ($table == "") { + return queries("CREATE TABLE " . idf_escape($name) . " (\n" . implode(",\n", $alter) . "\n) $status"); + } + if ($table != $name) { + $alter[] = "RENAME TO " . idf_escape($name); + } + $alter[] = $status; return queries("ALTER TABLE " . idf_escape($table) . "\n" . implode(",\n", $alter)); } Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-08 11:40:32 UTC (rev 1402) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-08 15:51:34 UTC (rev 1403) @@ -191,7 +191,7 @@ $return = array(); $result = $connection->query("SELECT table_name AS \"Name\", table_type AS \"Engine\" FROM information_schema.tables WHERE table_schema = 'public'" . ($name != "" ? " AND table_name = " . $connection->quote($name) : "")); while ($row = $result->fetch_assoc()) { - $return[$row["Name"]] = $row; + $return[$row["Name"]] = $row; //! comment - obj_description(oid, 'pg_class') } return ($name != "" ? $return[$name] : $return); } @@ -203,21 +203,24 @@ function fields($table) { global $connection; $return = array(); - $result = $connection->query("SELECT * FROM information_schema.columns WHERE table_name = " . $connection->quote($table) . " ORDER BY ordinal_position"); + $table_oid = $connection->result("SELECT oid FROM pg_class WHERE relname = " . $connection->quote($table)); + $result = $connection->query("SELECT *, col_description($table_oid, ordinal_position) AS comment FROM information_schema.columns WHERE table_name = " . $connection->quote($table) . " ORDER BY ordinal_position"); if ($result) { while ($row = $result->fetch_assoc()) { + $length = $row["character_maximum_length"]; $return[$row["column_name"]] = array( "field" => $row["column_name"], - "full_type" => $row["data_type"], + "full_type" => $row["data_type"] . ($length ? "($length)" : ""), "type" => $row["data_type"], - "length" => $row["character_maximum_length"], + "length" => $length, "default" => $row["column_default"], "null" => ($row["is_nullable"] == "YES"), "auto_increment" => eregi("^nextval\\(", $row["column_default"]), "on_update" => "", //! "collation" => $row["collation_name"], "privileges" => array("insert" => 1, "select" => 1, "update" => 1), //! is_updatable - "primary" => ($row["is_identity"] == "YES"), //! possible false negative + "primary" => false, //! + "comment" => $row["comment"], ); } } @@ -297,13 +300,60 @@ return queries("ALTER DATABASE " . idf_escape(DB) . " RENAME TO " . idf_escape($name)); } - function auto_increment($type) { - return (ereg("^bigint", $type) ? "BIG" : "") . "SERIAL"; + function auto_increment() { + return true; } - function alter_table($table, $alter) { - //! separate rename table, rename column, CHANGE to several ALTER - return queries("ALTER TABLE " . idf_escape($table) . "\n" . implode(",\n", $alter)); + function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) { + //! SELECT setval('sequence', $auto_increment) + global $connection; + $alter = array(); + $queries = array(); + foreach ($fields as $field) { + $column = idf_escape($field[0]); + $val = $field[1]; + if (!$val) { + $alter[] = "DROP $column"; + } else { + if ($table != "" || $val[5] != " COMMENT ''") { + $queries[] = "COMMENT ON COLUMN " . idf_escape($table) . ".$column IS " . substr($val[5], 9); + } + unset($val[5]); + if ($val[6]) { // auto_increment + $val = array($val[0], ($val[1] == "bigint" ? "big" : "") . "serial"); + } + if ($field[0] == "") { + $alter[] = ($table != "" ? "ADD " : " ") . implode("", $val); + } else { + if ($column != $val[0]) { + $queries[] = "ALTER TABLE " . idf_escape($table) . " RENAME $column TO $val[0]"; + } + $alter[] = "ALTER $column TYPE $val[1]"; + if (!$val[6]) { + $alter[] = "ALTER $column" . ($val[3] ? " SET$val[3]" : " DROP DEFAULT"); //! quoting + $alter[] = "ALTER $column " . ($val[2] == " NULL" ? "DROP NOT" : "SET") . $val[2]; + } + } + } + } + $alter = array_merge($alter, $foreign); + if ($table == "") { + array_unshift($queries, "CREATE TABLE " . idf_escape($name) . " (\n" . implode(",\n", $alter) . "\n)"); + } elseif ($alter) { + array_unshift($queries, "ALTER TABLE " . idf_escape($table) . "\n" . implode(",\n", $alter)); + } + /* enable after reading table comments + $queries[] = "COMMENT ON TABLE " . idf_escape($table) . " IS " . $connection->quote($comment); + */ + if ($table != "" && $table != $name) { + $queries[] = "ALTER TABLE " . idf_escape($table) . " RENAME TO " . idf_escape($name); + } + foreach ($queries as $query) { + if (!queries($query)) { + return false; + } + } + return true; } function alter_indexes($table, $alter) { @@ -355,7 +405,7 @@ } function support($feature) { - return ereg('^(view|routine|trigger)$', $feature); + return ereg('^(comment|view|routine|trigger)$', $feature); } $driver = "pgsql"; Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-08 11:40:32 UTC (rev 1402) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-08 15:51:34 UTC (rev 1403) @@ -355,17 +355,32 @@ return rename(DB, $name); } - function auto_increment($type) { - return "$type PRIMARY KEY AUTOINCREMENT"; + function auto_increment() { + return " PRIMARY KEY AUTOINCREMENT"; } - function alter_table($table, $alter) { - foreach ($alter as $val) { - if (!queries("ALTER TABLE " . idf_escape($table) . " $val")) { + function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) { + global $connection; + $alter = array(); + foreach ($fields as $field) { + $alter[] = ($table != "" && $field[0] == "" ? "ADD " : " ") . implode("", $field[1]); + } + $alter = array_merge($alter, $foreign); + if ($table != "") { + foreach ($alter as $val) { + if (!queries("ALTER TABLE " . idf_escape($table) . " $val")) { + return false; + } + } + if ($table != $name && !queries("ALTER TABLE " . idf_escape($table) . " RENAME TO " . idf_escape($name))) { return false; } + } elseif (!queries("CREATE TABLE " . idf_escape($name) . " (\n" . implode(",\n", $alter) . "\n)")) { + return false; } - //! UPDATE SQLITE_SEQUENCE + if ($auto_increment) { + return queries("UPDATE sqlite_sequence SET seq = $auto_increment WHERE name = " . $connection->quote($name) . ""); + } return true; } Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2010-04-08 11:40:32 UTC (rev 1402) +++ branches/sqlite/adminer/include/editing.inc.php 2010-04-08 15:51:34 UTC (rev 1403) @@ -142,17 +142,19 @@ /** Create SQL string from field * @param array basic field information * @param array information about field type -* @return string +* @return array array("field", "type", "NULL", "DEFAULT", "ON UPDATE", "COMMENT", "AUTO_INCREMENT") */ function process_field($field, $type_field) { global $connection; - $return = process_type($type_field) - . ($field["null"] ? " NULL" : " NOT NULL") // NULL for timestamp - . (!isset($field["default"]) ? "" : " DEFAULT " . ($field["type"] == "timestamp" && eregi("^CURRENT_TIMESTAMP$", $field["default"]) ? $field["default"] : $connection->quote($field["default"]))) - . ($field["on_update"] ? " ON UPDATE $field[on_update]" : "") - . (support("comment") ? " COMMENT " . $connection->quote($field["comment"]) : "") - ; - return idf_escape($field["field"]) . ($field["auto_increment"] ? auto_increment($return) : $return); + return array( + idf_escape($field["field"]), + process_type($type_field), + ($field["null"] ? " NULL" : " NOT NULL"), // NULL for timestamp + (isset($field["default"]) ? " DEFAULT " . ($field["type"] == "timestamp" && eregi("^CURRENT_TIMESTAMP$", $field["default"]) ? $field["default"] : $connection->quote($field["default"])) : ""), + ($field["on_update"] ? " ON UPDATE $field[on_update]" : ""), + (support("comment") ? " COMMENT " . $connection->quote($field["comment"]) : ""), + ($field["auto_increment"] ? auto_increment() : ""), + ); } /** Get type class to use in CSS Modified: branches/sqlite/todo.txt =================================================================== --- branches/sqlite/todo.txt 2010-04-08 11:40:32 UTC (rev 1402) +++ branches/sqlite/todo.txt 2010-04-08 15:51:34 UTC (rev 1403) @@ -40,3 +40,4 @@ Table status - http://www.postgresql.org/docs/8.4/static/functions-admin.html Comments - http://www.postgresql.org/docs/8.4/static/sql-comment.html Column rights - http://www.postgresql.org/docs/8.4/static/functions-info.html +Move table - ALTER TABLE SET SCHEMA This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-09 09:39:34
|
Revision: 1405 http://adminer.svn.sourceforge.net/adminer/?rev=1405&view=rev Author: jakubvrana Date: 2010-04-09 09:39:26 +0000 (Fri, 09 Apr 2010) Log Message: ----------- Use https://www.adminer.org for external files Modified Paths: -------------- branches/sqlite/adminer/static/functions.js branches/sqlite/compile.php Modified: branches/sqlite/adminer/static/functions.js =================================================================== --- branches/sqlite/adminer/static/functions.js 2010-04-08 16:05:48 UTC (rev 1404) +++ branches/sqlite/adminer/static/functions.js 2010-04-09 09:39:26 UTC (rev 1405) @@ -27,7 +27,7 @@ function verifyVersion() { cookie('adminer_version=0', 1); var script = document.createElement('script'); - script.src = 'https://adminer.svn.sourceforge.net/svnroot/adminer/trunk/version.js'; + script.src = 'https://www.adminer.org/version.php'; document.body.appendChild(script); } Modified: branches/sqlite/compile.php =================================================================== --- branches/sqlite/compile.php 2010-04-08 16:05:48 UTC (rev 1404) +++ branches/sqlite/compile.php 2010-04-09 09:39:26 UTC (rev 1405) @@ -225,7 +225,7 @@ $replace = 'h(preg_replace("~\\\\\\\\?.*~", "", $_SERVER["REQUEST_URI"])) . "?file=\\1&version=' . $VERSION; $file = preg_replace('~\\.\\./adminer/static/(default\\.css|functions\\.js|favicon\\.ico)~', '<?php echo ' . $replace . '"; ?>', $file); $file = preg_replace('~\\.\\./adminer/static/([^\'"]*)~', '" . ' . $replace, $file); - $file = str_replace("../externals/jush/", "https://jush.svn.sourceforge.net/svnroot/jush/trunk/", $file); // mixed-content warning if Adminer runs on HTTPS and external files on HTTP + $file = str_replace("../externals/jush/", "https://www.adminer.org/static/", $file); $file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file); $file = php_shrink($file); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-09 16:12:42
|
Revision: 1408 http://adminer.svn.sourceforge.net/adminer/?rev=1408&view=rev Author: jakubvrana Date: 2010-04-09 16:12:36 +0000 (Fri, 09 Apr 2010) Log Message: ----------- Spaces Modified Paths: -------------- branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/todo.txt Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-09 15:58:55 UTC (rev 1407) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-09 16:12:36 UTC (rev 1408) @@ -564,7 +564,7 @@ $alter = array(); foreach ($fields as $field) { $alter[] = ($field[1] - ? ($table != "" ? ($field[0] != "" ? "CHANGE " . idf_escape($field[0]) : "ADD ") : " ") . implode("", $field[1]) . ($table != "" ? " $field[2]" : "") + ? ($table != "" ? ($field[0] != "" ? "CHANGE " . idf_escape($field[0]) : "ADD") : " ") . " " . implode("", $field[1]) . ($table != "" ? " $field[2]" : "") : "DROP " . idf_escape($field[0]) ); } Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2010-04-09 15:58:55 UTC (rev 1407) +++ branches/sqlite/adminer/include/adminer.inc.php 2010-04-09 16:12:36 UTC (rev 1408) @@ -384,7 +384,7 @@ $id = "sql-" . count($_SESSION["messages"]); $history = &get_session("history"); $history[DB][] = (strlen($query) > 1e6 ? ereg_replace('[\x80-\xFF]+$', '', substr($query, 0, 1e6)) . "\n..." : $query); // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment - return " <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a><div id='$id' class='hidden'><pre class='jush-$driver'>" . shorten_utf8($query, 1000) . '</pre><a href="' . h(ME . 'sql=&history=' . (count($history[DB]) - 1)) . '">' . lang('Edit') . '</a></div>'; + return " <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a><div id='$id' class='hidden'><pre class='jush-$driver'>" . shorten_utf8($query, 1000) . '</pre><p><a href="' . h(ME . 'sql=&history=' . (count($history[DB]) - 1)) . '">' . lang('Edit') . '</a></div>'; } /** Functions displayed in edit form Modified: branches/sqlite/todo.txt =================================================================== --- branches/sqlite/todo.txt 2010-04-09 15:58:55 UTC (rev 1407) +++ branches/sqlite/todo.txt 2010-04-09 16:12:36 UTC (rev 1408) @@ -12,11 +12,13 @@ Blob download and image display in edit form (important for Editor with hidden fields in select) Add title to Logout, edit (in select) and select (in menu) in style "hever" Shift-click in checkboxes to select range +Export by GET parameters ? LIKE %% operator ? Column and table names auto-completition in SQL textarea ? Aliasing of built-in functions can save 7 KB, function minification can save 7 KB, substitution of repetitive $a["a"] can save 4 KB, substitution of $_GET and friends can save 2 KB, aliasing of $connection->query, $connection->result and $connection->quote can save ~ 3 KB, JS packer can save 1 KB, not enclosing HTML attribute values can save 1.2 KB, replacing \\n by \n can save .3 KB ? Branch binary_compile: LZW compression of translations can save 30 KB, LZW compression of all texts can save 11 KB, remove of base64_decode() + using chars 127-255 in minification can save 1 KB ? AJAX editing - select page has all data to display edit form +? MySQL geometry support Translations - database(s) have been dropped Editor: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |