[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. |