Thread: [adminer-svn] SF.net SVN: adminer:[1194] branches/sqlite/adminer
Database management in a single PHP file
Brought to you by:
jakubvrana
From: <jak...@us...> - 2009-10-17 07:16:11
|
Revision: 1194 http://adminer.svn.sourceforge.net/adminer/?rev=1194&view=rev Author: jakubvrana Date: 2009-10-17 07:16:02 +0000 (Sat, 17 Oct 2009) Log Message: ----------- Introduce $driver Modified Paths: -------------- branches/sqlite/adminer/create.inc.php branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/edit.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/include/connect.inc.php branches/sqlite/adminer/include/editing.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/include/mysql.inc.php branches/sqlite/adminer/include/sqlite.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/schema.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/adminer/sql.inc.php branches/sqlite/adminer/table.inc.php Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/create.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -67,7 +67,7 @@ $orig_field = next($orig_fields); } } - $status = "COMMENT=" . $connection->quote($_POST["Comment"]) + $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"]) : "") @@ -89,7 +89,7 @@ } $location = ME . "table=" . urlencode($_POST["name"]); if (strlen($TABLE)) { - query_redirect("ALTER TABLE " . idf_escape($TABLE) . "$fields\nRENAME TO " . idf_escape($_POST["name"]) . ",\n$status", $location, lang('Table has been altered.')); + 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.')); @@ -163,10 +163,12 @@ </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('Comment'); ?>: <input name="Comment" value="<?php echo h($row["Comment"]); ?>" maxlength="60"> +<?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>'); +<?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>'); +<?php } ?> </script> <p> <input type="hidden" name="token" value="<?php echo $token; ?>"> Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/db.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -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') . '<td>' . lang('Comment') . "</thead>\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"; 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');"); @@ -59,11 +59,11 @@ $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>" . nbsp($row["Comment"]); + echo ($comments_support ? "<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 '<td> '; + echo ($comments_support ? '<td> ' : ''); } } echo "</table>\n"; Modified: branches/sqlite/adminer/edit.inc.php =================================================================== --- branches/sqlite/adminer/edit.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/edit.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -58,8 +58,11 @@ } $row = array(); if ($select) { - $result = $connection->query("SELECT " . implode(", ", $select) . " FROM " . idf_escape($TABLE) . " WHERE $where " . (isset($_GET["select"]) ? "HAVING COUNT(*) = 1" : "LIMIT 1")); + $result = $connection->query("SELECT " . implode(", ", $select) . " FROM " . idf_escape($TABLE) . " WHERE $where LIMIT " . (isset($_GET["select"]) ? 2 : 1)); $row = $result->fetch_assoc(); + if (isset($_GET["select"]) && $result->fetch_assoc()) { + $row = false; + } } } ?> Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/include/adminer.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -108,7 +108,8 @@ * @return string */ function selectQuery($query) { - return "<p><code class='jush-sql'>" . h($query) . "</code> <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a></p>\n"; + global $driver; + return "<p><code class='jush-$driver'>" . h($query) . "</code> <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a></p>\n"; } /** Description of a row in a table @@ -360,7 +361,7 @@ function messageQuery($query) { $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-sql'>" . shorten_utf8($query, 1000) . '</pre><a href="' . h(ME . 'sql=&history=' . (count($_SESSION["history"][$_GET["server"]][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><a href="' . h(ME . 'sql=&history=' . (count($_SESSION["history"][$_GET["server"]][DB]) - 1)) . '">' . lang('Edit') . '</a></div>'; } /** Functions displayed in edit form @@ -490,7 +491,7 @@ </p> </form> <?php - if ($missing != "db" && strlen(DB)) { //!SQLite && $connection->select_db(DB) + if ($missing != "db" && strlen(DB) && $connection->select_db(DB)) { $tables = tables_list(); if (!$tables) { echo "<p class='message'>" . lang('No tables.') . "\n"; Modified: branches/sqlite/adminer/include/connect.inc.php =================================================================== --- branches/sqlite/adminer/include/connect.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/include/connect.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -5,16 +5,7 @@ page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), false); } else { page_header(lang('Select database'), "", null); - 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('MySQL version: %s through PHP extension %s', "<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"; + db_info(); } page_footer("db"); } Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/include/editing.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -119,12 +119,12 @@ } function process_field($field, $type_field) { - global $connection; + global $connection, $comments_support; 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]" : "") - . " COMMENT " . $connection->quote($field["comment"]) + . ($comments_support ? " COMMENT " . $connection->quote($field["comment"]) : ""); ; } @@ -142,7 +142,7 @@ } function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array()) { - global $inout; + global $inout, $comments_support; $column_comments = false; foreach ($fields as $field) { if (strlen($field["comment"])) { @@ -160,7 +160,7 @@ <td>NULL <td><input type="radio" name="auto_increment_col" value=""><?php echo lang('Auto Increment'); ?> <td class="hidden"><?php echo lang('Default values'); ?> -<td<?php echo ($column_comments ? "" : " class='hidden'"); ?>><?php echo lang('Comment'); ?> +<?php echo ($comments_support ? "<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> @@ -181,7 +181,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="nowrap 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;"> -<td<?php echo ($column_comments ? "" : " class='hidden'"); ?>><input name="fields[<?php echo $i; ?>][comment]" value="<?php echo h($field["comment"]); ?>" maxlength="255"> +<?php echo ($comments_support ? "<td" . ($column_comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='255'>" : ""); ?> <?php } ?> <?php echo "<td class='nowrap'><input type='image' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editing_add_row(this, $allowed, 1);'>"; Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/include/functions.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -402,7 +402,7 @@ * @return null */ function input($field, $value, $function) { - global $types, $adminer; + global $types, $adminer, $driver; $name = h(bracket_escape($field["field"])); echo "<td class='function'>"; $functions = (isset($_GET["select"]) ? array("orig" => lang('original')) : array()) + $adminer->editFunctions($field); @@ -439,7 +439,7 @@ 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='12'$onchange>" . h($value) . '</textarea>'; + 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.')); } else { Modified: branches/sqlite/adminer/include/mysql.inc.php =================================================================== --- branches/sqlite/adminer/include/mysql.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/include/mysql.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -177,6 +177,9 @@ return $return; } +/**Get supported engines +* @return array +*/ function engines() { global $connection; $return = array(); @@ -189,6 +192,23 @@ 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 */ @@ -214,6 +234,14 @@ 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 */ @@ -352,6 +380,8 @@ return "BINARY " . $connection->quote($val); } +$driver = "sqlite"; +$comments_support = true; // value means maximum unsigned length $types = array(); $structured_types = array(); Modified: branches/sqlite/adminer/include/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/include/sqlite.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/include/sqlite.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -140,10 +140,14 @@ 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(); - $this->server_info = $this->result($this->query("SELECT sqlite_version()")); return true; } @@ -165,7 +169,12 @@ 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 @@ -181,6 +190,11 @@ } function connect() { + static $connected = false; //! EXPLAIN doesn't work with second connection + if ($connected) { + return false; + } + $connected = true; return new Min_DB; } @@ -192,6 +206,16 @@ 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); } @@ -203,13 +227,16 @@ while ($row = $result->fetch_assoc()) { $return[$row["name"]] = array( "Name" => $row["name"], - "Rows" => ($row["type"] == "table" ? -1 : null), - "Engine" => "InnoDB", + "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(); } @@ -227,7 +254,7 @@ "default" => $row["dflt_value"], "null" => !$row["notnull"], "auto_increment" => false, //! - "collation" => $row["Collation"], //! + "collation" => null, //! "privileges" => array("select" => 1, "insert" => 1, "update" => 1), "primary" => $row["pk"], ); @@ -265,13 +292,15 @@ global $connection; $return = array(); $result = $connection->query("PRAGMA foreign_key_list(" . idf_escape($table) . ")"); - while ($row = $result->fetch_assoc()) { - $foreign_key = &$return[$row["id"]]; - if (!$foreign_key) { - $foreign_key = $row; + 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"]; } - $foreign_key["source"][] = $row["from"]; - $foreign_key["target"][] = $row["to"]; } return $return; } @@ -294,6 +323,8 @@ 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-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/lang/cs.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -126,7 +126,7 @@ 'Create trigger' => 'Vytvořit trigger', 'Time' => 'Čas', 'Event' => 'Událost', - 'MySQL version: %s through PHP extension %s' => 'Verze MySQL: %s přes PHP extenzi %s', + '%s version: %s through PHP extension %s' => 'Verze %s: %s přes PHP extenzi %s', '%d row(s)' => array('%d řádek', '%d řádky', '%d řádků'), '~ %s' => '~ %s', 'Remove' => 'Odebrat', Modified: branches/sqlite/adminer/lang/de.inc.php =================================================================== --- branches/sqlite/adminer/lang/de.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/lang/de.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -126,7 +126,7 @@ 'Create trigger' => 'Trigger hinzufügen', 'Time' => 'Zeitpunkt', 'Event' => 'Ereignis', - 'MySQL version: %s through PHP extension %s' => 'Version MySQL: %s, mit PHP-Erweiterung %s', + '%s version: %s through PHP extension %s' => 'Version %s: %s, mit PHP-Erweiterung %s', '%d row(s)' => array('%d Datensatz', '%d Datensätze'), '~ %s' => '~ %s', 'Remove' => 'Entfernen', Modified: branches/sqlite/adminer/lang/es.inc.php =================================================================== --- branches/sqlite/adminer/lang/es.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/lang/es.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -126,7 +126,7 @@ 'Create trigger' => 'Agregar Trigger', 'Time' => 'Tiempo', 'Event' => 'Evento', - 'MySQL version: %s through PHP extension %s' => 'Versión MySQL: %s a través de extensión PHP %s', + '%s version: %s through PHP extension %s' => 'Versión %s: %s a través de extensión PHP %s', '%d row(s)' => array('%d registro', '%d registros'), '~ %s' => '~ %s', 'Remove' => 'Eliminar', Modified: branches/sqlite/adminer/lang/et.inc.php =================================================================== --- branches/sqlite/adminer/lang/et.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/lang/et.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -140,7 +140,7 @@ 'Routine' => 'Protseduur', 'Grant' => 'Anna', 'Revoke' => 'Eemalda', - 'MySQL version: %s through PHP extension %s' => 'MySQL versioon: %s, kasutatud PHP moodul: %s', + '%s version: %s through PHP extension %s' => '%s versioon: %s, kasutatud PHP moodul: %s', 'Logged as: %s' => 'Sisse logitud: %s', 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST-andmete maht on liialt suur. Palun vähendage andmeid või suurendage %s php-seadet.', 'Move up' => 'Liiguta ülespoole', Modified: branches/sqlite/adminer/lang/fr.inc.php =================================================================== --- branches/sqlite/adminer/lang/fr.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/lang/fr.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -140,7 +140,7 @@ 'Routine' => 'Routine', 'Grant' => 'Grant', 'Revoke' => 'Revoke', - 'MySQL version: %s through PHP extension %s' => 'Version de MySQL: %s utilisant l\'extension %s', + '%s version: %s through PHP extension %s' => 'Version de %s: %s utilisant l\'extension %s', 'Logged as: %s' => 'Authentifié en tant que %s', 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Donnée POST trop grande . Réduire la taille des données ou modifier le %s dans la configuration de PHP.', 'Move up' => 'Déplacer vers le haut', Modified: branches/sqlite/adminer/lang/it.inc.php =================================================================== --- branches/sqlite/adminer/lang/it.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/lang/it.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -126,7 +126,7 @@ 'Create trigger' => 'Crea trigger', 'Time' => 'Orario', 'Event' => 'Evento', - 'MySQL version: %s through PHP extension %s' => 'Versione MySQL: %s via estensione PHP %s', + '%s version: %s through PHP extension %s' => 'Versione %s: %s via estensione PHP %s', '%d row(s)' => array('%d riga', '%d righe'), '~ %s' => '~ %s', 'Remove' => 'Rimuovi', Modified: branches/sqlite/adminer/lang/nl.inc.php =================================================================== --- branches/sqlite/adminer/lang/nl.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/lang/nl.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -126,7 +126,7 @@ 'Create trigger' => 'Trigger aanmaken', 'Time' => 'Time', 'Event' => 'Event', - 'MySQL version: %s through PHP extension %s' => 'MySQL versie: %s met PHP extensie %s', + '%s version: %s through PHP extension %s' => '%s versie: %s met PHP extensie %s', '%d row(s)' => array('%d rij', '%d rijen'), '~ %s' => '~ %s', 'Remove' => 'Verwijderen', Modified: branches/sqlite/adminer/lang/ru.inc.php =================================================================== --- branches/sqlite/adminer/lang/ru.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/lang/ru.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -126,7 +126,7 @@ 'Create trigger' => 'Создать триггер', 'Time' => 'Время', 'Event' => 'Событие', - 'MySQL version: %s through PHP extension %s' => 'Версия MySQL: %s с PHP-расширением %s', + '%s version: %s through PHP extension %s' => 'Версия %s: %s с PHP-расширением %s', '%d row(s)' => array('%d строка', '%d строки', '%d строк'), '~ %s' => '~ %s', 'Remove' => 'Удалить', Modified: branches/sqlite/adminer/lang/sk.inc.php =================================================================== --- branches/sqlite/adminer/lang/sk.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/lang/sk.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -126,7 +126,7 @@ 'Create trigger' => 'Vytvoriť trigger', 'Time' => 'Čas', 'Event' => 'Udalosť', - 'MySQL version: %s through PHP extension %s' => 'Verzia MySQL: %s cez PHP rozšírenie %s', + '%s version: %s through PHP extension %s' => 'Verzia %s: %s cez PHP rozšírenie %s', '%d row(s)' => array('%d riadok', '%d riadky', '%d riadkov'), '~ %s' => '~ %s', 'Remove' => 'Odobrať', Modified: branches/sqlite/adminer/lang/zh-tw.inc.php =================================================================== --- branches/sqlite/adminer/lang/zh-tw.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/lang/zh-tw.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -126,7 +126,7 @@ 'Create trigger' => '建立觸發器', 'Time' => '時間', 'Event' => '事件', - 'MySQL version: %s through PHP extension %s' => 'MySQL版本:%s 透過PHP擴充模組 %s', + '%s version: %s through PHP extension %s' => '%s版本:%s 透過PHP擴充模組 %s', '%d row(s)' => '%d行', '~ %s' => '~ %s', 'Remove' => '移除', Modified: branches/sqlite/adminer/lang/zh.inc.php =================================================================== --- branches/sqlite/adminer/lang/zh.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/lang/zh.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -126,7 +126,7 @@ 'Create trigger' => '创建触发器', 'Time' => '时间', 'Event' => '事件', - 'MySQL version: %s through PHP extension %s' => 'MySQL 版本:%s 通过 PHP 扩展 %s', + '%s version: %s through PHP extension %s' => '%s 版本:%s 通过 PHP 扩展 %s', '%d row(s)' => '%d 行', '~ %s' => '~ %s', 'Remove' => '移除', Modified: branches/sqlite/adminer/schema.inc.php =================================================================== --- branches/sqlite/adminer/schema.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/schema.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -27,7 +27,7 @@ $schema[$row["Name"]]["fields"][$name] = $field; } $schema[$row["Name"]]["pos"] = ($table_pos[$row["Name"]] ? $table_pos[$row["Name"]] : array($top, 0)); - if ($row["Engine"] == "InnoDB") { + if (fk_support($row)) { foreach (foreign_keys($row["Name"]) as $val) { if (!$val["db"]) { $left = $base_left; Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/select.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -57,7 +57,7 @@ if (!$_POST["import"]) { // edit $result = true; $affected = 0; - $command = ($_POST["delete"] ? ($_POST["all"] && !$where ? "TRUNCATE " : "DELETE FROM ") : ($_POST["clone"] ? "INSERT INTO " : "UPDATE ")) . idf_escape($TABLE); + $command = ($_POST["delete"] ? ($_POST["all"] && !$where && $driver == "sql" ? "TRUNCATE " : "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 Modified: branches/sqlite/adminer/sql.inc.php =================================================================== --- branches/sqlite/adminer/sql.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/sql.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -34,7 +34,7 @@ $delimiter = ";"; $offset = 0; $empty = true; - //!SQLite $connection2 = (strlen(DB) ? connect() : null); // connection for exploring indexes and EXPLAIN (to not replace FOUND_ROWS()) //! PDO - silent error + $connection2 = (strlen(DB) ? connect() : null); // connection for exploring indexes and EXPLAIN (to not replace FOUND_ROWS()) //! PDO - silent error if (is_object($connection2)) { $connection2->select_db(DB); } @@ -56,7 +56,7 @@ if (!$found || $found == $delimiter) { // end of a query $empty = false; $q = substr($query, 0, $match[0][1]); - echo "<pre class='jush-sql'>" . shorten_utf8(trim($q), 1000) . "</pre>\n"; + echo "<pre class='jush-$driver'>" . shorten_utf8(trim($q), 1000) . "</pre>\n"; ob_flush(); flush(); // can take a long time - show the running query $start = explode(" ", microtime()); // microtime(true) is available since PHP 5 @@ -155,7 +155,7 @@ echo "<fieldset><legend>" . lang('History') . "</legend>\n"; foreach ($history as $key => $val) { //! save and display timestamp - echo '<a href="' . h(ME . "sql=&history=$key") . '">' . lang('Edit') . '</a> <code class="jush-sql">' . shorten_utf8(ltrim(str_replace("\n", " ", str_replace("\r", "", preg_replace('~^(#|-- ).*~m', '', $val)))), 80, "</code>") . "<br>\n"; + echo '<a href="' . h(ME . "sql=&history=$key") . '">' . lang('Edit') . "</a> <code class='jush-$driver'>" . shorten_utf8(ltrim(str_replace("\n", " ", str_replace("\r", "", preg_replace('~^(#|-- ).*~m', '', $val)))), 80, "</code>") . "<br>\n"; } echo "<input type='submit' name='clear' value='" . lang('Clear') . "'>\n"; echo "</fieldset>\n"; Modified: branches/sqlite/adminer/table.inc.php =================================================================== --- branches/sqlite/adminer/table.inc.php 2009-10-16 12:34:13 UTC (rev 1193) +++ branches/sqlite/adminer/table.inc.php 2009-10-17 07:16:02 UTC (rev 1194) @@ -12,11 +12,11 @@ if ($fields) { echo "<table cellspacing='0'>\n"; - echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . "<td>" . lang('Comment') . "</thead>\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 "<td>" . h($field["full_type"]) . ($field["null"] ? " <i>NULL</i>" : "") . ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : ""); - echo "<td>" . nbsp($field["comment"]); + echo ($comments_support ? "<td>" . nbsp($field["comment"]) : ""); echo "\n"; } echo "</table>\n"; @@ -38,7 +38,7 @@ } echo '<p><a href="' . h(ME) . 'indexes=' . urlencode($TABLE) . '">' . lang('Alter indexes') . "</a>\n"; - if ($table_status["Engine"] == "InnoDB") { + if (fk_support($table_status)) { echo "<h3>" . lang('Foreign keys') . "</h3>\n"; $foreign_keys = foreign_keys($TABLE); if ($foreign_keys) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-01-15 10:56:28
|
Revision: 1294 http://adminer.svn.sourceforge.net/adminer/?rev=1294&view=rev Author: jakubvrana Date: 2010-01-15 10:56:21 +0000 (Fri, 15 Jan 2010) Log Message: ----------- Prepare MSSQL 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/bootstrap.inc.php branches/sqlite/adminer/include/functions.inc.php Added Paths: ----------- branches/sqlite/adminer/drivers/mssql.inc.php Added: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php (rev 0) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-01-15 10:56:21 UTC (rev 1294) @@ -0,0 +1,332 @@ +<?php +/** +* @author Jakub Cernohuby +*/ + +$possible_drivers[] = "SQLSRV"; +if (extension_loaded("sqlsrv")) { + $drivers["mssql"] = "SQLSRV"; +} + +if ($_GET["driver"] == "mssql") { + if (extension_loaded("sqlsrv")) { + class Min_DB { + var $extension = "sqlsrv", $_link, $_result, $server_info, $affected_rows, $error; + + function _get_error() { + $this->error = ""; + foreach (sqlsrv_errors() as $error) { + $this->error .= "SQLSTATE: $error[SQLSTATE] code: $error[code] message: $error[message]\n"; + } + } + + function connect($server, $username, $password) { + $this->_link = @sqlsrv_connect($server, array("UID" => $username, "PWD" => $password)); + if ($this->_link) { + $info = sqlsrv_server_info($this->_link); + $this->server_info = $info['SQLServerVersion']; + } else { + $this->_get_error(); + } + return (bool) $this->_link; + } + + function quote($string) { + return "'" . str_replace("'", "''", $string) . "'"; + } + + function select_db($database) { + $return = sqlsrv_query($this->_link, "USE $database"); + if (!$return) { + $this->_get_error(); + } + return $return; + } + + + function query($query, $unbuffered = false) { + $result = sqlsrv_query($this->_link, $query); //sqlsrv pouziva pouze unbuffered query + 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); + } + + function multi_query($query) { + return $this->_result = $this->query($query); + } + + function store_result() { + return $this->_result; + } + + function next_result() { + return sqlsrv_next_result($this->_result); + } + + function result($query, $field = 0) { + $result = $this->query($query); + if (!is_resource($result)) { + $this->_get_error(); + } + return sqlsrv_get_field($result->_result, 0); + } + } + + class Min_Result { + var $_result, $_offset = 0, $_fields, $num_rows; + + function Min_Result($result) { + $this->_result = $result; + $this->num_rows = sqlsrv_num_rows($result); + } + + function fetch_assoc(){ + return sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_NEXT); + } + + function fetch_row() { + return sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_NUMERIC, SQLSRV_SCROLL_NEXT); + } + + function fetch_field() { + if (!$this->_fields) { + $this->_fields = sqlsrv_field_metadata($this->_result); + } + $field = $this->_fields[$this->_offset++]; + $return = new stdClass; + $return->name = $field["Name"]; + $return->orgname = $field["Name"]; + $return->type = ($field["Type"] == 1 ? 254 : 0); + return $return; + } + + function __destruct() { + sqlsrv_free_stmt($this->_result); + } + } + + } + + function idf_escape($idf) { + return "[" . str_replace("]", "]]", $idf) . "]"; + } + + function connect() { + global $adminer; + $connection = new Min_DB; + $credentials = $adminer->credentials(); + if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) { + return $connection; + } + return $connection->error; + } + + function get_databases($flush = true) { + $return = &$_SESSION["databases"][$_GET["server"]]; + if (!isset($return)) { + $return = get_vals("EXEC sp_databases"); + if ($flush) { + ob_flush(); + flush(); + } + } + return $return; + } + + /** 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(); + $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("SELECT USER()")) . "</b>") . "\n"; + } + + function tables_list() { + return get_vals("SELECT TABLE_NAME AS FROM information_schema.TABLES"); + } + + 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) : "")); + while ($row = $result->fetch_assoc()) { + if ($name != "") { + return $row; + } + $return[$row["TABLE_NAME"]] = $row; + } + return $return; + } + + function table_status_referencable() { + return table_status(); + } + + function fk_support($table_status) { + return true; + } + + function fields($table) { + global $connection; + $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( + "field" => $row["COLUMN_NAME"], + "full_type" => $row["DATA_TYPE"], + "type" => $row["DATA_TYPE"], //! unsigned? + "length" => $row["CHARACTER_MAXIMUM_LENGTH"], //! NUMERIC_, DATETIME_? + "default" => $row["COLUMN_DEFAULT"], + "null" => ($row["IS_NULLABLE"] == "YES"), + "collation" => $row["COLLATION_NAME"], + ); + } + 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; + } + + function information_schema($db) { + return ($db == "information_schema"); + } + + function exact_value($val) { + global $connection; + return $connection->quote($val); + } + + // 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/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-01-13 23:57:54 UTC (rev 1293) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-01-15 10:56:21 UTC (rev 1294) @@ -206,6 +206,14 @@ } + /** Escape database identifier + * @param string + * @return string + */ + function idf_escape($idf) { + return "`" . str_replace("`", "``", $idf) . "`"; + } + /** Connect to the database * @return mixed Min_DB or string for error */ @@ -316,7 +324,7 @@ return $return; } - /** + /** Check if table supports foreign keys * @param array result of table_status * @return bool */ Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-01-13 23:57:54 UTC (rev 1293) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-01-15 10:56:21 UTC (rev 1294) @@ -109,6 +109,10 @@ } + function idf_escape($idf) { + return '"' . str_replace('"', '""', $idf) . '"'; + } + function connect() { global $adminer; $connection = new Min_DB; Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-01-13 23:57:54 UTC (rev 1293) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-01-15 10:56:21 UTC (rev 1294) @@ -198,6 +198,10 @@ } + function idf_escape($idf) { + return "`" . str_replace("`", "``", $idf) . "`"; + } + function connect() { static $connected = false; //! EXPLAIN doesn't work with second connection if ($connected) { Modified: branches/sqlite/adminer/include/bootstrap.inc.php =================================================================== --- branches/sqlite/adminer/include/bootstrap.inc.php 2010-01-13 23:57:54 UTC (rev 1293) +++ branches/sqlite/adminer/include/bootstrap.inc.php 2010-01-15 10:56:21 UTC (rev 1294) @@ -88,6 +88,7 @@ include "../adminer/drivers/mysql.inc.php"; include "../adminer/drivers/sqlite.inc.php"; include "../adminer/drivers/pgsql.inc.php"; +include "../adminer/drivers/mssql.inc.php"; include "../adminer/include/auth.inc.php"; include "./include/connect.inc.php"; include "./include/editing.inc.php"; Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-01-13 23:57:54 UTC (rev 1293) +++ branches/sqlite/adminer/include/functions.inc.php 2010-01-15 10:56:21 UTC (rev 1294) @@ -8,14 +8,6 @@ return $connection; } -/** Escape database identifier -* @param string -* @return string -*/ -function idf_escape($idf) { - return "`" . str_replace("`", "``", $idf) . "`"; -} - /** Unescape database identifier * @param string text inside `` * @return string This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-01-15 11:09:24
|
Revision: 1296 http://adminer.svn.sourceforge.net/adminer/?rev=1296&view=rev Author: jakubvrana Date: 2010-01-15 11:09:03 +0000 (Fri, 15 Jan 2010) Log Message: ----------- Remove table_status_referencable Modified Paths: -------------- 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/editing.inc.php Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-01-15 11:00:23 UTC (rev 1295) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-01-15 11:09:03 UTC (rev 1296) @@ -204,10 +204,6 @@ return $return; } - function table_status_referencable() { - return table_status(); - } - function fk_support($table_status) { return true; } Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-01-15 11:00:23 UTC (rev 1295) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-01-15 11:09:03 UTC (rev 1296) @@ -332,19 +332,6 @@ 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" => )) Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-01-15 11:00:23 UTC (rev 1295) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-01-15 11:09:03 UTC (rev 1296) @@ -168,10 +168,6 @@ return true; } - function table_status_referencable() { - return table_status(); - } - function fields($table) { //! global $connection; $return = array(); Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-01-15 11:00:23 UTC (rev 1295) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-01-15 11:09:03 UTC (rev 1296) @@ -245,10 +245,6 @@ return true; } - function table_status_referencable() { - return table_status(); - } - function fields($table) { global $connection; $return = array(); Modified: branches/sqlite/adminer/foreign.inc.php =================================================================== --- branches/sqlite/adminer/foreign.inc.php 2010-01-15 11:00:23 UTC (rev 1295) +++ branches/sqlite/adminer/foreign.inc.php 2010-01-15 11:09:03 UTC (rev 1296) @@ -39,13 +39,19 @@ $source = array_keys(fields($TABLE)); //! no text and blob $target = ($TABLE === $row["table"] ? $source : array_keys(fields($row["table"]))); +$referencable = array(); +foreach (table_status() as $name => $table_status) { + if (fk_support($table_status)) { + $referencable[] = $name; + } +} ?> <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();"); ?> +<?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> Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2010-01-15 11:00:23 UTC (rev 1295) +++ branches/sqlite/adminer/include/editing.inc.php 2010-01-15 11:09:03 UTC (rev 1296) @@ -82,8 +82,8 @@ */ function referencable_primary($self) { $return = array(); // table_name => field - foreach (table_status_referencable() as $table_name => $table) { - if ($table_name != $self) { + foreach (table_status() as $table_name => $table) { + if ($table_name != $self && fk_support($table)) { foreach (fields($table_name) as $field) { if ($field["primary"]) { if ($return[$table_name]) { // multi column primary key This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-02-17 15:24:24
|
Revision: 1314 http://adminer.svn.sourceforge.net/adminer/?rev=1314&view=rev Author: jakubvrana Date: 2010-02-17 15:24:17 +0000 (Wed, 17 Feb 2010) Log Message: ----------- Fix some MS SQL errors Modified Paths: -------------- branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/include/auth.inc.php branches/sqlite/adminer/privileges.inc.php branches/sqlite/adminer/select.inc.php Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-02-16 14:35:32 UTC (rev 1313) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-02-17 15:24:17 UTC (rev 1314) @@ -5,7 +5,7 @@ $possible_drivers[] = "SQLSRV"; if (extension_loaded("sqlsrv")) { - $drivers["mssql"] = "SQLSRV"; + $drivers["mssql"] = "MS SQL"; } if ($_GET["driver"] == "mssql") { @@ -45,12 +45,12 @@ function query($query, $unbuffered = false) { - $result = sqlsrv_query($this->_link, $query); //sqlsrv pouziva pouze unbuffered query + $result = sqlsrv_query($this->_link, $query); //! , array(), ($unbuffered ? array() : array("Scrollable" => SQLSRV_CURSOR_KEYSET)) if (!$result) { $this->_get_error(); return false; } elseif ($result === true) { - $this->affected_rows = sqlsrv_rows_affected ($this->_link); + $this->affected_rows = sqlsrv_rows_affected($this->_link); return true; } return new Min_Result($result); @@ -65,7 +65,7 @@ } function next_result() { - return sqlsrv_next_result($this->_result); + return sqlsrv_next_result($this->_result->_result); } function result($query, $field = 0) { @@ -82,7 +82,7 @@ function Min_Result($result) { $this->_result = $result; - $this->num_rows = sqlsrv_num_rows($result); + $this->num_rows = sqlsrv_has_rows($result); //! sqlsrv_num_rows($result) } function fetch_assoc(){ @@ -144,31 +144,14 @@ * @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; + return null; } /** 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; + return array(); } /** Print links and information about the database @@ -183,12 +166,12 @@ ) 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("SELECT USER()")) . "</b>") . "\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() { - return get_vals("SELECT TABLE_NAME AS FROM information_schema.TABLES"); + return get_vals("SELECT TABLE_NAME FROM information_schema.TABLES"); } function table_status($name = "") { @@ -196,10 +179,13 @@ $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) : "")); while ($row = $result->fetch_assoc()) { + if ($row["Engine"] != "VIEW") { + $row["Rows"] = -1; + } if ($name != "") { return $row; } - $return[$row["TABLE_NAME"]] = $row; + $return[$row["Name"]] = $row; } return $return; } @@ -221,6 +207,7 @@ "default" => $row["COLUMN_DEFAULT"], "null" => ($row["IS_NULLABLE"] == "YES"), "collation" => $row["COLLATION_NAME"], + "privileges" => array("insert" => 1, "select" => 1), ); } return $return; @@ -253,26 +240,7 @@ * @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(); - $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); - 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 array(); } /** Get view SELECT @@ -288,17 +256,7 @@ * @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; + return array(); } function information_schema($db) { Modified: branches/sqlite/adminer/include/auth.inc.php =================================================================== --- branches/sqlite/adminer/include/auth.inc.php 2010-02-16 14:35:32 UTC (rev 1313) +++ branches/sqlite/adminer/include/auth.inc.php 2010-02-17 15:24:17 UTC (rev 1314) @@ -1,6 +1,6 @@ <?php if (!$drivers) { - page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', $possible_drivers), null); + page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', implode(", ", $possible_drivers)), null); page_footer("auth"); exit; } Modified: branches/sqlite/adminer/privileges.inc.php =================================================================== --- branches/sqlite/adminer/privileges.inc.php 2010-02-16 14:35:32 UTC (rev 1313) +++ branches/sqlite/adminer/privileges.inc.php 2010-02-17 15:24:17 UTC (rev 1314) @@ -6,6 +6,7 @@ ?> <form action=""><p> <?php if (SID) { ?><input type="hidden" name="<?php echo session_name(); ?>" value="<?php echo h(session_id()); ?>"><?php } ?> +<?php if ($_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 lang('Username'); ?>: <input name="user"> <?php echo lang('Server'); ?>: <input name="host" value="localhost"> Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2010-02-16 14:35:32 UTC (rev 1313) +++ branches/sqlite/adminer/select.inc.php 2010-02-17 15:24:17 UTC (rev 1314) @@ -148,6 +148,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 (strlen($_GET["server"]) ? '<input type="hidden" name="server" value="' . h($_GET["server"]) . '">' : ""); echo (strlen(DB) ? '<input type="hidden" name="db" value="' . h(DB) . '">' : ""); // not used in Editor echo '<input type="hidden" name="select" value="' . h($TABLE) . '">'; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-03-24 09:36:43
|
Revision: 1351 http://adminer.svn.sourceforge.net/adminer/?rev=1351&view=rev Author: jakubvrana Date: 2010-03-24 09:36:37 +0000 (Wed, 24 Mar 2010) Log Message: ----------- Comments Modified Paths: -------------- branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/include/auth.inc.php Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-03-23 17:14:22 UTC (rev 1350) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-03-24 09:36:37 UTC (rev 1351) @@ -152,7 +152,7 @@ $_result ///< @access private ; - /** + /** Constructor * @param resource */ function Min_Result($result) { @@ -185,6 +185,8 @@ return $return; } + /** Free result set + */ function __destruct() { mysql_free_result($this->_result); //! not called in PHP 4 which is a problem with mysql.trace_mode } Modified: branches/sqlite/adminer/include/auth.inc.php =================================================================== --- branches/sqlite/adminer/include/auth.inc.php 2010-03-23 17:14:22 UTC (rev 1350) +++ branches/sqlite/adminer/include/auth.inc.php 2010-03-24 09:36:37 UTC (rev 1351) @@ -49,7 +49,7 @@ $_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)); + redirect(preg_replace('~^([^?]*).*~', '\\1', ME) . '?server=' . urlencode($server)); //! store and respect driver } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-01 19:45:49
|
Revision: 1357 http://adminer.svn.sourceforge.net/adminer/?rev=1357&view=rev Author: jakubvrana Date: 2010-04-01 19:45:43 +0000 (Thu, 01 Apr 2010) Log Message: ----------- Show driver in breadcrumb Display login form with empty driver Modified Paths: -------------- branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/include/auth.inc.php branches/sqlite/adminer/include/connect.inc.php branches/sqlite/adminer/include/design.inc.php Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-04-01 14:17:20 UTC (rev 1356) +++ branches/sqlite/adminer/db.inc.php 2010-04-01 19:45:43 UTC (rev 1357) @@ -37,7 +37,7 @@ queries_redirect(substr(ME, 0, -1), $message, $result); } -page_header(lang('Database') . ": " . h(DB), $error, false); +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"; Modified: branches/sqlite/adminer/include/auth.inc.php =================================================================== --- branches/sqlite/adminer/include/auth.inc.php 2010-04-01 14:17:20 UTC (rev 1356) +++ branches/sqlite/adminer/include/auth.inc.php 2010-04-01 19:45:43 UTC (rev 1357) @@ -18,7 +18,7 @@ } $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(session_name()) : substr(preg_replace('~\\?.*~', '', ME) . "?" . ($_POST["driver"] ? "driver=" . urlencode($_POST["driver"]) . "&" : "") . ($_POST["server"] != "" ? "server=" . urlencode($_POST["server"]) . "&" : ""), 0, -1)); + $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)); if (SID_FORM) { $pos = strpos($location, '?'); $location = ($pos ? substr_replace($location, SID . "&", $pos + 1, 0) : "$location?" . SID); @@ -58,7 +58,9 @@ global $connection, $adminer; $session_name = session_name(); $username = $_SESSION["usernames"][$_GET["server"]]; - unset($_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.'))) : (!$_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.') @@ -76,7 +78,7 @@ if (!isset($username)) { $username = $_GET["username"]; // default username can be passed in URL } -$connection = (isset($username) ? connect() : ''); +$connection = (!$_GET["login"] && isset($username) ? connect() : ''); if (is_string($connection) || !$adminer->login($username, $_SESSION["passwords"][$_GET["server"]])) { auth_error(); exit; Modified: branches/sqlite/adminer/include/connect.inc.php =================================================================== --- branches/sqlite/adminer/include/connect.inc.php 2010-04-01 14:17:20 UTC (rev 1356) +++ branches/sqlite/adminer/include/connect.inc.php 2010-04-01 19:45:43 UTC (rev 1357) @@ -2,7 +2,7 @@ function connect_error() { global $connection, $VERSION, $token, $error; if (DB != "") { - page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), false); + page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), true); } else { if ($_POST["db"] && !$error) { unset($_SESSION["databases"][$_GET["server"]]); @@ -14,7 +14,7 @@ queries_redirect(substr(ME, 0, -1), lang('Database has been dropped.'), !$connection->error); } - page_header(lang('Select database'), $error, null); + page_header(lang('Select database'), $error, false); echo "<p><a href='" . h(ME) . "database='>" . lang('Create new database') . "</a>\n"; db_info(); $databases = get_databases(); Modified: branches/sqlite/adminer/include/design.inc.php =================================================================== --- branches/sqlite/adminer/include/design.inc.php 2010-04-01 14:17:20 UTC (rev 1356) +++ branches/sqlite/adminer/include/design.inc.php 2010-04-01 19:45:43 UTC (rev 1357) @@ -1,6 +1,13 @@ <?php +/** Print HTML header +* @param string used in title, breadcrumb and heading +* @param string +* @param mixed array("key" => "link=desc", "key2" => array("link", "desc")), null for nothing, false for driver only, true for driver and server +* @param string used after colon in title and heading +* @return null +*/ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") { - global $LANG, $VERSION, $adminer, $connection; + global $LANG, $VERSION, $adminer, $connection, $drivers; header("Content-Type: text/html; charset=utf-8"); header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, NoScript plugin $title_all = $title . ($title2 != "" ? ": " . h($title2) : ""); @@ -25,19 +32,25 @@ <?php if (isset($breadcrumb)) { $link = substr(preg_replace('~db=[^&]*&~', '', ME), 0, -1); - echo '<p id="breadcrumb"><a href="' . ($link != "" ? h($link) : ".") . '">' . (isset($_GET["server"]) ? h($_GET["server"]) : lang('Server')) . '</a> » '; - if (is_array($breadcrumb)) { - if (DB != "") { - echo '<a href="' . h(substr(ME, 0, -1)) . '">' . h(DB) . '</a> » '; - } - foreach ($breadcrumb as $key => $val) { - $desc = (is_array($val) ? $val[1] : $val); - if ($desc != "") { - echo '<a href="' . h(ME . "$key=") . urlencode(is_array($val) ? $val[0] : $val) . '">' . h($desc) . '</a> » '; + 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> » "; + if (is_array($breadcrumb)) { + if (DB != "") { + echo '<a href="' . h(substr(ME, 0, -1)) . '">' . h(DB) . '</a> » '; } + foreach ($breadcrumb as $key => $val) { + $desc = (is_array($val) ? $val[1] : $val); + if ($desc != "") { + echo '<a href="' . h(ME . "$key=") . urlencode(is_array($val) ? $val[0] : $val) . '">' . h($desc) . '</a> » '; + } + } } + echo "$title\n"; } - echo "$title\n"; } echo "<h2>$title_all</h2>\n"; restart_session(); @@ -57,7 +70,11 @@ } } -function page_footer($missing = false) { +/** Print HTML footer +* @param string auth|db +* @return null +*/ +function page_footer($missing = "") { global $adminer; ?> </div> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-02 15:09:21
|
Revision: 1362 http://adminer.svn.sourceforge.net/adminer/?rev=1362&view=rev Author: jakubvrana Date: 2010-04-02 15:09:15 +0000 (Fri, 02 Apr 2010) Log Message: ----------- Defer table_status to JavaScript (performance) Modified Paths: -------------- branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/index.php branches/sqlite/adminer/static/editing.js Added Paths: ----------- branches/sqlite/adminer/js.inc.php Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-04-02 13:44:23 UTC (rev 1361) +++ branches/sqlite/adminer/db.inc.php 2010-04-02 15:09:15 UTC (rev 1362) @@ -1,14 +1,13 @@ <?php -$tables_views = array_merge((array) $_POST["tables"], (array) $_POST["views"]); - -if ($tables_views && !$error && !$_POST["search"]) { +if ($_POST["tables"] && !$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 ((array) $_POST["tables"] as $table) { + foreach ($_POST["tables"] as $table) { if (!queries("TRUNCATE TABLE " . idf_escape($table))) { $result = false; break; @@ -17,21 +16,18 @@ $message = lang('Tables have been truncated.'); } elseif (isset($_POST["move"])) { $rename = array(); - foreach ($tables_views as $table) { + foreach ($_POST["tables"] 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"]) || !$_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"]))))) - ) { - 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 (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>"; } } queries_redirect(substr(ME, 0, -1), $message, $result); @@ -42,8 +38,8 @@ echo '<a href="' . h(ME) . 'schema=">' . lang('Database schema') . "</a>\n"; echo "<h3>" . lang('Tables and views') . "</h3>\n"; -$table_status = table_status(); -if (!$table_status) { +$tables_list = tables_list(); +if (!$tables_list) { echo "<p class='message'>" . lang('No tables.') . "\n"; } else { echo "<form action='' method='post'>\n"; @@ -54,36 +50,28 @@ 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') . (support("comment") ? '<td>' . lang('Comment') : '') . "</thead>\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 ($table_status as $row) { - $name = $row["Name"]; - echo '<tr' . odd() . '><td>' . checkbox((isset($row["Rows"]) ? "tables[]" : "views[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');"); + foreach ($tables_list as $name) { + echo '<tr' . odd() . '><td>' . checkbox("tables[]", $name, in_array($name, (array) $_POST["tables"], 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) { - $val = number_format($row[$key], 0, '.', lang(',')); - 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 (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 (support("comment") ? '<td> ' : ''); + 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($table_status)); + 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("create", "indexes", "edit") as $val) { - echo "<td align='right'>" . number_format($sums[$val], 0, '.', lang(',')); + foreach (array("Data_length", "Index_length", "Data_free") as $key) { + echo "<td align='right' id='sum-$key'> "; } echo "</table>\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"; + //! 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"; $dbs = get_databases(); if (count($dbs) != 1) { $db = (isset($_POST["target"]) ? $_POST["target"] : DB); @@ -129,3 +117,5 @@ } 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) Modified: branches/sqlite/adminer/index.php =================================================================== --- branches/sqlite/adminer/index.php 2010-04-02 13:44:23 UTC (rev 1361) +++ branches/sqlite/adminer/index.php 2010-04-02 15:09:15 UTC (rev 1362) @@ -22,6 +22,8 @@ } 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"])) { Added: branches/sqlite/adminer/js.inc.php =================================================================== --- branches/sqlite/adminer/js.inc.php (rev 0) +++ branches/sqlite/adminer/js.inc.php 2010-04-02 15:09:15 UTC (rev 1362) @@ -0,0 +1,24 @@ +<?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 13:44:23 UTC (rev 1361) +++ branches/sqlite/adminer/static/editing.js 2010-04-02 15:09:15 UTC (rev 1362) @@ -26,8 +26,17 @@ 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 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:15:31
|
Revision: 1369 http://adminer.svn.sourceforge.net/adminer/?rev=1369&view=rev Author: jakubvrana Date: 2010-04-03 07:15:24 +0000 (Sat, 03 Apr 2010) Log Message: ----------- Escape / in <script> Modified Paths: -------------- branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/include/connect.inc.php branches/sqlite/adminer/schema.inc.php Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-04-02 23:03:14 UTC (rev 1368) +++ branches/sqlite/adminer/db.inc.php 2010-04-03 07:15:24 UTC (rev 1369) @@ -132,7 +132,7 @@ $table_status = table_status(); foreach ($table_status as $row) { if (isset($row["Rows"])) { - $id = addcslashes($row["Name"], "\\'"); + $id = addcslashes($row["Name"], "\\'/"); foreach (array("Engine", "Collation", "Comment") as $key) { echo "document.getElementById('$key-$id').innerHTML = '" . nbsp($row[$key]) . "';\n"; } Modified: branches/sqlite/adminer/include/connect.inc.php =================================================================== --- branches/sqlite/adminer/include/connect.inc.php 2010-04-02 23:03:14 UTC (rev 1368) +++ branches/sqlite/adminer/include/connect.inc.php 2010-04-03 07:15:24 UTC (rev 1369) @@ -40,7 +40,7 @@ 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 "document.getElementById('tables-" . addcslashes($db, "\\'/") . "').innerHTML = '$val';\n"; } echo "</script>\n"; } Modified: branches/sqlite/adminer/schema.inc.php =================================================================== --- branches/sqlite/adminer/schema.inc.php 2010-04-02 23:03:14 UTC (rev 1368) +++ branches/sqlite/adminer/schema.inc.php 2010-04-03 07:15:24 UTC (rev 1369) @@ -7,7 +7,7 @@ preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~', $_COOKIE["adminer_schema"], $matches, PREG_SET_ORDER); //! ':' in table name foreach ($matches as $i => $match) { $table_pos[$match[1]] = array($match[2], $match[3]); - $table_pos_js[] = "\n\t'" . addcslashes($match[1], "\r\n'\\") . "': [ $match[2], $match[3] ]"; + $table_pos_js[] = "\n\t'" . addcslashes($match[1], "\r\n'\\/") . "': [ $match[2], $match[3] ]"; } $top = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-06 16:02:35
|
Revision: 1382 http://adminer.svn.sourceforge.net/adminer/?rev=1382&view=rev Author: jakubvrana Date: 2010-04-06 16:02:26 +0000 (Tue, 06 Apr 2010) Log Message: ----------- SQLite indexes and basic export Modified Paths: -------------- branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/include/export.inc.php branches/sqlite/adminer/indexes.inc.php Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-04-06 13:51:51 UTC (rev 1381) +++ branches/sqlite/adminer/db.inc.php 2010-04-06 16:02:26 UTC (rev 1382) @@ -79,8 +79,7 @@ } echo "</table>\n"; if (!information_schema(DB)) { - //! driver specific operations - 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"; + echo "<p><input type='hidden' name='token' value='$token'>" . ($driver == "sql" ? "<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/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-06 13:51:51 UTC (rev 1381) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-06 16:02:26 UTC (rev 1382) @@ -417,8 +417,8 @@ 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[$row["Key_name"]]["columns"][] = $row["Column_name"]; + $return[$row["Key_name"]]["lengths"][] = $row["Sub_part"]; } } return $return; @@ -527,6 +527,27 @@ return $return; } + /** Run commands to alter indexes + * @param string escaped table name + * @param array of array("index type", "(columns definition)") or array("DROP", "escaped index name") + * @return bool + */ + function alter_indexes($table, $alter) { + foreach ($alter as $key => $val) { + $alter[$key] = ($val[0] == "DROP" ? "\nDROP INDEX " : "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "")) . $val[1]; + } + return queries("ALTER TABLE " . idf_escape($table) . implode(",", $alter)); + } + + /** Get SQL command to create table + * @param string + * @return string + */ + function create_sql($table) { + global $connection; + return $connection->result("SHOW CREATE TABLE " . idf_escape($table), 1); + } + /** Check whether a feature is supported * @param string * @return bool Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-06 13:51:51 UTC (rev 1381) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-06 16:02:26 UTC (rev 1382) @@ -256,7 +256,8 @@ } function fk_support($table_status) { - return true; + global $connection; + return !$connection->result("SELECT sqlite_compileoption_used('OMIT_FOREIGN_KEY')"); } function fields($table) { @@ -267,7 +268,7 @@ $type = strtolower($row["type"]); $return[$row["name"]] = array( "field" => $row["name"], - "type" => $type, + "type" => (eregi("int", $type) ? "integer" : (eregi("char|clob|text", $type) ? "text" : (eregi("blob", $type) ? "blob" : (eregi("real|floa|doub", $type) ? "real" : "numeric")))), "full_type" => $type, "default" => $row["dflt_value"], "null" => !$row["notnull"], @@ -299,7 +300,7 @@ $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[$row["name"]]["columns"][] = $row1["name"]; } } } @@ -352,12 +353,26 @@ return rename(DB, $name); } + function alter_indexes($table, $alter) { + foreach ($alter as $val) { + if (!queries(($val[0] == "DROP" ? "DROP INDEX" : "CREATE" . ($val[0] == "UNIQUE" ? " UNIQUE" : "") . " INDEX " . idf_escape(uniqid($table . "_")) . " ON " . idf_escape($table)) . " $val[1]")) { //! primary + return false; + } + } + return true; + } + + function create_sql($table) { + global $connection; + return $connection->result("SELECT sql FROM sqlite_master WHERE name = " . $connection->quote($table)); + } + function support($feature) { return ($feature == "view"); } $driver = "sqlite"; - $types = array("text" => 0, "numeric" => 0, "integer" => 0, "real" => 0, "blob" => 0); + $types = array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0); $structured_types = array_keys($types); $unsigned = array(); } Modified: branches/sqlite/adminer/include/export.inc.php =================================================================== --- branches/sqlite/adminer/include/export.inc.php 2010-04-06 13:51:51 UTC (rev 1381) +++ branches/sqlite/adminer/include/export.inc.php 2010-04-06 16:02:26 UTC (rev 1382) @@ -32,7 +32,7 @@ dump_csv(array_keys(fields($table))); } } elseif ($style) { - $create = $connection->result("SHOW CREATE TABLE " . idf_escape($table), 1); + $create = create_sql($table); if ($create) { if ($style == "DROP+CREATE") { echo "DROP " . ($is_view ? "VIEW" : "TABLE") . " IF EXISTS " . idf_escape($table) . ";\n"; Modified: branches/sqlite/adminer/indexes.inc.php =================================================================== --- branches/sqlite/adminer/indexes.inc.php 2010-04-06 13:51:51 UTC (rev 1381) +++ branches/sqlite/adminer/indexes.inc.php 2010-04-06 16:02:26 UTC (rev 1382) @@ -1,6 +1,10 @@ <?php $TABLE = $_GET["indexes"]; -$index_types = array("PRIMARY", "UNIQUE", "INDEX", "FULLTEXT"); +$index_types = array("PRIMARY", "UNIQUE", "INDEX"); +$table_status = table_status($TABLE); +if (ereg("MyISAM|Maria", $table_status["Engine"])) { + $index_types[] = "FULLTEXT"; +} $indexes = indexes($TABLE); if ($_POST && !$error && !$_POST["add"]) { $alter = array(); @@ -14,32 +18,32 @@ if ($column != "") { $length = $index["lengths"][$key]; $set[] = idf_escape($column) . ($length ? "(" . intval($length) . ")" : ""); - $columns[count($columns) + 1] = $column; - $lengths[count($lengths) + 1] = ($length ? $length : null); + $columns[] = $column; + $lengths[] = ($length ? $length : null); } } if ($columns) { foreach ($indexes as $name => $existing) { ksort($existing["columns"]); ksort($existing["lengths"]); - if ($index["type"] == $existing["type"] && $existing["columns"] === $columns && $existing["lengths"] === $lengths) { + if ($index["type"] == $existing["type"] && array_values($existing["columns"]) === $columns && (!$existing["lengths"] || array_values($existing["lengths"]) === $lengths)) { // skip existing index unset($indexes[$name]); continue 2; } } - $alter[] = "\nADD $index[type]" . ($index["type"] == "PRIMARY" ? " KEY" : "") . " (" . implode(", ", $set) . ")"; + $alter[] = array($index["type"], "(" . implode(", ", $set) . ")"); } } } // drop removed indexes foreach ($indexes as $name => $existing) { - $alter[] = "\nDROP INDEX " . idf_escape($name); + $alter[] = array("DROP", idf_escape($name)); } if (!$alter) { redirect(ME . "table=" . urlencode($TABLE)); } - query_redirect("ALTER TABLE " . idf_escape($TABLE) . implode(",", $alter), ME . "table=" . urlencode($TABLE), lang('Indexes have been altered.')); + queries_redirect(ME . "table=" . urlencode($TABLE), lang('Indexes have been altered.'), alter_indexes($TABLE, $alter)); } page_header(lang('Indexes'), $error, array("table" => $TABLE), $TABLE); @@ -77,7 +81,7 @@ ksort($index["columns"]); foreach ($index["columns"] as $i => $column) { echo "<span>" . html_select("indexes[$j][columns][$i]", array(-1 => "") + $fields, $column, ($i == count($index["columns"]) ? "indexesAddColumn(this);" : 1)); - echo "<input name='indexes[$j][lengths][$i]' size='2' value='" . h($index["lengths"][$i]) . "'> </span>\n"; + echo "<input name='indexes[$j][lengths][$i]' size='2' value='" . h($index["lengths"][$i]) . "'> </span>\n"; //! hide for non-MySQL drivers, add ASC|DESC } echo "\n"; $j++; 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:38:50
|
Revision: 1388 http://adminer.svn.sourceforge.net/adminer/?rev=1388&view=rev Author: jakubvrana Date: 2010-04-07 13:38:43 +0000 (Wed, 07 Apr 2010) Log Message: ----------- Alter table for SQLite Auto increment for all drivers 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 Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2010-04-07 11:44:10 UTC (rev 1387) +++ branches/sqlite/adminer/create.inc.php 2010-04-07 13:38:43 UTC (rev 1388) @@ -19,20 +19,8 @@ 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"; - } - } - } - $fields = ""; + $fields = array(); + $foreign = array(); ksort($_POST["fields"]); $orig_field = reset($orig_fields); $after = "FIRST"; @@ -48,28 +36,29 @@ $field["on_update"] = "CURRENT_TIMESTAMP"; $field["default"] = $default; } + if ($key == $_POST["auto_increment_col"]) { + $field["auto_increment"] = true; + } $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") : " ") + if ($process_field != process_field($orig_field, $orig_field)) { + $fields[] = ($TABLE != "" ? ($field["orig"] != "" ? "CHANGE " . idf_escape($field["orig"]) : "ADD") : " ") . " $process_field" - . ($auto_increment ? " AUTO_INCREMENT$auto_increment_index" : "") - . ($TABLE != "" ? " $after" : "") . "," + . (support("after") && $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"]) . "),"; + $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"]); - //! drop and create foreign keys with renamed columns } elseif ($field["orig"] != "") { - $fields .= "\nDROP COLUMN " . idf_escape($field["orig"]) . ","; + $fields[] = "DROP COLUMN " . idf_escape($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"]) : "") @@ -87,25 +76,25 @@ ? " (" . implode(",", $partitions) . "\n)" : ($_POST["partitions"] ? " PARTITIONS " . intval($_POST["partitions"]) : "") ); - } elseif ($driver == "sql" && $connection->server_info >= 5.1 && $TABLE != "") { + } elseif (support("partitioning") && $TABLE != "") { $status .= "\nREMOVE PARTITIONING"; } $location = ME . "table=" . urlencode($_POST["name"]); if ($TABLE != "") { if ($TABLE != $_POST["name"]) { - $fields .= "\nRENAME TO " . idf_escape($_POST["name"]) . ","; + $fields[] = "RENAME TO " . idf_escape($_POST["name"]); } if ($status) { - $fields .= "\n$status,"; + $fields[] = $status; } - if ($fields) { - query_redirect("ALTER TABLE " . idf_escape($TABLE) . substr($fields, 0, -1), $location, lang('Table has been altered.')); - } else { + if (!$fields) { redirect($location); } + ; + queries_redirect($location, lang('Table has been altered.'), alter_table($TABLE, $fields)); } 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.')); + query_redirect("CREATE TABLE " . idf_escape($_POST["name"]) . " (\n" . implode(",\n", $fields) . "\n) $status", $location, lang('Table has been created.')); } } } @@ -137,7 +126,7 @@ } $row["fields"][] = $field; } - if ($driver == "sql" && $connection->server_info >= 5.1) { + if (support("partitioning")) { $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)); list($row["partition_by"], $row["partitions"], $row["partition"]) = $result->fetch_row(); @@ -191,7 +180,7 @@ <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) { +if (support("partitioning")) { $partition_table = ereg('RANGE|LIST', $row["partition_by"]); print_fieldset("partition", lang('Partition by'), $row["partition_by"]); ?> Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-07 11:44:10 UTC (rev 1387) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-07 13:38:43 UTC (rev 1388) @@ -388,8 +388,12 @@ 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 support($feature) { - return ($feature == "view" || $feature == "routine"); + return in_array($feature, array("view", "routine", "trigger")); } $driver = "mssql"; Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-07 11:44:10 UTC (rev 1387) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-07 13:38:43 UTC (rev 1388) @@ -527,6 +527,36 @@ return $return; } + /** Generate modifier for auto increment column + * @param string + * @return string + */ + function auto_increment($type) { + $auto_increment_index = " PRIMARY KEY"; + // don't overwrite primary key by auto_increment + if ($_GET["create"] != "" && $_POST["auto_increment_col"]) { + foreach (indexes($_GET["create"]) 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"; + } + } + } + return "$type AUTO_INCREMENT$auto_increment_index"; + } + + /** Run commands to alter table + * @param string + * @param array of string commands + * @return bool + */ + function alter_table($table, $alter) { + return queries("ALTER TABLE " . idf_escape($table) . "\n" . implode(",\n", $alter)); + } + /** Run commands to alter indexes * @param string escaped table name * @param array of array("index type", "(columns definition)") or array("DROP", "escaped index name") @@ -555,12 +585,13 @@ function support($feature) { global $connection; $features = array( - "comment" => true, "view" => ($connection->server_info >= 5), "routine" => ($connection->server_info >= 5), + "trigger" => ($connection->server_info >= 5), "event" => ($connection->server_info >= 5.1), + "partitioning" => ($connection->server_info >= 5.1), ); - return $features[$feature]; + return (isset($features[$feature]) ? $features[$feature] : true); } $driver = "sql"; ///< @var string JUSH identifier Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-07 11:44:10 UTC (rev 1387) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-07 13:38:43 UTC (rev 1388) @@ -271,8 +271,12 @@ return "BINARY " . $connection->quote($val); } + function auto_increment($type) { + return (ereg("^bigint", $type) ? "BIG" : "") . "SERIAL"; + } + function support($feature) { - return ($feature == "view" || $feature == "routine"); + return in_array($feature, array("view", "routine", "trigger")); } $driver = "pgsql"; Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-07 11:44:10 UTC (rev 1387) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-07 13:38:43 UTC (rev 1388) @@ -272,7 +272,7 @@ "full_type" => $type, "default" => $row["dflt_value"], "null" => !$row["notnull"], - "auto_increment" => false, //! + "auto_increment" => eregi('^integer$', $type) && $row["pk"], //! possible false positive "collation" => null, //! "privileges" => array("select" => 1, "insert" => 1, "update" => 1), "primary" => $row["pk"], @@ -353,6 +353,20 @@ return rename(DB, $name); } + function auto_increment($type) { + return "$type PRIMARY KEY AUTOINCREMENT"; + } + + function alter_table($table, $alter) { + foreach ($alter as $val) { + if (!queries("ALTER TABLE " . idf_escape($table) . " $val")) { + return false; + } + } + //! UPDATE SQLITE_SEQUENCE + return true; + } + function alter_indexes($table, $alter) { foreach ($alter as $val) { if (!queries(($val[0] == "DROP" ? "DROP INDEX" : "CREATE" . ($val[0] == "UNIQUE" ? " UNIQUE" : "") . " INDEX " . idf_escape(uniqid($table . "_")) . " ON " . idf_escape($table)) . " $val[1]")) { //! primary @@ -368,7 +382,7 @@ } function support($feature) { - return ($feature == "view"); + return ($feature == "view" || $feature == "trigger"); } $driver = "sqlite"; Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2010-04-07 11:44:10 UTC (rev 1387) +++ branches/sqlite/adminer/include/editing.inc.php 2010-04-07 13:38:43 UTC (rev 1388) @@ -146,12 +146,13 @@ */ function process_field($field, $type_field) { global $connection; - return idf_escape($field["field"]) . process_type($type_field) + $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"]) : ""); + . (support("comment") ? " COMMENT " . $connection->quote($field["comment"]) : "") ; + return idf_escape($field["field"]) . ($field["auto_increment"] ? auto_increment($return) : $return); } /** Get type class to use in CSS @@ -197,7 +198,7 @@ <td><?php echo lang('Options'); ?> <?php if ($type == "TABLE") { ?> <td>NULL -<td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">A_I</acronym> +<td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">AI</acronym> <td class="hidden"><?php echo lang('Default values'); ?> <?php echo (support("comment") ? "<td" . ($column_comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?> <?php } ?> @@ -223,6 +224,7 @@ <?php echo (support("comment") ? "<td" . ($column_comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='255'>" : ""); ?> <?php } ?> <?php + //! hide operations not supported by the driver - column change, adding column not at the end, drop column, ... echo "<td><input type='image' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, $allowed, 1);'>"; echo " <input type='image' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick='return !editingRemoveRow(this);'>"; echo " <input type='image' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "'>"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-07 15:21:15
|
Revision: 1391 http://adminer.svn.sourceforge.net/adminer/?rev=1391&view=rev Author: jakubvrana Date: 2010-04-07 15:21:05 +0000 (Wed, 07 Apr 2010) Log Message: ----------- PDO drivers 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/pdo.inc.php Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-07 13:57:33 UTC (rev 1390) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-07 15:21:05 UTC (rev 1391) @@ -198,7 +198,6 @@ 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("SELECT VERSION()"); return true; } Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-07 13:57:33 UTC (rev 1390) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-07 15:21:05 UTC (rev 1391) @@ -124,7 +124,6 @@ function connect($server, $username, $password) { $this->dsn("pgsql:host=" . str_replace(":", " port=", $server), $username, $password); - $this->server_info = $this->result("SHOW SERVER_VERSION"); return true; } } Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-07 13:57:33 UTC (rev 1390) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-07 15:21:05 UTC (rev 1391) @@ -9,7 +9,7 @@ $drivers["sqlite2"] = "SQLite 2"; } -if (ereg("sqlite", $_GET["driver"])) { +if ($_GET["driver"] == "sqlite2" || $_GET["driver"] == "sqlite") { if (extension_loaded($_GET["driver"] == "sqlite2" ? "sqlite" : "sqlite3")) { if ($_GET["driver"] == "sqlite2") { @@ -186,12 +186,9 @@ if ($connected) { return true; } - 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("SELECT sqlite_version()"); + $this->dsn("$_GET[driver]:$filename", "", "", "connect_error"); + //! $this->server_info needs to be filled in __construct() return true; } } Modified: branches/sqlite/adminer/include/pdo.inc.php =================================================================== --- branches/sqlite/adminer/include/pdo.inc.php 2010-04-07 13:57:33 UTC (rev 1390) +++ branches/sqlite/adminer/include/pdo.inc.php 2010-04-07 15:21:05 UTC (rev 1391) @@ -7,11 +7,12 @@ function __construct() { } - function dsn($dsn, $username, $password) { - set_exception_handler('auth_error'); // try/catch is not compatible with PHP 4 + function dsn($dsn, $username, $password, $exception_handler = 'auth_error') { + set_exception_handler($exception_handler); // try/catch is not compatible with PHP 4 parent::__construct($dsn, $username, $password); restore_exception_handler(); - $this->setAttribute(13, array('Min_PDOStatement')); // PDO::ATTR_STATEMENT_CLASS + $this->setAttribute(13, array('Min_PDOStatement')); // 13 - PDO::ATTR_STATEMENT_CLASS + $this->server_info = $this->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION } function select_db($database) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-07 16:22:40
|
Revision: 1392 http://adminer.svn.sourceforge.net/adminer/?rev=1392&view=rev Author: jakubvrana Date: 2010-04-07 16:22:32 +0000 (Wed, 07 Apr 2010) Log Message: ----------- Driver specific triggers Modified Paths: -------------- branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/table.inc.php branches/sqlite/adminer/trigger.inc.php Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-07 15:21:05 UTC (rev 1391) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-07 16:22:32 UTC (rev 1392) @@ -328,7 +328,7 @@ /** Count tables in all databases * @param array - * @return array $db in keys, number of tables in values + * @return array array($db => $tables) */ function count_tables($databases) { $return = array(); @@ -568,6 +568,30 @@ return queries("ALTER TABLE " . idf_escape($table) . implode(",", $alter)); } + /** Get information about trigger + * @param string trigger name + * @return array array("Timing" => , "Event" => , "Trigger" => , "Statement" => ) + */ + function trigger($name) { + global $connection; + $result = $connection->query("SHOW TRIGGERS WHERE `Trigger` = " . $connection->quote($name)); + $row = $result->fetch_assoc(); + } + + /** Get defined triggers + * @param string + * @return array array($name => array($timing, $event)) + */ + function triggers($table) { + global $connection; + $return = array(); + $result = $connection->query("SHOW TRIGGERS LIKE " . $connection->quote(addcslashes($table, "%_"))); + while ($row = $result->fetch_assoc()) { + $return[$row["Trigger"]] = array($row["Timing"], $row["Event"]); + } + return $return; + } + /** Get SQL command to create table * @param string * @return string Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-07 15:21:05 UTC (rev 1391) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-07 16:22:32 UTC (rev 1392) @@ -366,13 +366,30 @@ function alter_indexes($table, $alter) { foreach ($alter as $val) { - if (!queries(($val[0] == "DROP" ? "DROP INDEX" : "CREATE" . ($val[0] == "UNIQUE" ? " 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 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); + return array("Timing" => strtoupper($match[1]), "Event" => strtoupper($match[2]), "Trigger" => $name, "Statement" => $match[3]); + } + + function triggers($table) { + global $connection; + $return = array(); + $result = $connection->query("SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . $connection->quote($table)); + while ($row = $result->fetch_assoc()) { + preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`\\s]+|`[^`]*`)+\\s*([a-z]+)\\s*([a-z]+)~i', $row["sql"], $match); + $return[$row["name"]] = array($match[1], $match[2]); + } + return $return; + } + function create_sql($table) { global $connection; return $connection->result("SELECT sql FROM sqlite_master WHERE name = " . $connection->quote($table)); Modified: branches/sqlite/adminer/table.inc.php =================================================================== --- branches/sqlite/adminer/table.inc.php 2010-04-07 15:21:05 UTC (rev 1391) +++ branches/sqlite/adminer/table.inc.php 2010-04-07 16:22:32 UTC (rev 1392) @@ -52,16 +52,18 @@ } echo "</table>\n"; } - echo '<p><a href="' . h(ME) . 'foreign=' . urlencode($TABLE) . '">' . lang('Add foreign key') . "</a>\n"; + if ($driver != "sqlite") { + echo '<p><a href="' . h(ME) . 'foreign=' . urlencode($TABLE) . '">' . lang('Add foreign key') . "</a>\n"; + } } if (support("trigger")) { echo "<h3>" . lang('Triggers') . "</h3>\n"; - $result = $connection->query("SHOW TRIGGERS LIKE " . $connection->quote(addcslashes($TABLE, "%_"))); - if ($result->num_rows) { + $triggers = triggers($TABLE); + if ($triggers) { echo "<table cellspacing='0'>\n"; - while ($row = $result->fetch_assoc()) { - echo "<tr valign='top'><td>$row[Timing]<td>$row[Event]<th>" . h($row["Trigger"]) . "<td><a href='" . h(ME . 'trigger=' . urlencode($TABLE) . '&name=' . urlencode($row["Trigger"])) . "'>" . lang('Alter') . "</a>\n"; + foreach ($triggers as $key => $val) { + echo "<tr valign='top'><td>$val[0]<td>$val[1]<th>" . h($key) . "<td><a href='" . h(ME . 'trigger=' . urlencode($TABLE) . '&name=' . urlencode($key)) . "'>" . lang('Alter') . "</a>\n"; } echo "</table>\n"; } Modified: branches/sqlite/adminer/trigger.inc.php =================================================================== --- branches/sqlite/adminer/trigger.inc.php 2010-04-07 15:21:05 UTC (rev 1391) +++ branches/sqlite/adminer/trigger.inc.php 2010-04-07 16:22:32 UTC (rev 1392) @@ -22,8 +22,7 @@ if ($_POST) { $row = $_POST; } elseif ($_GET["name"] != "") { - $result = $connection->query("SHOW TRIGGERS WHERE `Trigger` = " . $connection->quote($_GET["name"])); - $row = $result->fetch_assoc(); + $row = trigger($_GET["name"]); } ?> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-07 19:27:07
|
Revision: 1395 http://adminer.svn.sourceforge.net/adminer/?rev=1395&view=rev Author: jakubvrana Date: 2010-04-07 19:27:00 +0000 (Wed, 07 Apr 2010) Log Message: ----------- Initialize variables Modified Paths: -------------- branches/sqlite/adminer/call.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/include/auth.inc.php branches/sqlite/adminer/include/design.inc.php Modified: branches/sqlite/adminer/call.inc.php =================================================================== --- branches/sqlite/adminer/call.inc.php 2010-04-07 16:34:21 UTC (rev 1394) +++ branches/sqlite/adminer/call.inc.php 2010-04-07 19:27:00 UTC (rev 1395) @@ -52,8 +52,9 @@ echo "<table cellspacing='0'>\n"; foreach ($in as $key) { $field = $routine["fields"][$key]; - echo "<tr><th>" . h($field["field"]); - $value = $_POST["fields"][$key]; + $name = $field["field"]; + echo "<tr><th>" . h($name); + $value = $_POST["fields"][$name]; if ($value != "" && ereg("enum|set", $field["type"])) { $value = intval($value); } Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-07 16:34:21 UTC (rev 1394) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-07 19:27:00 UTC (rev 1395) @@ -508,6 +508,7 @@ * @return bool */ function rename_database($name, $collation) { + global $connection; $return = false; if (queries("CREATE DATABASE " . idf_escape($name) . ($collation ? " COLLATE " . $connection->quote($collation) : ""))) { //! move triggers Modified: branches/sqlite/adminer/include/auth.inc.php =================================================================== --- branches/sqlite/adminer/include/auth.inc.php 2010-04-07 16:34:21 UTC (rev 1394) +++ branches/sqlite/adminer/include/auth.inc.php 2010-04-07 19:27:00 UTC (rev 1395) @@ -1,4 +1,6 @@ <?php +$connection = ''; + if (!$drivers) { page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', implode(", ", $possible_drivers)), null); page_footer("auth"); @@ -67,7 +69,9 @@ page_footer("auth"); } -$connection = (isset($_GET["username"]) ? connect() : ''); +if (isset($_GET["username"])) { + $connection = connect(); +} if (is_string($connection) || !$adminer->login($_GET["username"], $_SESSION["passwords"][$_GET["server"]])) { auth_error(); exit; Modified: branches/sqlite/adminer/include/design.inc.php =================================================================== --- branches/sqlite/adminer/include/design.inc.php 2010-04-07 16:34:21 UTC (rev 1394) +++ branches/sqlite/adminer/include/design.inc.php 2010-04-07 19:27:00 UTC (rev 1395) @@ -9,7 +9,7 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") { global $LANG, $VERSION, $adminer, $connection, $drivers; header("Content-Type: text/html; charset=utf-8"); - header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, NoScript plugin + header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, Firefox NoScript plugin $title_all = $title . ($title2 != "" ? ": " . h($title2) : ""); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> @@ -24,7 +24,7 @@ <link rel="stylesheet" type="text/css" href="adminer.css"> <?php } ?> -<body onload="bodyLoad('<?php echo substr($connection->server_info, 0, 3); ?>');<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " verifyVersion();"); ?>"> +<body onload="bodyLoad('<?php echo (is_object($connection) ? substr($connection->server_info, 0, 3) : ""); ?>');<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " verifyVersion();"); ?>"> <script type="text/javascript" src="../adminer/static/functions.js"></script> <script type="text/javascript" src="static/editing.js"></script> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-08 08:49:54
|
Revision: 1400 http://adminer.svn.sourceforge.net/adminer/?rev=1400&view=rev Author: jakubvrana Date: 2010-04-08 08:49:47 +0000 (Thu, 08 Apr 2010) Log Message: ----------- Error reporting Modified Paths: -------------- branches/sqlite/adminer/drivers/mssql.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/select.inc.php branches/sqlite/adminer/static/default.css Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-08 00:06:29 UTC (rev 1399) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-08 08:49:47 UTC (rev 1400) @@ -21,6 +21,7 @@ foreach (sqlsrv_errors() as $error) { $this->error .= "$error[message]\n"; } + $this->error = rtrim($this->error); } function connect($server, $username, $password) { @@ -374,7 +375,7 @@ function error() { global $connection; - return h(ereg_replace("^(\\[[^]]*])+", "", $connection->error)); + return nl_br(h(ereg_replace("^(\\[[^]]*])+", "", $connection->error))); } function exact_value($val) { Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-08 00:06:29 UTC (rev 1399) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-08 08:49:47 UTC (rev 1400) @@ -284,7 +284,7 @@ if (preg_match('~^(.*\\n)?([^\\n]*)\\n( *)\\^(\\n.*)?$~s', $return, $match)) { $return = $match[1] . preg_replace('~((?:[^&]|&[^;]*;){' . strlen($match[3]) . '})(.*)~', '\\1<b>\\2</b>', $match[2]) . $match[4]; } - return str_replace("\n", "<br>", $return); // nl2br uses XHTML before PHP 5.3 + return nl_br($return); } function exact_value($val) { Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-04-08 00:06:29 UTC (rev 1399) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-08 08:49:47 UTC (rev 1400) @@ -52,6 +52,14 @@ return (trim($string) != "" ? h($string) : " "); } +/** Convert \n to <br> +* @param string +* @return string +*/ +function nl_br($string) { + return str_replace("\n", "<br>", $string); // nl2br() uses XHTML before PHP 5.3 +} + /** Generate HTML checkbox * @param string * @param string Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2010-04-08 00:06:29 UTC (rev 1399) +++ branches/sqlite/adminer/select.inc.php 2010-04-08 08:49:47 UTC (rev 1400) @@ -156,7 +156,7 @@ $adminer->selectLinks($table_status, $set); if (!$columns) { - echo "<p class='error'>" . lang('Unable to select the table') . ($fields ? "" : ": " . error()) . ".\n"; + echo "<p class='error'>" . lang('Unable to select the table') . ($fields ? "." : ": " . error()) . "\n"; } else { echo "<form action='' id='form'>\n"; echo "<div style='display: none;'>"; Modified: branches/sqlite/adminer/static/default.css =================================================================== --- branches/sqlite/adminer/static/default.css 2010-04-08 00:06:29 UTC (rev 1399) +++ branches/sqlite/adminer/static/default.css 2010-04-08 08:49:47 UTC (rev 1400) @@ -22,6 +22,7 @@ .nowrap td, .nowrap th, td.nowrap { white-space: pre; } .wrap td { white-space: normal; } .error { color: red; background: #fee; } +.error b { background: #fff; font-weight: normal; } .message { color: green; background: #efe; } .error, .message { padding: .5em .8em; margin: 0 20px 1em 0; } .char { color: #007F00; } 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:40:38
|
Revision: 1402 http://adminer.svn.sourceforge.net/adminer/?rev=1402&view=rev Author: jakubvrana Date: 2010-04-08 11:40:32 +0000 (Thu, 08 Apr 2010) Log Message: ----------- PostgreSQL DROP CONSTRAINT 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/indexes.inc.php Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-08 11:23:38 UTC (rev 1401) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-08 11:40:32 UTC (rev 1402) @@ -559,12 +559,12 @@ /** Run commands to alter indexes * @param string escaped table name - * @param array of array("index type", "(columns definition)") or array("DROP", "escaped index name") + * @param array of array("index type", "(columns definition)") or array("index type", "escaped name", "DROP") * @return bool */ function alter_indexes($table, $alter) { foreach ($alter as $key => $val) { - $alter[$key] = ($val[0] == "DROP" ? "\nDROP INDEX " : "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "")) . $val[1]; + $alter[$key] = ($val[2] ? "\nDROP INDEX " : "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "")) . $val[1]; } return queries("ALTER TABLE " . idf_escape($table) . implode(",", $alter)); } Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-08 11:23:38 UTC (rev 1401) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-08 11:40:32 UTC (rev 1402) @@ -310,10 +310,10 @@ $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]; + if ($val[0] != "INDEX") { + $create[] = ($val[2] ? "\nDROP CONSTRAINT " : "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "")) . $val[1]; + } elseif ($val[2]) { + $drop[] = $val[1]; } elseif (!queries("CREATE INDEX " . idf_escape(uniqid($table . "_")) . " ON " . idf_escape($table) . " $val[1]")) { return false; } Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-08 11:23:38 UTC (rev 1401) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-08 11:40:32 UTC (rev 1402) @@ -371,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 key must be created in CREATE TABLE + if (!queries(($val[2] ? "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; } } Modified: branches/sqlite/adminer/indexes.inc.php =================================================================== --- branches/sqlite/adminer/indexes.inc.php 2010-04-08 11:23:38 UTC (rev 1401) +++ branches/sqlite/adminer/indexes.inc.php 2010-04-08 11:40:32 UTC (rev 1402) @@ -38,7 +38,7 @@ } // drop removed indexes foreach ($indexes as $name => $existing) { - $alter[] = array("DROP", idf_escape($name)); + $alter[] = array($existing["type"], idf_escape($name), "DROP"); } if (!$alter) { redirect(ME . "table=" . urlencode($TABLE)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-08 16:05:54
|
Revision: 1404 http://adminer.svn.sourceforge.net/adminer/?rev=1404&view=rev Author: jakubvrana Date: 2010-04-08 16:05:48 +0000 (Thu, 08 Apr 2010) Log Message: ----------- Fix clone with auto increment Modified Paths: -------------- branches/sqlite/adminer/edit.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/select.inc.php Modified: branches/sqlite/adminer/edit.inc.php =================================================================== --- branches/sqlite/adminer/edit.inc.php 2010-04-08 15:51:34 UTC (rev 1403) +++ branches/sqlite/adminer/edit.inc.php 2010-04-08 16:05:48 UTC (rev 1404) @@ -21,7 +21,7 @@ $set = array(); foreach ($fields as $name => $field) { $val = process_input($field); - if ($val !== false) { + if ($val !== false && $val !== null) { $set[idf_escape($name)] = ($update ? "\n" . idf_escape($name) . " = $val" : $val); } } Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-04-08 15:51:34 UTC (rev 1403) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-08 16:05:48 UTC (rev 1404) @@ -527,7 +527,10 @@ } return intval($value); } - if ($function == "orig" || ($field["auto_increment"] && $value == "")) { + if ($field["auto_increment"] && $value == "") { + return null; + } + if ($function == "orig") { return false; } if ($function == "NULL") { Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2010-04-08 15:51:34 UTC (rev 1403) +++ branches/sqlite/adminer/select.inc.php 2010-04-08 16:05:48 UTC (rev 1404) @@ -69,10 +69,12 @@ if (!$_POST["delete"]) { foreach ($columns as $name => $val) { //! should check also for edit or insert privileges $val = process_input($fields[$name]); - if ($_POST["clone"]) { - $set[idf_escape($name)] = ($val !== false ? $val : idf_escape($name)); - } elseif ($val !== false) { - $set[] = idf_escape($name) . " = $val"; + if ($val !== null) { + if ($_POST["clone"]) { + $set[idf_escape($name)] = ($val !== false ? $val : idf_escape($name)); + } elseif ($val !== false) { + $set[] = idf_escape($name) . " = $val"; + } } } $query .= ($_POST["clone"] ? " (" . implode(", ", array_keys($set)) . ")\nSELECT " . implode(", ", $set) . "\nFROM " . idf_escape($TABLE) : " SET\n" . implode(",\n", $set)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-09 11:53:12
|
Revision: 1406 http://adminer.svn.sourceforge.net/adminer/?rev=1406&view=rev Author: jakubvrana Date: 2010-04-09 11:53:05 +0000 (Fri, 09 Apr 2010) Log Message: ----------- Display approximate count with big InnoDB tables Modified Paths: -------------- branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/dump.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 Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/db.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -136,7 +136,7 @@ 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"; + echo "document.getElementById('$key-$id').innerHTML = '" . ($key == "Rows" && $row["Engine"] == "InnoDB" && $val ? "~ $val" : $val) . "';\n"; if (isset($sums[$key])) { $sums[$key] += ($row["Engine"] != "InnoDB" || $key != "Data_free" ? $row[$key] : 0); } Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -418,7 +418,7 @@ 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" => 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), + lang('Geometry') => 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); Modified: branches/sqlite/adminer/dump.inc.php =================================================================== --- branches/sqlite/adminer/dump.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/dump.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -181,7 +181,7 @@ 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[]", $name, $checked, "", "formUncheck('check-data');") . "</label>\n"; + echo "$print<td align='right'><label>" . ($row["Engine"] == "InnoDB" && $row["Rows"] ? "~ " : "") . $row["Rows"] . checkbox("data[]", $name, $checked, "", "formUncheck('check-data');") . "</label>\n"; } $prefixes[$prefix]++; } Modified: branches/sqlite/adminer/lang/cs.inc.php =================================================================== --- branches/sqlite/adminer/lang/cs.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/lang/cs.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -130,7 +130,6 @@ 'Event' => 'Událost', '%s version: %s through PHP extension %s' => 'Verze %s: %s přes PHP extenzi %s', '%d row(s)' => array('%d řádek', '%d řádky', '%d řádků'), - '~ %s' => '~ %s', 'Remove' => 'Odebrat', 'Are you sure?' => 'Opravdu?', 'Privileges' => 'Oprávnění', @@ -231,4 +230,7 @@ '%d in total' => '%d celkem', 'Attachments' => 'Přílohy', 'Driver' => 'Ovladač', + 'last' => 'poslední', + 'Network' => 'Síť', + 'Geometry' => 'Geometrie', ); Modified: branches/sqlite/adminer/lang/de.inc.php =================================================================== --- branches/sqlite/adminer/lang/de.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/lang/de.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -130,7 +130,6 @@ 'Event' => 'Ereignis', '%s version: %s through PHP extension %s' => 'Version %s: %s, mit PHP-Erweiterung %s', '%d row(s)' => array('%d Datensatz', '%d Datensätze'), - '~ %s' => '~ %s', 'Remove' => 'Entfernen', 'Are you sure?' => 'Sind Sie sicher ?', 'Privileges' => 'Rechte', Modified: branches/sqlite/adminer/lang/es.inc.php =================================================================== --- branches/sqlite/adminer/lang/es.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/lang/es.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -130,7 +130,6 @@ 'Event' => 'Evento', '%s version: %s through PHP extension %s' => 'Versión %s: %s a través de extensión PHP %s', '%d row(s)' => array('%d registro', '%d registros'), - '~ %s' => '~ %s', 'Remove' => 'Eliminar', 'Are you sure?' => 'Está seguro?', 'Privileges' => 'Privilegios', Modified: branches/sqlite/adminer/lang/et.inc.php =================================================================== --- branches/sqlite/adminer/lang/et.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/lang/et.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -129,7 +129,6 @@ 'Time' => 'Aeg', 'Event' => 'Sündmus', '%d row(s)' => array('%d rida', '%d rida'), - '~ %s' => '~ %s', 'Remove' => 'Eemalda', 'Are you sure?' => 'Kas oled kindel?', 'Privileges' => 'Õigused', Modified: branches/sqlite/adminer/lang/fr.inc.php =================================================================== --- branches/sqlite/adminer/lang/fr.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/lang/fr.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -129,7 +129,6 @@ 'Time' => 'Temps', 'Event' => 'Évènement', '%d row(s)' => array('%d ligne', '%d lignes'), - '~ %s' => '~ %s', 'Remove' => 'Effacer', 'Are you sure?' => 'Êtes-vous certain?', 'Privileges' => 'Privilège', Modified: branches/sqlite/adminer/lang/it.inc.php =================================================================== --- branches/sqlite/adminer/lang/it.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/lang/it.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -130,7 +130,6 @@ 'Event' => 'Evento', '%s version: %s through PHP extension %s' => 'Versione %s: %s via estensione PHP %s', '%d row(s)' => array('%d riga', '%d righe'), - '~ %s' => '~ %s', 'Remove' => 'Rimuovi', 'Are you sure?' => 'Sicuro?', 'Privileges' => 'Privilegi', Modified: branches/sqlite/adminer/lang/nl.inc.php =================================================================== --- branches/sqlite/adminer/lang/nl.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/lang/nl.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -130,7 +130,6 @@ 'Event' => 'Event', '%s version: %s through PHP extension %s' => '%s versie: %s met PHP extensie %s', '%d row(s)' => array('%d rij', '%d rijen'), - '~ %s' => '~ %s', 'Remove' => 'Verwijderen', 'Are you sure?' => 'Weet u het zeker?', 'Privileges' => 'Rechten', Modified: branches/sqlite/adminer/lang/ru.inc.php =================================================================== --- branches/sqlite/adminer/lang/ru.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/lang/ru.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -130,7 +130,6 @@ 'Event' => 'Событие', '%s version: %s through PHP extension %s' => 'Версия %s: %s с PHP-расширением %s', '%d row(s)' => array('%d строка', '%d строки', '%d строк'), - '~ %s' => '~ %s', 'Remove' => 'Удалить', 'Are you sure?' => 'Вы уверены?', 'Privileges' => 'Полномочия', Modified: branches/sqlite/adminer/lang/sk.inc.php =================================================================== --- branches/sqlite/adminer/lang/sk.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/lang/sk.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -130,7 +130,6 @@ 'Event' => 'Udalosť', '%s version: %s through PHP extension %s' => 'Verzia %s: %s cez PHP rozšírenie %s', '%d row(s)' => array('%d riadok', '%d riadky', '%d riadkov'), - '~ %s' => '~ %s', 'Remove' => 'Odobrať', 'Are you sure?' => 'Naozaj?', 'Privileges' => 'Oprávnenia', Modified: branches/sqlite/adminer/lang/zh-tw.inc.php =================================================================== --- branches/sqlite/adminer/lang/zh-tw.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/lang/zh-tw.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -128,7 +128,6 @@ 'Event' => '事件', '%s version: %s through PHP extension %s' => '%s版本:%s 透過PHP擴充模組 %s', '%d row(s)' => '%d行', - '~ %s' => '~ %s', 'Remove' => '移除', 'Are you sure?' => '你確定嗎?', 'Privileges' => '權限', Modified: branches/sqlite/adminer/lang/zh.inc.php =================================================================== --- branches/sqlite/adminer/lang/zh.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/lang/zh.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -130,7 +130,6 @@ 'Event' => '事件', '%s version: %s through PHP extension %s' => '%s 版本:%s 通过 PHP 扩展 %s', '%d row(s)' => '%d 行', - '~ %s' => '~ %s', 'Remove' => '移除', 'Are you sure?' => '你确定吗?', 'Privileges' => '权限', Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2010-04-09 09:39:26 UTC (rev 1405) +++ branches/sqlite/adminer/select.inc.php 2010-04-09 11:53:05 UTC (rev 1406) @@ -26,6 +26,12 @@ $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 ($_GET["page"] == "last") { + session_write_close(); + $found_rows = $connection->result("SELECT COUNT(*) FROM " . idf_escape($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : "")); + redirect(remove_from_uri("page") . ($found_rows > $limit ? "&page=" . floor(($found_rows - 1) / $limit) : "")); +} + if ($_POST && !$error) { $where_check = "(" . implode(") OR (", array_map('where_check', (array) $_POST["check"])) . ")"; $primary = ($indexes["PRIMARY"] ? ($select ? array_flip($indexes["PRIMARY"]["columns"]) : array()) : null); // empty array means that all primary fields are selected @@ -275,11 +281,15 @@ } echo "</table>\n"; + $exact_count = true; 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) : "")); //! MS SQL + $found_rows = $table_status["Rows"]; + if (!$found_rows || $_GET["page"] || ($table_status["Engine"] == "InnoDB" && $found_rows < 1e5)) { + // slow with big tables + $found_rows = $connection->result("SELECT COUNT(*) FROM " . idf_escape($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : "")); + } else { + $exact_count = false; + } } echo "<p class='pages'>"; if (intval($limit) && $found_rows > $limit) { @@ -289,9 +299,9 @@ for ($i = max(1, $_GET["page"] - 2); $i < min($max_page, $_GET["page"] + 3); $i++) { echo pagination($i); } - echo ($_GET["page"] + 3 < $max_page ? " ..." : "") . pagination($max_page); + echo ($_GET["page"] + 3 < $max_page ? " ..." : "") . ($exact_count ? pagination($max_page) : ' <a href="' . h(remove_from_uri() . "&page=last") . '">' . lang('last') . "</a>"); } - echo " (" . lang('%d row(s)', $found_rows) . ") " . checkbox("all", 1, 0, lang('whole result')) . "\n"; + echo " (" . ($exact_count ? "" : "~ ") . lang('%d row(s)', $found_rows) . ") " . checkbox("all", 1, 0, lang('whole result')) . "\n"; echo (information_schema(DB) ? "" : "<fieldset><legend>" . lang('Edit') . "</legend><div><input type='submit' name='edit' value='" . lang('Edit') . "'> <input type='submit' name='clone' value='" . lang('Clone') . "'> <input type='submit' name='delete' value='" . lang('Delete') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + (this.form['all'].checked ? $found_rows : formChecked(this, /check/)) + ')');\"></div></fieldset>\n"); print_fieldset("export", lang('Export')); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-10 23:07:13
|
Revision: 1413 http://adminer.svn.sourceforge.net/adminer/?rev=1413&view=rev Author: jakubvrana Date: 2010-04-10 23:07:07 +0000 (Sat, 10 Apr 2010) Log Message: ----------- Central check for truncate tables Modified Paths: -------------- branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/drivers/pgsql.inc.php Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-04-10 23:01:25 UTC (rev 1412) +++ branches/sqlite/adminer/db.inc.php 2010-04-10 23:07:07 UTC (rev 1413) @@ -8,7 +8,9 @@ queries("SET foreign_key_checks = 0"); // allows to truncate or drop several tables at once } if ($_POST["truncate"]) { - $result = truncate_tables((array) $_POST["tables"]); + if ($_POST["tables"]) { + $result = truncate_tables($_POST["tables"]); + } $message = lang('Tables have been truncated.'); } elseif ($_POST["move"]) { $rename = array(); Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-10 23:01:25 UTC (rev 1412) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-10 23:07:07 UTC (rev 1413) @@ -381,9 +381,7 @@ } function truncate_tables($tables) { - if ($tables) { - return queries("TRUNCATE " . implode(", ", array_map('idf_escape', $tables))); - } + return queries("TRUNCATE " . implode(", ", array_map('idf_escape', $tables))); return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-12 08:18:38
|
Revision: 1418 http://adminer.svn.sourceforge.net/adminer/?rev=1418&view=rev Author: jakubvrana Date: 2010-04-12 08:18:31 +0000 (Mon, 12 Apr 2010) Log Message: ----------- Save driver in session Modified Paths: -------------- 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/auth.inc.php branches/sqlite/adminer/include/bootstrap.inc.php branches/sqlite/adminer/include/design.inc.php branches/sqlite/adminer/include/functions.inc.php Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-11 00:02:01 UTC (rev 1417) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-12 08:18:31 UTC (rev 1418) @@ -237,16 +237,8 @@ return $connection->error; } - function get_databases($flush = true) { - $return = &get_session("databases"); - if (!isset($return)) { - $return = get_vals("EXEC sp_databases"); - if ($flush) { - ob_flush(); - flush(); - } - } - return $return; + function get_databases() { + return get_vals("EXEC sp_databases"); } function limit($query, $limit, $offset = 0) { Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-11 00:02:01 UTC (rev 1417) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-12 08:18:31 UTC (rev 1418) @@ -246,12 +246,12 @@ // SHOW DATABASES can take a very long time so it is cached $return = &get_session("databases"); if (!isset($return)) { - restart_session(); - $return = get_vals("SHOW DATABASES"); if ($flush) { + restart_session(); ob_flush(); flush(); } + $return = get_vals("SHOW DATABASES"); } return $return; } Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-11 00:02:01 UTC (rev 1417) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-12 08:18:31 UTC (rev 1418) @@ -150,16 +150,8 @@ return $connection->error; } - function get_databases($flush = true) { - $return = &get_session("databases"); - if (!isset($return)) { - $return = get_vals("SELECT datname FROM pg_database"); - if ($flush) { - ob_flush(); - flush(); - } - } - return $return; + function get_databases() { + return get_vals("SELECT datname FROM pg_database"); } function limit($query, $limit, $offset = 0) { Modified: branches/sqlite/adminer/include/auth.inc.php =================================================================== --- branches/sqlite/adminer/include/auth.inc.php 2010-04-11 00:02:01 UTC (rev 1417) +++ branches/sqlite/adminer/include/auth.inc.php 2010-04-12 08:18:31 UTC (rev 1418) @@ -7,6 +7,8 @@ exit; } +$_GET["server"] = $_GET[$_GET["driver"]]; // translate pgsql=localhost to driver=pgsql&server=localhost + if (isset($_POST["server"])) { session_regenerate_id(); // defense against session fixation $_SESSION["passwords"][$_POST["driver"]][$_POST["server"]][$_POST["username"]] = $_POST["password"]; @@ -18,10 +20,10 @@ . ":" . base64_encode($_POST["driver"]) ); } - $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 + $same_connection = ($_GET["driver"] == $_POST["driver"] && $_GET["server"] == $_POST["server"] && $_GET["username"] === $_POST["username"]); // === - "0" == "00" + if (!$same_connection || count($_POST) == ($_POST["permanent"] ? 5 : 4)) { // 4 - driver, server, username, password $location = ($same_connection ? remove_from_uri(session_name()) : preg_replace('~\\?.*~', '', ME) . "?" . ($_POST["driver"] != "server" || $_POST["server"] != "" ? urlencode($_POST["driver"]) . "=" . urlencode($_POST["server"]) . "&" : "") . "username=" . urlencode($_POST["username"])); - if (SID_FORM) { + if (SID) { $location = substr_replace($location, SID . "&", strpos($location, '?') + 1, 0); } redirect($location); @@ -36,15 +38,12 @@ foreach (array("passwords", "databases", "history") as $key) { set_session($key, null); } - if (!$_SESSION["passwords"]) { // don't require login to logout - $_SESSION["passwords"] = array(); - } cookie("adminer_permanent", ""); redirect(substr(preg_replace('~(username|db)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.')); } } elseif ($_COOKIE["adminer_permanent"]) { list($server, $username, $cipher, $system) = array_map('base64_decode', explode(":", $_COOKIE["adminer_permanent"])); // $driver is a global variable - if ($server == $_GET["server"] && $username == $_GET["username"] && $system == $_GET["driver"]) { + if ($server == $_GET["server"] && $username === $_GET["username"] && $system == $_GET["driver"]) { session_regenerate_id(); // defense against session fixation set_session("passwords", decrypt_string($cipher, $adminer->permanentLogin())); } @@ -53,10 +52,23 @@ function auth_error($exception = null) { global $connection, $adminer; $session_name = session_name(); - 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); + $error = ""; + if (!$_COOKIE[$session_name] && $_GET[$session_name] && ini_get("session.use_only_cookies")) { + $error = lang('Session support must be enabled.'); + } elseif (isset($_GET["username"])) { + if (($_COOKIE[$session_name] || $_GET[$session_name]) && !isset($_SESSION["token"])) { + $error = lang('Session expired, please login again.'); + } else { + $password = get_session("passwords"); + if (isset($password)) { + $error = h($exception ? $exception->getMessage() : (is_string($connection) ? $connection : lang('Invalid credentials.'))); + } + } + if (!$_SESSION["token"]) { // checked for existence of session + $_SESSION["token"] = rand(1, 1e6); + } + } + page_header(lang('Login'), $error, null); echo "<form action='' method='post'>\n"; $adminer->loginForm(); echo "<div>"; Modified: branches/sqlite/adminer/include/bootstrap.inc.php =================================================================== --- branches/sqlite/adminer/include/bootstrap.inc.php 2010-04-11 00:02:01 UTC (rev 1417) +++ branches/sqlite/adminer/include/bootstrap.inc.php 2010-04-12 08:18:31 UTC (rev 1418) @@ -75,6 +75,9 @@ } @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 && !ini_get("session.use_only_cookies") ? SID . '&' : '') . (isset($_GET["server"]) ? urlencode($_GET["driver"]) . "=" . urlencode($_GET["server"]) . '&' : '') . (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '') . (DB != "" ? 'db=' . urlencode(DB) . '&' : '')); + include "../adminer/include/functions.inc.php"; include "../adminer/include/lang.inc.php"; include "../adminer/lang/$LANG.inc.php"; @@ -83,12 +86,6 @@ include "../adminer/drivers/pgsql.inc.php"; include "../adminer/drivers/mssql.inc.php"; include "../adminer/drivers/mysql.inc.php"; // must be included as last driver - -$_GET["server"] = $_GET[$_GET["driver"]]; // translate pgsql=localhost to driver=pgsql&server=localhost -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 . '&' : '') . (isset($_GET["server"]) ? urlencode($_GET["driver"]) . "=" . urlencode($_GET["server"]) . '&' : '') . (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '') . (DB != "" ? 'db=' . urlencode(DB) . '&' : '')); - include "../adminer/include/version.inc.php"; include "./include/adminer.inc.php"; include "../adminer/include/design.inc.php"; Modified: branches/sqlite/adminer/include/design.inc.php =================================================================== --- branches/sqlite/adminer/include/design.inc.php 2010-04-11 00:02:01 UTC (rev 1417) +++ branches/sqlite/adminer/include/design.inc.php 2010-04-12 08:18:31 UTC (rev 1418) @@ -59,9 +59,6 @@ echo "<div class='message'>" . implode("</div>\n<div class='message'>", $_SESSION["messages"]) . "</div>\n"; $_SESSION["messages"] = array(); } - if (!$_POST && !isset($_SESSION["passwords"])) { // used in auth - $_SESSION["passwords"] = array(); - } $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-11 00:02:01 UTC (rev 1417) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-12 08:18:31 UTC (rev 1418) @@ -443,7 +443,7 @@ * @return null */ function hidden_fields_get() { - echo SID_FORM; + echo (SID ? '<input type="hidden" name="' . session_name() . '" value="' . h(session_id()) . '">' : ''); echo (isset($_GET["server"]) ? '<input type="hidden" name="' . h($_GET["driver"]) . '" value="' . h($_GET["server"]) . '">' : ""); echo '<input type="hidden" name="username" value="' . h($_GET["username"]) . '">'; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-13 10:06:45
|
Revision: 1422 http://adminer.svn.sourceforge.net/adminer/?rev=1422&view=rev Author: jakubvrana Date: 2010-04-13 10:06:38 +0000 (Tue, 13 Apr 2010) Log Message: ----------- Simplify comment checkbox Modified Paths: -------------- branches/sqlite/adminer/create.inc.php branches/sqlite/adminer/include/editing.inc.php branches/sqlite/adminer/include/functions.inc.php Modified: branches/sqlite/adminer/create.inc.php =================================================================== --- branches/sqlite/adminer/create.inc.php 2010-04-12 11:42:31 UTC (rev 1421) +++ branches/sqlite/adminer/create.inc.php 2010-04-13 10:06:38 UTC (rev 1422) @@ -155,17 +155,14 @@ <?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); ?> +<?php $comments = edit_fields($row["fields"], $collations, "TABLE", $suhosin, $foreign_keys, $row["Comment"] != ""); ?> </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">' : ''); ?> <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")) { ?> -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> +<?php echo (support("comment") ? checkbox("", "", $comments, lang('Comment'), "columnShow(this.checked, 6); toggle('Comment');") . ' <input id="Comment" name="Comment" value="' . h($row["Comment"]) . '" maxlength="60"' . ($comments ? '' : ' class="hidden"') . '>' : ''); ?> <p> <input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="submit" value="<?php echo lang('Save'); ?>"> Modified: branches/sqlite/adminer/include/editing.inc.php =================================================================== --- branches/sqlite/adminer/include/editing.inc.php 2010-04-12 11:42:31 UTC (rev 1421) +++ branches/sqlite/adminer/include/editing.inc.php 2010-04-13 10:06:38 UTC (rev 1422) @@ -182,12 +182,11 @@ * @param array returned by referencable_primary() * @return bool column comments used */ -function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array()) { +function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array(), $comments = false) { global $inout; - $column_comments = false; foreach ($fields as $field) { if ($field["comment"] != "") { - $column_comments = true; + $comments = true; break; } } @@ -202,7 +201,7 @@ <td>NULL <td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">AI</acronym> <td class="hidden"><?php echo lang('Default values'); ?> -<?php echo (support("comment") ? "<td" . ($column_comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?> +<?php echo (support("comment") ? "<td" . ($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> @@ -219,7 +218,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 (support("comment") ? "<td" . ($column_comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='255'>" : ""); ?> +<?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='255'>" : ""); ?> <?php } ?> <?php //! hide operations not supported by the driver - column change, adding column not at the end, drop column, ... @@ -229,7 +228,7 @@ echo " <input type='image' name='down[$i]' src='../adminer/static/down.gif' alt='v' title='" . lang('Move down') . "'>"; echo "\n"; } - return $column_comments; + return $comments; } /** Move fields up and down or add field Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-04-12 11:42:31 UTC (rev 1421) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-13 10:06:38 UTC (rev 1422) @@ -71,7 +71,7 @@ function checkbox($name, $value, $checked, $label = "", $onclick = "") { static $id = 0; $id++; - $return = "<input type='checkbox' name='$name' value='" . h($value) . "'" . ($checked ? " checked" : "") . ($onclick ? " onclick=\"$onclick\"" : "") . " id='checkbox-$id'>"; + $return = "<input type='checkbox'" . ($name ? " name='$name' value='" . h($value) . "'" : "") . ($checked ? " checked" : "") . ($onclick ? " onclick=\"$onclick\"" : "") . " id='checkbox-$id'>"; return ($label != "" ? "<label for='checkbox-$id'>$return" . h($label) . "</label>" : $return); } @@ -443,7 +443,7 @@ * @return null */ function hidden_fields_get() { - echo (SID ? '<input type="hidden" name="' . session_name() . '" value="' . h(session_id()) . '">' : ''); + echo (SID && !$_COOKIE ? '<input type="hidden" name="' . session_name() . '" value="' . h(session_id()) . '">' : ''); echo (isset($_GET["server"]) ? '<input type="hidden" name="' . h($_GET["driver"]) . '" value="' . h($_GET["server"]) . '">' : ""); echo '<input type="hidden" name="username" value="' . h($_GET["username"]) . '">'; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-13 11:45:48
|
Revision: 1425 http://adminer.svn.sourceforge.net/adminer/?rev=1425&view=rev Author: jakubvrana Date: 2010-04-13 11:45:39 +0000 (Tue, 13 Apr 2010) Log Message: ----------- Define DRIVER and SERVER Modified Paths: -------------- 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/auth.inc.php branches/sqlite/adminer/include/bootstrap.inc.php branches/sqlite/adminer/include/design.inc.php branches/sqlite/adminer/include/functions.inc.php Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-13 11:18:50 UTC (rev 1424) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-13 11:45:39 UTC (rev 1425) @@ -12,7 +12,7 @@ } if (isset($_GET["mssql"])) { - $_GET["driver"] = "mssql"; + define("DRIVER", "mssql"); if (extension_loaded("sqlsrv")) { class Min_DB { var $extension = "sqlsrv", $_link, $_result, $server_info, $affected_rows, $error; Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-13 11:18:50 UTC (rev 1424) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-13 11:45:39 UTC (rev 1425) @@ -6,8 +6,8 @@ $drivers = array("server" => "MySQL") + $drivers; } -if (!$_GET["driver"]) { - $_GET["driver"] = "server"; // backwards compatibility +if (!defined("DRIVER")) { + define("DRIVER", "server"); // server - backwards compatibility // 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 { Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-13 11:18:50 UTC (rev 1424) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-13 11:45:39 UTC (rev 1425) @@ -6,7 +6,7 @@ } if (isset($_GET["pgsql"])) { - $_GET["driver"] = "pgsql"; + define("DRIVER", "pgsql"); if (extension_loaded("pgsql")) { class Min_DB { var $extension = "PgSQL", $_link, $_result, $_string, $_database = true, $server_info, $affected_rows, $error; Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-13 11:18:50 UTC (rev 1424) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-13 11:45:39 UTC (rev 1425) @@ -8,16 +8,11 @@ if (extension_loaded("sqlite") || extension_loaded("pdo_sqlite")) { $drivers["sqlite2"] = "SQLite 2"; } -if (isset($_GET["sqlite"])) { - $_GET["driver"] = "sqlite"; -} -if (isset($_GET["sqlite2"])) { - $_GET["driver"] = "sqlite2"; -} -if (ereg('^sqlite2?$', $_GET["driver"])) { - if (extension_loaded($_GET["driver"] == "sqlite2" ? "sqlite" : "sqlite3")) { - if ($_GET["driver"] == "sqlite2") { +if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) { + define("DRIVER", (isset($_GET["sqlite"]) ? "sqlite" : "sqlite2")); + if (extension_loaded(isset($_GET["sqlite2"]) ? "sqlite" : "sqlite3")) { + if (isset($_GET["sqlite2"])) { class Min_SQLite extends SQLiteDatabase { var $extension = "SQLite"; @@ -190,7 +185,7 @@ return true; } $connected = true; - $this->dsn("$_GET[driver]:$filename", "", "", "connect_error"); + $this->dsn(DRIVER . ":$filename", "", "", "connect_error"); //! $this->server_info needs to be filled in __construct() return true; } Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2010-04-13 11:18:50 UTC (rev 1424) +++ branches/sqlite/adminer/include/adminer.inc.php 2010-04-13 11:45:39 UTC (rev 1425) @@ -20,7 +20,7 @@ * @return array ($server, $username, $password) */ function credentials() { - return array($_GET["server"], $_GET["username"], get_session("passwords")); + return array(SERVER, $_GET["username"], get_session("passwords")); } /** Get key used for permanent login @@ -45,8 +45,8 @@ global $drivers, $possible_drivers; ?> <table cellspacing="0"> -<tr><th><?php echo lang('System'); ?><td><?php echo (count($possible_drivers) > 3 ? 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('System'); ?><td><?php echo (count($possible_drivers) > 3 ? html_select("driver", $drivers, 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(SERVER); ?>"> <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> Modified: branches/sqlite/adminer/include/auth.inc.php =================================================================== --- branches/sqlite/adminer/include/auth.inc.php 2010-04-13 11:18:50 UTC (rev 1424) +++ branches/sqlite/adminer/include/auth.inc.php 2010-04-13 11:45:39 UTC (rev 1425) @@ -7,7 +7,6 @@ exit; } -$_GET["server"] = $_GET[$_GET["driver"]]; // translate pgsql=localhost to driver=pgsql&server=localhost $token = $_SESSION["token"]; if (!$_SESSION["token"]) { $_SESSION["token"] = rand(1, 1e6); // defense against cross-site request forgery @@ -24,7 +23,7 @@ . ":" . base64_encode($_POST["driver"]) ); } - $same_connection = ($_GET["driver"] == $_POST["driver"] && $_GET["server"] == $_POST["server"] && $_GET["username"] === $_POST["username"]); // === - "0" == "00" + $same_connection = (DRIVER == $_POST["driver"] && SERVER == $_POST["server"] && $_GET["username"] === $_POST["username"]); // === - "0" == "00" if (!$same_connection || count($_POST) == ($_POST["permanent"] ? 5 : 4)) { // 4 - driver, server, username, password $location = ($same_connection ? remove_from_uri(session_name()) : preg_replace('~\\?.*~', '', ME) . "?" . ($_POST["driver"] != "server" || $_POST["server"] != "" ? urlencode($_POST["driver"]) . "=" . urlencode($_POST["server"]) . "&" : "") . "username=" . urlencode($_POST["username"])); if (SID) { @@ -46,7 +45,7 @@ } } elseif ($_COOKIE["adminer_permanent"]) { list($server, $username, $cipher, $system) = array_map('base64_decode', explode(":", $_COOKIE["adminer_permanent"])); // $driver is a global variable - if ($server == $_GET["server"] && $username === $_GET["username"] && $system == $_GET["driver"]) { + if ($server == SERVER && $username === $_GET["username"] && $system == DRIVER) { session_regenerate_id(); // defense against session fixation set_session("passwords", decrypt_string($cipher, $adminer->permanentLogin())); } Modified: branches/sqlite/adminer/include/bootstrap.inc.php =================================================================== --- branches/sqlite/adminer/include/bootstrap.inc.php 2010-04-13 11:18:50 UTC (rev 1424) +++ branches/sqlite/adminer/include/bootstrap.inc.php 2010-04-13 11:45:39 UTC (rev 1425) @@ -75,14 +75,6 @@ } @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 && !$_COOKIE ? SID . '&' : '') // !$_COOKIE - don't pass SID with permanent login - . (isset($_GET["server"]) ? urlencode($_GET["driver"]) . "=" . urlencode($_GET["server"]) . '&' : '') - . (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '') - . (DB != "" ? 'db=' . urlencode(DB) . '&' : '') -); - include "../adminer/include/functions.inc.php"; include "../adminer/include/lang.inc.php"; include "../adminer/lang/$LANG.inc.php"; @@ -91,6 +83,16 @@ include "../adminer/drivers/pgsql.inc.php"; include "../adminer/drivers/mssql.inc.php"; include "../adminer/drivers/mysql.inc.php"; // must be included as last driver + +define("SERVER", $_GET[DRIVER]); // read from pgsql=localhost +define("DB", $_GET["db"]); // for the sake of speed and size +define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\\1', $_SERVER["REQUEST_URI"]) . '?' + . (SID && !$_COOKIE ? SID . '&' : '') // !$_COOKIE - don't pass SID with permanent login + . (SERVER !== null ? DRIVER . "=" . urlencode(SERVER) . '&' : '') + . (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '') + . (DB != "" ? 'db=' . urlencode(DB) . '&' : '') +); + include "../adminer/include/version.inc.php"; include "./include/adminer.inc.php"; include "../adminer/include/design.inc.php"; Modified: branches/sqlite/adminer/include/design.inc.php =================================================================== --- branches/sqlite/adminer/include/design.inc.php 2010-04-13 11:18:50 UTC (rev 1424) +++ branches/sqlite/adminer/include/design.inc.php 2010-04-13 11:45:39 UTC (rev 1425) @@ -17,7 +17,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 . (SERVER != "" && SERVER != "localhost" ? h(" - " . 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")) { ?> @@ -32,9 +32,9 @@ <?php if (isset($breadcrumb)) { $link = substr(preg_replace('~(username|db)=[^&]*&~', '', ME), 0, -1); - echo '<p id="breadcrumb"><a href="' . ($link ? h($link) : ".") . '">' . $drivers[$_GET["driver"]] . '</a> » '; //! hide in Editor + echo '<p id="breadcrumb"><a href="' . ($link ? h($link) : ".") . '">' . $drivers[DRIVER] . '</a> » '; //! hide in Editor $link = substr(preg_replace('~db=[^&]*&~', '', ME), 0, -1); - $server = ($_GET["server"] != "" ? h($_GET["server"]) : lang('Server')); + $server = (SERVER != "" ? h(SERVER) : lang('Server')); if ($breadcrumb === false) { echo "$server\n"; } else { Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-04-13 11:18:50 UTC (rev 1424) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-13 11:45:39 UTC (rev 1425) @@ -260,7 +260,7 @@ * @return mixed */ function &get_session($key) { - return $_SESSION[$key][$_GET["driver"]][$_GET["server"]][$_GET["username"]]; + return $_SESSION[$key][DRIVER][SERVER][$_GET["username"]]; } /** Set session variable for current server @@ -269,7 +269,7 @@ * @return mixed */ function set_session($key, $val) { - $_SESSION[$key][$_GET["driver"]][$_GET["server"]][$_GET["username"]] = $val; // used also in auth.inc.php + $_SESSION[$key][DRIVER][SERVER][$_GET["username"]] = $val; // used also in auth.inc.php } /** Send Location header and exit @@ -444,7 +444,7 @@ */ function hidden_fields_get() { echo (SID && !$_COOKIE ? '<input type="hidden" name="' . session_name() . '" value="' . h(session_id()) . '">' : ''); - echo (isset($_GET["server"]) ? '<input type="hidden" name="' . h($_GET["driver"]) . '" value="' . h($_GET["server"]) . '">' : ""); + echo (SERVER !== null ? '<input type="hidden" name="' . DRIVER . '" value="' . h(SERVER) . '">' : ""); echo '<input type="hidden" name="username" value="' . h($_GET["username"]) . '">'; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-13 11:53:49
|
Revision: 1426 http://adminer.svn.sourceforge.net/adminer/?rev=1426&view=rev Author: jakubvrana Date: 2010-04-13 11:53:42 +0000 (Tue, 13 Apr 2010) Log Message: ----------- MS SQL EXPLAIN Modified Paths: -------------- 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/sql.inc.php Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-13 11:45:39 UTC (rev 1425) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-13 11:53:42 UTC (rev 1426) @@ -369,6 +369,13 @@ return " IDENTITY"; } + function explain($connection, $query) { + $connection->query("SET SHOWPLAN_ALL ON"); + $return = $connection->query($query); + $connection->query("SET SHOWPLAN_ALL OFF"); // connection is used also for indexes + return $return; + } + function support($feature) { return ereg('^(view|routine|trigger)$', $feature); } Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-13 11:45:39 UTC (rev 1425) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-13 11:53:42 UTC (rev 1426) @@ -656,6 +656,15 @@ return $return; } + /** Explain select + * @param Min_DB + * @param string + * @return Min_Result + */ + function explain($connection, $query) { + return $connection->query("EXPLAIN $query"); + } + /** Get SQL command to create table * @param string * @return string Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-13 11:45:39 UTC (rev 1425) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-13 11:53:42 UTC (rev 1426) @@ -401,6 +401,10 @@ return $return; } + function explain($connection, $query) { + return $connection->query("EXPLAIN $query"); + } + function support($feature) { return ereg('^(comment|view|routine|trigger)$', $feature); } Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-13 11:45:39 UTC (rev 1425) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-13 11:53:42 UTC (rev 1426) @@ -437,6 +437,10 @@ return $return; } + function explain($connection, $query) { + return $connection->query("EXPLAIN $query"); + } + function create_sql($table) { global $connection; return $connection->result("SELECT sql FROM sqlite_master WHERE name = " . $connection->quote($table)); Modified: branches/sqlite/adminer/sql.inc.php =================================================================== --- branches/sqlite/adminer/sql.inc.php 2010-04-13 11:45:39 UTC (rev 1425) +++ branches/sqlite/adminer/sql.inc.php 2010-04-13 11:53:42 UTC (rev 1426) @@ -85,7 +85,7 @@ $id = "explain-$queries"; echo ", <a href='#$id' onclick=\"return !toggle('$id');\">EXPLAIN</a>\n"; echo "<div id='$id' class='hidden'>\n"; - select($connection2->query("EXPLAIN $q")); + select(explain($connection2, $q)); echo "</div>\n"; } } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-13 21:20:51
|
Revision: 1435 http://adminer.svn.sourceforge.net/adminer/?rev=1435&view=rev Author: jakubvrana Date: 2010-04-13 21:20:44 +0000 (Tue, 13 Apr 2010) Log Message: ----------- SQLite2 Modified Paths: -------------- branches/sqlite/adminer/database.inc.php branches/sqlite/adminer/db.inc.php branches/sqlite/adminer/drivers/mysql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/include/functions.inc.php branches/sqlite/adminer/select.inc.php Modified: branches/sqlite/adminer/database.inc.php =================================================================== --- branches/sqlite/adminer/database.inc.php 2010-04-13 16:06:33 UTC (rev 1434) +++ branches/sqlite/adminer/database.inc.php 2010-04-13 21:20:44 UTC (rev 1435) @@ -46,7 +46,7 @@ // 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])); + $name = stripcslashes(idf_unescape("`$match[2]`")); break; } } Modified: branches/sqlite/adminer/db.inc.php =================================================================== --- branches/sqlite/adminer/db.inc.php 2010-04-13 16:06:33 UTC (rev 1434) +++ branches/sqlite/adminer/db.inc.php 2010-04-13 21:20:44 UTC (rev 1435) @@ -56,7 +56,7 @@ 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') . (support("comment") ? '<td>' . lang('Comment') : '') . "</thead>\n"; foreach ($tables_list as $name => $type) { - $view = (isset($type) && $type != "BASE TABLE"); + $view = (isset($type) && !eregi("table", $type)); 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>'; if ($view) { Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-13 16:06:33 UTC (rev 1434) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-13 21:20:44 UTC (rev 1435) @@ -435,19 +435,19 @@ */ function foreign_keys($table) { global $connection, $on_actions; - static $pattern = '(?:[^`]|``)+'; + static $pattern = '`(?:[^`]|``)+`'; $return = array(); $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); + 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); + 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]), - "source" => array_map('idf_unescape', $source[1]), - "target" => array_map('idf_unescape', $target[1]), + "source" => array_map('idf_unescape', $source[0]), + "target" => array_map('idf_unescape', $target[0]), "on_delete" => $match[6], "on_update" => $match[7], ); Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-13 16:06:33 UTC (rev 1434) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-13 21:20:44 UTC (rev 1435) @@ -14,19 +14,20 @@ if (extension_loaded(isset($_GET["sqlite2"]) ? "sqlite" : "sqlite3")) { if (isset($_GET["sqlite2"])) { - class Min_SQLite extends SQLiteDatabase { - var $extension = "SQLite"; + class Min_SQLite { + var $extension = "SQLite", $server_info, $affected_rows, $error, $_connection; function __construct() { $this->server_info = sqlite_libversion(); } function open($filename) { - parent::__construct($filename); + $this->_connection = new SQLiteDatabase($filename); } - function query($query) { - $result = @parent::query($query, SQLITE_BOTH, $error); + function query($query, $unbuffered = false) { + $method = ($unbuffered ? "unbufferedQuery" : "query"); + $result = @$this->_connection->$method($query, SQLITE_BOTH, $error); if (!$result) { $this->error = $error; return false; @@ -56,11 +57,21 @@ function __construct($result) { $this->_result = $result; - $this->num_rows = $result->numRows(); + if (method_exists($result, 'numRows')) { // not available in unbuffered query + $this->num_rows = $result->numRows(); + } } function fetch_assoc() { - return $this->_result->fetch(SQLITE_ASSOC); + $row = $this->_result->fetch(SQLITE_ASSOC); + if (!$row) { + return false; + } + $return = array(); + foreach ($row as $key => $val) { + $return[($key[0] == '"' ? idf_unescape($key) : $key)] = $val; + } + return $return; } function fetch_row() { @@ -69,7 +80,7 @@ function fetch_field() { return (object) array( - "name" => $this->fieldName($this->_offset++), + "name" => $this->_result->fieldName($this->_offset++), //! type, orgtable, charsetnr ); } @@ -79,7 +90,7 @@ } else { class Min_SQLite extends SQLite3 { - var $_offset = 0, $extension = "SQLite3"; + var $extension = "SQLite3", $server_info, $affected_rows, $error; function __construct() { $version = $this->version(); @@ -194,13 +205,13 @@ } function idf_escape($idf) { - return "`" . str_replace("`", "``", $idf) . "`"; + return '"' . str_replace('"', '""', $idf) . '"'; } function connect() { global $connection; if ($connection) { - return $connection; // can connect only once, furthermore function to get number of rows doesn't exist + return $connection; // can connect only once, function to get number of rows doesn't exist anyway } return new Min_DB; } @@ -232,7 +243,7 @@ } function tables_list() { - return get_key_vals("SELECT name, REPLACE(type, 'table', 'BASE TABLE') FROM sqlite_master WHERE type IN ('table', 'view')", 1); + return get_key_vals("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view')", 1); } function count_tables($databases) { @@ -356,7 +367,7 @@ } function auto_increment() { - return " PRIMARY KEY AUTOINCREMENT"; + return " PRIMARY KEY" . (DRIVER == "sqlite" ? " AUTOINCREMENT" : ""); } function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) { Modified: branches/sqlite/adminer/include/functions.inc.php =================================================================== --- branches/sqlite/adminer/include/functions.inc.php 2010-04-13 16:06:33 UTC (rev 1434) +++ branches/sqlite/adminer/include/functions.inc.php 2010-04-13 21:20:44 UTC (rev 1435) @@ -13,7 +13,7 @@ * @return string */ function idf_unescape($idf) { - return str_replace("``", "`", $idf); + return str_replace("$idf[0]$idf[0]", $idf[0], substr($idf, 1, -1)); } /** Escape string to use inside '' Modified: branches/sqlite/adminer/select.inc.php =================================================================== --- branches/sqlite/adminer/select.inc.php 2010-04-13 16:06:33 UTC (rev 1434) +++ branches/sqlite/adminer/select.inc.php 2010-04-13 21:20:44 UTC (rev 1435) @@ -53,7 +53,7 @@ if ($select) { $row = array(); foreach ($select as $val) { - $row[] = (ereg('^`(.*)`$', $val, $match) ? idf_unescape($match[1]) : $val); //! columns looking like functions + $row[] = (ereg('^`.*`$', $val) ? idf_unescape($val) : $val); //! columns looking like functions } } dump_csv($row); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-14 17:10:36
|
Revision: 1439 http://adminer.svn.sourceforge.net/adminer/?rev=1439&view=rev Author: jakubvrana Date: 2010-04-14 16:03:20 +0000 (Wed, 14 Apr 2010) Log Message: ----------- Driver specific edit functions Modified Paths: -------------- 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 Modified: branches/sqlite/adminer/drivers/mssql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-14 15:13:07 UTC (rev 1438) +++ branches/sqlite/adminer/drivers/mssql.inc.php 2010-04-14 16:03:20 UTC (rev 1439) @@ -396,4 +396,12 @@ $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); $functions = array("len", "lower", "round", "upper"); $grouping = array("avg", "count", "count distinct", "max", "min", "sum"); + $edit_functions = array( + array( + "date|time" => "getdate", + ), array( + "int|decimal|real|float|money|datetime" => "+/-", + "char|text" => "+", + ) + ); } Modified: branches/sqlite/adminer/drivers/mysql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-14 15:13:07 UTC (rev 1438) +++ branches/sqlite/adminer/drivers/mysql.inc.php 2010-04-14 16:03:20 UTC (rev 1439) @@ -359,6 +359,7 @@ } if (!isset($row["Rows"])) { $row["Engine"] = "VIEW"; + $row["Comment"] = ""; } if ($name != "") { return $row; @@ -705,6 +706,17 @@ } $unsigned = array("unsigned", "zerofill", "unsigned zerofill"); ///< @var array number variants $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "REGEXP", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL"); ///< @var array operators used in select - $functions = array("char_length", "from_unixtime", "hex", "lower", "round", "sec_to_time", "time_to_sec", "unix_timestamp", "upper"); ///< @var array functions used in select + $functions = array("char_length", "from_unixtime", "hex", "lower", "round", "sec_to_time", "time_to_sec", "upper"); ///< @var array functions used in select $grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"); ///< @var array grouping functions used in select + $edit_functions = array( ///< @var array of array("$type|$type2" => "$function/$function2") functions used in editing, [0] - edit and insert, [1] - edit only + array( + "char" => "md5/sha1/password/encrypt/uuid", //! JavaScript for disabling maxlength + "date|time" => "now", + ), array( + "int|float|double|decimal" => "+/-", + "date" => "+ interval/- interval", + "time" => "addtime/subtime", + "char|text" => "concat", + ) + ); } Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-14 15:13:07 UTC (rev 1438) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-14 16:03:20 UTC (rev 1439) @@ -314,9 +314,7 @@ if (!$val) { $alter[] = "DROP $column"; } else { - if ($table != "" || $val[5] != " COMMENT ''") { - $queries[] = "COMMENT ON COLUMN " . idf_escape($table) . ".$column IS " . substr($val[5], 9); - } + $val5 = $val[5]; unset($val[5]); if ($val[6]) { // auto_increment $val = array($val[0], ($val[1] == "bigint" ? "big" : "") . "serial"); @@ -333,6 +331,9 @@ $alter[] = "ALTER $column " . ($val[2] == " NULL" ? "DROP NOT" : "SET") . $val[2]; } } + if ($table != "" || $val5 != " COMMENT ''") { + $queries[] = "COMMENT ON COLUMN " . idf_escape($table) . ".$val[0] IS " . substr($val5, 9); + } } } $alter = array_merge($alter, $foreign); @@ -425,4 +426,14 @@ $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "~", "IN", "IS NULL", "NOT LIKE", "!~", "NOT IN", "IS NOT NULL"); $functions = array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper"); $grouping = array("avg", "count", "count distinct", "max", "min", "sum"); + $edit_functions = array( + array( + "char" => "md5", + "date|time" => "now", + ), array( + "int|numeric|real|money" => "+/-", + "date|time" => "+ interval/- interval", //! escape + "char|text" => "||", + ) + ); } Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-14 15:13:07 UTC (rev 1438) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-14 16:03:20 UTC (rev 1439) @@ -466,6 +466,15 @@ $structured_types = array_keys($types); $unsigned = array(); $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // REGEXP can be user defined function - $functions = array("hex", "length", "lower", "round", "upper"); + $functions = array("hex", "length", "lower", "round", "unixepoch", "upper"); $grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"); + $edit_functions = array( + array( + // "text" => "date('now')/time('now')/datetime('now')", + ), array( + "integer|real|numeric" => "+/-", + // "text" => "date/time/datetime", + "text" => "||", + ) + ); } Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2010-04-14 15:13:07 UTC (rev 1438) +++ branches/sqlite/adminer/include/adminer.inc.php 2010-04-14 16:03:20 UTC (rev 1439) @@ -388,31 +388,18 @@ * @return array */ function editFunctions($field) { - $return = array(""); - if (ereg('char|date|time', $field["type"])) { - $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 - if (ereg('int|float|double|decimal', $field["type"])) { - $return = array("", "+", "-"); + global $edit_functions; + $return = ($field["null"] ? "/NULL" : ""); + foreach ($edit_functions as $key => $functions) { + if (!$key || (!isset($_GET["call"]) && (isset($_GET["select"]) || where($_GET)))) { // relative functions + foreach ($functions as $pattern => $val) { + if (!$pattern || ereg($pattern, $field["type"])) { + $return .= "/$val"; + } + } } - if (ereg('date', $field["type"])) { - $return[] = "+ interval"; - $return[] = "- interval"; - } - if (ereg('time', $field["type"])) { - $return[] = "addtime"; - $return[] = "subtime"; - } - if (ereg('char|text', $field["type"])) { - $return[] = "concat"; - } } - if ($field["null"]) { - array_unshift($return, "NULL"); - } - return $return; + return explode("/", $return); } /** Get options to display edit field @@ -441,9 +428,9 @@ global $connection; $name = $field["field"]; $return = $connection->quote($value); - if (ereg('^(now|uuid)$', $function)) { + if (ereg('^(now|getdate|uuid)$', $function)) { $return = "$function()"; - } elseif (ereg('^[+-]$', $function)) { + } elseif (ereg('^([+-]|\\|\\|)$', $function)) { $return = idf_escape($name) . " $function $return"; } elseif (ereg('^[+-] interval$', $function)) { $return = idf_escape($name) . " $function " . (preg_match("~^([0-9]+|'[0-9.: -]') [A-Z_]+$~i", $value) ? $value : $return); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jak...@us...> - 2010-04-15 11:05:04
|
Revision: 1440 http://adminer.svn.sourceforge.net/adminer/?rev=1440&view=rev Author: jakubvrana Date: 2010-04-15 11:04:58 +0000 (Thu, 15 Apr 2010) Log Message: ----------- Views Modified Paths: -------------- branches/sqlite/adminer/drivers/pgsql.inc.php branches/sqlite/adminer/drivers/sqlite.inc.php branches/sqlite/adminer/include/adminer.inc.php branches/sqlite/adminer/view.inc.php Modified: branches/sqlite/adminer/drivers/pgsql.inc.php =================================================================== --- branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-14 16:03:20 UTC (rev 1439) +++ branches/sqlite/adminer/drivers/pgsql.inc.php 2010-04-15 11:04:58 UTC (rev 1440) @@ -268,7 +268,7 @@ function view($name) { global $connection; - return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)* AS ~U', '', $connection->result("SHOW CREATE VIEW " . idf_escape($name), 1))); + return array("select" => $connection->result("SELECT pg_get_viewdef(" . $connection->quote($name) . ")")); } function collations() { Modified: branches/sqlite/adminer/drivers/sqlite.inc.php =================================================================== --- branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-14 16:03:20 UTC (rev 1439) +++ branches/sqlite/adminer/drivers/sqlite.inc.php 2010-04-15 11:04:58 UTC (rev 1440) @@ -339,7 +339,7 @@ function view($name) { global $connection; - return array("select" => preg_replace('~^(?:[^`]+|`[^`]*`)* AS ~iU', '', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . $connection->quote($name)))); + return array("select" => preg_replace('~^(?:[^`"]+|`[^`]*`|"[^"]*")* AS\\s+~iU', '', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . $connection->quote($name)))); } function collations() { @@ -433,7 +433,7 @@ 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); + 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); return array("Timing" => strtoupper($match[1]), "Event" => strtoupper($match[2]), "Trigger" => $name, "Statement" => $match[3]); } @@ -442,7 +442,7 @@ $return = array(); $result = $connection->query("SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . $connection->quote($table)); while ($row = $result->fetch_assoc()) { - preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`\\s]+|`[^`]*`)+\\s*([a-z]+)\\s*([a-z]+)~i', $row["sql"], $match); + preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*([a-z]+)\\s*([a-z]+)~i', $row["sql"], $match); $return[$row["name"]] = array($match[1], $match[2]); } return $return; Modified: branches/sqlite/adminer/include/adminer.inc.php =================================================================== --- branches/sqlite/adminer/include/adminer.inc.php 2010-04-14 16:03:20 UTC (rev 1439) +++ branches/sqlite/adminer/include/adminer.inc.php 2010-04-15 11:04:58 UTC (rev 1440) @@ -85,10 +85,10 @@ function selectLinks($tableStatus, $set = "") { echo '<p class="tabs">'; $links = array("select" => lang('Select data'), "table" => lang('Show structure')); - if ($tableStatus["Engine"] != "VIEW") { + if (eregi("view", $tableStatus["Engine"])) { + $links["view"] = lang('Alter view'); + } else { $links["create"] = lang('Alter table'); - } else { - $links["view"] = lang('Alter view'); } if (isset($set)) { $links["edit"] = lang('New item'); Modified: branches/sqlite/adminer/view.inc.php =================================================================== --- branches/sqlite/adminer/view.inc.php 2010-04-14 16:03:20 UTC (rev 1439) +++ branches/sqlite/adminer/view.inc.php 2010-04-15 11:04:58 UTC (rev 1440) @@ -5,7 +5,7 @@ $dropped = drop_create( "DROP VIEW " . idf_escape($TABLE), "CREATE VIEW " . idf_escape($_POST["name"]) . " AS\n$_POST[select]", - substr(ME, 0, -1), + ($_POST["drop"] ? substr(ME, 0, -1) : ME . "table=" . urlencode($_POST["name"])), lang('View has been dropped.'), lang('View has been altered.'), lang('View has been created.'), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |