1
0
mirror of https://github.com/vrana/adminer.git synced 2025-09-05 20:02:54 +02:00

Compare commits

..

63 Commits

Author SHA1 Message Date
Jakub Vrana
514ff41c7c Release 3.4.0 2012-06-30 05:04:37 -07:00
Jakub Vrana
dafd2deef2 Avoid flicker before the image is loaded 2012-06-30 05:02:43 -07:00
Jakub Vrana
6a96c14948 Tests compatible with strict mode 2012-06-30 03:50:23 -07:00
Jakub Vrana
091a4d04f4 Link to documentation 2012-06-30 03:17:16 -07:00
Jakub Vrana
a71b99096c Remove CodeMirror
- uses other colors than JUSH
- not used everywhere (triggers, routines, ...)
- Ctrl+Left and similar works bad
- missing autocomplete
- blocking loader
2012-06-30 01:51:35 -07:00
Jakub Vrana
a833468c0a Fix datetime type parsing (bug #3418043) 2012-06-29 16:41:12 -07:00
Jakub Vrana
54f464a893 Set character set in SQLSRV (bug #3479986) 2012-06-29 15:23:35 -07:00
Jakub Vrana
7de0b21e16 Fix indexes with duplicate tables in different schemas 2012-06-29 14:59:04 -07:00
Jakub Vrana
b78b0cd109 Plugin for including date in export filename 2012-06-29 14:41:47 -07:00
Jakub Vrana
f158d5e392 Zip dump only if requested 2012-06-29 14:09:44 -07:00
Jakub Vrana
5b57706890 Customizable export filename 2012-06-29 12:25:05 -07:00
Jakub Vrana
0d5543c9ac Use better Bengali translation 2012-06-29 12:13:03 -07:00
Jakub Vrana
7363429b52 Load jush.css earlier 2012-06-29 11:38:20 -07:00
Jakub Vrana
6ca4082e6c Unhighlight Binlog Dump in process list 2012-06-29 10:29:46 -07:00
Jakub Vrana
8daf581c21 Indonesian translation 2012-06-19 10:21:40 -07:00
Jakub Vrana
eb05475337 Bengali placeholders 2012-06-19 10:12:17 -07:00
Josef Šimánek
b2f5f5689d čeština v českém překladu 2012-06-19 19:51:01 +03:00
Jordi Rivero
a1e4e87b82 Typo error fixes 2012-06-18 11:29:12 -07:00
Jakub Vrana
97566acd75 Shift+click on checkbox to select consecutive rows (thanks to Alexander Loonar) 2012-06-13 12:21:21 -07:00
Jakub Vrana
4a6c72cd1c Comment 2012-06-13 11:19:50 -07:00
Jakub Vrana
7f1fcc2286 Format numbers in translations 2012-06-04 17:44:04 -07:00
Jakub Vrana
a2378af008 Display Indian languages together 2012-06-04 17:13:55 -07:00
Jakub Vrana
56ac3d1817 Mark scripts as executable 2012-05-25 23:21:31 -07:00
Jakub Vrana
739bcb0979 Warn about selecting data without index 2012-05-17 00:13:13 -07:00
Jakub Vrana
b0666e537d Remove unnecessary { } in compile 2012-05-16 16:42:45 -07:00
Jakub Vrana
8339b14da3 Comment 2012-05-16 16:42:16 -07:00
Jakub Vrana
5dc90731eb Update ng9 design 2012-05-14 09:27:16 -07:00
Jakub Vrana
f498219f29 Remove eventStop() used by AJAXification in past 2012-05-14 02:22:44 -07:00
Jakub Vrana
2db14e4bc2 Update TODO 2012-05-14 01:17:43 -07:00
Jakub Vrana
8be29afb9b Allow specifying database in login form (bug #3499359) 2012-05-14 01:11:09 -07:00
Jakub Vrana
f595f9313e Use namespace in login form 2012-05-14 01:11:08 -07:00
Jakub Vrana
6591d485e9 Replace isset($var) by $var !== null 2012-05-14 01:11:08 -07:00
Jakub Vrana
40ad846d20 Improve PDO_PgSQL support 2012-05-14 00:54:28 -07:00
Jakub Vrana
c4a57246ac Simplify work with NULL values in select 2012-05-13 23:24:39 -07:00
Jakub Vrana
20cf6d29c5 Support binary data in SQLite (http://forum.zdrojak.cz/?topic=619, https://sourceforge.net/projects/adminer/forums/forum/960418/topic/5274204) 2012-05-13 23:23:57 -07:00
Jakub Vrana
17ef1f0dfc Highlight keywords in PL/SQL CodeMirror 2012-05-13 22:56:56 -07:00
Jakub Vrana
5ac72dd739 Add design like Nette documentation 2012-05-13 17:58:45 -07:00
Jakub Vrana
06595f90e4 Inform about disabled event_scheduler (http://forum.zdrojak.cz/?topic=637) 2012-05-13 17:40:36 -07:00
Jakub Vrana
4f3fddc870 Fix parsing of functions returning datetime (bug #3518425) 2012-05-13 17:19:53 -07:00
Jakub Vrana
336a32c144 Update Bengali translation 2012-05-13 16:30:37 -07:00
Ivan Masár
0e31b09543 Add approximate row count for PostgreSQL driver 2012-05-13 16:07:58 -07:00
Jakub Vrana
20e11be093 Initialize variable used in textarea highlighting 2012-05-13 15:26:42 -07:00
Ivan Masár
d6c5f85a24 Add Oracle processlist support 2012-05-13 15:08:06 -07:00
Ivan Masár
a280179bd5 Add row count and table size for Oracle tables 2012-05-13 14:48:00 -07:00
Ivan Masár
7f1afde592 Add schema support to the Oracle driver 2012-05-13 14:46:46 -07:00
Jakub Vrana
70fb696fbd Link to descending order 2012-04-30 18:16:13 -07:00
Jakub Vrana
b16bb54219 Save assignment if not necessary 2012-04-29 17:54:18 -07:00
Davi Alexandre
9188d21ea3 Fixing some typos in the Portuguese translation 2012-04-29 17:45:04 -07:00
Jakub Vrana
3ada73d5ed Bengali translation 2012-04-29 17:35:42 -07:00
Jakub Vrana
047ce184f5 Highlight line with error in SQL command 2012-04-17 13:51:20 -07:00
Jakub Vrana
4815c7d020 Don't use AJAX links and forms 2012-04-15 22:22:47 -07:00
Jakub Vrana
bf54c13dfe Highlight code in textarea by CodeMirror 2012-04-15 22:00:33 -07:00
Jakub Vrana
48df7aa1c9 Link to original table in EXPLAIN of SELECT * FROM table t 2012-04-15 10:53:40 -07:00
Jakub Vrana
77ec05d50b Better support for multi results in PDO 2012-04-08 21:59:49 -07:00
Jakub Vrana
4dc3ec6a0d Ukrainian plural 2012-03-26 23:24:58 -07:00
Jakub Vrana
24c51fe11f Print current time next to executed SQL queries 2012-03-26 23:21:38 -07:00
Jakub Vrana
b254503fb2 Add progress cursor also to buttons 2012-03-26 23:21:02 -07:00
srsbiz
ea0a6a5a01 Update Polish translation 2012-03-21 22:53:23 -07:00
Jakub Vrana
e36afcc127 Ukrainian translation 2012-03-21 22:36:07 -07:00
Jakub Vrana
bf4f0a1f9e Replace JSMin by JsShrink 2012-03-10 21:41:00 -08:00
Jakub Vrana
a6f10787bb Add template for translations 2012-03-09 17:19:21 -08:00
Jakub Vrana
cc1398e5a4 Don't document parameters in readme 2012-03-08 15:30:15 -08:00
Jakub Vrana
00b3bc3f2c Develop 2012-03-06 23:31:44 -08:00
94 changed files with 2003 additions and 512 deletions

9
.gitmodules vendored
View File

@@ -1,9 +1,6 @@
[submodule "jush"] [submodule "jush"]
path = externals/jush path = externals/jush
url = git://jush.git.sourceforge.net/gitroot/jush/jush url = git://jush.git.sourceforge.net/gitroot/jush/jush
[submodule "jsmin-php"]
path = externals/jsmin-php
url = git://github.com/rgrove/jsmin-php.git
[submodule "tinymce"] [submodule "tinymce"]
path = externals/tinymce path = externals/tinymce
url = git://github.com/tinymce/tinymce.git url = git://github.com/tinymce/tinymce.git
@@ -16,3 +13,9 @@
[submodule "wymeditor"] [submodule "wymeditor"]
path = externals/wymeditor path = externals/wymeditor
url = git://github.com/wymeditor/wymeditor.git url = git://github.com/wymeditor/wymeditor.git
[submodule "JsShrink"]
path = externals/JsShrink
url = git://github.com/vrana/JsShrink.git
[submodule "CodeMirror2"]
path = externals/CodeMirror2
url = git://github.com/marijnh/CodeMirror2.git

View File

@@ -29,7 +29,7 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"]
$after = "FIRST"; $after = "FIRST";
foreach ($_POST["fields"] as $key => $field) { foreach ($_POST["fields"] as $key => $field) {
$foreign_key = $foreign_keys[$field["type"]]; $foreign_key = $foreign_keys[$field["type"]];
$type_field = (isset($foreign_key) ? $referencable_primary[$foreign_key] : $field); //! can collide with user defined type $type_field = ($foreign_key !== null ? $referencable_primary[$foreign_key] : $field); //! can collide with user defined type
if ($field["field"] != "") { if ($field["field"] != "") {
if (!$field["has_default"]) { if (!$field["has_default"]) {
$field["default"] = null; $field["default"] = null;
@@ -46,7 +46,7 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"]
if ($process_field != process_field($orig_field, $orig_field)) { if ($process_field != process_field($orig_field, $orig_field)) {
$fields[] = array($field["orig"], $process_field, $after); $fields[] = array($field["orig"], $process_field, $after);
} }
if (isset($foreign_key)) { if ($foreign_key !== null) {
$foreign[idf_escape($field["field"])] = ($TABLE != "" ? "ADD" : " ") . " FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . table($foreign_keys[$field["type"]]) . " (" . idf_escape($type_field["field"]) . ")" . (ereg("^($on_actions)\$", $field["on_delete"]) ? " ON DELETE $field[on_delete]" : ""); $foreign[idf_escape($field["field"])] = ($TABLE != "" ? "ADD" : " ") . " FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . table($foreign_keys[$field["type"]]) . " (" . idf_escape($type_field["field"]) . ")" . (ereg("^($on_actions)\$", $field["on_delete"]) ? " ON DELETE $field[on_delete]" : "");
} }
$after = "AFTER " . idf_escape($field["field"]); $after = "AFTER " . idf_escape($field["field"]);

View File

@@ -67,7 +67,7 @@ if ($adminer->homepage()) {
echo (support("comment") ? '<td>' . lang('Comment') : ''); echo (support("comment") ? '<td>' . lang('Comment') : '');
echo "</thead>\n"; echo "</thead>\n";
foreach ($tables_list as $name => $type) { foreach ($tables_list as $name => $type) {
$view = (isset($type) && !eregi("table", $type)); $view = ($type !== null && !eregi("table", $type));
echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');"); 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) . '" title="' . lang('Show structure') . '">' . h($name) . '</a>'; echo '<th><a href="' . h(ME) . 'table=' . urlencode($name) . '" title="' . lang('Show structure') . '">' . h($name) . '</a>';
if ($view) { if ($view) {
@@ -100,14 +100,14 @@ if ($adminer->homepage()) {
echo "<p>" . (ereg('^(sql|sqlite|pgsql)$', $jush) echo "<p>" . (ereg('^(sql|sqlite|pgsql)$', $jush)
? ($jush != "sqlite" ? "<input type='submit' value='" . lang('Analyze') . "'> " : "") ? ($jush != "sqlite" ? "<input type='submit' value='" . lang('Analyze') . "'> " : "")
. "<input type='submit' name='optimize' value='" . lang('Optimize') . "'> " : "" . "<input type='submit' name='optimize' value='" . lang('Optimize') . "'> " : ""
) . ($jush == "sql" ? "<input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> " : "") . "<input type='submit' name='truncate' value='" . lang('Truncate') . "'" . confirm("formChecked(this, /tables/)") . "> <input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm("formChecked(this, /tables|views/)", 1) . ">\n"; // 1 - eventStop ) . ($jush == "sql" ? "<input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> " : "") . "<input type='submit' name='truncate' value='" . lang('Truncate') . "'" . confirm("formChecked(this, /tables/)") . "> <input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm("formChecked(this, /tables|views/)") . ">\n";
$databases = (support("scheme") ? schemas() : $adminer->databases()); $databases = (support("scheme") ? schemas() : $adminer->databases());
if (count($databases) != 1 && $jush != "sqlite") { if (count($databases) != 1 && $jush != "sqlite") {
$db = (isset($_POST["target"]) ? $_POST["target"] : (support("scheme") ? $_GET["ns"] : DB)); $db = (isset($_POST["target"]) ? $_POST["target"] : (support("scheme") ? $_GET["ns"] : DB));
echo "<p>" . lang('Move to other database') . ": "; echo "<p>" . lang('Move to other database') . ": ";
echo ($databases ? html_select("target", $databases, $db) : '<input name="target" value="' . h($db) . '">'); echo ($databases ? html_select("target", $databases, $db) : '<input name="target" value="' . h($db) . '">');
echo " <input type='submit' name='move' value='" . lang('Move') . "' onclick='eventStop(event);'>"; echo " <input type='submit' name='move' value='" . lang('Move') . "'>";
echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "' onclick='eventStop(event);'>" : ""); echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'>" : "");
echo "\n"; echo "\n";
} }
echo "<input type='hidden' name='token' value='$token'>\n"; echo "<input type='hidden' name='token' value='$token'>\n";
@@ -182,6 +182,10 @@ if ($adminer->homepage()) {
echo "<td>$row[Ends]"; echo "<td>$row[Ends]";
} }
echo "</table>\n"; echo "</table>\n";
$event_scheduler = $connection->result("SELECT @@event_scheduler");
if ($event_scheduler && $event_scheduler != "ON") {
echo "<p class='error'><code class='jush-sqlset'>event_scheduler</code>: " . h($event_scheduler) . "\n";
}
} }
echo '<p><a href="' . h(ME) . 'event=">' . lang('Create event') . "</a>\n"; echo '<p><a href="' . h(ME) . 'event=">' . lang('Create event') . "</a>\n";
} }

View File

@@ -23,7 +23,7 @@ if (isset($_GET["mssql"])) {
} }
function connect($server, $username, $password) { function connect($server, $username, $password) {
$this->_link = @sqlsrv_connect($server, array("UID" => $username, "PWD" => $password)); $this->_link = @sqlsrv_connect($server, array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8"));
if ($this->_link) { if ($this->_link) {
$info = sqlsrv_server_info($this->_link); $info = sqlsrv_server_info($this->_link);
$this->server_info = $info['SQLServerVersion']; $this->server_info = $info['SQLServerVersion'];
@@ -252,7 +252,7 @@ if (isset($_GET["mssql"])) {
} }
function limit($query, $where, $limit, $offset = 0, $separator = " ") { function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return (isset($limit) ? " TOP (" . ($limit + $offset) . ")" : "") . " $query$where"; // seek later return ($limit !== null ? " TOP (" . ($limit + $offset) . ")" : "") . " $query$where"; // seek later
} }
function limit1($query, $where) { function limit1($query, $where) {

View File

@@ -268,7 +268,7 @@ if (!defined("DRIVER")) {
global $connection; global $connection;
// SHOW DATABASES can take a very long time so it is cached // SHOW DATABASES can take a very long time so it is cached
$return = &get_session("dbs"); $return = &get_session("dbs");
if (!isset($return)) { if ($return === null) {
if ($flush) { if ($flush) {
restart_session(); restart_session();
ob_flush(); ob_flush();
@@ -288,7 +288,7 @@ if (!defined("DRIVER")) {
* @return string * @return string
*/ */
function limit($query, $where, $limit, $offset = 0, $separator = " ") { function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . (isset($limit) ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : ""); return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
} }
/** Formulate SQL modification query with limit 1 /** Formulate SQL modification query with limit 1
@@ -510,6 +510,16 @@ if (!defined("DRIVER")) {
return h(preg_replace('~^You have an error.*syntax to use~U', "Syntax error", $connection->error)); return h(preg_replace('~^You have an error.*syntax to use~U', "Syntax error", $connection->error));
} }
/** Get line of error
* @return int 0 for first line
*/
function error_line() {
global $connection;
if (ereg(' at line ([0-9]+)$', $connection->error, $regs)) {
return $regs[1] - 1;
}
}
/** Return expression for binary comparison /** Return expression for binary comparison
* @param string * @param string
* @return string * @return string
@@ -739,10 +749,10 @@ if (!defined("DRIVER")) {
function routine($name, $type) { function routine($name, $type) {
global $connection, $enum_length, $inout, $types; global $connection, $enum_length, $inout, $types;
$aliases = array("bool", "boolean", "integer", "double precision", "real", "dec", "numeric", "fixed", "national char", "national varchar"); $aliases = array("bool", "boolean", "integer", "double precision", "real", "dec", "numeric", "fixed", "national char", "national varchar");
$type_pattern = "((" . implode("|", array_merge(array_keys($types), $aliases)) . ")(?:\\s*\\(((?:[^'\")]*|$enum_length)+)\\))?\\s*(zerofill\\s*)?(unsigned(?:\\s+zerofill)?)?)(?:\\s*(?:CHARSET|CHARACTER\\s+SET)\\s*['\"]?([^'\"\\s]+)['\"]?)?"; $type_pattern = "((" . implode("|", array_merge(array_keys($types), $aliases)) . ")\\b(?:\\s*\\(((?:[^'\")]*|$enum_length)+)\\))?\\s*(zerofill\\s*)?(unsigned(?:\\s+zerofill)?)?)(?:\\s*(?:CHARSET|CHARACTER\\s+SET)\\s*['\"]?([^'\"\\s]+)['\"]?)?";
$pattern = "\\s*(" . ($type == "FUNCTION" ? "" : $inout) . ")?\\s*(?:`((?:[^`]|``)*)`\\s*|\\b(\\S+)\\s+)$type_pattern"; $pattern = "\\s*(" . ($type == "FUNCTION" ? "" : $inout) . ")?\\s*(?:`((?:[^`]|``)*)`\\s*|\\b(\\S+)\\s+)$type_pattern";
$create = $connection->result("SHOW CREATE $type " . idf_escape($name), 2); $create = $connection->result("SHOW CREATE $type " . idf_escape($name), 2);
preg_match("~\\(((?:$pattern\\s*,?)*)\\)" . ($type == "FUNCTION" ? "\\s*RETURNS\\s+$type_pattern" : "") . "\\s*(.*)~is", $create, $match); preg_match("~\\(((?:$pattern\\s*,?)*)\\)\\s*" . ($type == "FUNCTION" ? "RETURNS\\s+$type_pattern\\s+" : "") . "(.*)~is", $create, $match);
$fields = array(); $fields = array();
preg_match_all("~$pattern\\s*,?~is", $match[1], $matches, PREG_SET_ORDER); preg_match_all("~$pattern\\s*,?~is", $match[1], $matches, PREG_SET_ORDER);
foreach ($matches as $param) { foreach ($matches as $param) {

View File

@@ -154,7 +154,7 @@ if (isset($_GET["oracle"])) {
function limit($query, $where, $limit, $offset = 0, $separator = " ") { function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return ($offset ? " * FROM (SELECT t.*, rownum AS rnum FROM (SELECT $query$where) t WHERE rownum <= " . ($limit + $offset) . ") WHERE rnum > $offset" return ($offset ? " * FROM (SELECT t.*, rownum AS rnum FROM (SELECT $query$where) t WHERE rownum <= " . ($limit + $offset) . ") WHERE rnum > $offset"
: (isset($limit) ? " * FROM (SELECT $query$where) WHERE rownum <= " . ($limit + $offset) : ($limit !== null ? " * FROM (SELECT $query$where) WHERE rownum <= " . ($limit + $offset)
: " $query$where" : " $query$where"
)); ));
} }
@@ -190,8 +190,8 @@ UNION SELECT view_name, 'view' FROM user_views"
function table_status($name = "") { function table_status($name = "") {
$return = array(); $return = array();
$search = q($name); $search = q($name);
foreach (get_rows('SELECT table_name "Name", \'table\' "Engine" FROM all_tables WHERE tablespace_name = ' . q(DB) . ($name != "" ? " AND table_name = $search" : "") . " foreach (get_rows('SELECT table_name "Name", \'table\' "Engine", avg_row_len * num_rows "Data_length", num_rows "Rows" FROM all_tables WHERE tablespace_name = ' . q(DB) . ($name != "" ? " AND table_name = $search" : "") . "
UNION SELECT view_name, 'view' FROM user_views" . ($name != "" ? " WHERE view_name = $search" : "") UNION SELECT view_name, 'view', 0, 0 FROM user_views" . ($name != "" ? " WHERE view_name = $search" : "")
) as $row) { ) as $row) {
if ($name != "") { if ($name != "") {
return $row; return $row;
@@ -329,28 +329,39 @@ ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
} }
function schemas() { function schemas() {
return array(); return get_vals("SELECT DISTINCT owner FROM dba_segments WHERE owner IN (SELECT username FROM dba_users WHERE default_tablespace NOT IN ('SYSTEM','SYSAUX'))");
} }
function get_schema() { function get_schema() {
return ""; global $connection;
return $connection->result("SELECT sys_context('USERENV', 'SESSION_USER') FROM dual");
} }
function set_schema($scheme) { function set_schema($scheme) {
return true; global $connection;
return $connection->query("ALTER SESSION SET CURRENT_SCHEMA = " . idf_escape($scheme));
} }
function show_variables() { function show_variables() {
return get_key_vals('SELECT name, display_value FROM v$parameter'); return get_key_vals('SELECT name, display_value FROM v$parameter');
} }
function process_list() {
return get_rows('SELECT sess.process AS "process", sess.username AS "user", sess.schemaname AS "schema", sess.status AS "status", sess.wait_class AS "wait_class", sess.seconds_in_wait AS "seconds_in_wait", sql.sql_text AS "sql_text", sess.machine AS "machine", sess.port AS "port"
FROM v$session sess LEFT OUTER JOIN v$sql sql
ON sql.sql_id = sess.sql_id
WHERE sess.type = \'USER\'
ORDER BY PROCESS
');
}
function show_status() { function show_status() {
$rows = get_rows('SELECT * FROM v$instance'); $rows = get_rows('SELECT * FROM v$instance');
return reset($rows); return reset($rows);
} }
function support($feature) { function support($feature) {
return ereg("view|drop_col|variables|status", $feature); //! return ereg("view|scheme|processlist|drop_col|variables|status", $feature); //!
} }
$jush = "oracle"; $jush = "oracle";

View File

@@ -174,7 +174,7 @@ if (isset($_GET["pgsql"])) {
} }
function limit($query, $where, $limit, $offset = 0, $separator = " ") { function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . (isset($limit) ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : ""); return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
} }
function limit1($query, $where) { function limit1($query, $where) {
@@ -205,7 +205,7 @@ if (isset($_GET["pgsql"])) {
function table_status($name = "") { function table_status($name = "") {
$return = array(); $return = array();
foreach (get_rows("SELECT relname AS \"Name\", CASE relkind WHEN 'r' THEN '' ELSE 'view' END AS \"Engine\", pg_relation_size(oid) AS \"Data_length\", pg_total_relation_size(oid) - pg_relation_size(oid) AS \"Index_length\", obj_description(oid, 'pg_class') AS \"Comment\", relhasoids AS \"Oid\" foreach (get_rows("SELECT relname AS \"Name\", CASE relkind WHEN 'r' THEN 'table' ELSE 'view' END AS \"Engine\", pg_relation_size(oid) AS \"Data_length\", pg_total_relation_size(oid) - pg_relation_size(oid) AS \"Index_length\", obj_description(oid, 'pg_class') AS \"Comment\", relhasoids AS \"Oid\", reltuples as \"Rows\"
FROM pg_class FROM pg_class
WHERE relkind IN ('r','v') WHERE relkind IN ('r','v')
AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())" AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())"
@@ -258,7 +258,7 @@ ORDER BY a.attnum"
$connection2 = $connection; $connection2 = $connection;
} }
$return = array(); $return = array();
$table_oid = $connection2->result("SELECT oid FROM pg_class WHERE relname = " . q($table)); $table_oid = $connection2->result("SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) AND relname = " . q($table));
$columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = $table_oid AND attnum > 0", $connection2); $columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = $table_oid AND attnum > 0", $connection2);
foreach (get_rows("SELECT relname, indisunique, indisprimary, indkey FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid", $connection2) as $row) { foreach (get_rows("SELECT relname, indisunique, indisprimary, indkey FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid", $connection2) as $row) {
$return[$row["relname"]]["type"] = ($row["indisprimary"] == "t" ? "PRIMARY" : ($row["indisunique"] == "t" ? "UNIQUE" : "INDEX")); $return[$row["relname"]]["type"] = ($row["indisprimary"] == "t" ? "PRIMARY" : ($row["indisunique"] == "t" ? "UNIQUE" : "INDEX"));

View File

@@ -30,7 +30,10 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
} }
function quote($string) { function quote($string) {
return "'" . $this->_link->escapeString($string) . "'"; return (is_utf8($string)
? "'" . $this->_link->escapeString($string) . "'"
: "x'" . reset(unpack('H*', $string)) . "'"
);
} }
function store_result() { function store_result() {
@@ -215,7 +218,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
} }
function limit($query, $where, $limit, $offset = 0, $separator = " ") { function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . (isset($limit) ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : ""); return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
} }
function limit1($query, $where) { function limit1($query, $where) {

View File

@@ -75,14 +75,14 @@ if ($fields) {
foreach ($fields as $name => $field) { foreach ($fields as $name => $field) {
echo "<tr><th>" . $adminer->fieldName($field); echo "<tr><th>" . $adminer->fieldName($field);
$default = $_GET["set"][bracket_escape($name)]; $default = $_GET["set"][bracket_escape($name)];
$value = (isset($row) $value = ($row !== null
? ($row[$name] != "" && ereg("enum|set", $field["type"]) ? (is_array($row[$name]) ? array_sum($row[$name]) : +$row[$name]) : $row[$name]) ? ($row[$name] != "" && ereg("enum|set", $field["type"]) ? (is_array($row[$name]) ? array_sum($row[$name]) : +$row[$name]) : $row[$name])
: (!$update && $field["auto_increment"] ? "" : (isset($_GET["select"]) ? false : (isset($default) ? $default : $field["default"]))) : (!$update && $field["auto_increment"] ? "" : (isset($_GET["select"]) ? false : ($default !== null ? $default : $field["default"])))
); );
if (!$_POST["save"] && is_string($value)) { if (!$_POST["save"] && is_string($value)) {
$value = $adminer->editVal($value, $field); $value = $adminer->editVal($value, $field);
} }
$function = ($_POST["save"] ? (string) $_POST["function"][$name] : ($update && $field["on_update"] == "CURRENT_TIMESTAMP" ? "now" : ($value === false ? null : (isset($value) ? '' : 'NULL')))); $function = ($_POST["save"] ? (string) $_POST["function"][$name] : ($update && $field["on_update"] == "CURRENT_TIMESTAMP" ? "now" : ($value === false ? null : ($value !== null ? '' : 'NULL'))));
if ($field["type"] == "timestamp" && $value == "CURRENT_TIMESTAMP") { if ($field["type"] == "timestamp" && $value == "CURRENT_TIMESTAMP") {
$value = ""; $value = "";
$function = "now"; $function = "now";

View File

@@ -9,7 +9,7 @@ if ($_GET["file"] == "favicon.ico") {
?>compile_file('../adminer/static/default.css', 'minify_css');<?php ?>compile_file('../adminer/static/default.css', 'minify_css');<?php
} elseif ($_GET["file"] == "functions.js") { } elseif ($_GET["file"] == "functions.js") {
header("Content-Type: text/javascript; charset=utf-8"); header("Content-Type: text/javascript; charset=utf-8");
?>compile_file('../adminer/static/functions.js', 'JSMin::minify');compile_file('static/editing.js', 'JSMin::minify');<?php ?>compile_file('../adminer/static/functions.js', 'jsShrink');compile_file('static/editing.js', 'jsShrink');<?php
} else { } else {
header("Content-Type: image/gif"); header("Content-Type: image/gif");
switch ($_GET["file"]) { switch ($_GET["file"]) {
@@ -18,7 +18,6 @@ if ($_GET["file"] == "favicon.ico") {
case "up.gif": echo base64_decode("compile_file('../adminer/static/up.gif', 'base64_encode');"); break; case "up.gif": echo base64_decode("compile_file('../adminer/static/up.gif', 'base64_encode');"); break;
case "down.gif": echo base64_decode("compile_file('../adminer/static/down.gif', 'base64_encode');"); break; case "down.gif": echo base64_decode("compile_file('../adminer/static/down.gif', 'base64_encode');"); break;
case "arrow.gif": echo base64_decode("compile_file('../adminer/static/arrow.gif', 'base64_encode');"); break; case "arrow.gif": echo base64_decode("compile_file('../adminer/static/arrow.gif', 'base64_encode');"); break;
case "loader.gif": echo base64_decode("compile_file('../adminer/static/loader.gif', 'base64_encode');"); break;
} }
} }
exit; exit;

View File

@@ -51,7 +51,7 @@ foreach (table_status() as $name => $table_status) {
<p> <p>
<?php if ($row["db"] == "" && $row["ns"] == "") { ?> <?php if ($row["db"] == "" && $row["ns"] == "") { ?>
<?php echo lang('Target table'); ?>: <?php echo lang('Target table'); ?>:
<?php echo html_select("table", $referencable, $row["table"], "this.form['change-js'].value = '1'; if (!ajaxForm(this.form)) 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=""> <input type="hidden" name="change-js" value="">
<noscript><p><input type="submit" name="change" value="<?php echo lang('Change'); ?>"></noscript> <noscript><p><input type="submit" name="change" value="<?php echo lang('Change'); ?>"></noscript>
<table cellspacing="0"> <table cellspacing="0">

View File

@@ -63,19 +63,20 @@ class Adminer {
global $drivers; global $drivers;
?> ?>
<table cellspacing="0"> <table cellspacing="0">
<tr><th><?php echo lang('System'); ?><td><?php echo html_select("driver", $drivers, DRIVER, "loginDriver(this);"); ?> <tr><th><?php echo lang('System'); ?><td><?php echo html_select("auth[driver]", $drivers, DRIVER, "loginDriver(this);"); ?>
<tr><th><?php echo lang('Server'); ?><td><input name="server" value="<?php echo h(SERVER); ?>" title="hostname[:port]"> <tr><th><?php echo lang('Server'); ?><td><input name="auth[server]" value="<?php echo h(SERVER); ?>" title="hostname[:port]">
<tr><th><?php echo lang('Username'); ?><td><input id="username" name="username" value="<?php echo h($_GET["username"]); ?>"> <tr><th><?php echo lang('Username'); ?><td><input id="username" name="auth[username]" value="<?php echo h($_GET["username"]); ?>">
<tr><th><?php echo lang('Password'); ?><td><input type="password" name="password"> <tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
<tr><th><?php echo lang('Database'); ?><td><input name="auth[db]" value="<?php echo h($_GET["db"]); ?>">
</table> </table>
<script type="text/javascript"> <script type="text/javascript">
var username = document.getElementById('username'); var username = document.getElementById('username');
username.focus(); username.focus();
username.form['driver'].onchange(); username.form['auth[driver]'].onchange();
</script> </script>
<?php <?php
echo "<p><input type='submit' value='" . lang('Login') . "'>\n"; echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
echo checkbox("permanent", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n"; echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
} }
/** Authorize the user /** Authorize the user
@@ -117,7 +118,7 @@ username.form['driver'].onchange();
} else { } else {
$links["create"] = lang('Alter table'); $links["create"] = lang('Alter table');
} }
if (isset($set)) { if ($set !== null) {
$links["edit"] = lang('New item'); $links["edit"] = lang('New item');
} }
foreach ($links as $key => $val) { foreach ($links as $key => $val) {
@@ -184,9 +185,9 @@ username.form['driver'].onchange();
* @return string * @return string
*/ */
function selectVal($val, $link, $field) { function selectVal($val, $link, $field) {
$return = ($val != "<i>NULL</i>" && ereg("char|binary", $field["type"]) && !ereg("var", $field["type"]) ? "<code>$val</code>" : $val); $return = ($val === null ? "<i>NULL</i>" : (ereg("char|binary", $field["type"]) && !ereg("var", $field["type"]) ? "<code>$val</code>" : $val));
if (ereg('blob|bytea|raw|file', $field["type"]) && !is_utf8($val)) { if (ereg('blob|bytea|raw|file', $field["type"]) && !is_utf8($val)) {
$return = lang('%d byte(s)', strlen(html_entity_decode($val, ENT_QUOTES))); $return = lang('%d byte(s)', strlen($val));
} }
return ($link ? "<a href='$link'>$return</a>" : $return); return ($link ? "<a href='$link'>$return</a>" : $return);
} }
@@ -232,23 +233,22 @@ username.form['driver'].onchange();
foreach ($indexes as $i => $index) { foreach ($indexes as $i => $index) {
if ($index["type"] == "FULLTEXT") { if ($index["type"] == "FULLTEXT") {
echo "(<i>" . implode("</i>, <i>", array_map('h', $index["columns"])) . "</i>) AGAINST"; echo "(<i>" . implode("</i>, <i>", array_map('h', $index["columns"])) . "</i>) AGAINST";
echo " <input name='fulltext[$i]' value='" . h($_GET["fulltext"][$i]) . "'>"; echo " <input name='fulltext[$i]' value='" . h($_GET["fulltext"][$i]) . "' onchange='selectFieldChange(this.form);'>";
echo checkbox("boolean[$i]", 1, isset($_GET["boolean"][$i]), "BOOL"); echo checkbox("boolean[$i]", 1, isset($_GET["boolean"][$i]), "BOOL");
echo "<br>\n"; echo "<br>\n";
} }
} }
$i = 0; $_GET["where"] = (array) $_GET["where"];
foreach ((array) $_GET["where"] as $val) { reset($_GET["where"]);
if ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators)) { $change_next = "this.nextSibling.onchange();";
echo "<div><select name='where[$i][col]'><option value=''>(" . lang('anywhere') . ")" . optionlist($columns, $val["col"], true) . "</select>"; for ($i = 0; $i <= count($_GET["where"]); $i++) {
echo html_select("where[$i][op]", $this->operators, $val["op"]); list(, $val) = each($_GET["where"]);
echo "<input name='where[$i][val]' value='" . h($val["val"]) . "'></div>\n"; if (!$val || ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators))) {
$i++; echo "<div><select name='where[$i][col]' onchange='$change_next'><option value=''>(" . lang('anywhere') . ")" . optionlist($columns, $val["col"], true) . "</select>";
echo html_select("where[$i][op]", $this->operators, $val["op"], $change_next);
echo "<input name='where[$i][val]' value='" . h($val["val"]) . "' onchange='" . ($val ? "selectFieldChange(this.form)" : "selectAddRow(this)") . ";'></div>\n";
} }
} }
echo "<div><select name='where[$i][col]' onchange='this.nextSibling.nextSibling.onchange();'><option value=''>(" . lang('anywhere') . ")" . optionlist($columns, null, true) . "</select>";
echo html_select("where[$i][op]", $this->operators, "=");
echo "<input name='where[$i][val]' onchange='selectAddRow(this);'></div>\n";
echo "</div></fieldset>\n"; echo "</div></fieldset>\n";
} }
@@ -263,7 +263,7 @@ username.form['driver'].onchange();
$i = 0; $i = 0;
foreach ((array) $_GET["order"] as $key => $val) { foreach ((array) $_GET["order"] as $key => $val) {
if (isset($columns[$val])) { if (isset($columns[$val])) {
echo "<div><select name='order[$i]'><option>" . optionlist($columns, $val, true) . "</select>"; echo "<div><select name='order[$i]' onchange='selectFieldChange(this.form);'><option>" . optionlist($columns, $val, true) . "</select>";
echo checkbox("desc[$i]", 1, isset($_GET["desc"][$key]), lang('descending')) . "</div>\n"; echo checkbox("desc[$i]", 1, isset($_GET["desc"][$key]), lang('descending')) . "</div>\n";
$i++; $i++;
} }
@@ -288,7 +288,7 @@ username.form['driver'].onchange();
* @return null * @return null
*/ */
function selectLengthPrint($text_length) { function selectLengthPrint($text_length) {
if (isset($text_length)) { if ($text_length !== null) {
echo "<fieldset><legend>" . lang('Text length') . "</legend><div>"; echo "<fieldset><legend>" . lang('Text length') . "</legend><div>";
echo '<input name="text_length" size="3" value="' . h($text_length) . '">'; echo '<input name="text_length" size="3" value="' . h($text_length) . '">';
echo "</div></fieldset>\n"; echo "</div></fieldset>\n";
@@ -296,11 +296,28 @@ username.form['driver'].onchange();
} }
/** Print action box in select /** Print action box in select
* @param array
* @return null * @return null
*/ */
function selectActionPrint() { function selectActionPrint($indexes) {
echo "<fieldset><legend>" . lang('Action') . "</legend><div>"; echo "<fieldset><legend>" . lang('Action') . "</legend><div>";
echo "<input type='submit' value='" . lang('Select') . "'>"; echo "<input type='submit' value='" . lang('Select') . "'>";
echo " <span id='noindex' title='" . lang('Full table scan') . "'></span>";
echo "<script type='text/javascript'>\n";
echo "var indexColumns = ";
$columns = array();
foreach ($indexes as $index) {
if ($index["type"] != "FULLTEXT") {
$columns[reset($index["columns"])] = 1;
}
}
$columns[""] = 1;
foreach ($columns as $key => $val) {
json_row($key);
}
echo ";\n";
echo "selectFieldChange(document.getElementById('form'));\n";
echo "</script>\n";
echo "</div></fieldset>\n"; echo "</div></fieldset>\n";
} }
@@ -438,11 +455,11 @@ username.form['driver'].onchange();
restart_session(); restart_session();
$id = "sql-" . ($count++); $id = "sql-" . ($count++);
$history = &get_session("queries"); $history = &get_session("queries");
if (strlen($query) > 1e6) { // not DB - reset in drop database if (strlen($query) > 1e6) {
$query = ereg_replace('[\x80-\xFF]+$', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment $query = ereg_replace('[\x80-\xFF]+$', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
} }
$history[$_GET["db"]][] = $query; // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"] $history[$_GET["db"]][] = array($query, time()); // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"]
return " <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a><div id='$id' class='hidden'><pre><code class='jush-$jush'>" . shorten_utf8($query, 1000) . '</code></pre><p><a href="' . h(str_replace("db=" . urlencode(DB), "db=" . urlencode($_GET["db"]), ME) . 'sql=&history=' . (count($history[$_GET["db"]]) - 1)) . '">' . lang('Edit') . '</a></div>'; return " <span class='time'>" . @date("H:i:s") . "</span> <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a><div id='$id' class='hidden'><pre><code class='jush-$jush'>" . shorten_utf8($query, 1000) . '</code></pre><p><a href="' . h(str_replace("db=" . urlencode(DB), "db=" . urlencode($_GET["db"]), ME) . 'sql=&history=' . (count($history[$_GET["db"]]) - 1)) . '">' . lang('Edit') . '</a></div>'; // @ - time zone may be not set
} }
/** Functions displayed in edit form /** Functions displayed in edit form
@@ -477,7 +494,7 @@ username.form['driver'].onchange();
function editInput($table, $field, $attrs, $value) { function editInput($table, $field, $attrs, $value) {
if ($field["type"] == "enum") { if ($field["type"] == "enum") {
return (isset($_GET["select"]) ? "<label><input type='radio'$attrs value='-1' checked><i>" . lang('original') . "</i></label> " : "") return (isset($_GET["select"]) ? "<label><input type='radio'$attrs value='-1' checked><i>" . lang('original') . "</i></label> " : "")
. ($field["null"] ? "<label><input type='radio'$attrs value=''" . (isset($value) || isset($_GET["select"]) ? "" : " checked") . "><i>NULL</i></label> " : "") . ($field["null"] ? "<label><input type='radio'$attrs value=''" . ($value !== null || isset($_GET["select"]) ? "" : " checked") . "><i>NULL</i></label> " : "")
. enum_input("radio", $attrs, $field, $value, 0) // 0 - empty . enum_input("radio", $attrs, $field, $value, 0) // 0 - empty
; ;
} }
@@ -577,12 +594,12 @@ CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN
$after = ""; $after = "";
foreach (get_rows($query) as $row) { foreach (get_rows($query) as $row) {
$default = $row["COLUMN_DEFAULT"]; $default = $row["COLUMN_DEFAULT"];
$row["default"] = (isset($default) ? q($default) : "NULL"); $row["default"] = ($default !== null ? q($default) : "NULL");
$row["after"] = q($after); //! rgt AFTER lft, lft AFTER id doesn't work $row["after"] = q($after); //! rgt AFTER lft, lft AFTER id doesn't work
$row["alter"] = escape_string(idf_escape($row["COLUMN_NAME"]) $row["alter"] = escape_string(idf_escape($row["COLUMN_NAME"])
. " $row[COLUMN_TYPE]" . " $row[COLUMN_TYPE]"
. ($row["COLLATION_NAME"] ? " COLLATE $row[COLLATION_NAME]" : "") . ($row["COLLATION_NAME"] ? " COLLATE $row[COLLATION_NAME]" : "")
. (isset($default) ? " DEFAULT " . ($default == "CURRENT_TIMESTAMP" ? $default : $row["default"]) : "") . ($default !== null ? " DEFAULT " . ($default == "CURRENT_TIMESTAMP" ? $default : $row["default"]) : "")
. ($row["IS_NULLABLE"] == "YES" ? "" : " NOT NULL") . ($row["IS_NULLABLE"] == "YES" ? "" : " NOT NULL")
. ($row["EXTRA"] ? " $row[EXTRA]" : "") . ($row["EXTRA"] ? " $row[EXTRA]" : "")
. ($row["COLUMN_COMMENT"] ? " COMMENT " . q($row["COLUMN_COMMENT"]) : "") . ($row["COLUMN_COMMENT"] ? " COMMENT " . q($row["COLUMN_COMMENT"]) : "")
@@ -667,7 +684,7 @@ DROP PROCEDURE adminer_alter;
$insert = "INSERT INTO " . table($table) . " (" . implode(", ", array_map('idf_escape', array_keys($row))) . ") VALUES"; $insert = "INSERT INTO " . table($table) . " (" . implode(", ", array_map('idf_escape', array_keys($row))) . ") VALUES";
} }
foreach ($row as $key => $val) { foreach ($row as $key => $val) {
$row[$key] = (isset($val) ? (ereg('int|float|double|decimal|bit', $fields[$key]["type"]) ? $val : q($val)) : "NULL"); //! columns looking like functions $row[$key] = ($val !== null ? (ereg('int|float|double|decimal|bit', $fields[$key]["type"]) ? $val : q($val)) : "NULL"); //! columns looking like functions
} }
$s = implode(",\t", $row); $s = implode(",\t", $row);
if ($style == "INSERT+UPDATE") { if ($style == "INSERT+UPDATE") {
@@ -699,6 +716,14 @@ DROP PROCEDURE adminer_alter;
} }
} }
/** Set export filename
* @param string
* @return string filename without extension
*/
function dumpFilename($identifier) {
return friendly_url($identifier != "" ? $identifier : (SERVER != "" ? SERVER : "localhost"));
}
/** Send headers for export /** Send headers for export
* @param string * @param string
* @param bool * @param bool
@@ -750,9 +775,9 @@ DROP PROCEDURE adminer_alter;
foreach ((array) $_SESSION["pwds"] as $driver => $servers) { foreach ((array) $_SESSION["pwds"] as $driver => $servers) {
foreach ($servers as $server => $usernames) { foreach ($servers as $server => $usernames) {
foreach ($usernames as $username => $password) { foreach ($usernames as $username => $password) {
if (isset($password)) { if ($password !== null) {
if ($first) { if ($first) {
echo "<p onclick='eventStop(event);'>\n"; echo "<p>\n";
$first = false; $first = false;
} }
echo "<a href='" . h(auth_url($driver, $server, $username)) . "'>($drivers[$driver]) " . h($username . ($server != "" ? "@$server" : "")) . "</a><br>\n"; echo "<a href='" . h(auth_url($driver, $server, $username)) . "'>($drivers[$driver]) " . h($username . ($server != "" ? "@$server" : "")) . "</a><br>\n";
@@ -773,7 +798,7 @@ DROP PROCEDURE adminer_alter;
} }
} }
?> ?>
<input type="submit" name="logout" value="<?php echo lang('Logout'); ?>" onclick="eventStop(event);"> <input type="submit" name="logout" value="<?php echo lang('Logout'); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="hidden" name="token" value="<?php echo $token; ?>">
</p> </p>
</form> </form>
@@ -781,7 +806,7 @@ DROP PROCEDURE adminer_alter;
<p> <p>
<?php hidden_fields_get(); ?> <?php hidden_fields_get(); ?>
<?php echo ($databases ? html_select("db", array("" => "(" . lang('database') . ")") + $databases, DB, "this.form.submit();") : '<input name="db" value="' . h(DB) . '">'); ?> <?php echo ($databases ? html_select("db", array("" => "(" . lang('database') . ")") + $databases, DB, "this.form.submit();") : '<input name="db" value="' . h(DB) . '">'); ?>
<input type="submit" value="<?php echo lang('Use'); ?>"<?php echo ($databases ? " class='hidden'" : ""); ?> onclick="eventStop(event);"> <input type="submit" value="<?php echo lang('Use'); ?>"<?php echo ($databases ? " class='hidden'" : ""); ?>>
<?php <?php
if ($missing != "db" && DB != "" && $connection->select_db(DB)) { if ($missing != "db" && DB != "" && $connection->select_db(DB)) {
if (support("scheme")) { if (support("scheme")) {
@@ -833,6 +858,6 @@ DROP PROCEDURE adminer_alter;
} }
$adminer = (function_exists('adminer_object') ? adminer_object() : new Adminer); $adminer = (function_exists('adminer_object') ? adminer_object() : new Adminer);
if (!isset($adminer->operators)) { if ($adminer->operators === null) {
$adminer->operators = $operators; $adminer->operators = $operators;
} }

View File

@@ -14,21 +14,23 @@ if ($_COOKIE["adminer_permanent"]) {
} }
} }
if (isset($_POST["server"])) { $auth = $_POST["auth"];
if ($auth) {
session_regenerate_id(); // defense against session fixation session_regenerate_id(); // defense against session fixation
$_SESSION["pwds"][$_POST["driver"]][$_POST["server"]][$_POST["username"]] = $_POST["password"]; $_SESSION["pwds"][$auth["driver"]][$auth["server"]][$auth["username"]] = $auth["password"];
if ($_POST["permanent"]) { if ($auth["permanent"]) {
$key = base64_encode($_POST["driver"]) . "-" . base64_encode($_POST["server"]) . "-" . base64_encode($_POST["username"]); $key = base64_encode($auth["driver"]) . "-" . base64_encode($auth["server"]) . "-" . base64_encode($auth["username"]);
$private = $adminer->permanentLogin(); $private = $adminer->permanentLogin();
$permanent[$key] = "$key:" . base64_encode($private ? encrypt_string($_POST["password"], $private) : ""); $permanent[$key] = "$key:" . base64_encode($private ? encrypt_string($auth["password"], $private) : "");
cookie("adminer_permanent", implode(" ", $permanent)); cookie("adminer_permanent", implode(" ", $permanent));
} }
if (count($_POST) == ($_POST["permanent"] ? 5 : 4) // 4 - driver, server, username, password if (count($_POST) == 1 // 1 - auth
|| DRIVER != $_POST["driver"] || DRIVER != $auth["driver"]
|| SERVER != $_POST["server"] || SERVER != $auth["server"]
|| $_GET["username"] !== $_POST["username"] // "0" == "00" || $_GET["username"] !== $auth["username"] // "0" == "00"
|| DB != $auth["db"]
) { ) {
redirect(auth_url($_POST["driver"], $_POST["server"], $_POST["username"])); redirect(auth_url($auth["driver"], $auth["server"], $auth["username"], $auth["db"]));
} }
} elseif ($_POST["logout"]) { } elseif ($_POST["logout"]) {
if ($token && $_POST["token"] != $token) { if ($token && $_POST["token"] != $token) {
@@ -67,17 +69,17 @@ function auth_error($exception = null) {
$error = lang('Session expired, please login again.'); $error = lang('Session expired, please login again.');
} else { } else {
$password = &get_session("pwds"); $password = &get_session("pwds");
if (isset($password)) { if ($password !== null) {
$error = h($exception ? $exception->getMessage() : (is_string($connection) ? $connection : lang('Invalid credentials.'))); $error = h($exception ? $exception->getMessage() : (is_string($connection) ? $connection : lang('Invalid credentials.')));
$password = null; $password = null;
} }
} }
} }
page_header(lang('Login'), $error, null); page_header(lang('Login'), $error, null);
echo "<form action='' method='post' onclick='eventStop(event);'>\n"; echo "<form action='' method='post'>\n";
$adminer->loginForm(); $adminer->loginForm();
echo "<div>"; echo "<div>";
hidden_fields($_POST, array("driver", "server", "username", "password", "permanent")); // expired session hidden_fields($_POST, array("auth")); // expired session
echo "</div>\n"; echo "</div>\n";
echo "</form>\n"; echo "</form>\n";
page_footer("auth"); page_footer("auth");
@@ -98,7 +100,7 @@ if (is_string($connection) || !$adminer->login($_GET["username"], get_session("p
} }
$token = $_SESSION["token"]; ///< @var string CSRF protection $token = $_SESSION["token"]; ///< @var string CSRF protection
if (isset($_POST["server"]) && $_POST["token"]) { if ($auth && $_POST["token"]) {
$_POST["token"] = $token; // reset token after explicit login $_POST["token"] = $token; // reset token after explicit login
} }
$error = ($_POST ///< @var string $error = ($_POST ///< @var string

View File

@@ -43,9 +43,9 @@ function connect_error() {
} }
echo "</table>\n"; echo "</table>\n";
echo "<script type='text/javascript'>tableCheck();</script>\n"; echo "<script type='text/javascript'>tableCheck();</script>\n";
echo "<p><input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm("formChecked(this, /db/)", 1) . ">\n"; // 1 - eventStop echo "<p><input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm("formChecked(this, /db/)") . ">\n";
echo "<input type='hidden' name='token' value='$token'>\n"; echo "<input type='hidden' name='token' value='$token'>\n";
echo "<a href='" . h(ME) . "refresh=1' onclick='eventStop(event);'>" . lang('Refresh') . "</a>\n"; echo "<a href='" . h(ME) . "refresh=1'>" . lang('Refresh') . "</a>\n";
echo "</form>\n"; echo "</form>\n";
} }
} }

View File

@@ -15,10 +15,7 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
} }
$title_all = $title . ($title2 != "" ? ": " . h($title2) : ""); $title_all = $title . ($title2 != "" ? ": " . h($title2) : "");
$title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name()); $title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name());
if (is_ajax()) { ?>
header("X-AJAX-Title: " . rawurlencode($title_page));
} else {
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="<?php echo $LANG; ?>" dir="<?php echo lang('ltr'); ?>"> <html lang="<?php echo $LANG; ?>" dir="<?php echo lang('ltr'); ?>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
@@ -26,10 +23,6 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
<meta name="robots" content="noindex"> <meta name="robots" content="noindex">
<title><?php echo $title_page; ?></title> <title><?php echo $title_page; ?></title>
<link rel="stylesheet" type="text/css" href="../adminer/static/default.css"> <link rel="stylesheet" type="text/css" href="../adminer/static/default.css">
<script type="text/javascript">
var areYouSure = '<?php echo lang('Resend POST data?'); ?>';
var noResponse = '<?php echo lang('No response from server.'); ?>';
</script>
<script type="text/javascript" src="../adminer/static/functions.js"></script> <script type="text/javascript" src="../adminer/static/functions.js"></script>
<script type="text/javascript" src="static/editing.js"></script> <script type="text/javascript" src="static/editing.js"></script>
<?php if ($adminer->head()) { ?> <?php if ($adminer->head()) { ?>
@@ -39,16 +32,14 @@ var noResponse = '<?php echo lang('No response from server.'); ?>';
<?php } ?> <?php } ?>
<?php } ?> <?php } ?>
<body class="<?php echo lang('ltr'); ?> nojs"<?php echo ($_POST ? "" : " onclick=\"return bodyClick(event, '" . h(js_escape(DB) . "', '" . js_escape($_GET["ns"])) . "');\""); // avoid re-post confirmation after refreshing the next page in Google Chrome ?> onkeydown="bodyKeydown(event);" onload="bodyLoad('<?php echo (is_object($connection) ? substr($connection->server_info, 0, 3) : ""); ?>');<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " verifyVersion();"); ?>"> <body class="<?php echo lang('ltr'); ?> nojs" onkeydown="bodyKeydown(event);" onload="bodyLoad('<?php echo (is_object($connection) ? substr($connection->server_info, 0, 3) : ""); ?>');<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " verifyVersion();"); ?>">
<script type="text/javascript"> <script type="text/javascript">
document.body.className = document.body.className.replace(/ nojs/, ' js'); document.body.className = document.body.className.replace(/ nojs/, ' js');
</script> </script>
<div id="loader"><img src="../adminer/static/loader.gif" alt=""></div>
<div id="content"> <div id="content">
<?php <?php
} if ($breadcrumb !== null) {
if (isset($breadcrumb)) {
$link = substr(preg_replace('~(username|db|ns)=[^&]*&~', '', ME), 0, -1); $link = substr(preg_replace('~(username|db|ns)=[^&]*&~', '', ME), 0, -1);
echo '<p id="breadcrumb"><a href="' . h($link ? $link : ".") . '">' . $drivers[DRIVER] . '</a> &raquo; '; echo '<p id="breadcrumb"><a href="' . h($link ? $link : ".") . '">' . $drivers[DRIVER] . '</a> &raquo; ';
$link = substr(preg_replace('~(db|ns)=[^&]*&~', '', ME), 0, -1); $link = substr(preg_replace('~(db|ns)=[^&]*&~', '', ME), 0, -1);
@@ -98,8 +89,7 @@ document.body.className = document.body.className.replace(/ nojs/, ' js');
*/ */
function page_footer($missing = "") { function page_footer($missing = "") {
global $adminer; global $adminer;
if (!is_ajax()) { ?>
?>
</div> </div>
<?php switch_lang(); ?> <?php switch_lang(); ?>
@@ -107,5 +97,4 @@ function page_footer($missing = "") {
<?php $adminer->navigation($missing); ?> <?php $adminer->navigation($missing); ?>
</div> </div>
<?php <?php
}
} }

View File

@@ -3,14 +3,16 @@
* @param Min_Result * @param Min_Result
* @param Min_DB connection to examine indexes * @param Min_DB connection to examine indexes
* @param string base link for <th> fields * @param string base link for <th> fields
* @param array
* @return null * @return null
*/ */
function select($result, $connection2 = null, $href = "") { function select($result, $connection2 = null, $href = "", $orgtables = array()) {
$links = array(); // colno => orgtable - create links from these columns $links = array(); // colno => orgtable - create links from these columns
$indexes = array(); // orgtable => array(column => colno) - primary keys $indexes = array(); // orgtable => array(column => colno) - primary keys
$columns = array(); // orgtable => array(column => ) - not selected columns in primary key $columns = array(); // orgtable => array(column => ) - not selected columns in primary key
$blobs = array(); // colno => bool - display bytes for blobs $blobs = array(); // colno => bool - display bytes for blobs
$types = array(); // colno => type - display char in <code> $types = array(); // colno => type - display char in <code>
$return = array(); // table => orgtable - mapping to use in EXPLAIN
odd(''); // reset odd for each result odd(''); // reset odd for each result
for ($i=0; $row = $result->fetch_row(); $i++) { for ($i=0; $row = $result->fetch_row(); $i++) {
if (!$i) { if (!$i) {
@@ -21,6 +23,7 @@ function select($result, $connection2 = null, $href = "") {
$name = $field->name; $name = $field->name;
$orgtable = $field->orgtable; $orgtable = $field->orgtable;
$orgname = $field->orgname; $orgname = $field->orgname;
$return[$field->table] = $orgtable;
if ($href) { // MySQL EXPLAIN if ($href) { // MySQL EXPLAIN
$links[$j] = ($name == "table" ? "table=" : ($name == "possible_keys" ? "indexes=" : null)); $links[$j] = ($name == "table" ? "table=" : ($name == "possible_keys" ? "indexes=" : null));
} elseif ($orgtable != "") { } elseif ($orgtable != "") {
@@ -52,7 +55,7 @@ function select($result, $connection2 = null, $href = "") {
} }
echo "<tr" . odd() . ">"; echo "<tr" . odd() . ">";
foreach ($row as $key => $val) { foreach ($row as $key => $val) {
if (!isset($val)) { if ($val === null) {
$val = "<i>NULL</i>"; $val = "<i>NULL</i>";
} elseif ($blobs[$key] && !is_utf8($val)) { } elseif ($blobs[$key] && !is_utf8($val)) {
$val = "<i>" . lang('%d byte(s)', strlen($val)) . "</i>"; //! link to download $val = "<i>" . lang('%d byte(s)', strlen($val)) . "</i>"; //! link to download
@@ -66,7 +69,8 @@ function select($result, $connection2 = null, $href = "") {
} }
if (isset($links[$key]) && !$columns[$links[$key]]) { if (isset($links[$key]) && !$columns[$links[$key]]) {
if ($href) { // MySQL EXPLAIN if ($href) { // MySQL EXPLAIN
$link = $links[$key] . urlencode($row[array_search("table=", $links)]); $table = $row[array_search("table=", $links)];
$link = $links[$key] . urlencode($orgtables[$table] != "" ? $orgtables[$table] : $table);
} else { } else {
$link = "edit=" . urlencode($links[$key]); $link = "edit=" . urlencode($links[$key]);
foreach ($indexes[$links[$key]] as $col => $j) { foreach ($indexes[$links[$key]] as $col => $j) {
@@ -79,6 +83,7 @@ function select($result, $connection2 = null, $href = "") {
} }
} }
echo ($i ? "</table>" : "<p class='message'>" . lang('No rows.')) . "\n"; echo ($i ? "</table>" : "<p class='message'>" . lang('No rows.')) . "\n";
return $return;
} }
/** Get referencable tables with single column primary key except self /** Get referencable tables with single column primary key except self
@@ -114,7 +119,7 @@ function textarea($name, $value, $rows = 10, $cols = 80) {
echo "<textarea name='$name' rows='$rows' cols='$cols' class='sqlarea' spellcheck='false' wrap='off' onkeydown='return textareaKeydown(this, event);'>"; // spellcheck, wrap - not valid before HTML5 echo "<textarea name='$name' rows='$rows' cols='$cols' class='sqlarea' spellcheck='false' wrap='off' onkeydown='return textareaKeydown(this, event);'>"; // spellcheck, wrap - not valid before HTML5
if (is_array($value)) { if (is_array($value)) {
foreach ($value as $val) { // not implode() to save memory foreach ($value as $val) { // not implode() to save memory
echo h($val) . "\n\n\n"; echo h($val[0]) . "\n\n\n"; // $val == array($query, $time)
} }
} else { } else {
echo h($value); echo h($value);
@@ -229,7 +234,7 @@ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $forei
<td<?php echo ($_POST["defaults"] ? "" : " class='hidden'"); ?>><?php echo lang('Default values'); ?> <td<?php echo ($_POST["defaults"] ? "" : " class='hidden'"); ?>><?php echo lang('Default values'); ?>
<?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?> <?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
<?php } ?> <?php } ?>
<td><?php echo "<input type='image' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?><script type="text/javascript">row_count = <?php echo count($fields); ?>;</script> <td><?php echo "<input type='image' class='icon' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?><script type="text/javascript">row_count = <?php echo count($fields); ?>;</script>
</thead> </thead>
<tbody onkeydown="return editingKeydown(event);"> <tbody onkeydown="return editingKeydown(event);">
<?php <?php
@@ -251,11 +256,11 @@ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $forei
<?php <?php
echo "<td>"; echo "<td>";
echo (support("move_col") ? echo (support("move_col") ?
"<input type='image' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, $allowed, 1);'>&nbsp;" "<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, $allowed, 1);'>&nbsp;"
. "<input type='image' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "'>&nbsp;" . "<input type='image' class='icon' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "'>&nbsp;"
. "<input type='image' name='down[$i]' src='../adminer/static/down.gif' alt='v' title='" . lang('Move down') . "'>&nbsp;" . "<input type='image' class='icon' name='down[$i]' src='../adminer/static/down.gif' alt='v' title='" . lang('Move down') . "'>&nbsp;"
: ""); : "");
echo ($orig == "" || support("drop_col") ? "<input type='image' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick='return !editingRemoveRow(this);'>" : ""); echo ($orig == "" || support("drop_col") ? "<input type='image' class='icon' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick='return !editingRemoveRow(this);'>" : "");
echo "\n"; echo "\n";
} }
} }
@@ -361,7 +366,7 @@ function tar_file($filename, $contents) {
$return = pack("a100a8a8a8a12a12", $filename, 644, 0, 0, decoct(strlen($contents)), decoct(time())); $return = pack("a100a8a8a8a12a12", $filename, 644, 0, 0, decoct(strlen($contents)), decoct(time()));
$checksum = 8*32; // space for checksum itself $checksum = 8*32; // space for checksum itself
for ($i=0; $i < strlen($return); $i++) { for ($i=0; $i < strlen($return); $i++) {
$checksum += ord($return{$i}); $checksum += ord($return[$i]);
} }
$return .= sprintf("%06o", $checksum) . "\0 "; $return .= sprintf("%06o", $checksum) . "\0 ";
return $return . str_repeat("\0", 512 - strlen($return)) . $contents . str_repeat("\0", 511 - (strlen($contents) + 511) % 512); return $return . str_repeat("\0", 512 - strlen($return)) . $contents . str_repeat("\0", 511 - (strlen($contents) + 511) % 512);

View File

@@ -149,11 +149,10 @@ function html_select($name, $options, $value = "", $onchange = true) {
/** Get onclick confirmation /** Get onclick confirmation
* @param string JavaScript expression * @param string JavaScript expression
* @param bool stop event propagation
* @return string * @return string
*/ */
function confirm($count = "", $stop = false) { function confirm($count = "") {
return " onclick=\"" . ($stop ? "eventStop(event); " : "") . "return confirm('" . lang('Are you sure?') . ($count ? " (' + $count + ')" : "") . "');\""; return " onclick=\"return confirm('" . lang('Are you sure?') . ($count ? " (' + $count + ')" : "") . "');\"";
} }
/** Print header for hidden fieldset (close by </div></fieldset>) /** Print header for hidden fieldset (close by </div></fieldset>)
@@ -206,7 +205,7 @@ function json_row($key, $val = null) {
echo "{"; echo "{";
} }
if ($key != "") { if ($key != "") {
echo ($first ? "" : ",") . "\n\t\"" . addcslashes($key, "\r\n\"\\") . '": ' . (isset($val) ? '"' . addcslashes($val, "\r\n\"\\") . '"' : 'undefined'); echo ($first ? "" : ",") . "\n\t\"" . addcslashes($key, "\r\n\"\\") . '": ' . ($val !== null ? '"' . addcslashes($val, "\r\n\"\\") . '"' : 'undefined');
$first = false; $first = false;
} else { } else {
echo "\n}\n"; echo "\n}\n";
@@ -228,7 +227,7 @@ function ini_bool($ini) {
*/ */
function sid() { function sid() {
static $return; static $return;
if (!isset($return)) { // restart_session() defines SID if ($return === null) { // restart_session() defines SID
$return = (SID && !($_COOKIE && ini_bool("session.use_cookies"))); // $_COOKIE - don't pass SID with permanent login $return = (SID && !($_COOKIE && ini_bool("session.use_cookies"))); // $_COOKIE - don't pass SID with permanent login
} }
return $return; return $return;
@@ -364,7 +363,7 @@ function where_check($val) {
* @return string * @return string
*/ */
function where_link($i, $column, $value, $operator = "=") { function where_link($i, $column, $value, $operator = "=") {
return "&where%5B$i%5D%5Bcol%5D=" . urlencode($column) . "&where%5B$i%5D%5Bop%5D=" . urlencode((isset($value) ? $operator : "IS NULL")) . "&where%5B$i%5D%5Bval%5D=" . urlencode($value); return "&where%5B$i%5D%5Bcol%5D=" . urlencode($column) . "&where%5B$i%5D%5Bop%5D=" . urlencode(($value !== null ? $operator : "IS NULL")) . "&where%5B$i%5D%5Bval%5D=" . urlencode($value);
} }
/** Set cookie valid for 1 month /** Set cookie valid for 1 month
@@ -418,15 +417,17 @@ function set_session($key, $val) {
* @param string * @param string
* @param string * @param string
* @param string * @param string
* @param string
* @return string * @return string
*/ */
function auth_url($driver, $server, $username) { function auth_url($driver, $server, $username, $db = null) {
global $drivers; global $drivers;
preg_match('~([^?]*)\\??(.*)~', remove_from_uri(implode("|", array_keys($drivers)) . "|username|" . session_name()), $match); preg_match('~([^?]*)\\??(.*)~', remove_from_uri(implode("|", array_keys($drivers)) . "|username|" . ($db !== null ? "db|" : "") . session_name()), $match);
return "$match[1]?" return "$match[1]?"
. (sid() ? SID . "&" : "") . (sid() ? SID . "&" : "")
. ($driver != "server" || $server != "" ? urlencode($driver) . "=" . urlencode($server) . "&" : "") . ($driver != "server" || $server != "" ? urlencode($driver) . "=" . urlencode($server) . "&" : "")
. "username=" . urlencode($username) . "username=" . urlencode($username)
. ($db != "" ? "&db=" . urlencode($db) : "")
. ($match[2] ? "&$match[2]" : "") . ($match[2] ? "&$match[2]" : "")
; ;
} }
@@ -444,15 +445,15 @@ function is_ajax() {
* @return null * @return null
*/ */
function redirect($location, $message = null) { function redirect($location, $message = null) {
if (isset($message)) { if ($message !== null) {
restart_session(); restart_session();
$_SESSION["messages"][preg_replace('~^[^?]*~', '', (isset($location) ? $location : $_SERVER["REQUEST_URI"]))][] = $message; $_SESSION["messages"][preg_replace('~^[^?]*~', '', ($location !== null ? $location : $_SERVER["REQUEST_URI"]))][] = $message;
} }
if (isset($location)) { if ($location !== null) {
if ($location == "") { if ($location == "") {
$location = "."; $location = ".";
} }
header((is_ajax() ? "X-AJAX-Redirect" : "Location") . ": $location"); header("Location: $location");
exit; exit;
} }
} }
@@ -492,7 +493,7 @@ function query_redirect($query, $location, $message, $redirect = true, $execute
function queries($query = null) { function queries($query = null) {
global $connection; global $connection;
static $queries = array(); static $queries = array();
if (!isset($query)) { if ($query === null) {
// return executed queries without parameter // return executed queries without parameter
return implode(";\n", $queries); return implode(";\n", $queries);
} }
@@ -668,7 +669,7 @@ function column_foreign_keys($table) {
function enum_input($type, $attrs, $field, $value, $empty = null) { function enum_input($type, $attrs, $field, $value, $empty = null) {
global $adminer; global $adminer;
preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches); preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
$return = (isset($empty) ? "<label><input type='$type'$attrs value='$empty'" . ((is_array($value) ? in_array($empty, $value) : $value === 0) ? " checked" : "") . "><i>" . lang('empty') . "</i></label>" : ""); $return = ($empty !== null ? "<label><input type='$type'$attrs value='$empty'" . ((is_array($value) ? in_array($empty, $value) : $value === 0) ? " checked" : "") . "><i>" . lang('empty') . "</i></label>" : "");
foreach ($matches[1] as $i => $val) { foreach ($matches[1] as $i => $val) {
$val = stripcslashes(str_replace("''", "'", $val)); $val = stripcslashes(str_replace("''", "'", $val));
$checked = (is_int($value) ? $value == $i+1 : (is_array($value) ? in_array($i+1, $value) : $value === $val)); $checked = (is_int($value) ? $value == $i+1 : (is_array($value) ? in_array($i+1, $value) : $value === $val));
@@ -705,7 +706,7 @@ function input($field, $value, $function) {
} }
$onchange = ($first ? " onchange=\"var f = this.form['function[" . h(js_escape(bracket_escape($field["field"]))) . "]']; if ($first > f.selectedIndex) f.selectedIndex = $first;\"" : ""); $onchange = ($first ? " onchange=\"var f = this.form['function[" . h(js_escape(bracket_escape($field["field"]))) . "]']; if ($first > f.selectedIndex) f.selectedIndex = $first;\"" : "");
$attrs .= $onchange; $attrs .= $onchange;
echo (count($functions) > 1 ? html_select("function[$name]", $functions, !isset($function) || in_array($function, $functions) || isset($functions[$function]) ? $function : "", "functionChange(this);") : nbsp(reset($functions))) . '<td>'; echo (count($functions) > 1 ? html_select("function[$name]", $functions, $function === null || in_array($function, $functions) || isset($functions[$function]) ? $function : "", "functionChange(this);") : nbsp(reset($functions))) . '<td>';
$input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table $input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table
if ($input != "") { if ($input != "") {
echo $input; echo $input;
@@ -804,7 +805,7 @@ function dump_headers($identifier, $multi_table = false) {
$return = $adminer->dumpHeaders($identifier, $multi_table); $return = $adminer->dumpHeaders($identifier, $multi_table);
$output = $_POST["output"]; $output = $_POST["output"];
if ($output != "text") { if ($output != "text") {
header("Content-Disposition: attachment; filename=" . friendly_url($identifier != "" ? $identifier : (SERVER != "" ? SERVER : "localhost")) . ".$return" . ($output != "file" && !ereg('[^0-9a-z]', $output) ? ".$output" : "")); header("Content-Disposition: attachment; filename=" . $adminer->dumpFilename($identifier) . ".$return" . ($output != "file" && !ereg('[^0-9a-z]', $output) ? ".$output" : ""));
} }
session_write_close(); session_write_close();
return $return; return $return;

View File

@@ -14,16 +14,19 @@ $langs = array(
'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu 'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu
'pl' => 'Polski', // Radosław Kowalewski - http://srsbiz.pl/ 'pl' => 'Polski', // Radosław Kowalewski - http://srsbiz.pl/
'ca' => 'Català', // Joan Llosas 'ca' => 'Català', // Joan Llosas
'pt' => 'Português', // Gian Live - gian@live.com 'pt' => 'Português', // Gian Live - gian@live.com, Davi Alexandre davi@davialexandre.com.br
'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com 'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com
'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt 'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com 'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com
'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com 'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com
'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
'ru' => 'Русский язык', // Maksim Izmaylov 'ru' => 'Русский язык', // Maksim Izmaylov
'uk' => 'Українська', // Valerii Kryzhov
'zh' => '简体中文', // Mr. Lodar 'zh' => '简体中文', // Mr. Lodar
'zh-tw' => '繁體中文', // http://tzangms.com 'zh-tw' => '繁體中文', // http://tzangms.com
'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/ 'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/
'ta' => 'த‌மிழ்', // G. Sampath Kumar, Chennai, India, sampathkumar11@gmail.com 'ta' => 'த‌மிழ்', // G. Sampath Kumar, Chennai, India, sampathkumar11@gmail.com
'bn' => 'বাংলা', // Dipak Kumar - dipak.ndc@gmail.com
'ar' => 'العربية', // Y.M Amine - Algeria - nbr7@live.fr 'ar' => 'العربية', // Y.M Amine - Algeria - nbr7@live.fr
'fa' => 'فارسی', // mojtaba barghbani - Iran - mbarghbani@gmail.com 'fa' => 'فارسی', // mojtaba barghbani - Iran - mbarghbani@gmail.com
); );
@@ -43,7 +46,7 @@ function get_lang() {
*/ */
function lang($idf, $number = null) { function lang($idf, $number = null) {
global $LANG, $translations; global $LANG, $translations;
$translation = $translations[$idf]; $translation = (isset($translations[$idf]) ? $translations[$idf] : $idf);
if (is_array($translation)) { if (is_array($translation)) {
$pos = ($number == 1 ? 0 $pos = ($number == 1 ? 0
: ($LANG == 'cs' || $LANG == 'sk' ? ($number && $number < 5 ? 1 : 2) // different forms for 1, 2-4, other : ($LANG == 'cs' || $LANG == 'sk' ? ($number && $number < 5 ? 1 : 2) // different forms for 1, 2-4, other
@@ -51,14 +54,18 @@ function lang($idf, $number = null) {
: ($LANG == 'pl' ? ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2) // different forms for 1, 2-4, other : ($LANG == 'pl' ? ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2) // different forms for 1, 2-4, other
: ($LANG == 'sl' ? ($number % 100 == 1 ? 0 : ($number % 100 == 2 ? 1 : ($number % 100 == 3 || $number % 100 == 4 ? 2 : 3))) // different forms for 1, 2, 3-4, other : ($LANG == 'sl' ? ($number % 100 == 1 ? 0 : ($number % 100 == 2 ? 1 : ($number % 100 == 3 || $number % 100 == 4 ? 2 : 3))) // different forms for 1, 2, 3-4, other
: ($LANG == 'lt' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 12-19, other : ($LANG == 'lt' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 12-19, other
: ($LANG == 'ru' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 2-4, other : ($LANG == 'ru' || $LANG == 'uk' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 2-4, other
: 1 : 1
))))))); // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html ))))))); // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
$translation = $translation[$pos]; $translation = $translation[$pos];
} }
$args = func_get_args(); $args = func_get_args();
array_shift($args); array_shift($args);
return vsprintf((isset($translation) ? $translation : $idf), $args); $format = str_replace("%d", "%s", $translation);
if ($format != $translation) {
$args[0] = number_format($number, 0, ".", lang(','));
}
return vsprintf($format, $args);
} }
function switch_lang() { function switch_lang() {

View File

@@ -50,7 +50,8 @@ if (extension_loaded('pdo')) {
} }
function next_result() { function next_result() {
return $this->_result->nextRowset(); $this->_result->_offset = 0;
return @$this->_result->nextRowset(); // @ - PDO_PgSQL doesn't support it
} }
function result($query, $field = 0) { function result($query, $field = 0) {
@@ -78,7 +79,7 @@ if (extension_loaded('pdo')) {
$row = (object) $this->getColumnMeta($this->_offset++); $row = (object) $this->getColumnMeta($this->_offset++);
$row->orgtable = $row->table; $row->orgtable = $row->table;
$row->orgname = $row->name; $row->orgname = $row->name;
$row->charsetnr = (in_array("blob", $row->flags) ? 63 : 0); $row->charsetnr = (in_array("blob", (array) $row->flags) ? 63 : 0);
return $row; return $row;
} }
} }

View File

@@ -1,2 +1,2 @@
<?php <?php
$VERSION = "3.3.4"; $VERSION = "3.4.0";

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'نسخ', 'Copy' => 'نسخ',
'Permanent link' => 'وصلة دائمة', 'Permanent link' => 'وصلة دائمة',
'Edit all' => 'تعديل الكل', 'Edit all' => 'تعديل الكل',
'Resend POST data?' => 'هل تود إعادة إرسال بيانات POST ؟',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

272
adminer/lang/bn.inc.php Normal file
View File

@@ -0,0 +1,272 @@
<?php
$translations = array(
'Login' => 'লগইন',
'Logout successful.' => 'লগআউট সম্পন্ন হয়েছে।',
'Invalid credentials.' => 'ভুল পাসওয়ার্ড।',
'Server' => 'সার্ভার',
'Username' => 'ইউজারের নাম',
'Password' => 'পাসওয়ার্ড',
'Select database' => 'ডাটাবেজ নির্বাচন করো',
'Invalid database.' => 'ভুল ডাটাবেজ।',
'Create new database' => 'নতুন ডাটাবেজ তৈরী করো',
'Table has been dropped.' => 'টেবিল মুছে ফেলা হয়েছে।',
'Table has been altered.' => 'টেবিল সম্পাদনা করা হয়েছে।',
'Table has been created.' => 'টেবিল তৈরী করা হয়েছে।',
'Alter table' => 'টেবিল সম্পাদনা',
'Create table' => 'টেবিল তৈরী করো',
'Table name' => 'টেবিলের নাম',
'engine' => 'ইন্জিন',
'collation' => 'কলোকেশন',
'Column name' => 'কলামের নাম',
'Type' => 'টাইপ',
'Length' => 'দৈর্ঘ্য',
'Auto Increment' => 'স্বয়ংক্রিয় বৃদ্ধি',
'Options' => 'অপশন',
'Save' => 'সংরক্ষণ',
'Drop' => 'মুছে ফেলো',
'Database has been dropped.' => 'ডাটাবেজ মুছে ফেলা হয়েছে।',
'Database has been created.' => 'ডাটাবেজ তৈরী করা হয়েছে।',
'Database has been renamed.' => 'ডাটাবেজের নতুন নামকরণ করা হয়েছে।',
'Database has been altered.' => 'ডাটাবেজ সম্পাদনা করা হয়েছে।',
'Alter database' => 'ডাটাবেজ সম্পাদনা',
'Create database' => 'ডাটাবেজ তৈরী',
'SQL command' => 'SQL-কোয়্যারী',
'Dump' => 'এক্সপোর্ট',
'Logout' => 'লগআউট',
'database' => 'ডাটাবেজ',
'Use' => 'ব্যবহার',
'No tables.' => 'কোন টেবিল নাই।',
'select' => 'নির্বাচন',
'Create new table' => 'নতুন টেবিল তৈরী করো',
'Item has been deleted.' => 'বিষয়বস্তু মুছে ফেলা হয়েছে।',
'Item has been updated.' => 'বিষয়বস্তু আপডেট করা হয়েছে।',
'Item%s has been inserted.' => 'বিষয়বস্তুসমূহ সংযোজন করা হয়েছে।',
'Edit' => 'সম্পাদনা',
'Insert' => 'সংযোজন',
'Save and insert next' => 'সংরক্ষন ও পরবর্তী সংযোজন',
'Delete' => 'মুছে ফেলো',
'Database' => 'ডাটাবেজ',
'Routines' => 'রুটিনসমূহ',
'Indexes have been altered.' => 'সূচীসমূহ সম্পাদনা করা হয়েছে।',
'Indexes' => 'সূচীসমূহ',
'Alter indexes' => 'সূচীসমূহ সম্পাদনা',
'Add next' => 'সংযোজন',
'Language' => 'ভাষা',
'Select' => 'নির্বাচন',
'New item' => 'নতুন বিষয়বস্তু',
'Search' => 'খোঁজ',
'Sort' => 'সাজানো',
'descending' => 'ক্রমহ্রাস',
'Limit' => 'সীমা',
'No rows.' => 'কোন সারি নাই।',
'Action' => 'ক্রিয়া',
'edit' => 'সম্পাদনা',
'Page' => 'পৃষ্ঠা',
'Query executed OK, %d row(s) affected.' => array('কোয়্যারী সম্পাদন হয়েছে, %d সারি প্রভাবিত হয়েছে।', 'কোয়্যারী সম্পাদন হয়েছে, %d সারি প্রভাবিত হয়েছে।'),
'Error in query' => 'কোয়্যারীতে ভুল আছে।',
'Execute' => 'সম্পাদন করো',
'Table' => 'টেবিল',
'Foreign keys' => 'ফরেন কী',
'Triggers' => 'ট্রিগার',
'View' => 'ভিউ',
'Unable to select the table' => 'টেবিল নির্বাচন করতে অক্ষম',
'Invalid CSRF token. Send the form again.' => 'অবৈধ CSRF টোকেন। ফর্ম আবার পাঠাও।',
'Comment' => 'মন্তব্য',
'Default values' => 'ডিফল্ট মান',
'%d byte(s)' => array('%d বাইট', '%d বাইটসমূহ'),
'No commands to execute.' => 'সম্পাদন করার মত কোন নির্দেশ নাই।',
'Unable to upload a file.' => 'ফাইল আপলোড করা সম্ভব হচ্ছে না।',
'File upload' => 'ফাইল আপলোড',
'File uploads are disabled.' => 'ফাইল আপলোড নিষ্ক্রিয় করা আছে।',
'Routine has been called, %d row(s) affected.' => array('রুটিন কল করা হয়েছে, %d টি সারি (সমূহ) প্রভাবিত হয়েছে।', 'রুটিন কল করা হয়েছে, %d টি সারি (সমূহ) প্রভাবিত হয়েছে।'),
'Call' => 'কল',
'No extension' => 'কোন এক্সটেনশান নাই',
'None of the supported PHP extensions (%s) are available.' => 'কোন PHP সমর্থিত এক্সটেনশন (%s) পাওয়া যায় নাই।',
'Session support must be enabled.' => 'সেশন সমর্থন সক্রিয় করা আবশ্যক।',
'Session expired, please login again.' => 'সেশানের মেয়াদ শেষ হয়েছে, আবার লগইন করুন।',
'Text length' => 'টেক্সট দৈর্ঘ্য',
'Foreign key has been dropped.' => 'ফরেন কী মুছে ফেলা হয়েছে।',
'Foreign key has been altered.' => 'ফরেন কী সম্পাদনা করা হয়েছে।',
'Foreign key has been created.' => 'ফরেন কী তৈরী করা হয়েছে।',
'Foreign key' => 'ফরেন কী ',
'Target table' => 'টার্গেট টেবিল',
'Change' => 'পরিবর্তন',
'Source' => 'উৎস',
'Target' => 'লক্ষ্য',
'Add column' => 'কলাম সংযোজন',
'Alter' => 'সম্পাদনা',
'Add foreign key' => 'ফরেন কী সংযোজন করো',
'ON DELETE' => 'অন ডিলিট',
'ON UPDATE' => 'অন আপডেট',
'Index Type' => 'সূচী-ধরণ',
'Column (length)' => 'কলাম (দৈর্ঘ্য)',
'View has been dropped.' => 'ভিউ মুছে ফেলা হয়েছে।',
'View has been altered.' => 'ভিউ সম্পাদনা করা হয়েছে।',
'View has been created.' => 'ভিউ তৈরী করা হয়েছে।',
'Alter view' => 'ভিউ সম্পাদনা করো',
'Create view' => 'ভিউ তৈরী করো',
'Name' => 'নাম',
'Process list' => 'প্রসেস তালিকা',
'%d process(es) have been killed.' => array('%d টি প্রসেস (সমূহ) বিনষ্ট করা হয়েছে।', '%d টি প্রসেস (সমূহ) বিনষ্ট করা হয়েছে।'),
'Kill' => 'বিনষ্ট করো',
'Parameter name' => 'প্যারামিটারের নাম',
'Database schema' => 'ডাটাবেজ স্কিমা',
'Create procedure' => 'প্রসিডিওর তৈরী করো',
'Create function' => 'ফাংশন তৈরী করো',
'Routine has been dropped.' => 'রুটিন মুছে ফেলা হয়েছে।',
'Routine has been altered.' => 'রুটিন সম্পাদনা করা হয়েছে।',
'Routine has been created.' => 'রুটিন তৈরী করা হয়েছে।',
'Alter function' => 'ফাংশন সম্পাদনা করো',
'Alter procedure' => 'প্রসিডিওর সম্পাদনা করো',
'Return type' => 'রিটার্ন টাইপ',
'Add trigger' => 'ট্রিগার সংযোজন করো',
'Trigger has been dropped.' => 'ট্রিগার মুছে ফেলা হয়েছে।',
'Trigger has been altered.' => 'ট্রিগার সম্পাদনা করা হয়েছে।',
'Trigger has been created.' => 'ট্রিগার তৈরী করা হয়েছে।',
'Alter trigger' => 'ট্রিগার সম্পাদনা করো',
'Create trigger' => 'ট্রিগার তৈরী করো',
'Time' => 'সময়',
'Event' => 'ইভেন্ট',
'%s version: %s through PHP extension %s' => 'ভার্সন %s: %s, %s PHP এক্সটেনশনের মধ্য দিয়ে',
'%d row(s)' => array('%d সারি', '%d সারি সমূহ'),
'Remove' => 'অপসারণ',
'Are you sure?' => 'তুমি কি নিশ্চিত?',
'Privileges' => 'প্রিভিলেজেস',
'Create user' => 'ইউজার তৈরী করো',
'User has been dropped.' => 'ইউজার মুছে ফেলা হয়েছে।',
'User has been altered.' => 'ইউজার সম্পাদনা করা হয়েছে।',
'User has been created.' => 'ইউজার তৈরী করা হয়েছে।',
'Hashed' => 'হ্যাসড',
'Column' => 'কলাম',
'Routine' => 'রুটিন',
'Grant' => 'গ্র্যান্ট',
'Revoke' => 'রিভোক',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'খুব বড় POST ডাটা। ডাটা সংক্ষিপ্ত করো অথবা %s কনফিগারেশন নির্দেশ বৃদ্ধি করো',
'Logged as: %s' => '%s হিসাবে লগড',
'Move up' => 'উপরে স্থানান্তর',
'Move down' => 'নীচে স্থানান্তর',
'Functions' => 'ফাংশন সমূহ',
'Aggregation' => 'মোট পরিমাণ',
'Export' => 'এক্সপোর্ট',
'Output' => 'আউটপুট',
'open' => 'খোলা',
'save' => 'সংরক্ষণ',
'Format' => 'বিন্যাস',
'Tables' => 'টেবিলসমূহ',
'Data' => 'ডাটা',
'Event has been dropped.' => 'ইভেন্ট মুছে ফেলা হয়েছে।',
'Event has been altered.' => 'ইভেন্ট সম্পাদনা করা হয়েছে।',
'Event has been created.' => 'ইভেন্ট তৈরী করা হয়েছে।',
'Alter event' => 'ইভেন্ট সম্পাদনা করো',
'Create event' => 'ইভেন্ট তৈরী করো',
'At given time' => 'প্রদত্ত সময়ে',
'Every' => 'প্রত্যেক',
'Events' => 'ইভেন্টসমূহ',
'Schedule' => 'সময়সূচি',
'Start' => 'শুরু',
'End' => 'সমাপ্তি',
'Status' => 'স্ট্যাটাস',
'On completion preserve' => 'সমাপ্ত হওয়ার পর সংরক্ষন করো',
'Tables and views' => 'টেবিল এবং ভিউ সমূহ',
'Data Length' => 'ডাটার দৈর্ঘ্য',
'Index Length' => 'ইনডেক্স এর দৈর্ঘ্য',
'Data Free' => 'তথ্য মুক্ত',
'Collation' => 'কলোকেশন',
'Analyze' => 'বিশ্লেষণ',
'Optimize' => 'অপটিমাইজ',
'Check' => 'পরীক্ষা',
'Repair' => 'মেরামত',
'Truncate' => 'ছাঁটাই',
'Tables have been truncated.' => 'টেবিল ছাঁটাই করা হয়েছে',
'Rows' => 'সারি',
',' => ',',
'Tables have been moved.' => 'টেবিল স্থানান্তর করা হয়েছে।',
'Move to other database' => 'অন্য ডাটাবেজে স্থানান্তর করো',
'Move' => 'স্থানান্তর করো',
'Engine' => 'ইঞ্জিন',
'Save and continue edit' => 'সংরক্ষণ করো এবং সম্পাদনা চালিয়ে যাও',
'original' => 'প্রকৃত',
'Tables have been dropped.' => 'টেবিলসমূহ মুছে ফেলা হয়েছে।',
'%d item(s) have been affected.' => '%d টি বিষয়বস্তু প্রভাবিত হয়েছে',
'whole result' => 'সম্পূর্ণ ফলাফল',
'Clone' => 'ক্লোন',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'অনুমোদিত ফিল্ড এর সর্বাধিক সংখ্যা অতিক্রম করে গেছে। অনুগ্রহপূর্বক %s এবং %s বৃদ্ধি করুন।',
'Partition by' => 'পার্টিশন যার মাধ্যমে',
'Partitions' => 'পার্টিশন',
'Partition name' => 'পার্টিশনের নাম',
'Values' => 'মানসমূহ',
'%d row(s) have been imported.' => array('%d টি সারি (সমূহ) ইমপোর্ট করা হয়েছে।', '%d টি সারি (সমূহ) ইমপোর্ট করা হয়েছে।'),
'anywhere' => 'যে কোন স্থানে',
'Import' => 'ইমপোর্ট',
'Stop on error' => 'ত্রুটি পেলে থেমে যাও',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$6.$4.$1',
'[yyyy]-mm-dd' => 't.m.[jjjj]',
'History' => 'ইতিহাস',
'Variables' => 'চলকসমূহ',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'সোর্স এবং টার্গেট কলামে একই ডাটা টাইপ থাকতে হবে, টার্গেট কলামসমূহে একটি সূচী এবং রেফারেন্সড ডেটার উপস্থিতি থাকা আবশ্যক।',
'Relations' => 'সম্পর্ক',
'Run file' => 'ফাইল চালাও',
'Clear' => 'সাফ করো',
'Maximum allowed file size is %sB.' => 'সর্বাধিক অনুমোদিত ফাইল সাইজ %sB.',
'Numbers' => 'সংখ্যা',
'Date and time' => 'তারিখ এবং সময়',
'Strings' => 'স্ট্রিং',
'Binary' => 'বাইনারি',
'Lists' => 'তালিকা',
'Editor' => 'সম্পাদক',
'E-mail' => '​​ই-মেইল',
'From' => 'থেকে',
'Subject' => 'বিষয়',
'Send' => 'পাঠাও',
'%d e-mail(s) have been sent.' => array('%d ইমেইল (গুলি) পাঠানো হয়েছে।', '%d ইমেইল (গুলি) পাঠানো হয়েছে।'),
'Webserver file %s' => 'ওয়েবসার্ভার ফাইল %s',
'File does not exist.' => 'ফাইলের কোন অস্তিত্ব নেই।',
'%d in total' => 'সর্বমোটঃ %d টি',
'Permanent login' => 'স্থায়ী লগইন',
'Databases have been dropped.' => 'ডাটাবেজসমূহ মুছে ফেলা হয়েছে।',
'Search data in tables' => 'টেবিলে খোঁজ করো',
'schema' => 'স্কিমা',
'Schema' => 'স্কিমা',
'Alter schema' => 'স্কিমা পরিবর্তন করো',
'Create schema' => 'স্কিমা তৈরী করো',
'Schema has been dropped.' => 'স্কিমা মুছে ফেলা হয়েছে।',
'Schema has been created.' => 'স্কিমা তৈরি করা হয়েছে।',
'Schema has been altered.' => 'স্কিমা সম্পাদনা করা হয়েছে।',
'Sequences' => 'অনুক্রম',
'Create sequence' => 'অনুক্রম তৈরি করো',
'Alter sequence' => 'অনুক্রম সম্পাদনা করো',
'Sequence has been dropped.' => 'অনুক্রম মুছে ফেলা হয়েছে।',
'Sequence has been created.' => 'অনুক্রম তৈরি করা হয়েছে।',
'Sequence has been altered.' => 'অনুক্রম সম্পাদনা করা হয়েছে।',
'User types' => 'ইউজারের টাইপ',
'Create type' => 'টাইপ তৈরী করো',
'Alter type' => 'টাইপ পরিবর্তন করো',
'Type has been dropped.' => 'টাইপ মুছে ফেলা হয়েছে।',
'Type has been created.' => 'টাইপ তৈরি করা হয়েছে।',
'Double click on a value to modify it.' => 'কোন মানকে পরিবর্তন করতে এতে ডবল ক্লিক করো।',
'Use edit link to modify this value.' => 'এই মান পরিবর্তনের জন্য সম্পাদনা লিঙ্ক ব্যবহার করো।',
'last' => 'সর্বশেষ',
'From server' => 'সার্ভার থেকে',
'System' => 'সিস্টেম',
'Select data' => 'তথ্য নির্বাচন করো',
'Show structure' => 'গঠন দেখাও',
'empty' => 'খালি',
'Network' => 'নেটওয়ার্ক',
'Geometry' => 'জ্যামিতি',
'File exists.' => 'ফাইল রয়েছে।',
'Attachments' => 'সংযুক্তি',
'%d query(s) executed OK.' => array('SQL-কোয়্যারী সফলভাবে সম্পন্ন হয়েছে', '%d SQL-কোয়্যারীসমূহ সফলভাবে সম্পন্ন হয়েছে'),
'Show only errors' => 'শুধুমাত্র ত্রুটি দেখাও',
'Last page' => 'শেষ পাতা',
'Refresh' => 'রিফ্রেশ',
'Invalid schema.' => 'অবৈধ স্কিমা।',
'Please use one of the extensions %s.' => 'কোন একটা এক্সটেনশন %s ব্যবহার করো।',
'now' => 'এখন',
'ltr' => 'ltr',
'Tables have been copied.' => 'টেবিল কপি করা হয়েছে।',
'Copy' => 'কপি',
'Permanent link' => 'স্থায়ী লিংক',
'Edit all' => 'সকল সম্পাদনা করো',
'HH:MM:SS' => 'HH:MM:SS',
);

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'Còpia', 'Copy' => 'Còpia',
'Permanent link' => 'Enllaç permanent', 'Permanent link' => 'Enllaç permanent',
'Edit all' => 'Edita-ho tot', 'Edit all' => 'Edita-ho tot',
'Resend POST data?' => 'Torna a enviar les dades POST?',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -13,11 +13,11 @@ $translations = array(
'Invalid credentials.' => 'Neplatné přihlašovací údaje.', 'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
'Language' => 'Jazyk', 'Language' => 'Jazyk',
'Invalid CSRF token. Send the form again.' => 'Neplatný token CSRF. Odešlete formulář znovu.', 'Invalid CSRF token. Send the form again.' => 'Neplatný token CSRF. Odešlete formulář znovu.',
'No extension' => 'Žádná extenze', 'No extension' => 'Žádné rozšíření',
'None of the supported PHP extensions (%s) are available.' => 'Není dostupná žádná z podporovaných PHP extenzí (%s).', 'None of the supported PHP extensions (%s) are available.' => 'Není dostupné žádné z podporovaných PHP rozšíření (%s).',
'Session support must be enabled.' => 'Session proměnné musí být povolené.', 'Session support must be enabled.' => 'Session proměnné musí být povolené.',
'Session expired, please login again.' => 'Session vypršela, přihlašte se prosím znovu.', 'Session expired, please login again.' => 'Session vypršela, přihlašte se prosím znovu.',
'%s version: %s through PHP extension %s' => 'Verze %s: %s přes PHP extenzi %s', '%s version: %s through PHP extension %s' => 'Verze %s: %s přes PHP rozšíření %s',
'Refresh' => 'Obnovit', 'Refresh' => 'Obnovit',
// text direction - 'ltr' or 'rtl' // text direction - 'ltr' or 'rtl'
@@ -227,6 +227,7 @@ $translations = array(
'Limit' => 'Limit', 'Limit' => 'Limit',
'Text length' => 'Délka textů', 'Text length' => 'Délka textů',
'Action' => 'Akce', 'Action' => 'Akce',
'Full table scan' => 'Průchod celé tabulky',
'Unable to select the table' => 'Nepodařilo se vypsat tabulku', 'Unable to select the table' => 'Nepodařilo se vypsat tabulku',
'No rows.' => 'Žádné řádky.', 'No rows.' => 'Žádné řádky.',
'%d row(s)' => array('%d řádek', '%d řádky', '%d řádků'), '%d row(s)' => array('%d řádek', '%d řádky', '%d řádků'),
@@ -278,10 +279,6 @@ $translations = array(
'Geometry' => 'Geometrie', 'Geometry' => 'Geometrie',
'Relations' => 'Vztahy', 'Relations' => 'Vztahy',
// reload confirmation in AJAX
'Resend POST data?' => 'Znovu odeslat POST data?',
'No response from server.' => 'Server neodpověděl.',
'Editor' => 'Editor', 'Editor' => 'Editor',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$6.$4.$1', '$1-$3-$5' => '$6.$4.$1',

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'Kopieren', 'Copy' => 'Kopieren',
'Permanent link' => 'Dauerhafter Link', 'Permanent link' => 'Dauerhafter Link',
'Edit all' => 'Alle ändern', 'Edit all' => 'Alle ändern',
'Resend POST data?' => 'POST data noch einmal senden ?',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -13,7 +13,7 @@ $translations = array(
'Table has been altered.' => 'Tabla modificada.', 'Table has been altered.' => 'Tabla modificada.',
'Table has been created.' => 'Tabla creada.', 'Table has been created.' => 'Tabla creada.',
'Alter table' => 'Modifique estructura', 'Alter table' => 'Modifique estructura',
'Create table' => 'Cree tabla', 'Create table' => 'Crear tabla',
'Table name' => 'Nombre de la tabla', 'Table name' => 'Nombre de la tabla',
'engine' => 'motor', 'engine' => 'motor',
'collation' => 'colación', 'collation' => 'colación',
@@ -104,7 +104,7 @@ $translations = array(
'View has been altered.' => 'Vista modificada.', 'View has been altered.' => 'Vista modificada.',
'View has been created.' => 'Vista creada.', 'View has been created.' => 'Vista creada.',
'Alter view' => 'Modificar vista', 'Alter view' => 'Modificar vista',
'Create view' => 'Cear vista', 'Create view' => 'Crear vista',
'Name' => 'Nombre', 'Name' => 'Nombre',
'Process list' => 'Lista de procesos', 'Process list' => 'Lista de procesos',
'%d process(es) have been killed.' => array('%d proceso detenido.', '%d procesos detenidos.'), '%d process(es) have been killed.' => array('%d proceso detenido.', '%d procesos detenidos.'),
@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'Copiar', 'Copy' => 'Copiar',
'Permanent link' => 'Enlace permanente', 'Permanent link' => 'Enlace permanente',
'Edit all' => 'Editar todos', 'Edit all' => 'Editar todos',
'Resend POST data?' => 'Volver a enviar POST data?',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'Kopeeri', 'Copy' => 'Kopeeri',
'Permanent link' => 'Püsilink', 'Permanent link' => 'Püsilink',
'Edit all' => 'Muuda kõiki', 'Edit all' => 'Muuda kõiki',
'Resend POST data?' => 'Saada POST andmed uuesti?',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -277,9 +277,6 @@ $translations = array(
'Geometry' => 'هندسه', 'Geometry' => 'هندسه',
'Relations' => 'رابطه ها', 'Relations' => 'رابطه ها',
// reload confirmation in AJAX
'Resend POST data?' => 'ارسال مجدد داده ها؟',
'Editor' => 'ویرایشگر', 'Editor' => 'ویرایشگر',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5', '$1-$3-$5' => '$1-$3-$5',

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'Copier', 'Copy' => 'Copier',
'Permanent link' => 'Lien permanent', 'Permanent link' => 'Lien permanent',
'Edit all' => 'Tout modifier', 'Edit all' => 'Tout modifier',
'Resend POST data?' => 'Renvoyer les données POST ?',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'Másolás', 'Copy' => 'Másolás',
'Permanent link' => 'Hivatkozás', 'Permanent link' => 'Hivatkozás',
'Edit all' => 'Összes szerkesztése', 'Edit all' => 'Összes szerkesztése',
'Resend POST data?' => 'Újraküldi a POST adatokat?',
'HH:MM:SS' => 'óó:pp:mm', 'HH:MM:SS' => 'óó:pp:mm',
); );

321
adminer/lang/id.inc.php Normal file
View File

@@ -0,0 +1,321 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistem',
'Server' => 'Server',
'Username' => 'Pengguna',
'Password' => 'Sandi',
'Permanent login' => 'Masuk permanen',
'Login' => 'Masuk',
'Logout' => 'Keluar',
'Logged as: %s' => 'Masuk sebagai: %s',
'Logout successful.' => 'Berhasil keluar.',
'Invalid credentials.' => 'Akses invalid.',
'Language' => 'Bahasa',
'Invalid CSRF token. Send the form again.' => 'Token CSRF invalid. Kirim ulang formulir.',
'No extension' => 'Ekstensi tidak tersedia',
'None of the supported PHP extensions (%s) are available.' => 'Ekstensi PHP yang didukung (%s) tidak tersedia.',
'Session support must be enabled.' => 'Dukungan sesi harus aktif.',
'Session expired, please login again.' => 'Sesi habis, silakan masuk lagi.',
'%s version: %s through PHP extension %s' => 'Versi %s: %s dengan ekstensi PHP %s',
'Refresh' => 'Segarkan',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Privilese',
'Create user' => 'Buat pengguna',
'User has been dropped.' => 'Pengguna berhasil dihapus.',
'User has been altered.' => 'Pengguna berhasil diubah.',
'User has been created.' => 'Pengguna berhasil dibuat.',
'Hashed' => 'Hashed*',
'Column' => 'Kolom',
'Routine' => 'Rutin',
'Grant' => 'Beri',
'Revoke' => 'Tarik',
'Process list' => 'Daftar proses',
'%d process(es) have been killed.' => '%d proses berhasil dihentikan.',
'Kill' => 'Hentikan',
'Variables' => 'Variabel',
'Status' => 'Status',
'SQL command' => 'Perintah SQL',
'%d query(s) executed OK.' => '%d kueri berhasil dijalankan.',
'Query executed OK, %d row(s) affected.' => 'Kueri berhasil, %d baris terpengaruh.',
'No commands to execute.' => 'Tiada perintah untuk dijalankan.',
'Error in query' => 'Kesalahan dalam kueri',
'Execute' => 'Jalankan',
'Stop on error' => 'Hentikan pada kesalahan',
'Show only errors' => 'Hanya tampilkan kesalahan',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Riwayat',
'Clear' => 'Bersihkan',
'Edit all' => 'Edit semua',
'File upload' => 'Unggah berkas',
'From server' => 'Dari server',
'Webserver file %s' => 'Berkas server web %s',
'Run file' => 'Jalankan berkas',
'File does not exist.' => 'Berkas tidak ditemukan.',
'File uploads are disabled.' => 'Pengunggahan berkas dimatikan.',
'Unable to upload a file.' => 'Tidak dapat mengunggah berkas.',
'Maximum allowed file size is %sB.' => 'Besar berkas yang diizinkan adalah %s bita.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Data POST terlalu besar. Kurangi data atau perbesar pengarah konfigurasi %s.',
'Export' => 'Ekspor',
'Dump' => 'Ekspor',
'Output' => 'Hasil',
'open' => 'buka',
'save' => 'simpan',
'Format' => 'Format',
'Data' => 'Data',
'Database' => 'Basis data',
'database' => 'basis data',
'Use' => 'Gunakan',
'Select database' => 'Pilih basis data',
'Invalid database.' => 'Basis data invalid.',
'Create new database' => 'Buat basis data baru',
'Database has been dropped.' => 'Basis data berhasil dihapus.',
'Databases have been dropped.' => 'Basis data berhasil dihapus.',
'Database has been created.' => 'Basis data berhasil dibuat.',
'Database has been renamed.' => 'Basis data berhasil diganti nama.',
'Database has been altered.' => 'Basis data berhasil diubah.',
'Alter database' => 'Ubah basis data',
'Create database' => 'Buat basis data',
'Database schema' => 'Skema basis data',
// link to current database schema layout
'Permanent link' => 'Tautan permanen',
// thousands separator - must contain single byte
',' => '.',
'Engine' => 'Mesin',
'Collation' => 'Kolasi',
'Data Length' => 'Panjang Data',
'Index Length' => 'Panjang Indeks',
'Data Free' => 'Data Bebas',
'Rows' => 'Baris',
'%d in total' => '%d total',
'Analyze' => 'Analisis',
'Optimize' => 'Optimalkan',
'Check' => 'Periksa',
'Repair' => 'Perbaiki',
'Truncate' => 'Kosongkan',
'Tables have been truncated.' => 'Tabel berhasil dikosongkan.',
'Move to other database' => 'Pindahkan ke basis data lain',
'Move' => 'Pindahkan',
'Tables have been moved.' => 'Tabel berhasil dipindahkan.',
'Copy' => 'Salin',
'Tables have been copied.' => 'Tabel berhasil disalin.',
'Routines' => 'Rutin',
'Routine has been called, %d row(s) affected.' => array('Rutin telah dipanggil, %d baris terpengaruh.', 'Rutin telah dipanggil, %d baris terpengaruh'),
'Call' => 'Panggilan',
'Parameter name' => 'Nama paramater',
'Create procedure' => 'Buat prosedur',
'Create function' => 'Buat fungsi',
'Routine has been dropped.' => 'Rutin berhasil dihapus.',
'Routine has been altered.' => 'Rutin berhasil diubah.',
'Routine has been created.' => 'Rutin berhasil dibuat.',
'Alter function' => 'Ubah fungsi',
'Alter procedure' => 'Ubah prosedur',
'Return type' => 'Jenis balikan',
'Events' => 'Peristiwa',
'Event has been dropped.' => 'Peristiwa berhasil dihapus.',
'Event has been altered.' => 'Peristiwa berhasil diubah.',
'Event has been created.' => 'Peristiwa berhasil dibuat.',
'Alter event' => 'Ubah peristiwa',
'Create event' => 'Buat peristiwa',
'At given time' => 'Pada waktu tertentu',
'Every' => 'Setiap',
'Schedule' => 'Jadwal',
'Start' => 'Mulai',
'End' => 'Selesai',
'On completion preserve' => 'Pertahankan saat selesai',
'Tables' => 'Tabel',
'Tables and views' => 'Tabel dan tampilan',
'Table' => 'Tabel',
'No tables.' => 'Tiada tabel.',
'Alter table' => 'Ubah tabel',
'Create table' => 'Buat tabel',
'Create new table' => 'Buat tabel baru',
'Table has been dropped.' => 'Tabel berhasil dihapus.',
'Tables have been dropped.' => 'Tabel berhasil dihapus.',
'Tables have been optimized.' => 'Tabel berhasil dioptimalkan.',
'Table has been altered.' => 'Tabel berhasil diubah.',
'Table has been created.' => 'Tabel berhasil dibuat.',
'Table name' => 'Nama tabel',
'Show structure' => 'Lihat struktur',
'engine' => 'mesin',
'collation' => 'kolasi',
'Column name' => 'Nama kolom',
'Type' => 'Jenis',
'Length' => 'Panjang',
'Auto Increment' => 'Kenaikan Otomatis',
'Options' => 'Opsi',
'Comment' => 'Komentar',
'Default values' => 'Nilai bawaan',
'Drop' => 'Hapus',
'Are you sure?' => 'Anda yakin',
'Move up' => 'Naik',
'Move down' => 'Turun',
'Remove' => 'Hapus',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Jumlah ruas maksimum yang diizinkan dilewati. Harap naikkan %s dan %s.',
'Partition by' => 'Partisi menurut',
'Partitions' => 'Partisi',
'Partition name' => 'Nama partisi',
'Values' => 'Nilai',
'View' => 'Tampilan',
'View has been dropped.' => 'Tampilan berhasil dihapus.',
'View has been altered.' => 'Tampilan berhasil diubah.',
'View has been created.' => 'Tampilan berhasil dibuat.',
'Alter view' => 'Ubah tampilan',
'Create view' => 'Buat tampilan',
'Indexes' => 'Indeks',
'Indexes have been altered.' => 'Indeks berhasil diubah.',
'Alter indexes' => 'Ubah indeks',
'Add next' => 'Tambah setelahnya',
'Index Type' => 'Jenis Indeks',
'Column (length)' => 'Kolom (panjang)',
'Foreign keys' => 'Kunci asing',
'Foreign key' => 'Kunci asing',
'Foreign key has been dropped.' => 'Kunci asing berhasil dihapus.',
'Foreign key has been altered.' => 'Kunci asing berhasil diubah.',
'Foreign key has been created.' => 'Kunci asing berhasil dibuat.',
'Target table' => 'Tabel sasaran',
'Change' => 'Ubah',
'Source' => 'Sumber',
'Target' => 'Sasaran',
'Add column' => 'Tambah kolom',
'Alter' => 'Ubah',
'Add foreign key' => 'Tambah kunci asing',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kolom sumber dan sasaran harus memiliki jenis data yang sama. Kolom sasaran harus memiliki indeks dan data rujukan harus ada.',
'Triggers' => 'Picu',
'Add trigger' => 'Tambah picu',
'Trigger has been dropped.' => 'Picu berhasil dihapus.',
'Trigger has been altered.' => 'Picu berhasil diubah.',
'Trigger has been created.' => 'Picu berhasil dibuat.',
'Alter trigger' => 'Ubah picu',
'Create trigger' => 'Buat picu',
'Time' => 'Waktu',
'Event' => 'Peristiwa',
'Name' => 'Nama',
'select' => 'pilih',
'Select' => 'Pilih',
'Select data' => 'Pilih data',
'Functions' => 'Fungsi',
'Aggregation' => 'Agregasi',
'Search' => 'Cari',
'anywhere' => 'di mana pun',
'Search data in tables' => 'Cari data dalam tabel',
'Sort' => 'Urutan',
'descending' => 'menurun',
'Limit' => 'Limit',
'Text length' => 'Panjang teks',
'Action' => 'Tindakan',
'Full table scan' => 'Pindai tabel lengkap',
'Unable to select the table' => 'Gagal memilih tabel',
'No rows.' => 'Tiada baris.',
'%d row(s)' => '%d baris',
'Page' => 'Halaman',
'last' => 'terakhir',
'Last page' => 'Halaman terakhir',
'whole result' => 'Seluruh hasil',
'%d byte(s)' => '%d bita',
'Import' => 'Impor',
'%d row(s) have been imported.' => '%d baris berhasil diimpor.',
// in-place editing in select
'Double click on a value to modify it.' => 'Klik ganda suatu nilai untuk mengubahnya.',
'Use edit link to modify this value.' => 'Gunakan tautan edit untuk mengubah nilai ini.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Entri%s berhasil disisipkan.',
'Item has been deleted.' => 'Entri berhasil dihapus.',
'Item has been updated.' => 'Entri berhasil diperbarui.',
'%d item(s) have been affected.' => '%d entri terpengaruh.',
'New item' => 'Entri baru',
'original' => 'orisinal',
// label for value '' in enum data type
'empty' => 'kosong',
'edit' => 'edit',
'Edit' => 'Edit',
'Insert' => 'Sisipkan',
'Save' => 'Simpan',
'Save and continue edit' => 'Simpan dan terus mengedit',
'Save and insert next' => 'Simpan dan sisipkan yang lain',
'Clone' => 'Gandakan',
'Delete' => 'Hapus',
'E-mail' => 'Surel',
'From' => 'Dari',
'Subject' => 'Subjek',
'Attachments' => 'Lampiran',
'Send' => 'Kirim',
'%d e-mail(s) have been sent.' => array('%d surel berhasil dikirim.', '%d surel berhasil dikirim'),
// data type descriptions
'Numbers' => 'Angka',
'Date and time' => 'Tanggal dan waktu',
'Strings' => 'String',
'Binary' => 'Biner',
'Lists' => 'Daftar',
'Network' => 'Jaringan',
'Geometry' => 'Geometri',
'Relations' => 'Relasi',
'Editor' => 'Editor',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'now',
'yes' => 'yes',
'no' => 'no',
// general SQLite error in create, drop or rename database
'File exists.' => 'Berkas sudah ada.',
'Please use one of the extensions %s.' => 'Harap gunakan salah satu ekstensi %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Ubah skema',
'Create schema' => 'Buat skema',
'Schema has been dropped.' => 'Skema berhasil dihapus.',
'Schema has been created.' => 'Skema berhasil dibuat.',
'Schema has been altered.' => 'Skema berhasil diubah.',
'schema' => 'skema',
'Schema' => 'Skema',
'Invalid schema.' => 'Skema invalid.',
// PostgreSQL sequences support
'Sequences' => 'Deret',
'Create sequence' => 'Buat deret',
'Sequence has been dropped.' => 'Deret berhasil dihapus.',
'Sequence has been created.' => 'Deret berhasil dibuat.',
'Sequence has been altered.' => 'Deret berhasil diubah.',
'Alter sequence' => 'Ubah deret',
// PostgreSQL user types support
'User types' => 'Jenis pengguna',
'Create type' => 'Buat jenis',
'Type has been dropped.' => 'Jenis berhasil dihapus.',
'Type has been created.' => 'Jenis berhasil dibuat.',
'Alter type' => 'Ubah jenis',
);

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'Copia', 'Copy' => 'Copia',
'Permanent link' => 'Link permanente', 'Permanent link' => 'Link permanente',
'Edit all' => 'Modifica tutto', 'Edit all' => 'Modifica tutto',
'Resend POST data?' => 'Reinvio i dati POST?',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'コピー', 'Copy' => 'コピー',
'Permanent link' => 'パーマネントリンク', 'Permanent link' => 'パーマネントリンク',
'Edit all' => 'すべて編集', 'Edit all' => 'すべて編集',
'Resend POST data?' => '再送信しますか?',
'HH:MM:SS' => '時:分:秒', 'HH:MM:SS' => '時:分:秒',
); );

View File

@@ -277,9 +277,6 @@ $translations = array(
'Geometry' => 'Geometrija', 'Geometry' => 'Geometrija',
'Relations' => 'Ryšiai', 'Relations' => 'Ryšiai',
// reload confirmation in AJAX
'Resend POST data?' => 'Persiųsti POST duomenis?',
'Editor' => 'Redaktorius', 'Editor' => 'Redaktorius',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5', '$1-$3-$5' => '$1-$3-$5',

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'Kopieren', 'Copy' => 'Kopieren',
'Permanent link' => 'Permanente link', 'Permanent link' => 'Permanente link',
'Edit all' => 'Alles bewerken', 'Edit all' => 'Alles bewerken',
'Resend POST data?' => 'POST data opnieuw verzenden',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -20,7 +20,7 @@ $translations = array(
'%s version: %s through PHP extension %s' => 'Wersja %s: %s za pomocą %s', '%s version: %s through PHP extension %s' => 'Wersja %s: %s za pomocą %s',
'Refresh' => 'Odśwież', 'Refresh' => 'Odśwież',
// text direction // text direction - 'ltr' or 'rtl'
'ltr' => 'ltr', 'ltr' => 'ltr',
'Privileges' => 'Uprawnienia użytkowników', 'Privileges' => 'Uprawnienia użytkowników',
@@ -147,6 +147,7 @@ $translations = array(
'Create new table' => 'Utwórz nową tabelę', 'Create new table' => 'Utwórz nową tabelę',
'Table has been dropped.' => 'Tabela została usunięta.', 'Table has been dropped.' => 'Tabela została usunięta.',
'Tables have been dropped.' => 'Tabele zostały usunięte.', 'Tables have been dropped.' => 'Tabele zostały usunięte.',
'Tables have been optimized.' => 'Tabele zostały zoptymalizowane.',
'Table has been altered.' => 'Tabela została zmieniona.', 'Table has been altered.' => 'Tabela została zmieniona.',
'Table has been created.' => 'Tabela została utworzona.', 'Table has been created.' => 'Tabela została utworzona.',
'Table name' => 'Nazwa tabeli', 'Table name' => 'Nazwa tabeli',
@@ -277,9 +278,6 @@ $translations = array(
'Geometry' => 'Geometria', 'Geometry' => 'Geometria',
'Relations' => 'Relacje', 'Relations' => 'Relacje',
// reload confirmation in AJAX
'Resend POST data?' => 'Wysłać dane ponownie?',
'Editor' => 'Edytor', 'Editor' => 'Edytor',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$6.$4.$1', '$1-$3-$5' => '$6.$4.$1',
@@ -288,6 +286,8 @@ $translations = array(
// hint for time format - use language equivalents for hour, minute and second shortcuts // hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
'now' => 'teraz', 'now' => 'teraz',
'yes' => 'tak',
'no' => 'nie',
// general SQLite error in create, drop or rename database // general SQLite error in create, drop or rename database
'File exists.' => 'Plik już istnieje.', 'File exists.' => 'Plik już istnieje.',

View File

@@ -4,7 +4,7 @@ $translations = array(
'Logout successful.' => 'Saida bem sucedida.', 'Logout successful.' => 'Saida bem sucedida.',
'Invalid credentials.' => 'Identificação inválida.', 'Invalid credentials.' => 'Identificação inválida.',
'Server' => 'Servidor', 'Server' => 'Servidor',
'Username' => 'Usuario', 'Username' => 'Usuário',
'Password' => 'Senha', 'Password' => 'Senha',
'Select database' => 'Selecionar Base de dados', 'Select database' => 'Selecionar Base de dados',
'Invalid database.' => 'Base de dados inválida.', 'Invalid database.' => 'Base de dados inválida.',
@@ -47,9 +47,9 @@ $translations = array(
'Delete' => 'Apagar', 'Delete' => 'Apagar',
'Database' => 'Base de dados', 'Database' => 'Base de dados',
'Routines' => 'Procedimentos', 'Routines' => 'Procedimentos',
'Indexes have been altered.' => 'Indices modificados.', 'Indexes have been altered.' => 'Índices modificados.',
'Indexes' => 'Indices', 'Indexes' => 'Índices',
'Alter indexes' => 'Modificar indices', 'Alter indexes' => 'Modificar índices',
'Add next' => 'Adicionar proximo', 'Add next' => 'Adicionar proximo',
'Language' => 'Idioma', 'Language' => 'Idioma',
'Select' => 'Selecionar', 'Select' => 'Selecionar',
@@ -62,7 +62,7 @@ $translations = array(
'Action' => 'Ação', 'Action' => 'Ação',
'edit' => 'modificar', 'edit' => 'modificar',
'Page' => 'Página', 'Page' => 'Página',
'Query executed OK, %d row(s) affected.' => array('Consulta executada, %d registro afetados.', 'Consulta executada, %d registros afetados.'), 'Query executed OK, %d row(s) affected.' => array('Consulta executada, %d registro afetado.', 'Consulta executada, %d registros afetados.'),
'Error in query' => 'Erro na consulta', 'Error in query' => 'Erro na consulta',
'Execute' => 'Executar', 'Execute' => 'Executar',
'Table' => 'Tabela', 'Table' => 'Tabela',
@@ -71,17 +71,17 @@ $translations = array(
'View' => 'Visualizar', 'View' => 'Visualizar',
'Unable to select the table' => 'Não é possivel selecionar a Tabela', 'Unable to select the table' => 'Não é possivel selecionar a Tabela',
'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Enviar o formulario novamente.', 'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Enviar o formulario novamente.',
'Comment' => 'Comentario', 'Comment' => 'Comentário',
'Default values' => 'Valores predeterminados', 'Default values' => 'Valores predeterminados',
'%d byte(s)' => array('%d byte', '%d bytes'), '%d byte(s)' => array('%d byte', '%d bytes'),
'No commands to execute.' => 'Nenhum comando para executar.', 'No commands to execute.' => 'Nenhum comando para executar.',
'Unable to upload a file.' => 'Não é possivel enviar o arquivo.', 'Unable to upload a file.' => 'Não é possível enviar o arquivo.',
'File upload' => 'Importar arquivo', 'File upload' => 'Importar arquivo',
'File uploads are disabled.' => 'Importação de arquivos desablilitado.', 'File uploads are disabled.' => 'Importação de arquivos desablilitada.',
'Routine has been called, %d row(s) affected.' => array('Consulta executada, %d registro afetado.', 'Consulta executada, %d registros afetados.'), 'Routine has been called, %d row(s) affected.' => array('Consulta executada, %d registro afetado.', 'Consulta executada, %d registros afetados.'),
'Call' => 'Chamar', 'Call' => 'Chamar',
'No extension' => 'Não ha extension', 'No extension' => 'Não há extension',
'None of the supported PHP extensions (%s) are available.' => 'Nenhuma das extensões PHP soportadas (%s) está disponivel.', 'None of the supported PHP extensions (%s) are available.' => 'Nenhuma das extensões PHP suportadas (%s) está disponivel.',
'Session support must be enabled.' => 'Devem estar habilitadas as sessões.', 'Session support must be enabled.' => 'Devem estar habilitadas as sessões.',
'Session expired, please login again.' => 'Sessão expirada, por favor entre sua Chave de novo.', 'Session expired, please login again.' => 'Sessão expirada, por favor entre sua Chave de novo.',
'Text length' => 'Tamanho de texto', 'Text length' => 'Tamanho de texto',
@@ -109,7 +109,7 @@ $translations = array(
'Process list' => 'Lista de processos', 'Process list' => 'Lista de processos',
'%d process(es) have been killed.' => array('%d processo terminado.', '%d processos terminados.'), '%d process(es) have been killed.' => array('%d processo terminado.', '%d processos terminados.'),
'Kill' => 'Parar', 'Kill' => 'Parar',
'Parameter name' => 'Nome de Parametro', 'Parameter name' => 'Nome de Parâmetro',
'Database schema' => 'Esquema de Base de dados', 'Database schema' => 'Esquema de Base de dados',
'Create procedure' => 'Criar procedimento', 'Create procedure' => 'Criar procedimento',
'Create function' => 'Criar função', 'Create function' => 'Criar função',
@@ -117,7 +117,7 @@ $translations = array(
'Routine has been altered.' => 'Procedimento modificado.', 'Routine has been altered.' => 'Procedimento modificado.',
'Routine has been created.' => 'Procedimento criado.', 'Routine has been created.' => 'Procedimento criado.',
'Alter function' => 'Modificar Função', 'Alter function' => 'Modificar Função',
'Alter procedure' => 'Modificar procedimiento', 'Alter procedure' => 'Modificar procedimento',
'Return type' => 'Tipo de valor de regreso', 'Return type' => 'Tipo de valor de regreso',
'Add trigger' => 'Adicionar trigger', 'Add trigger' => 'Adicionar trigger',
'Trigger has been dropped.' => 'Trigger eliminado.', 'Trigger has been dropped.' => 'Trigger eliminado.',
@@ -131,11 +131,11 @@ $translations = array(
'%d row(s)' => array('%d registro', '%d registros'), '%d row(s)' => array('%d registro', '%d registros'),
'Remove' => 'Remover', 'Remove' => 'Remover',
'Are you sure?' => 'Está seguro?', 'Are you sure?' => 'Está seguro?',
'Privileges' => 'Privilegios', 'Privileges' => 'Privilégios',
'Create user' => 'Criar Usuario', 'Create user' => 'Criar Usuário',
'User has been dropped.' => 'Usuario eliminado.', 'User has been dropped.' => 'Usuário eliminado.',
'User has been altered.' => 'Usuario modificado.', 'User has been altered.' => 'Usuário modificado.',
'User has been created.' => 'Usuario criado.', 'User has been created.' => 'Usuário criado.',
'Hashed' => 'Hash', 'Hashed' => 'Hash',
'Column' => 'Coluna', 'Column' => 'Coluna',
'Routine' => 'Rotina', 'Routine' => 'Rotina',
@@ -148,7 +148,7 @@ $translations = array(
'Functions' => 'Funções', 'Functions' => 'Funções',
'Aggregation' => 'Adições', 'Aggregation' => 'Adições',
'Export' => 'Exportar', 'Export' => 'Exportar',
'Output' => 'Saida', 'Output' => 'Saída',
'open' => 'mostrar', 'open' => 'mostrar',
'save' => 'salvas', 'save' => 'salvas',
'Format' => 'Formato', 'Format' => 'Formato',
@@ -163,7 +163,7 @@ $translations = array(
'Every' => 'Cada', 'Every' => 'Cada',
'Events' => 'Eventos', 'Events' => 'Eventos',
'Schedule' => 'Agenda', 'Schedule' => 'Agenda',
'Start' => 'Inicio', 'Start' => 'Início',
'End' => 'Fim', 'End' => 'Fim',
'Status' => 'Estado', 'Status' => 'Estado',
'On completion preserve' => 'Ao completar preservar', 'On completion preserve' => 'Ao completar preservar',
@@ -187,10 +187,10 @@ $translations = array(
'Save and continue edit' => 'Salvar e continuar editando', 'Save and continue edit' => 'Salvar e continuar editando',
'original' => 'original', 'original' => 'original',
'Tables have been dropped.' => 'Tabelas eliminadas.', 'Tables have been dropped.' => 'Tabelas eliminadas.',
'%d item(s) have been affected.' => array('%d ítem afetado.', '%d itens afetados.'), '%d item(s) have been affected.' => array('%d item afetado.', '%d itens afetados.'),
'whole result' => 'resultado completo', 'whole result' => 'resultado completo',
'Clone' => 'Clonar', 'Clone' => 'Clonar',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Cantida máxima de campos permitidos excedidos. Por favor aumente %s y %s.', 'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s e %s.',
'Partition by' => 'Particionar por', 'Partition by' => 'Particionar por',
'Partitions' => 'Partições', 'Partitions' => 'Partições',
'Partition name' => 'Nome da Partição', 'Partition name' => 'Nome da Partição',
@@ -202,8 +202,8 @@ $translations = array(
'%.3f s' => '%.3f s', '%.3f s' => '%.3f s',
'$1-$3-$5' => '$5/$3/$1', '$1-$3-$5' => '$5/$3/$1',
'[yyyy]-mm-dd' => 'dd/mm/[aaaa]', '[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
'History' => 'Historico', 'History' => 'Histórico',
'Variables' => 'Variaveis', 'Variables' => 'Variáveis',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'As colunas de origen e destino devem ser do mesmo tipo, deve existir um índice entre as colunas de destino e o registro referenciado deve existir.', 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'As colunas de origen e destino devem ser do mesmo tipo, deve existir um índice entre as colunas de destino e o registro referenciado deve existir.',
'Relations' => 'Relações', 'Relations' => 'Relações',
'Run file' => 'Executar Arquivo', 'Run file' => 'Executar Arquivo',
@@ -212,7 +212,7 @@ $translations = array(
'Numbers' => 'Números', 'Numbers' => 'Números',
'Date and time' => 'Data e hora', 'Date and time' => 'Data e hora',
'Strings' => 'Cadena', 'Strings' => 'Cadena',
'Binary' => 'Binario', 'Binary' => 'Binário',
'Lists' => 'Listas', 'Lists' => 'Listas',
'Editor' => 'Editor', 'Editor' => 'Editor',
'E-mail' => 'E-mail', 'E-mail' => 'E-mail',
@@ -233,18 +233,18 @@ $translations = array(
'Schema has been dropped.' => 'Esquema eliminado.', 'Schema has been dropped.' => 'Esquema eliminado.',
'Schema has been created.' => 'Esquema criado.', 'Schema has been created.' => 'Esquema criado.',
'Schema has been altered.' => 'Esquema modificado.', 'Schema has been altered.' => 'Esquema modificado.',
'Sequences' => 'Sequencias', 'Sequences' => 'Sequências',
'Create sequence' => 'Criar sequencias', 'Create sequence' => 'Criar sequências',
'Alter sequence' => 'Modificar sequencia', 'Alter sequence' => 'Modificar sequência',
'Sequence has been dropped.' => 'Sequencia eliminada.', 'Sequence has been dropped.' => 'Sequência eliminada.',
'Sequence has been created.' => 'Sequencia criada.', 'Sequence has been created.' => 'Sequência criada.',
'Sequence has been altered.' => 'Sequencia modificada.', 'Sequence has been altered.' => 'Sequência modificada.',
'User types' => 'Tipos definido pelo usuario', 'User types' => 'Tipos definido pelo usuário',
'Create type' => 'Criar tipo', 'Create type' => 'Criar tipo',
'Alter type' => 'Modificar tipo', 'Alter type' => 'Modificar tipo',
'Type has been dropped.' => 'Tipo eliminado.', 'Type has been dropped.' => 'Tipo eliminado.',
'Type has been created.' => 'Tipo criado.', 'Type has been created.' => 'Tipo criado.',
'Double click on a value to modify it.' => 'Doble-clic sobre o valor para edita-lo.', 'Double click on a value to modify it.' => 'Clique duas vezes sobre o valor para edita-lo.',
'Use edit link to modify this value.' => 'Utilize o link modificar para alterar.', 'Use edit link to modify this value.' => 'Utilize o link modificar para alterar.',
'last' => 'último', 'last' => 'último',
'From server' => 'Desde servidor', 'From server' => 'Desde servidor',
@@ -253,12 +253,12 @@ $translations = array(
'Show structure' => 'Mostrar estrutura', 'Show structure' => 'Mostrar estrutura',
'empty' => 'vazio', 'empty' => 'vazio',
'Network' => 'Rede', 'Network' => 'Rede',
'Geometry' => 'Geometría', 'Geometry' => 'Geometria',
'File exists.' => 'Arquivo ja existe.', 'File exists.' => 'Arquivo já existe.',
'Attachments' => 'Anexos', 'Attachments' => 'Anexos',
'%d query(s) executed OK.' => array('%d consulta sql executada corretamente.', '%d consulta sql executadas corretamente.'), '%d query(s) executed OK.' => array('%d consulta sql executada corretamente.', '%d consultas sql executadas corretamente.'),
'Show only errors' => 'Mostrar somente erros', 'Show only errors' => 'Mostrar somente erros',
'Last page' => 'Ultima página', 'Last page' => 'Última página',
'Refresh' => 'Atualizar', 'Refresh' => 'Atualizar',
'Invalid schema.' => 'Esquema inválido.', 'Invalid schema.' => 'Esquema inválido.',
'Please use one of the extensions %s.' => 'Por favor use uma das extensões %s.', 'Please use one of the extensions %s.' => 'Por favor use uma das extensões %s.',

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'Copiază', 'Copy' => 'Copiază',
'Permanent link' => 'Adresă permanentă', 'Permanent link' => 'Adresă permanentă',
'Edit all' => 'Editează tot', 'Edit all' => 'Editează tot',
'Resend POST data?' => 'Retrimite datele POST?',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'Копировать', 'Copy' => 'Копировать',
'Permanent link' => 'Постоянная ссылка', 'Permanent link' => 'Постоянная ссылка',
'Edit all' => 'Редактировать всё', 'Edit all' => 'Редактировать всё',
'Resend POST data?' => 'Еще раз послать данные POST запроса?',
'HH:MM:SS' => 'ЧЧ:ММ:СС', 'HH:MM:SS' => 'ЧЧ:ММ:СС',
); );

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'Kopírovať', 'Copy' => 'Kopírovať',
'Permanent link' => 'Permanentný odkaz', 'Permanent link' => 'Permanentný odkaz',
'Edit all' => 'Upraviť všetko', 'Edit all' => 'Upraviť všetko',
'Resend POST data?' => 'Znovu poslať POST data?',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => 'நகல்', 'Copy' => 'நகல்',
'Permanent link' => 'நிரந்தர இணைப்பு', 'Permanent link' => 'நிரந்தர இணைப்பு',
'Edit all' => 'அனைத்தையும் தொகு', 'Edit all' => 'அனைத்தையும் தொகு',
'Resend POST data?' => 'POST data வை மீண்டும் அனுப்பவா?',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

320
adminer/lang/uk.inc.php Normal file
View File

@@ -0,0 +1,320 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Система Бази Даних',
'Server' => 'Сервер',
'Username' => 'Користувач',
'Password' => 'Пароль',
'Permanent login' => 'Пам\'ятати сесію',
'Login' => 'Увійти',
'Logout' => 'Вийти',
'Logged as: %s' => 'Ви увійшли як: %s',
'Logout successful.' => 'Ви вдало вийшли з системи.',
'Invalid credentials.' => 'Неправильні дані входу.',
'Language' => 'Мова',
'Invalid CSRF token. Send the form again.' => 'Недійсний CSRF токен. Надішліть форму ще раз.',
'No extension' => 'Нема розширень',
'None of the supported PHP extensions (%s) are available.' => 'Жодне з PHP-розширень (%s), що підтримуються, не доступне.',
'Session support must be enabled.' => 'Сесії повинні бути дозволені.',
'Session expired, please login again.' => 'Сесія закінчилась, будь ласка, увійдіть в систему знову.',
'%s version: %s through PHP extension %s' => 'Версія %s: %s з PHP-розширенням %s',
'Refresh' => 'Оновити',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Привілеї',
'Create user' => 'Створити користувача',
'User has been dropped.' => 'Користувача було видалено.',
'User has been altered.' => 'Користувача було змінено.',
'User has been created.' => 'Користувача було створено.',
'Hashed' => 'Хешовано',
'Column' => 'Колонка',
'Routine' => 'Процедура',
'Grant' => 'Дозволити',
'Revoke' => 'Заборонити',
'Process list' => 'Перелік процесів',
'%d process(es) have been killed.' => array('Було завершено %d процес.', 'Було завершено %d процеси.', 'Було завершёно %d процесів.'),
'Kill' => 'Завершити процес',
'Variables' => 'Змінні',
'Status' => 'Статус',
'SQL command' => 'SQL запит',
'%d query(s) executed OK.' => array('%d запит виконано успішно.', '%d запити виконано успішно.', '%d запитів виконано успішно.'),
'Query executed OK, %d row(s) affected.' => array('Запит виконано успішно, змінено %d рядок.', 'Запит виконано успішно, змінено %d рядки.', 'Запит виконано успішно, змінено %d рядків.'),
'No commands to execute.' => 'Нема запитів до виконання.',
'Error in query' => 'Помилка в запиті',
'Execute' => 'Виконати',
'Stop on error' => 'Зупинитись при помилці',
'Show only errors' => 'Показувати тільки помилки',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Історія',
'Clear' => 'Очистити',
'Edit all' => 'Редагувати все',
'File upload' => 'Завантажити файл',
'From server' => 'З сервера',
'Webserver file %s' => 'Файл %s на вебсервері',
'Run file' => 'Запустити файл',
'File does not exist.' => 'Файл не існує.',
'File uploads are disabled.' => 'Завантаження файлів заборонене.',
'Unable to upload a file.' => 'Неможливо завантажити файл.',
'Maximum allowed file size is %sB.' => 'Максимально допустимий розмір файлу %sБ.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Занадто великий об\'єм POST-даних. Зменшіть об\'єм або збільшіть параметр директиви %s конфигурації.',
'Export' => 'Експорт',
'Dump' => 'Дамп',
'Output' => 'Вихідні дані',
'open' => 'відкрити',
'save' => 'зберегти',
'Format' => 'Формат',
'Data' => 'Дані',
'Database' => 'База даних',
'database' => 'база даних',
'Use' => 'Обрати',
'Select database' => 'Обрати базу даних',
'Invalid database.' => 'Погана база даних.',
'Create new database' => 'Створити нову базу даних',
'Database has been dropped.' => 'Базу даних було видалено.',
'Databases have been dropped.' => 'Бази даних були видалені.',
'Database has been created.' => 'Базу даних було створено.',
'Database has been renamed.' => 'Базу даних було переіменовано.',
'Database has been altered.' => 'Базу даних було змінено.',
'Alter database' => 'Змінити базу даних',
'Create database' => 'Створити базу даних',
'Database schema' => 'Схема бази даних',
// link to current database schema layout
'Permanent link' => 'Постійне посилання',
// thousands separator - must contain single byte
',' => ' ',
'Engine' => 'Рушій',
'Collation' => 'Співставлення',
'Data Length' => 'Об\'єм даних',
'Index Length' => 'Об\'єм індексів',
'Data Free' => 'Вільне місце',
'Rows' => 'Рядків',
'%d in total' => '%d всього',
'Analyze' => 'Аналізувати',
'Optimize' => 'Оптимізувати',
'Check' => 'Перевірити',
'Repair' => 'Виправити',
'Truncate' => 'Очистити',
'Tables have been truncated.' => 'Таблиці було очищено.',
'Move to other database' => 'Перенести до іншої бази даних',
'Move' => 'Перенести',
'Tables have been moved.' => 'Таблиці було перенесено.',
'Copy' => 'копіювати',
'Tables have been copied.' => 'Таблиці було зкопійовано.',
'Routines' => 'Збережені процедури',
'Routine has been called, %d row(s) affected.' => array('Була викликана процедура, %d запис було змінено.', 'Була викликана процедура, %d записи було змінено.', 'Була викликана процедура, %d записів було змінено.'),
'Call' => 'Викликати',
'Parameter name' => 'Назва параметра',
'Create procedure' => 'Створити процедуру',
'Create function' => 'Створити функцію',
'Routine has been dropped.' => 'Процедуру було видалено.',
'Routine has been altered.' => 'Процедуру було змінено.',
'Routine has been created.' => 'Процедуру було створено.',
'Alter function' => 'Змінити функцію',
'Alter procedure' => 'Змінити процедуру',
'Return type' => 'Тип, що повернеться',
'Events' => 'Події',
'Event has been dropped.' => 'Подію було видалено.',
'Event has been altered.' => 'Подію було змінено.',
'Event has been created.' => 'Подію було створено.',
'Alter event' => 'Змінити подію',
'Create event' => 'Створити подію',
'At given time' => 'В даний час',
'Every' => 'Кожного',
'Schedule' => 'Розклад',
'Start' => 'Початок',
'End' => 'Кінець',
'On completion preserve' => 'Після завершення зберегти',
'Tables' => 'Таблиці',
'Tables and views' => 'Таблиці і вигляди',
'Table' => 'Таблиця',
'No tables.' => 'Нема таблиць.',
'Alter table' => 'Змінити таблицю',
'Create table' => 'Створити таблицю',
'Create new table' => 'Створити нову таблицю',
'Table has been dropped.' => 'Таблицю було видалено.',
'Tables have been dropped.' => 'Таблиці були видалені.',
'Tables have been optimized.' => 'Таблиці були оптимізовані.',
'Table has been altered.' => 'Таблица була змінена.',
'Table has been created.' => 'Таблиця була створена.',
'Table name' => 'Назва таблиці',
'Show structure' => 'Показати структуру',
'engine' => 'рушій',
'collation' => 'співставлення',
'Column name' => 'Назва стовпця',
'Type' => 'Тип',
'Length' => 'Довжина',
'Auto Increment' => 'Автоматичне збільшення',
'Options' => 'Опції',
'Comment' => 'Коментарі',
'Default values' => 'Значення за замовчуванням',
'Drop' => 'Видалити',
'Are you sure?' => 'Ви впевнені?',
'Move up' => 'Пересунути вгору',
'Move down' => 'Пересунути вниз',
'Remove' => 'Видалити',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Досягнута максимальна кількість доступних полів. Будь ласка, збільшіть %s і %s.',
'Partition by' => 'Розділити по',
'Partitions' => 'Розділи',
'Partition name' => 'Назва розділу',
'Values' => 'Значення',
'View' => 'Вигляд',
'View has been dropped.' => 'Вигляд було видалено.',
'View has been altered.' => 'Вигляд було змінено.',
'View has been created.' => 'Вигляд було створено.',
'Alter view' => 'Змінити вигляд',
'Create view' => 'Створити вигляд',
'Indexes' => 'Індекси',
'Indexes have been altered.' => 'Індексування було змінено.',
'Alter indexes' => 'Змінити індексування',
'Add next' => 'Додати ще',
'Index Type' => 'Тип індексу',
'Column (length)' => 'Стовпець (довжина)',
'Foreign keys' => 'Зовнішні ключі',
'Foreign key' => 'Зовнішній ключ',
'Foreign key has been dropped.' => 'Зовнішній ключ було видалено.',
'Foreign key has been altered.' => 'Зовнішній ключ було змінено.',
'Foreign key has been created.' => 'Зовнішній ключ було створено.',
'Target table' => 'Цільова таблиця',
'Change' => 'Змінити',
'Source' => 'Джерело',
'Target' => 'Ціль',
'Add column' => 'Додати стовпець',
'Alter' => 'Змінити',
'Add foreign key' => 'Додати зовнішній ключ',
'ON DELETE' => 'ПРИ ВИДАЛЕННІ',
'ON UPDATE' => 'ПРИ ЗМІНІ',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Стовпці повинні мати той самий тип даних, цільові стовпці повинні бути проіндексовані і дані, на які посилаються повинні існувати.',
'Triggers' => 'Тригери',
'Add trigger' => 'Додати тригер',
'Trigger has been dropped.' => 'Тригер було видалено.',
'Trigger has been altered.' => 'Тригер було змінено.',
'Trigger has been created.' => 'Тригер було створено.',
'Alter trigger' => 'Змінити тригер',
'Create trigger' => 'Створити тригер',
'Time' => 'Час',
'Event' => 'Подія',
'Name' => 'Назва',
'select' => 'вибрати',
'Select' => 'Вибрати',
'Select data' => 'Вибрати дані',
'Functions' => 'Функції',
'Aggregation' => 'Агрегація',
'Search' => 'Пошук',
'anywhere' => 'будь-де',
'Search data in tables' => 'Шукати дані в таблицях',
'Sort' => 'Сортувати',
'descending' => 'по спаданню',
'Limit' => 'Обмеження',
'Text length' => 'Довжина тексту',
'Action' => 'Дія',
'Unable to select the table' => 'Неможливо вибрати таблицю',
'No rows.' => 'Нема рядків.',
'%d row(s)' => array('%d рядок', '%d рядки', '%d рядків'),
'Page' => 'Сторінка',
'last' => 'остання',
'Last page' => 'Остання сторінка',
'whole result' => 'весь результат',
'%d byte(s)' => array('%d байт', '%d байта', '%d байтів'),
'Import' => 'Імпортувати',
'%d row(s) have been imported.' => array('%d рядок було імпортовано.', '%d рядки було імпортовано.', '%d рядків було імпортовано.'),
// in-place editing in select
'Double click on a value to modify it.' => 'Двічі клікніть на значенні щоб змінити його.',
'Use edit link to modify this value.' => 'Використовуйте посилання щоб змінити це значення.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Запис%s було вставлено.',
'Item has been deleted.' => 'Запис було видалено.',
'Item has been updated.' => 'Запис було змінено.',
'%d item(s) have been affected.' => array('Було змінено %d запис.', 'Було змінено %d записи.', 'Було змінено %d записів.'),
'New item' => 'Новий запис',
'original' => 'початковий',
// label for value '' in enum data type
'empty' => 'порожньо',
'edit' => 'редагувати',
'Edit' => 'Редагувати',
'Insert' => 'Вставити',
'Save' => 'Зберегти',
'Save and continue edit' => 'Зберегти і продовжити редагування',
'Save and insert next' => 'Зберегти і вставити знову',
'Clone' => 'Клонувати',
'Delete' => 'Видалити',
'E-mail' => 'E-mail',
'From' => 'Від',
'Subject' => 'Заголовок',
'Attachments' => 'Додатки',
'Send' => 'Надіслати',
'%d e-mail(s) have been sent.' => array('Було надіслано %d повідомлення.', 'Було надіслано %d повідомлення.', 'Було надіслано %d повідомлень.'),
// data type descriptions
'Numbers' => 'Числа',
'Date and time' => 'Дата і час',
'Strings' => 'Радки',
'Binary' => 'Двійкові',
'Lists' => 'Списки',
'Network' => 'Мережа',
'Geometry' => 'Геометрія',
'Relations' => 'Зв\'язки',
'Editor' => 'Редактор',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$5.$3.$1',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'дд.мм.[рррр]',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'ГГ:ХХ:СС',
'now' => 'зараз',
'yes' => 'так',
'no' => 'ні',
// general SQLite error in create, drop or rename database
'File exists.' => 'Файл існує.',
'Please use one of the extensions %s.' => 'Будь ласка, використовуйте одне з розширень %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Змінити схему',
'Create schema' => 'Створити схему',
'Schema has been dropped.' => 'Схему було видалено.',
'Schema has been created.' => 'Схему було створено.',
'Schema has been altered.' => 'Схему було змінено.',
'schema' => 'схема',
'Schema' => 'Схема',
'Invalid schema.' => 'Невірна схема.',
// PostgreSQL sequences support
'Sequences' => 'Послідовності',
'Create sequence' => 'Створити послідовність',
'Sequence has been dropped.' => 'Послідовність було видалено.',
'Sequence has been created.' => 'Послідовність було створено.',
'Sequence has been altered.' => 'Послідовність було змінено.',
'Alter sequence' => 'Змінити послідовність',
// PostgreSQL user types support
'User types' => 'Типи користувачів',
'Create type' => 'Створити тип',
'Type has been dropped.' => 'Тип було видалено.',
'Type has been created.' => 'Тип було створено.',
'Alter type' => 'Змінити тип',
);

321
adminer/lang/xx.inc.php Normal file
View File

@@ -0,0 +1,321 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'xx',
'Server' => 'xx',
'Username' => 'xx',
'Password' => 'xx',
'Permanent login' => 'xx',
'Login' => 'xx',
'Logout' => 'xx',
'Logged as: %s' => 'xx',
'Logout successful.' => 'xx',
'Invalid credentials.' => 'xx',
'Language' => 'xx',
'Invalid CSRF token. Send the form again.' => 'xx',
'No extension' => 'xx',
'None of the supported PHP extensions (%s) are available.' => 'xx',
'Session support must be enabled.' => 'xx',
'Session expired, please login again.' => 'xx',
'%s version: %s through PHP extension %s' => 'xx',
'Refresh' => 'xx',
// text direction - 'ltr' or 'rtl'
'ltr' => 'xx',
'Privileges' => 'xx',
'Create user' => 'xx',
'User has been dropped.' => 'xx',
'User has been altered.' => 'xx',
'User has been created.' => 'xx',
'Hashed' => 'xx',
'Column' => 'xx',
'Routine' => 'xx',
'Grant' => 'xx',
'Revoke' => 'xx',
'Process list' => 'xx',
'%d process(es) have been killed.' => array('xx', 'xx'),
'Kill' => 'xx',
'Variables' => 'xx',
'Status' => 'xx',
'SQL command' => 'xx',
'%d query(s) executed OK.' => array('xx', 'xx'),
'Query executed OK, %d row(s) affected.' => array('xx', 'xx'),
'No commands to execute.' => 'xx',
'Error in query' => 'xx',
'Execute' => 'xx',
'Stop on error' => 'xx',
'Show only errors' => 'xx',
// sprintf() format for time of the command
'%.3f s' => 'xx',
'History' => 'xx',
'Clear' => 'xx',
'Edit all' => 'xx',
'File upload' => 'xx',
'From server' => 'xx',
'Webserver file %s' => 'xx',
'Run file' => 'xx',
'File does not exist.' => 'xx',
'File uploads are disabled.' => 'xx',
'Unable to upload a file.' => 'xx',
'Maximum allowed file size is %sB.' => 'xx',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'xx',
'Export' => 'xx',
'Dump' => 'xx',
'Output' => 'xx',
'open' => 'xx',
'save' => 'xx',
'Format' => 'xx',
'Data' => 'xx',
'Database' => 'xx',
'database' => 'xx',
'Use' => 'xx',
'Select database' => 'xx',
'Invalid database.' => 'xx',
'Create new database' => 'xx',
'Database has been dropped.' => 'xx',
'Databases have been dropped.' => 'xx',
'Database has been created.' => 'xx',
'Database has been renamed.' => 'xx',
'Database has been altered.' => 'xx',
'Alter database' => 'xx',
'Create database' => 'xx',
'Database schema' => 'xx',
// link to current database schema layout
'Permanent link' => 'xx',
// thousands separator - must contain single byte
',' => 'xx',
'Engine' => 'xx',
'Collation' => 'xx',
'Data Length' => 'xx',
'Index Length' => 'xx',
'Data Free' => 'xx',
'Rows' => 'xx',
'%d in total' => 'xx',
'Analyze' => 'xx',
'Optimize' => 'xx',
'Check' => 'xx',
'Repair' => 'xx',
'Truncate' => 'xx',
'Tables have been truncated.' => 'xx',
'Move to other database' => 'xx',
'Move' => 'xx',
'Tables have been moved.' => 'xx',
'Copy' => 'xx',
'Tables have been copied.' => 'xx',
'Routines' => 'xx',
'Routine has been called, %d row(s) affected.' => array('xx', 'xx'),
'Call' => 'xx',
'Parameter name' => 'xx',
'Create procedure' => 'xx',
'Create function' => 'xx',
'Routine has been dropped.' => 'xx',
'Routine has been altered.' => 'xx',
'Routine has been created.' => 'xx',
'Alter function' => 'xx',
'Alter procedure' => 'xx',
'Return type' => 'xx',
'Events' => 'xx',
'Event has been dropped.' => 'xx',
'Event has been altered.' => 'xx',
'Event has been created.' => 'xx',
'Alter event' => 'xx',
'Create event' => 'xx',
'At given time' => 'xx',
'Every' => 'xx',
'Schedule' => 'xx',
'Start' => 'xx',
'End' => 'xx',
'On completion preserve' => 'xx',
'Tables' => 'xx',
'Tables and views' => 'xx',
'Table' => 'xx',
'No tables.' => 'xx',
'Alter table' => 'xx',
'Create table' => 'xx',
'Create new table' => 'xx',
'Table has been dropped.' => 'xx',
'Tables have been dropped.' => 'xx',
'Tables have been optimized.' => 'xx',
'Table has been altered.' => 'xx',
'Table has been created.' => 'xx',
'Table name' => 'xx',
'Show structure' => 'xx',
'engine' => 'xx',
'collation' => 'xx',
'Column name' => 'xx',
'Type' => 'xx',
'Length' => 'xx',
'Auto Increment' => 'xx',
'Options' => 'xx',
'Comment' => 'xx',
'Default values' => 'xx',
'Drop' => 'xx',
'Are you sure?' => 'xx',
'Move up' => 'xx',
'Move down' => 'xx',
'Remove' => 'xx',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'xx',
'Partition by' => 'xx',
'Partitions' => 'xx',
'Partition name' => 'xx',
'Values' => 'xx',
'View' => 'xx',
'View has been dropped.' => 'xx',
'View has been altered.' => 'xx',
'View has been created.' => 'xx',
'Alter view' => 'xx',
'Create view' => 'xx',
'Indexes' => 'xx',
'Indexes have been altered.' => 'xx',
'Alter indexes' => 'xx',
'Add next' => 'xx',
'Index Type' => 'xx',
'Column (length)' => 'xx',
'Foreign keys' => 'xx',
'Foreign key' => 'xx',
'Foreign key has been dropped.' => 'xx',
'Foreign key has been altered.' => 'xx',
'Foreign key has been created.' => 'xx',
'Target table' => 'xx',
'Change' => 'xx',
'Source' => 'xx',
'Target' => 'xx',
'Add column' => 'xx',
'Alter' => 'xx',
'Add foreign key' => 'xx',
'ON DELETE' => 'xx',
'ON UPDATE' => 'xx',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'xx',
'Triggers' => 'xx',
'Add trigger' => 'xx',
'Trigger has been dropped.' => 'xx',
'Trigger has been altered.' => 'xx',
'Trigger has been created.' => 'xx',
'Alter trigger' => 'xx',
'Create trigger' => 'xx',
'Time' => 'xx',
'Event' => 'xx',
'Name' => 'xx',
'select' => 'xx',
'Select' => 'xx',
'Select data' => 'xx',
'Functions' => 'xx',
'Aggregation' => 'xx',
'Search' => 'xx',
'anywhere' => 'xx',
'Search data in tables' => 'xx',
'Sort' => 'xx',
'descending' => 'xx',
'Limit' => 'xx',
'Text length' => 'xx',
'Action' => 'xx',
'Full table scan' => 'xx',
'Unable to select the table' => 'xx',
'No rows.' => 'xx',
'%d row(s)' => array('xx', 'xx'),
'Page' => 'xx',
'last' => 'xx',
'Last page' => 'xx',
'whole result' => 'xx',
'%d byte(s)' => array('xx', 'xx'),
'Import' => 'xx',
'%d row(s) have been imported.' => array('xx', 'xx'),
// in-place editing in select
'Double click on a value to modify it.' => 'xx',
'Use edit link to modify this value.' => 'xx',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'xx',
'Item has been deleted.' => 'xx',
'Item has been updated.' => 'xx',
'%d item(s) have been affected.' => array('xx', 'xx'),
'New item' => 'xx',
'original' => 'xx',
// label for value '' in enum data type
'empty' => 'xx',
'edit' => 'xx',
'Edit' => 'xx',
'Insert' => 'xx',
'Save' => 'xx',
'Save and continue edit' => 'xx',
'Save and insert next' => 'xx',
'Clone' => 'xx',
'Delete' => 'xx',
'E-mail' => 'xx',
'From' => 'xx',
'Subject' => 'xx',
'Attachments' => 'xx',
'Send' => 'xx',
'%d e-mail(s) have been sent.' => array('xx', 'xx'),
// data type descriptions
'Numbers' => 'xx',
'Date and time' => 'xx',
'Strings' => 'xx',
'Binary' => 'xx',
'Lists' => 'xx',
'Network' => 'xx',
'Geometry' => 'xx',
'Relations' => 'xx',
'Editor' => 'xx',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => 'xx',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'xx',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'xx',
'now' => 'xx',
'yes' => 'xx',
'no' => 'xx',
// general SQLite error in create, drop or rename database
'File exists.' => 'xx',
'Please use one of the extensions %s.' => 'xx',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'xx',
'Create schema' => 'xx',
'Schema has been dropped.' => 'xx',
'Schema has been created.' => 'xx',
'Schema has been altered.' => 'xx',
'schema' => 'xx',
'Schema' => 'xx',
'Invalid schema.' => 'xx',
// PostgreSQL sequences support
'Sequences' => 'xx',
'Create sequence' => 'xx',
'Sequence has been dropped.' => 'xx',
'Sequence has been created.' => 'xx',
'Sequence has been altered.' => 'xx',
'Alter sequence' => 'xx',
// PostgreSQL user types support
'User types' => 'xx',
'Create type' => 'xx',
'Type has been dropped.' => 'xx',
'Type has been created.' => 'xx',
'Alter type' => 'xx',
);

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => '複製', 'Copy' => '複製',
'Permanent link' => '永久鏈接', 'Permanent link' => '永久鏈接',
'Edit all' => '編輯全部', 'Edit all' => '編輯全部',
'Resend POST data?' => '重新發送表單資料?',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -268,6 +268,5 @@ $translations = array(
'Copy' => '复制', 'Copy' => '复制',
'Permanent link' => '固定链接', 'Permanent link' => '固定链接',
'Edit all' => '编辑全部', 'Edit all' => '编辑全部',
'Resend POST data?' => '重新发送 POST 数据?',
'HH:MM:SS' => 'HH:MM:SS', 'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -23,7 +23,13 @@ foreach (process_list() as $i => $row) {
} }
echo "<tr" . odd() . ">" . (support("kill") ? "<td>" . checkbox("kill[]", $row["Id"], 0) : ""); echo "<tr" . odd() . ">" . (support("kill") ? "<td>" . checkbox("kill[]", $row["Id"], 0) : "");
foreach ($row as $key => $val) { foreach ($row as $key => $val) {
echo "<td>" . (($jush == "sql" ? $key == "Info" && $val != "" : $key == "current_query" && $val != "<IDLE>") ? "<code class='jush-$jush'>" . shorten_utf8($val, 100, "</code>") . ' <a href="' . h(ME . ($row["db"] != "" ? "db=" . urlencode($row["db"]) . "&" : "") . "sql=" . urlencode($val)) . '">' . lang('Edit') . '</a>' : nbsp($val)); echo "<td>" . (
($jush == "sql" && $key == "Info" && $row["Command"] == "Query" && $val != "") ||
($jush == "pgsql" && $key == "current_query" && $val != "<IDLE>") ||
($jush == "oracle" && $key == "sql_text" && $val != "")
? "<code class='jush-$jush'>" . shorten_utf8($val, 100, "</code>") . ' <a href="' . h(ME . ($row["db"] != "" ? "db=" . urlencode($row["db"]) . "&" : "") . "sql=" . urlencode($val)) . '">' . lang('Edit') . '</a>'
: nbsp($val)
);
} }
echo "\n"; echo "\n";
} }

View File

@@ -13,8 +13,12 @@ if ($_GET["script"] == "db") {
foreach ($sums + array("Auto_increment" => 0, "Rows" => 0) as $key => $val) { foreach ($sums + array("Auto_increment" => 0, "Rows" => 0) as $key => $val) {
if ($table_status[$key] != "") { if ($table_status[$key] != "") {
$val = number_format($table_status[$key], 0, '.', lang(',')); $val = number_format($table_status[$key], 0, '.', lang(','));
json_row("$key-$id", ($key == "Rows" && $table_status["Engine"] == "InnoDB" && $val ? "~ $val" : $val)); json_row("$key-$id", ($key == "Rows" && $val && (
$table_status["Engine"] == "InnoDB" || // MySQL InnoDB
$table_status["Engine"] == "table" // PostgreSQL table reltype
) ? "~ $val" : $val));
if (isset($sums[$key])) { if (isset($sums[$key])) {
// ignore innodb_file_per_table because it is not active for tables created before it was enabled
$sums[$key] += ($table_status["Engine"] != "InnoDB" || $key != "Data_free" ? $table_status[$key] : 0); $sums[$key] += ($table_status["Engine"] != "InnoDB" || $key != "Data_free" ? $table_status[$key] : 0);
} }
} elseif (array_key_exists($key, $table_status)) { } elseif (array_key_exists($key, $table_status)) {

View File

@@ -209,7 +209,7 @@ if (!$columns) {
$adminer->selectOrderPrint($order, $columns, $indexes); $adminer->selectOrderPrint($order, $columns, $indexes);
$adminer->selectLimitPrint($limit); $adminer->selectLimitPrint($limit);
$adminer->selectLengthPrint($text_length); $adminer->selectLengthPrint($text_length);
$adminer->selectActionPrint(); $adminer->selectActionPrint($indexes);
echo "</form>\n"; echo "</form>\n";
$page = $_GET["page"]; $page = $_GET["page"];
@@ -265,9 +265,9 @@ if (!$columns) {
$rank++; $rank++;
$names[$key] = $name; $names[$key] = $name;
$column = idf_escape($key); $column = idf_escape($key);
echo '<th><a href="' . h(remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key) $href = remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key);
. ($order[0] == $column || $order[0] == $key || (!$order && count($group) < count($select) && $group[0] == $column) ? '&desc%5B0%5D=1' : '') // $order[0] == $key - COUNT(*) echo '<th><a href="' . h($href) . '">' . (!$select || $val ? apply_sql_function($val["fun"], $name) : h(current($select))) . "</a>"; //! columns looking like functions
) . '">' . (!$select || $val ? apply_sql_function($val["fun"], $name) : h(current($select))) . "</a>"; //! columns looking like functions echo "<a href='" . h("$href&desc%5B0%5D=1") . "' title='" . lang('descending') . "' class='text'> ↓</a>";
} }
$functions[$key] = $val["fun"]; $functions[$key] = $val["fun"];
next($select); next($select);
@@ -286,7 +286,7 @@ if (!$columns) {
$unique_array = unique_array($rows[$n], $indexes); $unique_array = unique_array($rows[$n], $indexes);
$unique_idf = ""; $unique_idf = "";
foreach ($unique_array as $key => $val) { foreach ($unique_array as $key => $val) {
$unique_idf .= "&" . (isset($val) ? urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($val) : "null%5B%5D=" . urlencode($key)); $unique_idf .= "&" . ($val !== null ? urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($val) : "null%5B%5D=" . urlencode($key));
} }
echo "<tr" . odd() . ">" . (!$group && $select ? "" : "<td>" . checkbox("check[]", substr($unique_idf, 1), in_array(substr($unique_idf, 1), (array) $_POST["check"]), "", "this.form['all'].checked = false; formUncheck('all-page');") . (count($group) < count($select) || information_schema(DB) ? "" : " <a href='" . h(ME . "edit=" . urlencode($TABLE) . $unique_idf) . "'>" . lang('edit') . "</a>")); echo "<tr" . odd() . ">" . (!$group && $select ? "" : "<td>" . checkbox("check[]", substr($unique_idf, 1), in_array(substr($unique_idf, 1), (array) $_POST["check"]), "", "this.form['all'].checked = false; formUncheck('all-page');") . (count($group) < count($select) || information_schema(DB) ? "" : " <a href='" . h(ME . "edit=" . urlencode($TABLE) . $unique_idf) . "'>" . lang('edit') . "</a>"));
foreach ($row as $key => $val) { foreach ($row as $key => $val) {
@@ -297,18 +297,18 @@ if (!$columns) {
} }
$link = ""; $link = "";
$val = $adminer->editVal($val, $field); $val = $adminer->editVal($val, $field);
if (!isset($val)) { if ($val !== null) {
$val = "<i>NULL</i>";
} else {
if (ereg('blob|bytea|raw|file', $field["type"]) && $val != "") { if (ereg('blob|bytea|raw|file', $field["type"]) && $val != "") {
$link = h(ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf); $link = h(ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf);
} }
if ($val === "") { // === - may be int if ($val === "") { // === - may be int
$val = "&nbsp;"; $val = "&nbsp;";
} elseif ($text_length != "" && ereg('text|blob', $field["type"]) && is_utf8($val)) { } elseif (is_utf8($val)) {
$val = shorten_utf8($val, max(0, +$text_length)); // usage of LEFT() would reduce traffic but complicate query - expected average speedup: .001 s VS .01 s on local network if ($text_length != "" && ereg('text|blob', $field["type"])) {
} else { $val = shorten_utf8($val, max(0, +$text_length)); // usage of LEFT() would reduce traffic but complicate query - expected average speedup: .001 s VS .01 s on local network
$val = h($val); } else {
$val = h($val);
}
} }
if (!$link) { // link related items if (!$link) { // link related items
@@ -351,11 +351,11 @@ if (!$columns) {
} }
$id = h("val[$unique_idf][" . bracket_escape($key) . "]"); $id = h("val[$unique_idf][" . bracket_escape($key) . "]");
$value = $_POST["val"][$unique_idf][bracket_escape($key)]; $value = $_POST["val"][$unique_idf][bracket_escape($key)];
$h_value = h(isset($value) ? $value : $row[$key]); $h_value = h($value !== null ? $value : $row[$key]);
$long = strpos($val, "<i>...</i>"); $long = strpos($val, "<i>...</i>");
$editable = is_utf8($val) && $rows[$n][$key] == $row[$key] && !$functions[$key]; $editable = is_utf8($val) && $rows[$n][$key] == $row[$key] && !$functions[$key];
$text = ereg('text|lob', $field["type"]); $text = ereg('text|lob', $field["type"]);
echo (($_GET["modify"] && $editable) || isset($value) echo (($_GET["modify"] && $editable) || $value !== null
? "<td>" . ($text ? "<textarea name='$id' cols='30' rows='" . (substr_count($row[$key], "\n") + 1) . "'>$h_value</textarea>" : "<input name='$id' value='$h_value' size='$lengths[$key]'>") ? "<td>" . ($text ? "<textarea name='$id' cols='30' rows='" . (substr_count($row[$key], "\n") + 1) . "'>$h_value</textarea>" : "<input name='$id' value='$h_value' size='$lengths[$key]'>")
: "<td id='$id' ondblclick=\"" . ($editable ? "selectDblClick(this, event" . ($long ? ", 2" : ($text ? ", 1" : "")) . ")" : "alert('" . h(lang('Use edit link to modify this value.')) . "')") . ";\">" . $adminer->selectVal($val, $link, $field) : "<td id='$id' ondblclick=\"" . ($editable ? "selectDblClick(this, event" . ($long ? ", 2" : ($text ? ", 1" : "")) . ")" : "alert('" . h(lang('Use edit link to modify this value.')) . "')") . ";\">" . $adminer->selectVal($val, $link, $field)
); );
@@ -377,7 +377,7 @@ if (!$columns) {
$found_rows = found_rows($table_status, $where); $found_rows = found_rows($table_status, $where);
if ($found_rows < max(1e4, 2 * ($page + 1) * $limit)) { if ($found_rows < max(1e4, 2 * ($page + 1) * $limit)) {
// slow with big tables // slow with big tables
ob_flush(); //! doesn't work with AJAX ob_flush();
flush(); flush();
$found_rows = $connection->result("SELECT COUNT(*) FROM " . table($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : "")); $found_rows = $connection->result("SELECT COUNT(*) FROM " . table($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : ""));
} else { } else {
@@ -413,7 +413,7 @@ if (!$columns) {
$output = $adminer->dumpOutput(); $output = $adminer->dumpOutput();
echo ($output ? html_select("output", $output, $adminer_import["output"]) . " " : ""); echo ($output ? html_select("output", $output, $adminer_import["output"]) . " " : "");
echo html_select("format", $format, $adminer_import["format"]); echo html_select("format", $format, $adminer_import["format"]);
echo " <input type='submit' name='export' value='" . lang('Export') . "' onclick='eventStop(event);'>\n"; echo " <input type='submit' name='export' value='" . lang('Export') . "'>\n";
echo "</div></fieldset>\n"; echo "</div></fieldset>\n";
} }
} }

View File

@@ -34,8 +34,8 @@ if (!$error && $_POST) {
} }
if ($query != "" && strlen($query) < 1e6) { // don't add big queries if ($query != "" && strlen($query) < 1e6) { // don't add big queries
$q = $query . (ereg(";[ \t\r\n]*\$", $query) ? "" : ";"); //! doesn't work with DELIMITER | $q = $query . (ereg(";[ \t\r\n]*\$", $query) ? "" : ";"); //! doesn't work with DELIMITER |
if (!$history || end($history) != $q) { // no repeated queries if (!$history || reset(end($history)) != $q) { // no repeated queries
$history[] = $q; $history[] = array($q, time());
} }
} }
$space = "(?:\\s|/\\*.*\\*/|(?:#|-- )[^\n]*\n|--\n)"; $space = "(?:\\s|/\\*.*\\*/|(?:#|-- )[^\n]*\n|--\n)";
@@ -51,6 +51,7 @@ if (!$error && $_POST) {
} }
$commands = 0; $commands = 0;
$errors = array(); $errors = array();
$line = 0;
$parse = '[\'"' . ($jush == "sql" ? '`#' : ($jush == "sqlite" ? '`[' : ($jush == "mssql" ? '[' : ''))) . ']|/\\*|-- |$' . ($jush == "pgsql" ? '|\\$[^$]*\\$' : ''); $parse = '[\'"' . ($jush == "sql" ? '`#' : ($jush == "sqlite" ? '`[' : ($jush == "mssql" ? '[' : ''))) . ']|/\\*|-- |$' . ($jush == "pgsql" ? '|\\$[^$]*\\$' : '');
$total_start = microtime(); $total_start = microtime();
parse_str($_COOKIE["adminer_export"], $adminer_export); parse_str($_COOKIE["adminer_export"], $adminer_export);
@@ -61,16 +62,16 @@ if (!$error && $_POST) {
$delimiter = $match[1]; $delimiter = $match[1];
$query = substr($query, strlen($match[0])); $query = substr($query, strlen($match[0]));
} else { } else {
preg_match('(' . preg_quote($delimiter) . "|$parse)", $query, $match, PREG_OFFSET_CAPTURE, $offset); // should always match preg_match('(' . preg_quote($delimiter) . "\\s*|$parse)", $query, $match, PREG_OFFSET_CAPTURE, $offset); // should always match
$found = $match[0][0]; list($found, $pos) = $match[0];
if (!$found && $fp && !feof($fp)) { if (!$found && $fp && !feof($fp)) {
$query .= fread($fp, 1e5); $query .= fread($fp, 1e5);
} else { } else {
$offset = $match[0][1] + strlen($found);
if (!$found && rtrim($query) == "") { if (!$found && rtrim($query) == "") {
break; break;
} }
if ($found && $found != $delimiter) { // find matching quote or comment end $offset = $pos + strlen($found);
if ($found && rtrim($found) != $delimiter) { // find matching quote or comment end
while (preg_match('(' . ($found == '/*' ? '\\*/' : ($found == '[' ? ']' : (ereg('^-- |^#', $found) ? "\n" : preg_quote($found) . "|\\\\."))) . '|$)s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES while (preg_match('(' . ($found == '/*' ? '\\*/' : ($found == '[' ? ']' : (ereg('^-- |^#', $found) ? "\n" : preg_quote($found) . "|\\\\."))) . '|$)s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES
$s = $match[0][0]; $s = $match[0][0];
if (!$s && $fp && !feof($fp)) { if (!$s && $fp && !feof($fp)) {
@@ -84,7 +85,7 @@ if (!$error && $_POST) {
} }
} else { // end of a query } else { // end of a query
$empty = false; $empty = false;
$q = substr($query, 0, $match[0][1]); $q = substr($query, 0, $pos);
$commands++; $commands++;
$print = "<pre id='sql-$commands'><code class='jush-$jush'>" . shorten_utf8(trim($q), 1000) . "</code></pre>\n"; $print = "<pre id='sql-$commands'><code class='jush-$jush'>" . shorten_utf8(trim($q), 1000) . "</code></pre>\n";
if (!$_POST["only_errors"]) { if (!$_POST["only_errors"]) {
@@ -109,7 +110,7 @@ if (!$error && $_POST) {
break 2; break 2;
} }
} elseif (is_object($result)) { } elseif (is_object($result)) {
select($result, $connection2); $orgtables = select($result, $connection2);
if (!$_POST["only_errors"]) { if (!$_POST["only_errors"]) {
echo "<form action='' method='post'>\n"; echo "<form action='' method='post'>\n";
echo "<p>" . ($result->num_rows ? lang('%d row(s)', $result->num_rows) : "") . $time; echo "<p>" . ($result->num_rows ? lang('%d row(s)', $result->num_rows) : "") . $time;
@@ -118,13 +119,13 @@ if (!$error && $_POST) {
. html_select("output", $adminer->dumpOutput(), $adminer_export["output"]) . " " . html_select("output", $adminer->dumpOutput(), $adminer_export["output"]) . " "
. html_select("format", $dump_format, $adminer_export["format"]) . html_select("format", $dump_format, $adminer_export["format"])
. "<input type='hidden' name='query' value='" . h($q) . "'>" . "<input type='hidden' name='query' value='" . h($q) . "'>"
. " <input type='submit' name='export' value='" . lang('Export') . "' onclick='eventStop(event);'><input type='hidden' name='token' value='$token'></span>\n" . " <input type='submit' name='export' value='" . lang('Export') . "'><input type='hidden' name='token' value='$token'></span>\n"
; ;
if ($connection2 && preg_match("~^($space|\\()*SELECT\\b~isU", $q) && ($explain = explain($connection2, $q))) { if ($connection2 && preg_match("~^($space|\\()*SELECT\\b~isU", $q) && ($explain = explain($connection2, $q))) {
$id = "explain-$commands"; $id = "explain-$commands";
echo ", <a href='#$id' onclick=\"return !toggle('$id');\">EXPLAIN</a>$export"; echo ", <a href='#$id' onclick=\"return !toggle('$id');\">EXPLAIN</a>$export";
echo "<div id='$id' class='hidden'>\n"; echo "<div id='$id' class='hidden'>\n";
select($explain, $connection2, ($jush == "sql" ? "http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/explain-output.html#explain_" : "")); select($explain, $connection2, ($jush == "sql" ? "http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/explain-output.html#explain_" : ""), $orgtables);
echo "</div>\n"; echo "</div>\n";
} else { } else {
echo $export; echo $export;
@@ -143,6 +144,7 @@ if (!$error && $_POST) {
} }
$start = $end; $start = $end;
} while ($connection->next_result()); } while ($connection->next_result());
$line += substr_count($q.$found, "\n");
$query = substr($query, $offset); $query = substr($query, $offset);
$offset = 0; $offset = 0;
} }
@@ -171,7 +173,7 @@ if ($_POST) {
} elseif ($_GET["history"] == "all") { } elseif ($_GET["history"] == "all") {
$q = $history; $q = $history;
} elseif ($_GET["history"] != "") { } elseif ($_GET["history"] != "") {
$q = $history[$_GET["history"]]; $q = $history[$_GET["history"]][0];
} }
textarea("query", $q, 20); textarea("query", $q, 20);
echo ($_POST ? "" : "<script type='text/javascript'>document.getElementsByTagName('textarea')[0].focus();</script>\n"); echo ($_POST ? "" : "<script type='text/javascript'>document.getElementsByTagName('textarea')[0].focus();</script>\n");
@@ -202,8 +204,8 @@ echo "</div></fieldset>\n";
if ($history) { if ($history) {
print_fieldset("history", lang('History'), $_GET["history"] != ""); print_fieldset("history", lang('History'), $_GET["history"] != "");
foreach ($history as $key => $val) { foreach ($history as $key => $val) {
//! save and display timestamp list($q, $time) = $val;
echo '<a href="' . h(ME . "sql=&history=$key") . '">' . lang('Edit') . "</a> <code class='jush-$jush'>" . 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> <span class='time'>" . @date("H:i:s", $time) . "</span> <code class='jush-$jush'>" . shorten_utf8(ltrim(str_replace("\n", " ", str_replace("\r", "", preg_replace('~^(#|-- ).*~m', '', $q)))), 80, "</code>") . "<br>\n"; // @ - time zone may be not set
} }
echo "<input type='submit' name='clear' value='" . lang('Clear') . "'>\n"; echo "<input type='submit' name='clear' value='" . lang('Clear') . "'>\n";
echo "<a href='" . h(ME . "sql=&history=all") . "'>" . lang('Edit all') . "</a>\n"; echo "<a href='" . h(ME . "sql=&history=all") . "'>" . lang('Edit all') . "</a>\n";

View File

@@ -3,6 +3,7 @@ body { color: #000; background: #fff; font: 90%/1.25 Verdana, Arial, Helvetica,
a { color: blue; } a { color: blue; }
a:visited { color: navy; } a:visited { color: navy; }
a:hover { color: red; } a:hover { color: red; }
a.text { text-decoration: none; }
h1 { font-size: 150%; margin: 0; padding: .8em 1em; border-bottom: 1px solid #999; font-weight: normal; color: #777; background: #eee; } h1 { font-size: 150%; margin: 0; padding: .8em 1em; border-bottom: 1px solid #999; font-weight: normal; color: #777; background: #eee; }
h2 { font-size: 150%; margin: 0 0 20px -18px; padding: .8em 1em; border-bottom: 1px solid #000; color: #000; font-weight: normal; background: #ddf; } h2 { font-size: 150%; margin: 0 0 20px -18px; padding: .8em 1em; border-bottom: 1px solid #000; color: #000; font-weight: normal; background: #ddf; }
h3 { font-weight: normal; font-size: 130%; margin: 1em 0 0; } h3 { font-weight: normal; font-size: 130%; margin: 1em 0 0; }
@@ -20,8 +21,6 @@ code { background: #eee; }
tbody tr:hover td, tbody tr:hover th { background: #eee; } tbody tr:hover td, tbody tr:hover th { background: #eee; }
pre { margin: 1em 0 0; } pre { margin: 1em 0 0; }
input[type=image] { vertical-align: middle; } input[type=image] { vertical-align: middle; }
.loading { cursor: progress; }
.loading #loader { display: inline; }
.version { color: #777; font-size: 67%; } .version { color: #777; font-size: 67%; }
.js .hidden, .nojs .jsonly { display: none; } .js .hidden, .nojs .jsonly { display: none; }
.nowrap td, .nowrap th, td.nowrap { white-space: pre; } .nowrap td, .nowrap th, td.nowrap { white-space: pre; }
@@ -44,12 +43,12 @@ input[type=image] { vertical-align: middle; }
.options select { width: 20ex; width: auto\9; } .options select { width: 20ex; width: auto\9; }
.active { font-weight: bold; } .active { font-weight: bold; }
.sqlarea { width: 98%; } .sqlarea { width: 98%; }
.icon { width: 18px; height: 18px; }
#menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; overflow: auto; overflow-y: hidden; white-space: nowrap; } #menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; overflow: auto; overflow-y: hidden; white-space: nowrap; }
#menu p { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; } #menu p { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
#content { margin: 2em 0 0 21em; padding: 10px 20px 20px 0; } #content { margin: 2em 0 0 21em; padding: 10px 20px 20px 0; }
#lang { position: absolute; top: 0; left: 0; line-height: 1.8em; padding: .3em 1em; } #lang { position: absolute; top: 0; left: 0; line-height: 1.8em; padding: .3em 1em; }
#breadcrumb { white-space: nowrap; position: absolute; top: 0; left: 21em; background: #eee; height: 2em; line-height: 1.8em; padding: 0 1em; margin: 0 0 0 -18px; } #breadcrumb { white-space: nowrap; position: absolute; top: 0; left: 21em; background: #eee; height: 2em; line-height: 1.8em; padding: 0 1em; margin: 0 0 0 -18px; }
#loader { display: none; position: fixed; top: 2px; right: 2px; z-index: 1; }
#h1 { color: #777; text-decoration: none; font-style: italic; } #h1 { color: #777; text-decoration: none; font-style: italic; }
#version { font-size: 67%; color: red; } #version { font-size: 67%; color: red; }
#schema { margin-left: 60px; position: relative; -moz-user-select: none; -webkit-user-select: none; } #schema { margin-left: 60px; position: relative; -moz-user-select: none; -webkit-user-select: none; }

View File

@@ -6,10 +6,14 @@ var jushRoot = '../externals/jush/'; // global variable to allow simple customiz
* @param string first three characters of database system version * @param string first three characters of database system version
*/ */
function bodyLoad(version) { function bodyLoad(version) {
if (history.state !== undefined) { // copied from editor/static/editing.js
onpopstate(history);
}
if (jushRoot) { if (jushRoot) {
// copy of jush.style to load JS and CSS at once
var link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = jushRoot + 'jush.css';
document.getElementsByTagName('head')[0].appendChild(link);
var script = document.createElement('script'); var script = document.createElement('script');
script.src = jushRoot + 'jush.js'; script.src = jushRoot + 'jush.js';
script.onload = function () { script.onload = function () {
@@ -19,7 +23,6 @@ function bodyLoad(version) {
var pgsql = 'http://www.postgresql.org/docs/' + version + '/static/'; var pgsql = 'http://www.postgresql.org/docs/' + version + '/static/';
jush.urls.pgsql_pgsqlset = jush.urls.pgsql[0] = pgsql + '$key'; jush.urls.pgsql_pgsqlset = jush.urls.pgsql[0] = pgsql + '$key';
jush.urls.pgsqlset[0] = pgsql + 'runtime-config-$key.html#GUC-$1'; jush.urls.pgsqlset[0] = pgsql + 'runtime-config-$key.html#GUC-$1';
jush.style(jushRoot + 'jush.css');
if (window.jushLinks) { if (window.jushLinks) {
jush.custom_links = jushLinks; jush.custom_links = jushLinks;
} }
@@ -62,7 +65,7 @@ function typePassword(el, disable) {
function loginDriver(driver) { function loginDriver(driver) {
var trs = driver.parentNode.parentNode.parentNode.rows; var trs = driver.parentNode.parentNode.parentNode.rows;
for (var i=1; i < trs.length; i++) { for (var i=1; i < trs.length - 1; i++) {
trs[i].className = (/sqlite/.test(driver.value) ? 'hidden' : ''); trs[i].className = (/sqlite/.test(driver.value) ? 'hidden' : '');
} }
} }

View File

@@ -106,10 +106,11 @@ function tableClick(event) {
var click = (!window.getSelection || getSelection().isCollapsed); var click = (!window.getSelection || getSelection().isCollapsed);
var el = event.target || event.srcElement; var el = event.target || event.srcElement;
while (!/^tr$/i.test(el.tagName)) { while (!/^tr$/i.test(el.tagName)) {
if (/^table$/i.test(el.tagName)) { if (/^(table|a|input|textarea)$/i.test(el.tagName)) {
return; if (el.type != 'checkbox') {
} return;
if (/^(a|input|textarea)$/i.test(el.tagName)) { }
checkboxClick(event, el);
click = false; click = false;
} }
el = el.parentNode; el = el.parentNode;
@@ -122,6 +123,39 @@ function tableClick(event) {
trCheck(el); trCheck(el);
} }
var lastChecked;
/** Shift-click on checkbox for multiple selection.
* @param MouseEvent
* @param HTMLInputElement
*/
function checkboxClick(event, el) {
if (!el.name) {
return;
}
if (event.shiftKey && (!lastChecked || lastChecked.name == el.name)) {
var checked = (lastChecked ? lastChecked.checked : true);
var inputs = el.parentNode.parentNode.parentNode.getElementsByTagName('input');
var checking = !lastChecked;
for (var i=0; i < inputs.length; i++) {
var input = inputs[i];
if (input.name === el.name) {
if (checking) {
input.checked = checked;
trCheck(input);
}
if (input === el || input === lastChecked) {
if (checking) {
break;
}
checking = true;
}
}
}
}
lastChecked = el;
}
/** Set HTML code of an element /** Set HTML code of an element
* @param string * @param string
* @param string undefined to set parentNode to &nbsp; * @param string undefined to set parentNode to &nbsp;
@@ -157,9 +191,7 @@ function nodePosition(el) {
function pageClick(href, page, event) { function pageClick(href, page, event) {
if (!isNaN(page) && page) { if (!isNaN(page) && page) {
href += (page != 1 ? '&page=' + (page - 1) : ''); href += (page != 1 ? '&page=' + (page - 1) : '');
if (!ajaxSend(href)) { location.href = href;
location.href = href;
}
} }
} }
@@ -169,7 +201,10 @@ function pageClick(href, page, event) {
* @param HTMLSelectElement * @param HTMLSelectElement
*/ */
function selectAddRow(field) { function selectAddRow(field) {
field.onchange = function () { }; field.onchange = function () {
selectFieldChange(field.form);
};
field.onchange();
var row = field.parentNode.cloneNode(true); var row = field.parentNode.cloneNode(true);
var selects = row.getElementsByTagName('select'); var selects = row.getElementsByTagName('select');
for (var i=0; i < selects.length; i++) { for (var i=0; i < selects.length; i++) {
@@ -185,16 +220,44 @@ function selectAddRow(field) {
field.parentNode.parentNode.appendChild(row); field.parentNode.parentNode.appendChild(row);
} }
/** Check whether the query will be executed with index
* @param HTMLFormElement
/** Abort AJAX request
* @uses ajaxRequest
*/ */
function ajaxAbort() { function selectFieldChange(form) {
ajaxRequest.onreadystatechange = null; var ok = (function () {
if (ajaxRequest.abort) { var inputs = form.getElementsByTagName('input');
ajaxRequest.abort(); for (var i=0; i < inputs.length; i++) {
} var input = inputs[i];
if (/^fulltext/.test(input.name) && input.value) {
return true;
}
}
var ok = true;
var selects = form.getElementsByTagName('select');
for (var i=0; i < selects.length; i++) {
var select = selects[i];
var col = selectValue(select);
var match = /^(where.+)col\]/.exec(select.name);
if (match) {
var op = selectValue(form[match[1] + 'op]']);
var val = form[match[1] + 'val]'].value;
if (col in indexColumns && (!/LIKE|REGEXP/.test(op) || (op == 'LIKE' && val.charAt(0) != '%'))) {
return true;
} else if (col || val) {
ok = false;
}
}
//! take grouping in select into account
if (col && /^order/.test(select.name)) {
if (!(col in indexColumns)) {
ok = false;
}
break;
}
}
return ok;
})();
setHtml('noindex', (ok ? '' : '!'));
} }
@@ -206,22 +269,12 @@ function ajaxAbort() {
*/ */
function bodyKeydown(event, button) { function bodyKeydown(event, button) {
var target = event.target || event.srcElement; var target = event.target || event.srcElement;
if (event.keyCode == 27 && !event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey) { // 27 - Esc
ajaxAbort();
document.body.className = document.body.className.replace(/ loading/g, '');
onblur = function () { };
if (originalFavicon) {
replaceFavicon(originalFavicon);
}
}
if (event.ctrlKey && (event.keyCode == 13 || event.keyCode == 10) && !event.altKey && !event.metaKey && /select|textarea|input/i.test(target.tagName)) { // 13|10 - Enter, shiftKey allowed if (event.ctrlKey && (event.keyCode == 13 || event.keyCode == 10) && !event.altKey && !event.metaKey && /select|textarea|input/i.test(target.tagName)) { // 13|10 - Enter, shiftKey allowed
target.blur(); target.blur();
if (!ajaxForm(target.form, (button ? button + '=1' : ''))) { if (button) {
if (button) { target.form[button].click();
target.form[button].click(); } else {
} else { target.form.submit();
target.form.submit();
}
} }
return false; return false;
} }
@@ -307,132 +360,6 @@ function ajaxSetHtml(url) {
}); });
} }
var originalFavicon;
/** Replace favicon
* @param string
*/
function replaceFavicon(href) {
var favicon = document.getElementById('favicon');
if (favicon) {
favicon.href = href;
favicon.parentNode.appendChild(favicon); // to replace the icon in Firefox
}
}
var ajaxRequest = {};
/** Safely load content to #content
* @param string
* @param [string]
* @param [boolean]
* @param [boolean]
* @return XMLHttpRequest or false in case of an error
* @uses ajaxRequest
*/
function ajaxSend(url, data, popState, noscroll) {
if (!history.pushState) {
return false;
}
ajaxAbort();
onblur = function () {
if (!originalFavicon) {
originalFavicon = (document.getElementById('favicon') || {}).href;
}
replaceFavicon(document.getElementById('loader').firstChild.src);
};
document.body.className += ' loading';
ajaxRequest = ajax(url, function (request) {
var title = request.getResponseHeader('X-AJAX-Title');
if (title) {
document.title = decodeURIComponent(title);
}
var redirect = request.getResponseHeader('X-AJAX-Redirect');
if (redirect) {
return ajaxSend(redirect, '', popState);
}
onblur = function () { };
if (originalFavicon) {
replaceFavicon(originalFavicon);
}
if (!popState) {
if (data || url != location.href) {
history.pushState(data, '', url); //! remember window position
}
}
if (!noscroll && !/&order/.test(url)) {
scrollTo(0, 0);
}
setHtml('content', (request.status ? request.responseText : '<p class="error">' + noResponse));
document.body.className = document.body.className.replace(/ loading/g, '');
var content = document.getElementById('content');
var scripts = content.getElementsByTagName('script');
var length = scripts.length; // required to avoid infinite loop
for (var i=0; i < length; i++) {
var script = document.createElement('script');
script.text = scripts[i].text;
content.appendChild(script);
}
var as = document.getElementById('menu').getElementsByTagName('a');
var href = location.href.replace(/(&(sql=|dump=|(select|table)=[^&]*)).*/, '$1');
for (var i=0; i < as.length; i++) {
as[i].className = (href == as[i].href ? 'active' : '');
}
var dump = document.getElementById('dump');
if (dump) {
var match = /&(select|table)=([^&]+)/.exec(href);
dump.href = dump.href.replace(/[^=]+$/, '') + (match ? match[2] : '');
}
//! modify Change database hidden fields
if (window.jush) {
jush.highlight_tag('code', 0);
}
}, data);
return ajaxRequest;
}
/** Revive page from history
* @param PopStateEvent|history
* @uses ajaxRequest
*/
onpopstate = function (event) {
if ((ajaxRequest.send || event.state) && !/#/.test(location.href)) {
ajaxSend(location.href, (event.state && confirm(areYouSure) ? event.state : ''), 1); // 1 - disable pushState
} else {
ajaxRequest.send = true; // to enable AJAX for next call of this function
}
};
/** Send form by AJAX GET
* @param HTMLFormElement
* @param [string]
* @param [boolean]
* @return XMLHttpRequest or false in case of an error
*/
function ajaxForm(form, data, noscroll) {
if ((/&(database|scheme|create|view|sql|user|dump|call)=/.test(location.href) && !/\./.test(data)) || (form.onsubmit && form.onsubmit() === false)) { // . - type="image"
return false;
}
var params = [ ];
for (var i=0; i < form.elements.length; i++) {
var el = form.elements[i];
if (/file/i.test(el.type) && el.value) {
return false;
} else if (el.name && (!/checkbox|radio|submit|file/i.test(el.type) || el.checked)) {
params.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(/select/i.test(el.tagName) ? selectValue(el) : el.value));
}
}
if (data) {
params.push(data);
}
if (form.method == 'post') {
return ajaxSend((/\?/.test(form.action) ? form.action : location.href), params.join('&'), false, noscroll); // ? - always part of Adminer URL
}
return ajaxSend((form.action || location.href).replace(/\?.*/, '') + '?' + params.join('&'), '', false, noscroll);
}
/** Display edit field /** Display edit field
@@ -499,38 +426,6 @@ function selectDblClick(td, event, text) {
/** Load link by AJAX
* @param MouseEvent
* @param string
* @param string
* @return boolean
*/
function bodyClick(event, db, ns) {
if (event.button || event.shiftKey || event.altKey || event.metaKey) {
return;
}
if (event.getPreventDefault ? event.getPreventDefault() : event.returnValue === false || event.defaultPrevented) {
return false;
}
var el = event.target || event.srcElement;
if (/^a$/i.test(el.parentNode.tagName)) {
el = el.parentNode;
}
if (/^a$/i.test(el.tagName) && !/:|#|&download=/i.test(el.getAttribute('href')) && /[&?]username=/.test(el.href) && !event.ctrlKey) {
var match = /&db=([^&]*)/.exec(el.href);
var match2 = /&ns=([^&]*)/.exec(el.href);
return !(db == (match ? decodeURIComponent(match[1]) : '') && ns == (match2 ? decodeURIComponent(match2[1]) : '') && ajaxSend(el.href));
}
if (/^input$/i.test(el.tagName) && /image|submit/.test(el.type)) {
if (event.ctrlKey) {
el.form.target = '_blank';
} else {
return !ajaxForm(el.form, (el.name ? encodeURIComponent(el.name) + (el.type == 'image' ? '.x' : '') + '=1' : ''), el.type == 'image');
}
}
return true;
}
/** Stop event propagation /** Stop event propagation
* @param Event * @param Event
*/ */

Binary file not shown.

Before

Width:  |  Height:  |  Size: 673 B

View File

@@ -1,3 +1,25 @@
Adminer 3.4.0 (released 2012-06-30):
Link to descending order
Shift+click on checkbox to select consecutive rows
Print current time next to executed SQL queries
Warn about selecting data without index
Allow specifying database in login form
Link to original table in EXPLAIN of SELECT * FROM table t
Format numbers in translations
MySQL: inform about disabled event_scheduler
SQLite: support binary data
PostgreSQL: approximate row count in table overview
PostgreSQL: improve PDO support in SQL command
Oracle: schema, processlist, table overview numbers
Simplify work with NULL values (customization)
Use namespace in login form (customization)
Customizable export filename (customization)
Replace JSMin by better JavaScript minifier
Don't use AJAX links and forms
Indonesian translation
Ukrainian translation
Bengali translation
Adminer 3.3.4 (released 2012-03-07): Adminer 3.3.4 (released 2012-03-07):
Foreign keys default actions (bug #3397606) Foreign keys default actions (bug #3397606)
SET DEFAULT foreign key action SET DEFAULT foreign key action

58
compile.php Normal file → Executable file
View File

@@ -1,21 +1,12 @@
#!/usr/bin/env php
<?php <?php
error_reporting(6135); // errors and warnings error_reporting(6135); // errors and warnings
include dirname(__FILE__) . "/adminer/include/version.inc.php"; include dirname(__FILE__) . "/adminer/include/version.inc.php";
include dirname(__FILE__) . "/externals/jsmin-php/jsmin.php"; include dirname(__FILE__) . "/externals/JsShrink/jsShrink.php";
if (!class_exists("JSMin")) { if (!function_exists('jsShrink')) {
/** Simple JS minifier without full support for regex literals function jsShrink($code) {
* @link http://pastebin.com/2Jc2swSr return $code;
*/
class JSMin {
/*private static*/ function callback($match) {
$s = trim($match[0]);
return ($s === "" ? "\n" : ($s[0] === "/" && ($s[1] === "*" || $s[1] === "/") ? "" : $s));
}
/*static*/ function minify($input) {
return preg_replace_callback('~//[^\n]*|/\*.*?\*/|/(?!\s)(?:\\\\.|[^/\\\\])*/|\'(?:\\\\.|[^\'\\\\])*\'|"(?:\\\\.|[^"\\\\])*"|\s*[^0-9a-z_$\'"/\s]\s*|\s+~si', array('JSMin', 'callback'), $input);
}
} }
} }
@@ -36,7 +27,7 @@ function remove_lang($match) {
function lang_ids($match) { function lang_ids($match) {
global $lang_ids; global $lang_ids;
$lang_id = &$lang_ids[stripslashes($match[1])]; $lang_id = &$lang_ids[stripslashes($match[1])];
if (!isset($lang_id)) { if ($lang_id === null) {
$lang_id = count($lang_ids) - 1; $lang_id = count($lang_ids) - 1;
} }
return ($_SESSION["lang"] ? $match[0] : "lang($lang_id$match[2]"); return ($_SESSION["lang"] ? $match[0] : "lang($lang_id$match[2]");
@@ -60,7 +51,9 @@ function put_file($match) {
function lang(\$translation, \$number) { function lang(\$translation, \$number) {
\$pos = $match2[2]\t\t: " . (preg_match("~\\\$LANG == '$_SESSION[lang]'.* \\? (.+)\n~U", $match2[1], $match3) ? $match3[1] : "1") . ' \$pos = $match2[2]\t\t: " . (preg_match("~\\\$LANG == '$_SESSION[lang]'.* \\? (.+)\n~U", $match2[1], $match3) ? $match3[1] : "1") . '
); );
return sprintf($translation[$pos], $number); $translation = str_replace("%d", "%s", $translation[$pos]);
$number = number_format($number, 0, ".", lang(\',\'));
return sprintf($translation, $number);
} }
'; ';
} else { } else {
@@ -78,7 +71,7 @@ function put_file_lang($match) {
include dirname(__FILE__) . "/adminer/lang/$lang.inc.php"; // assign $translations include dirname(__FILE__) . "/adminer/lang/$lang.inc.php"; // assign $translations
$translation_ids = array_flip($lang_ids); // default translation $translation_ids = array_flip($lang_ids); // default translation
foreach ($translations as $key => $val) { foreach ($translations as $key => $val) {
if (isset($val)) { if ($val !== null) {
$translation_ids[$lang_ids[$key]] = $val; $translation_ids[$lang_ids[$key]] = $val;
} }
} }
@@ -94,7 +87,7 @@ function put_file_lang($match) {
function short_identifier($number, $chars) { function short_identifier($number, $chars) {
$return = ''; $return = '';
while ($number >= 0) { while ($number >= 0) {
$return .= $chars{$number % strlen($chars)}; $return .= $chars[$number % strlen($chars)];
$number = floor($number / strlen($chars)) - 1; $number = floor($number / strlen($chars)) - 1;
} }
return $return; return $return;
@@ -108,6 +101,33 @@ function php_shrink($input) {
$shortening = true; $shortening = true;
$tokens = token_get_all($input); $tokens = token_get_all($input);
// remove unnecessary { }
//! change also `while () { if () {;} }` to `while () if () ;` but be careful about `if () { if () { } } else { }
$shorten = 0;
$opening = -1;
foreach ($tokens as $i => $token) {
if (in_array($token[0], array(T_IF, T_ELSE, T_ELSEIF, T_WHILE, T_DO, T_FOR, T_FOREACH), true)) {
$shorten = ($token[0] == T_FOR ? 4 : 2);
$opening = -1;
} elseif (in_array($token[0], array(T_SWITCH, T_FUNCTION, T_CLASS, T_CLOSE_TAG), true)) {
$shorten = 0;
} elseif ($token === ';') {
$shorten--;
} elseif ($token === '{') {
if ($opening < 0) {
$opening = $i;
} elseif ($shorten > 1) {
$shorten = 0;
}
} elseif ($token === '}' && $opening >= 0 && $shorten == 1) {
unset($tokens[$opening]);
unset($tokens[$i]);
$shorten = 0;
$opening = -1;
}
}
$tokens = array_values($tokens);
foreach ($tokens as $i => $token) { foreach ($tokens as $i => $token) {
if ($token[0] === T_VARIABLE && !isset($special_variables[$token[1]])) { if ($token[0] === T_VARIABLE && !isset($special_variables[$token[1]])) {
$short_variables[$token[1]]++; $short_variables[$token[1]]++;
@@ -272,7 +292,7 @@ foreach (array("adminer", "editor") as $project) {
$file = str_replace('<script type="text/javascript" src="static/editing.js"></script>' . "\n", "", $file); $file = str_replace('<script type="text/javascript" src="static/editing.js"></script>' . "\n", "", $file);
$file = preg_replace_callback("~compile_file\\('([^']+)', '([^']+)'\\);~", 'compile_file', $file); // integrate static files $file = preg_replace_callback("~compile_file\\('([^']+)', '([^']+)'\\);~", 'compile_file', $file); // integrate static files
$replace = 'h(preg_replace("~\\\\\\\\?.*~", "", ME)) . "?file=\\1&amp;version=' . $VERSION; $replace = 'h(preg_replace("~\\\\\\\\?.*~", "", ME)) . "?file=\\1&amp;version=' . $VERSION;
$file = preg_replace('~\\.\\./adminer/static/(default\\.css|functions\\.js|favicon\\.ico|loader\\.gif)~', '<?php echo ' . $replace . '"; ?>', $file); $file = preg_replace('~\\.\\./adminer/static/(default\\.css|functions\\.js|favicon\\.ico)~', '<?php echo ' . $replace . '"; ?>', $file);
$file = preg_replace('~\\.\\./adminer/static/([^\'"]*)~', '" . ' . $replace, $file); $file = preg_replace('~\\.\\./adminer/static/([^\'"]*)~', '" . ' . $replace, $file);
$file = str_replace("'../externals/jush/'", "location.protocol + '//www.adminer.org/static/'", $file); $file = str_replace("'../externals/jush/'", "location.protocol + '//www.adminer.org/static/'", $file);
$file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file); $file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file);

View File

@@ -33,7 +33,7 @@ if (!extension_loaded("xdebug")) {
$filename = $_GET["coverage"]; $filename = $_GET["coverage"];
$coverage = (file_exists($coverage_filename) ? unserialize(file_get_contents($coverage_filename)) : array()); $coverage = (file_exists($coverage_filename) ? unserialize(file_get_contents($coverage_filename)) : array());
$file = explode("<br />", highlight_file($filename, true)); $file = explode("<br />", highlight_file($filename, true));
unset($prev_color); $prev_color = null;
$s = ""; $s = "";
for ($l=0; $l <= count($file); $l++) { for ($l=0; $l <= count($file); $l++) {
$line = $file[$l]; $line = $file[$l];
@@ -43,10 +43,10 @@ if (!extension_loaded("xdebug")) {
case -2: $color = "Silver"; break; // dead code case -2: $color = "Silver"; break; // dead code
case null: $color = ""; break; // not executable case null: $color = ""; break; // not executable
} }
if (!isset($prev_color)) { if ($prev_color === null) {
$prev_color = $color; $prev_color = $color;
} }
if ($prev_color != $color || !isset($line)) { if ($prev_color != $color || $line === null) {
echo "<div" . ($prev_color ? " style='background-color: $prev_color;'" : "") . ">$s"; echo "<div" . ($prev_color ? " style='background-color: $prev_color;'" : "") . ">$s";
$open_tags = xhtml_open_tags($s); $open_tags = xhtml_open_tags($s);
foreach (array_reverse($open_tags) as $tag) { foreach (array_reverse($open_tags) as $tag) {

View File

@@ -141,4 +141,3 @@ fieldset, legend, table, .error, .message {-moz-border-radius: 5px; -khtml-borde
#breadcrumb, #lang, #menu {-moz-border-radius-bottomright: 5px; -khtml-border-bottom-right-radius: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px;} #breadcrumb, #lang, #menu {-moz-border-radius-bottomright: 5px; -khtml-border-bottom-right-radius: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px;}
#breadcrumb, #lang {-moz-border-radius-bottomleft: 5px; -khtml-border-bottom-left-radius: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px;} #breadcrumb, #lang {-moz-border-radius-bottomleft: 5px; -khtml-border-bottom-left-radius: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px;}
#menu {-moz-border-radius-topright: 5px; -khtml-border-top-right-radius: 5px; -webkit-border-top-right-radius: 5px; border-bottom-top-radius: 5px;} #menu {-moz-border-radius-topright: 5px; -khtml-border-top-right-radius: 5px; -webkit-border-top-right-radius: 5px; border-bottom-top-radius: 5px;}
#loader {margin-left: 35px;}

View File

@@ -123,4 +123,3 @@ fieldset, legend, h2, table, .error, .message {-moz-border-radius: 5px; -khtml-b
#breadcrumb, #lang, #menu {-moz-border-radius-bottomright: 5px; -khtml-border-bottom-right-radius: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px;} #breadcrumb, #lang, #menu {-moz-border-radius-bottomright: 5px; -khtml-border-bottom-right-radius: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px;}
#breadcrumb {-moz-border-radius-bottomleft: 5px; -khtml-border-bottom-left-radius: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px;} #breadcrumb {-moz-border-radius-bottomleft: 5px; -khtml-border-bottom-left-radius: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px;}
#menu {-moz-border-radius-topright: 5px; -khtml-border-top-right-radius: 5px; -webkit-border-top-right-radius: 5px; border-bottom-top-radius: 5px;} #menu {-moz-border-radius-topright: 5px; -khtml-border-top-right-radius: 5px; -webkit-border-top-right-radius: 5px; border-bottom-top-radius: 5px;}
#loader {margin-left: 35px;}

225
designs/ng9/adminer.css Normal file
View File

@@ -0,0 +1,225 @@
* {
font: 13px/1.5 Verdana, 'Geneva CE', lucida, sans-serif;
color:#333333;
margin:0px;
padding:0px;
}
a,a:visited {
color:#006aeb;
text-decoration:none;
padding:3px 1px;
}
#content table thead span, #content table thead a {
font-weight:bold;
color:black;
}
#content table thead a:hover {
background:none;
text-decoration:underline;
color:black;
}
a:hover {
color:white;
background:#006aeb;
}
h1 {
font-size:1.9em;
font-weight:normal;
background:white;
color:#1e5eb6;
border-bottom:1px solid #f4f4f4;
padding:20px;
margin:0px;
}
#menu h1 {
padding:0px 0px 5px 20px;
background:none;
}
h2,h3 {
font-size:1.5em;
font-weight:normal;
background:white;
color:#1e5eb6;
border-bottom:1px solid #f4f4f4;
padding:20px 0px;
margin:0px;
}
fieldset {
padding:5px;
border:1px solid #f4f4f4;
}
input,select,textarea {
border:1px solid #e5e5e5;
margin:1px;
padding:3px;
}
input[type=submit] {
color:white;
background:#3390e6;
padding:3px 10px;
cursor:pointer;
border:0px solid;
}
input[type=submit]:hover{
background:blue;
}
input[type=checkbox]{
margin-right:5px;
}
input[type=image] {
border:1px solid #d0cdc4;
}
input[type=checkbox],input[type=radio]{
border:1px solid #e5e5e5;
padding:2px 5px;
}
code{
background:#f0ffe1;
border:1px dashed #d5f1b9;
padding:2px 4px;
font-family:"Courier New";
}
code a:hover{background:transparent}
table{
margin:10px 0px;
border:1px solid #d0cdc4;
border-collapse:collapse;
}
tbody tr:hover td,tbody tr:hover th{
background:#edf4ff
}
thead th, thead td {
text-align:center;
vertical-align:middle;
font-weight:bold;
white-space:nowrap;
background:#f2eee1;
color:#808080;
}
th,td{
border:1px solid #d0cdc4;
padding:3px 6px;
vertical-align:top;
}
th a {
font-weight:bold;
padding-bottom:0px;
}
th {
background:white;
}
tr.odd td {
background:#fcfaf5;
}
#content tbody tr.checked td, tr.checked.odd td {
background:#fbe2e2;
color:red;
}
.hidden{
display:none
}
.error,.message{
padding:0px;
background:transparent;
font-weight:bold
}
.error{
color:#c00
}
.message{
color:#090
}
#content{
margin:0px 0px 0px 320px;
padding:50px 20px 40px 0px;
height:100%;
}
#lang {
background:#f2eee1;
color:#808080;
position:fixed;
top:0px;
left:0px;
width:100%;
padding:10px 20px;
z-index:1;
}
#breadcrumb {
position:fixed;
top:0px;
left:300px;
background:#f2eee1;
z-index:2;
width:100%;
padding:10px;
}
#menu {
background:#fcfaf5;
position:fixed;
top:-10px;
padding:20px;
padding-top:40px;
bottom:0px;
overflow:auto;
left:0px;
width:240px;
border-right:5px solid #f2eee1;
}
#schema .table {
padding:5px;
background:#fcfaf5;
border:1px solid #d0cdc4;
}
#schema .table b {
color:#006aeb;
font-weight:bold;
text-decoration:underline;
}
#schema .table b:hover {
color:white;
}
input[name=logout] {
color:#fce2e2;
background:#d73e3e;
}
input[name=logout]:hover {
background:#ea0202;
}

View File

@@ -288,8 +288,3 @@ fieldset {
p { p {
margin: 0.8em 0 0 0 margin: 0.8em 0 0 0
} }
#loader {
position: fixed;
top: 0;
left: 16em;
}

View File

@@ -41,15 +41,15 @@ class Adminer {
function loginForm() { function loginForm() {
?> ?>
<table cellspacing="0"> <table cellspacing="0">
<tr><th><?php echo lang('Username'); ?><td><input type="hidden" name="driver" value="server"><input type="hidden" name="server" value=""><input id="username" name="username" value="<?php echo h($_GET["username"]); ?>"> <tr><th><?php echo lang('Username'); ?><td><input type="hidden" name="auth[driver]" value="server"><input id="username" name="auth[username]" value="<?php echo h($_GET["username"]); ?>">
<tr><th><?php echo lang('Password'); ?><td><input type="password" name="password"> <tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
</table> </table>
<script type="text/javascript"> <script type="text/javascript">
document.getElementById('username').focus(); document.getElementById('username').focus();
</script> </script>
<?php <?php
echo "<p><input type='submit' value='" . lang('Login') . "'>\n"; echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
echo checkbox("permanent", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n"; echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
} }
function login($login, $password) { function login($login, $password) {
@@ -68,7 +68,7 @@ document.getElementById('username').focus();
function selectLinks($tableStatus, $set = "") { function selectLinks($tableStatus, $set = "") {
$TABLE = $tableStatus["Name"]; $TABLE = $tableStatus["Name"];
if (isset($set)) { if ($set !== null) {
echo '<p class="tabs"><a href="' . h(ME . 'edit=' . urlencode($TABLE) . $set) . '">' . lang('New item') . "</a>\n"; echo '<p class="tabs"><a href="' . h(ME . 'edit=' . urlencode($TABLE) . $set) . '">' . lang('New item') . "</a>\n";
} }
echo "<a href='" . h(remove_from_uri("page")) . "&amp;page=last' title='" . lang('Last page') . "'>&gt;&gt;</a>\n"; echo "<a href='" . h(remove_from_uri("page")) . "&amp;page=last' title='" . lang('Last page') . "'>&gt;&gt;</a>\n";
@@ -159,7 +159,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
} }
function selectVal($val, $link, $field) { function selectVal($val, $link, $field) {
$return = ($val == "<i>NULL</i>" ? "&nbsp;" : $val); $return = ($val === null ? "&nbsp;" : $val);
if (ereg('blob|bytea', $field["type"]) && !is_utf8($val)) { if (ereg('blob|bytea', $field["type"]) && !is_utf8($val)) {
$return = lang('%d byte(s)', strlen($val)); $return = lang('%d byte(s)', strlen($val));
if (ereg("^(GIF|\xFF\xD8\xFF|\x89PNG\x0D\x0A\x1A\x0A)", $val)) { // GIF|JPG|PNG, getimagetype() works with filename if (ereg("^(GIF|\xFF\xD8\xFF|\x89PNG\x0D\x0A\x1A\x0A)", $val)) { // GIF|JPG|PNG, getimagetype() works with filename
@@ -181,7 +181,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
} }
function editVal($val, $field) { function editVal($val, $field) {
if (ereg('date|timestamp', $field["type"]) && isset($val)) { if (ereg('date|timestamp', $field["type"]) && $val !== null) {
return preg_replace('~^(\\d{2}(\\d+))-(0?(\\d+))-(0?(\\d+))~', lang('$1-$3-$5'), $val); return preg_replace('~^(\\d{2}(\\d+))-(0?(\\d+))-(0?(\\d+))~', lang('$1-$3-$5'), $val);
} }
return (ereg("binary", $field["type"]) ? reset(unpack("H*", $val)) : $val); return (ereg("binary", $field["type"]) ? reset(unpack("H*", $val)) : $val);
@@ -271,7 +271,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
function selectLengthPrint($text_length) { function selectLengthPrint($text_length) {
} }
function selectActionPrint() { function selectActionPrint($indexes) {
echo "<fieldset><legend>" . lang('Action') . "</legend><div>"; echo "<fieldset><legend>" . lang('Action') . "</legend><div>";
echo "<input type='submit' value='" . lang('Select') . "'>"; echo "<input type='submit' value='" . lang('Select') . "'>";
echo "</div></fieldset>\n"; echo "</div></fieldset>\n";
@@ -291,7 +291,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
echo "<div onkeydown=\"eventStop(event); return bodyKeydown(event, 'email');\">\n"; echo "<div onkeydown=\"eventStop(event); return bodyKeydown(event, 'email');\">\n";
echo "<p>" . lang('From') . ": <input name='email_from' value='" . h($_POST ? $_POST["email_from"] : $_COOKIE["adminer_email"]) . "'>\n"; echo "<p>" . lang('From') . ": <input name='email_from' value='" . h($_POST ? $_POST["email_from"] : $_COOKIE["adminer_email"]) . "'>\n";
echo lang('Subject') . ": <input name='email_subject' value='" . h($_POST["email_subject"]) . "'>\n"; echo lang('Subject') . ": <input name='email_subject' value='" . h($_POST["email_subject"]) . "'>\n";
echo "<p><textarea name='email_message' rows='15' cols='75'>" . h($_POST["email_message"] . ($_POST["email_append"] ? '{$' . "$_POST[email_addition]}" : "")) . "</textarea>\n"; //! Ctrl+Enter for this.form.email echo "<p><textarea name='email_message' rows='15' cols='75'>" . h($_POST["email_message"] . ($_POST["email_append"] ? '{$' . "$_POST[email_addition]}" : "")) . "</textarea>\n";
echo "<p onkeydown=\"eventStop(event); return bodyKeydown(event, 'email_append');\">" . html_select("email_addition", $columns, $_POST["email_addition"]) . "<input type='submit' name='email_append' value='" . lang('Insert') . "'>\n"; //! JavaScript echo "<p onkeydown=\"eventStop(event); return bodyKeydown(event, 'email_append');\">" . html_select("email_addition", $columns, $_POST["email_addition"]) . "<input type='submit' name='email_append' value='" . lang('Insert') . "'>\n"; //! JavaScript
echo "<p>" . lang('Attachments') . ": <input type='file' name='email_files[]' onchange=\"this.onchange = function () { }; var el = this.cloneNode(true); el.value = ''; this.parentNode.appendChild(el);\">"; echo "<p>" . lang('Attachments') . ": <input type='file' name='email_files[]' onchange=\"this.onchange = function () { }; var el = this.cloneNode(true); el.value = ''; this.parentNode.appendChild(el);\">";
echo "<p>" . (count($emailFields) == 1 ? '<input type="hidden" name="email_field" value="' . h(key($emailFields)) . '">' : html_select("email_field", $emailFields)); echo "<p>" . (count($emailFields) == 1 ? '<input type="hidden" name="email_field" value="' . h(key($emailFields)) . '">' : html_select("email_field", $emailFields));
@@ -408,7 +408,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
} }
function messageQuery($query) { function messageQuery($query) {
return "<!--\n" . str_replace("--", "--><!-- ", $query) . "\n-->"; return " <span class='time'>" . @date("H:i:s") . "</span><!--\n" . str_replace("--", "--><!-- ", $query) . "\n-->";
} }
function editFunctions($field) { function editFunctions($field) {
@@ -434,7 +434,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
; ;
} }
$options = $this->_foreignKeyOptions($table, $field["field"], $value); $options = $this->_foreignKeyOptions($table, $field["field"], $value);
if (isset($options)) { if ($options !== null) {
return (is_array($options) return (is_array($options)
? "<select$attrs>" . optionlist($options, $value, true) . "</select>" ? "<select$attrs>" . optionlist($options, $value, true) . "</select>"
: "<input value='" . h($value) . "'$attrs class='hidden'><input value='" . h($options) . "' class='jsonly' onkeyup=\"whisper('" . h(ME . "script=complete&source=" . urlencode($table) . "&field=" . urlencode($field["field"])) . "&value=', this);\"><div onclick='return whisperClick(event, this.previousSibling);'></div>" : "<input value='" . h($value) . "'$attrs class='hidden'><input value='" . h($options) . "' class='jsonly' onkeyup=\"whisper('" . h(ME . "script=complete&source=" . urlencode($table) . "&field=" . urlencode($field["field"])) . "&value=', this);\"><div onclick='return whisperClick(event, this.previousSibling);'></div>"
@@ -505,6 +505,10 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
} }
} }
function dumpFilename($identifier) {
return friendly_url($identifier);
}
function dumpHeaders($identifier, $multi_table = false) { function dumpHeaders($identifier, $multi_table = false) {
$ext = "csv"; $ext = "csv";
header("Content-Type: text/csv; charset=utf-8"); header("Content-Type: text/csv; charset=utf-8");
@@ -526,9 +530,9 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
if ($missing == "auth") { if ($missing == "auth") {
$first = true; $first = true;
foreach ((array) $_SESSION["pwds"]["server"][""] as $username => $password) { foreach ((array) $_SESSION["pwds"]["server"][""] as $username => $password) {
if (isset($password)) { if ($password !== null) {
if ($first) { if ($first) {
echo "<p onclick='eventStop(event);'>\n"; echo "<p>\n";
$first = false; $first = false;
} }
echo "<a href='" . h(auth_url("server", "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a><br>\n"; echo "<a href='" . h(auth_url("server", "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a><br>\n";
@@ -538,7 +542,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
?> ?>
<form action="" method="post"> <form action="" method="post">
<p class="logout"> <p class="logout">
<input type="submit" name="logout" value="<?php echo lang('Logout'); ?>" onclick="eventStop(event);"> <input type="submit" name="logout" value="<?php echo lang('Logout'); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="hidden" name="token" value="<?php echo $token; ?>">
</p> </p>
</form> </form>
@@ -580,11 +584,11 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
global $connection; global $connection;
if (list($target, $id, $name) = $this->_foreignColumn(column_foreign_keys($table), $column)) { if (list($target, $id, $name) = $this->_foreignColumn(column_foreign_keys($table), $column)) {
$return = &$this->_values[$target]; $return = &$this->_values[$target];
if (!isset($return)) { if ($return === null) {
$table_status = table_status($target); $table_status = table_status($target);
$return = ($table_status["Rows"] > 1000 ? "" : array("" => "") + get_key_vals("SELECT $id, $name FROM " . table($target) . " ORDER BY 2")); $return = ($table_status["Rows"] > 1000 ? "" : array("" => "") + get_key_vals("SELECT $id, $name FROM " . table($target) . " ORDER BY 2"));
} }
if (!$return && isset($value)) { if (!$return && $value !== null) {
return $connection->result("SELECT $name FROM " . table($target) . " WHERE $id = " . q($value)); return $connection->result("SELECT $name FROM " . table($target) . " WHERE $id = " . q($value));
} }
return $return; return $return;

View File

@@ -1,9 +1,6 @@
// Editor specific functions // Editor specific functions
function bodyLoad(version) { function bodyLoad(version) {
if (history.state !== undefined) {
onpopstate(history);
}
} }
function whisperClick(event, field) { function whisperClick(event, field) {
@@ -12,7 +9,6 @@ function whisperClick(event, field) {
field.value = el.firstChild.data; field.value = el.firstChild.data;
field.previousSibling.value = decodeURIComponent(el.href.replace(/.*=/, '')); field.previousSibling.value = decodeURIComponent(el.href.replace(/.*=/, ''));
field.nextSibling.style.display = 'none'; field.nextSibling.style.display = 'none';
eventStop(event);
return false; return false;
} }
} }

1
externals/CodeMirror2 vendored Submodule

Submodule externals/CodeMirror2 added at 8feb48b37c

1
externals/JsShrink vendored Submodule

Submodule externals/JsShrink added at 2298c30f3f

1
externals/jsmin-php vendored

Submodule externals/jsmin-php deleted from 8689392dab

2
externals/jush vendored

1
lang.php Normal file → Executable file
View File

@@ -1,3 +1,4 @@
#!/usr/bin/env php
<?php <?php
error_reporting(6135); // errors and warnings error_reporting(6135); // errors and warnings
unset($_COOKIE["adminer_lang"]); unset($_COOKIE["adminer_lang"]);

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Hide some databases from the interface - just to improve design, not a security plugin /** Hide some databases from the interface - just to improve design, not a security plugin
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)

16
plugins/dump-date.php Normal file
View File

@@ -0,0 +1,16 @@
<?php
/** Include current date and time in export filename
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/
class AdminerDumpDate {
function dumpFilename($identifier) {
$connection = connection();
return friendly_url(($identifier != "" ? $identifier : (SERVER != "" ? SERVER : "localhost")) . "-" . $connection->result("SELECT NOW()"));
}
}

View File

@@ -1,11 +1,14 @@
<?php <?php
/** Dump to XML format in structure <database name=""><table name=""><column name="">value /** Dump to XML format in structure <database name=""><table name=""><column name="">value
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/ */
class AdminerDumpXml { class AdminerDumpXml {
/** @access protected */
var $database = false;
function dumpFormat() { function dumpFormat() {
return array('xml' => 'XML'); return array('xml' => 'XML');
@@ -22,10 +25,9 @@ class AdminerDumpXml {
} }
function dumpData($table, $style, $query) { function dumpData($table, $style, $query) {
static $database = false;
if ($_POST["format"] == "xml") { if ($_POST["format"] == "xml") {
if (!$database) { if (!$this->database) {
$database = true; $this->database = true;
echo "<database name='" . h(DB) . "'>\n"; echo "<database name='" . h(DB) . "'>\n";
register_shutdown_function(array($this, '_database')); register_shutdown_function(array($this, '_database'));
} }

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Dump to ZIP format /** Dump to ZIP format
* @link http://www.adminer.org/plugins/#use
* @uses ZipArchive, tempnam("") * @uses ZipArchive, tempnam("")
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
@@ -8,7 +9,7 @@
*/ */
class AdminerDumpZip { class AdminerDumpZip {
/** @access protected */ /** @access protected */
var $filename; var $filename, $data;
function dumpOutput() { function dumpOutput() {
if (!class_exists('ZipArchive')) { if (!class_exists('ZipArchive')) {
@@ -18,13 +19,12 @@ class AdminerDumpZip {
} }
function _zip($string, $state) { function _zip($string, $state) {
static $data = ""; $this->data .= $string;
$data .= $string;
if ($state & PHP_OUTPUT_HANDLER_END) { if ($state & PHP_OUTPUT_HANDLER_END) {
$zip = new ZipArchive; $zip = new ZipArchive;
$zipFile = tempnam("", "zip"); $zipFile = tempnam("", "zip");
$zip->open($zipFile, ZipArchive::OVERWRITE); // php://output is not supported $zip->open($zipFile, ZipArchive::OVERWRITE); // php://output is not supported
$zip->addFromString($this->filename, $data); $zip->addFromString($this->filename, $this->data);
$zip->close(); $zip->close();
$return = file_get_contents($zipFile); $return = file_get_contents($zipFile);
unlink($zipFile); unlink($zipFile);
@@ -37,8 +37,8 @@ class AdminerDumpZip {
$this->filename = "$identifier." . ($multi_table && ereg("[ct]sv", $_POST["format"]) ? "tar" : $_POST["format"]); $this->filename = "$identifier." . ($multi_table && ereg("[ct]sv", $_POST["format"]) ? "tar" : $_POST["format"]);
if ($_POST["output"] == "zip") { if ($_POST["output"] == "zip") {
header("Content-Type: application/zip"); header("Content-Type: application/zip");
ob_start(array($this, '_zip'));
} }
ob_start(array($this, '_zip'));
} }
} }

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Display jQuery UI Timepicker for each date and datetime field /** Display jQuery UI Timepicker for each date and datetime field
* @link http://www.adminer.org/plugins/#use
* @uses jQuery-Timepicker, http://trentrichardson.com/examples/timepicker/ * @uses jQuery-Timepicker, http://trentrichardson.com/examples/timepicker/
* @uses jQuery UI: core, widget, mouse, slider, datepicker * @uses jQuery UI: core, widget, mouse, slider, datepicker
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Select foreign key in edit form /** Select foreign key in edit form
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
@@ -11,7 +12,7 @@ class AdminerEditForeign {
static $foreignTables = array(); static $foreignTables = array();
static $values = array(); static $values = array();
$foreignKeys = &$foreignTables[$table]; $foreignKeys = &$foreignTables[$table];
if (!isset($foreignKeys)) { if ($foreignKeys === null) {
$foreignKeys = column_foreign_keys($table); $foreignKeys = column_foreign_keys($table);
} }
foreach ((array) $foreignKeys[$field["field"]] as $foreignKey) { foreach ((array) $foreignKeys[$field["field"]] as $foreignKey) {

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Use <textarea> for char and varchar /** Use <textarea> for char and varchar
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Get e-mail subject and message from database (Adminer Editor) /** Get e-mail subject and message from database (Adminer Editor)
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Use <select><option> for enum edit instead of <input type="radio"> /** Use <select><option> for enum edit instead of <input type="radio">
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
@@ -16,7 +17,7 @@ class AdminerEnumOption {
} }
if ($field["null"]) { if ($field["null"]) {
$options[""][""] = "NULL"; $options[""][""] = "NULL";
if (!isset($value) && !isset($_GET["select"])) { if ($value === null && !isset($_GET["select"])) {
$selected = ""; $selected = "";
} }
} }

View File

@@ -2,6 +2,7 @@
//! delete //! delete
/** Edit fields ending with "_path" by <input type="file"> and link to the uploaded files from select /** Edit fields ending with "_path" by <input type="file"> and link to the uploaded files from select
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
@@ -17,7 +18,7 @@ class AdminerFileUpload {
*/ */
function AdminerFileUpload($uploadPath = "../static/data/", $displayPath = null, $extensions = "[a-zA-Z0-9]+") { function AdminerFileUpload($uploadPath = "../static/data/", $displayPath = null, $extensions = "[a-zA-Z0-9]+") {
$this->uploadPath = $uploadPath; $this->uploadPath = $uploadPath;
$this->displayPath = (isset($displayPath) ? $displayPath : $uploadPath); $this->displayPath = ($displayPath !== null ? $displayPath : $uploadPath);
$this->extensions = $extensions; $this->extensions = $extensions;
} }

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Link system tables (in mysql and information_schema databases) by foreign keys /** Link system tables (in mysql and information_schema databases) by foreign keys
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Allow using Adminer inside a frame (disables ClickJacking protection) /** Allow using Adminer inside a frame (disables ClickJacking protection)
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Display constant list of servers in login form /** Display constant list of servers in login form
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
@@ -37,13 +38,13 @@ class AdminerLoginServers {
function loginForm() { function loginForm() {
?> ?>
<table cellspacing="0"> <table cellspacing="0">
<tr><th><?php echo lang('Server'); ?><td><input type="hidden" name="driver" value="<?php echo $this->driver; ?>"><select name="server"><?php echo optionlist($this->servers, SERVER); ?></select> <tr><th><?php echo lang('Server'); ?><td><input type="hidden" name="auth[driver]" value="<?php echo $this->driver; ?>"><select name="auth[server]"><?php echo optionlist($this->servers, SERVER); ?></select>
<tr><th><?php echo lang('Username'); ?><td><input id="username" name="username" value="<?php echo h($_GET["username"]); ?>"> <tr><th><?php echo lang('Username'); ?><td><input id="username" name="auth[username]" value="<?php echo h($_GET["username"]); ?>">
<tr><th><?php echo lang('Password'); ?><td><input type="password" name="password"> <tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
</table> </table>
<p><input type="submit" value="<?php echo lang('Login'); ?>"> <p><input type="submit" value="<?php echo lang('Login'); ?>">
<?php <?php
echo checkbox("permanent", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n"; echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
return true; return true;
} }

View File

@@ -10,6 +10,7 @@ CREATE TABLE login (
*/ */
/** Authenticate a user from the login table /** Authenticate a user from the login table
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Store password's SHA1 to session /** Store password's SHA1 to session
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
@@ -18,8 +19,8 @@ class AdminerPasswordSha1 {
$this->login = $login; $this->login = $login;
$this->passwordSha1 = $passwordSha1; $this->passwordSha1 = $passwordSha1;
$this->credentials = $credentials; $this->credentials = $credentials;
if (isset($_POST["password"])) { if (isset($_POST["auth"])) {
$_POST["password"] = sha1($_POST["password"]); $_POST["auth"]["password"] = sha1($_POST["auth"]["password"]);
} }
} }
@@ -32,7 +33,7 @@ class AdminerPasswordSha1 {
} }
function permanentLogin() { function permanentLogin() {
//! should save original $_POST["password"] and hash after load //! should save original $_POST["auth"]["password"] and hash after load
} }
} }

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Adminer customization allowing usage of plugins /** Adminer customization allowing usage of plugins
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
@@ -20,7 +21,7 @@ class AdminerPlugin extends Adminer {
* @param array object instances or null to register all classes starting by 'Adminer' * @param array object instances or null to register all classes starting by 'Adminer'
*/ */
function AdminerPlugin($plugins) { function AdminerPlugin($plugins) {
if (!isset($plugins)) { if ($plugins === null) {
$plugins = array(); $plugins = array();
foreach (get_declared_classes() as $class) { foreach (get_declared_classes() as $class) {
if (preg_match('~^Adminer.~i', $class) && strcasecmp($this->_findRootClass($class), 'Adminer')) { // can use interface since PHP 5 if (preg_match('~^Adminer.~i', $class) && strcasecmp($this->_findRootClass($class), 'Adminer')) { // can use interface since PHP 5
@@ -54,7 +55,7 @@ class AdminerPlugin extends Adminer {
case 4: $return = $plugin->$function($args[0], $args[1], $args[2], $args[3]); break; case 4: $return = $plugin->$function($args[0], $args[1], $args[2], $args[3]); break;
default: trigger_error('Too many parameters.', E_USER_WARNING); default: trigger_error('Too many parameters.', E_USER_WARNING);
} }
if (isset($return)) { if ($return !== null) {
return $return; return $return;
} }
} }
@@ -291,6 +292,11 @@ class AdminerPlugin extends Adminer {
return $this->_applyPlugin(__FUNCTION__, $args); return $this->_applyPlugin(__FUNCTION__, $args);
} }
function dumpFilename() {
$args = func_get_args();
return $this->_applyPlugin(__FUNCTION__, $args);
}
function dumpHeaders() { function dumpHeaders() {
$args = func_get_args(); $args = func_get_args();
return $this->_applyPlugin(__FUNCTION__, $args); return $this->_applyPlugin(__FUNCTION__, $args);

View File

@@ -1,2 +1,2 @@
../adminer/plugin.php - demo usage ../adminer/plugin.php - demo usage
http://www.adminer.org/en/plugins/ - documentation http://www.adminer.org/plugins/ - documentation

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Prefill field containing "_slug" with slugified value of a previous field (JavaScript) /** Prefill field containing "_slug" with slugified value of a previous field (JavaScript)
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
@@ -21,7 +22,7 @@ class AdminerSlugify {
function editInput($table, $field, $attrs, $value) { function editInput($table, $field, $attrs, $value) {
static $slugify; static $slugify;
if (!$_GET["select"] && !$_GET["where"]) { if (!$_GET["select"] && !$_GET["where"]) {
if (!isset($slugify)) { if ($slugify === null) {
$slugify = array(); $slugify = array();
$prev = null; $prev = null;
foreach (fields($table) as $name => $val) { foreach (fields($table) as $name => $val) {
@@ -32,7 +33,7 @@ class AdminerSlugify {
} }
} }
$slug = $slugify[$field["field"]]; $slug = $slugify[$field["field"]];
if (isset($slug)) { if ($slug !== null) {
return "<input value='" . h($value) . "' maxlength='$field[length]' size='40'$attrs onchange=\"var find = '$this->from'; var repl = '$this->to'; this.form['fields[$slug]'].value = this.value.toLowerCase().replace(new RegExp('[' + find + ']', 'g'), function (str) { return repl[find.indexOf(str)]; }).replace(/[^a-z0-9_]+/g, '-').replace(/^-|-\$/g, '').substr(0, $field[length]);\">"; return "<input value='" . h($value) . "' maxlength='$field[length]' size='40'$attrs onchange=\"var find = '$this->from'; var repl = '$this->to'; this.form['fields[$slug]'].value = this.value.toLowerCase().replace(new RegExp('[' + find + ']', 'g'), function (str) { return repl[find.indexOf(str)]; }).replace(/[^a-z0-9_]+/g, '-').replace(/^-|-\$/g, '').substr(0, $field[length]);\">";
} }
} }

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Log all queries to SQL file (manual queries through SQL command are not logged) /** Log all queries to SQL file (manual queries through SQL command are not logged)
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Use filter in tables list /** Use filter in tables list
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Edit all fields containing "_html" by HTML editor TinyMCE and display the HTML in select /** Edit all fields containing "_html" by HTML editor TinyMCE and display the HTML in select
* @link http://www.adminer.org/plugins/#use
* @uses TinyMCE, http://tinymce.moxiecode.com/ * @uses TinyMCE, http://tinymce.moxiecode.com/
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0

View File

@@ -11,6 +11,7 @@ CREATE TABLE translation (
*/ */
/** Translate all table and field comments, enum and set values from the translation table (inserts new translations) /** Translate all table and field comments, enum and set values from the translation table (inserts new translations)
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
@@ -19,17 +20,17 @@ class AdminerTranslation {
function _translate($idf) { function _translate($idf) {
static $translations, $lang; static $translations, $lang;
if (!isset($lang)) { if ($lang === null) {
$lang = get_lang(); $lang = get_lang();
} }
if ($idf == "" || $lang == "en") { if ($idf == "" || $lang == "en") {
return $idf; return $idf;
} }
if (!isset($translations)) { if ($translations === null) {
$translations = get_key_vals("SELECT idf, translation FROM translation WHERE language_id = " . q($lang)); $translations = get_key_vals("SELECT idf, translation FROM translation WHERE language_id = " . q($lang));
} }
$return = &$translations[$idf]; $return = &$translations[$idf];
if (!isset($return)) { if ($return === null) {
$return = $idf; $return = $idf;
$connection = connection(); $connection = connection();
$connection->query("INSERT INTO translation (language_id, idf, translation) VALUES (" . q($lang) . ", " . q($idf) . ", " . q($idf) . ")"); $connection->query("INSERT INTO translation (language_id, idf, translation) VALUES (" . q($lang) . ", " . q($idf) . ", " . q($idf) . ")");

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Disable version checker /** Disable version checker
* @link http://www.adminer.org/plugins/#use
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)

View File

@@ -1,6 +1,7 @@
<?php <?php
/** Edit all fields containing "_html" by HTML editor WYMeditor and display the HTML in select /** Edit all fields containing "_html" by HTML editor WYMeditor and display the HTML in select
* @link http://www.adminer.org/plugins/#use
* @uses WYMeditor, http://www.wymeditor.org/ * @uses WYMeditor, http://www.wymeditor.org/
* @author Jakub Vrana, http://www.vrana.cz/ * @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0

View File

@@ -11,6 +11,6 @@ editor/index.php - Run development version of Adminer Editor
editor/example.php - Example customization editor/example.php - Example customization
plugins/readme.txt - Plugins for Adminer and Adminer Editor plugins/readme.txt - Plugins for Adminer and Adminer Editor
adminer/plugin.php - Plugin demo adminer/plugin.php - Plugin demo
compile.php [driver] [lang] - Create a single file version compile.php - Create a single file version
lang.php [lang] - Update translations lang.php - Update translations
tests/selenium.html - Selenium test suite tests/selenium.html - Selenium test suite

View File

@@ -41,6 +41,16 @@
<td>fields[2.1][length]</td> <td>fields[2.1][length]</td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>click</td>
<td>name=defaults</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>name=fields[2.1][default]</td>
<td>0</td>
</tr>
<tr> <tr>
<td>clickAndWait</td> <td>clickAndWait</td>
<td>//input[@value='Save']</td> <td>//input[@value='Save']</td>

View File

@@ -1,16 +1,14 @@
Transactions in export Transactions in export
Create view and routine options Create view and routine options
Variables editation Variables editation
Highlight SQL textarea - may use external CodeMirror
Blob download and image display in edit form (important for Editor with hidden fields in select and SQL command) Blob download and image display in edit form (important for Editor with hidden fields in select and SQL command)
Add title to Logout, edit (in select) and select (in menu) for style "hever" Add title to Logout, edit (in select) and select (in menu) for style "hever"
Shift-click in checkboxes to select range Shift-click in checkboxes to select range
Export by GET parameters Export by GET parameters
Only first part of big BZ2 export is readable, files are missing in TAR Only first part of big BZ2 export is readable, files are missing in TAR
Double click in select - Esc to abort editation
Draggable columns in alter table (thanks to Michal Manak) Draggable columns in alter table (thanks to Michal Manak)
<option class> for system databases and schemas - information_schema and driver-specific (thanks to Vaclav Novotny) <option class> for system databases and schemas - information_schema and driver-specific (thanks to Vaclav Novotny)
Define indexes and foreign keys name - http://forum.zdrojak.root.cz/index.php?topic=185.msg1255#msg1255 Define foreign keys name - http://forum.zdrojak.root.cz/index.php?topic=185.msg1255#msg1255
Skinnable plus.gif and other images - http://typo3.org/extensions/repository/view/t3adminer/current/ Skinnable plus.gif and other images - http://typo3.org/extensions/repository/view/t3adminer/current/
Selectable <option>(on update)<option>CURRENT_TIMESTAMP for timestamp - https://sourceforge.net/projects/adminer/forums/forum/960418/topic/4568650 Selectable <option>(on update)<option>CURRENT_TIMESTAMP for timestamp - https://sourceforge.net/projects/adminer/forums/forum/960418/topic/4568650
? Filter by value in row under <thead> in select ? Filter by value in row under <thead> in select