ARI Adminer – WordPress Database Manager - Version 1.1.13

Version Description

  • Update Adminer to v. .4.7.1
Download this release

Release Info

Developer arisoft
Plugin Icon 128x128 ARI Adminer – WordPress Database Manager
Version 1.1.13
Comparing to
See all releases

Code changes from version 1.11.2 to 1.1.13

Files changed (50) hide show
  1. adminer/adminer/adminer/call.inc.php +1 -1
  2. adminer/adminer/adminer/create.inc.php +12 -17
  3. adminer/adminer/adminer/database.inc.php +1 -1
  4. adminer/adminer/adminer/db.inc.php +2 -0
  5. adminer/adminer/adminer/drivers/clickhouse.inc.php +354 -0
  6. adminer/adminer/adminer/drivers/mongo.inc.php +2 -2
  7. adminer/adminer/adminer/drivers/mssql.inc.php +8 -2
  8. adminer/adminer/adminer/drivers/mysql.inc.php +5 -8
  9. adminer/adminer/adminer/drivers/oracle.inc.php +1 -1
  10. adminer/adminer/adminer/drivers/pgsql.inc.php +14 -4
  11. adminer/adminer/adminer/drivers/sqlite.inc.php +1 -1
  12. adminer/adminer/adminer/dump.inc.php +1 -1
  13. adminer/adminer/adminer/event.inc.php +3 -3
  14. adminer/adminer/adminer/include/adminer.inc.php +10 -8
  15. adminer/adminer/adminer/include/auth.inc.php +3 -2
  16. adminer/adminer/adminer/include/bootstrap.inc.php +1 -0
  17. adminer/adminer/adminer/include/editing.inc.php +32 -7
  18. adminer/adminer/adminer/include/functions.inc.php +6 -6
  19. adminer/adminer/adminer/include/lang.inc.php +1 -0
  20. adminer/adminer/adminer/include/version.inc.php +1 -1
  21. adminer/adminer/adminer/indexes.inc.php +3 -1
  22. adminer/adminer/adminer/lang/cs.inc.php +2 -1
  23. adminer/adminer/adminer/lang/he.inc.php +1 -1
  24. adminer/adminer/adminer/lang/ja.inc.php +11 -1
  25. adminer/adminer/adminer/lang/ka.inc.php +303 -0
  26. adminer/adminer/adminer/lang/ms.inc.php +1 -1
  27. adminer/adminer/adminer/lang/pl.inc.php +1 -1
  28. adminer/adminer/adminer/lang/tr.inc.php +1 -1
  29. adminer/adminer/adminer/lang/vi.inc.php +5 -5
  30. adminer/adminer/adminer/lang/xx.inc.php +2 -1
  31. adminer/adminer/adminer/lang/zh-tw.inc.php +281 -200
  32. adminer/adminer/adminer/lang/zh.inc.php +280 -199
  33. adminer/adminer/adminer/procedure.inc.php +3 -1
  34. adminer/adminer/adminer/processlist.inc.php +2 -0
  35. adminer/adminer/adminer/select.inc.php +8 -6
  36. adminer/adminer/adminer/sql.inc.php +8 -5
  37. adminer/adminer/adminer/static/default.css +2 -2
  38. adminer/adminer/adminer/static/editing.js +42 -17
  39. adminer/adminer/adminer/static/functions.js +19 -14
  40. adminer/adminer/adminer/trigger.inc.php +2 -2
  41. adminer/adminer/adminer/user.inc.php +3 -3
  42. adminer/adminer/adminer/view.inc.php +1 -1
  43. adminer/adminer/editor/db.inc.php +2 -0
  44. adminer/adminer/editor/include/adminer.inc.php +7 -7
  45. adminer/adminer/editor/static/editing.js +1 -1
  46. adminer/adminer/plugins/slugify.php +1 -1
  47. adminer/adminer/plugins/tables-filter.php +2 -2
  48. ari-adminer.php +1 -1
  49. includes/defines.php +1 -1
  50. readme.txt +8 -2
adminer/adminer/adminer/call.inc.php CHANGED
@@ -62,7 +62,7 @@ if (!$error && $_POST) {
62
  <form action="" method="post">
63
  <?php
64
  if ($in) {
65
- echo "<table cellspacing='0'>\n";
66
  foreach ($in as $key) {
67
  $field = $routine["fields"][$key];
68
  $name = $field["field"];
62
  <form action="" method="post">
63
  <?php
64
  if ($in) {
65
+ echo "<table cellspacing='0' class='layout'>\n";
66
  foreach ($in as $key) {
67
  $field = $routine["fields"][$key];
68
  $name = $field["field"];
adminer/adminer/adminer/create.inc.php CHANGED
@@ -27,6 +27,10 @@ if ($row["auto_increment_col"]) {
27
  $row["fields"][$row["auto_increment_col"]]["auto_increment"] = true;
28
  }
29
 
 
 
 
 
30
  if ($_POST && !process_fields($row["fields"]) && !$error) {
31
  if ($_POST["drop"]) {
32
  queries_redirect(substr(ME, 0, -1), lang('Table has been dropped.'), drop_tables(array($TABLE)));
@@ -162,7 +166,7 @@ foreach ($engines as $engine) {
162
  <form action="" method="post" id="form">
163
  <p>
164
  <?php if (support("columns") || $TABLE == "") { ?>
165
- <?php echo lang('Table name'); ?>: <input name="name" maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
166
  <?php if ($TABLE == "" && !$_POST) { echo script("focus(qs('#form')['name']);"); } ?>
167
  <?php echo ($engines ? "<select name='Engine'>" . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "</select>" . on_help("getTarget(event).value", 1) . script("qsl('select').onchange = helpClose;") : ""); ?>
168
  <?php echo ($collations && !preg_match("~sqlite|mssql~", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
@@ -170,28 +174,19 @@ foreach ($engines as $engine) {
170
  <?php } ?>
171
 
172
  <?php if (support("columns")) { ?>
 
173
  <table cellspacing="0" id="edit-fields" class="nowrap">
174
  <?php
175
- $comments = ($_POST ? $_POST["comments"] : $row["Comment"] != "");
176
- if (!$_POST && !$comments) {
177
- foreach ($row["fields"] as $field) {
178
- if ($field["comment"] != "") {
179
- $comments = true;
180
- break;
181
- }
182
- }
183
- }
184
- edit_fields($row["fields"], $collations, "TABLE", $foreign_keys, $comments);
185
  ?>
186
  </table>
 
187
  <p>
188
  <?php echo lang('Auto Increment'); ?>: <input type="number" name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
189
- <?php echo checkbox("defaults", 1, !$_POST || $_POST["defaults"], lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
190
- <?php echo ($_POST ? "" : script("editingHideDefaults();")); ?>
191
  <?php echo (support("comment")
192
- ? "<label><input type='checkbox' name='comments' value='1' class='jsonly'" . ($comments ? " checked" : "") . ">" . lang('Comment') . "</label>"
193
- . script("qsl('input').onclick = partial(editingCommentsClick, true);")
194
- . ' <input name="Comment" value="' . h($row["Comment"]) . '" maxlength="' . (min_version(5.5) ? 2048 : 60) . '"' . ($comments ? '' : ' class="hidden"') . '>'
195
  : '')
196
  ; ?>
197
  <p>
@@ -225,4 +220,4 @@ foreach ($row["partition_names"] as $key => $val) {
225
  ?>
226
  <input type="hidden" name="token" value="<?php echo $token; ?>">
227
  </form>
228
- <?php echo script("qs('#form')['defaults'].onclick();" . (support("comment") ? " editingCommentsClick.call(qs('#form')['comments']);" : "")); ?>
27
  $row["fields"][$row["auto_increment_col"]]["auto_increment"] = true;
28
  }
29
 
30
+ if ($_POST) {
31
+ set_adminer_settings(array("comments" => $_POST["comments"], "defaults" => $_POST["defaults"]));
32
+ }
33
+
34
  if ($_POST && !process_fields($row["fields"]) && !$error) {
35
  if ($_POST["drop"]) {
36
  queries_redirect(substr(ME, 0, -1), lang('Table has been dropped.'), drop_tables(array($TABLE)));
166
  <form action="" method="post" id="form">
167
  <p>
168
  <?php if (support("columns") || $TABLE == "") { ?>
169
+ <?php echo lang('Table name'); ?>: <input name="name" data-maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
170
  <?php if ($TABLE == "" && !$_POST) { echo script("focus(qs('#form')['name']);"); } ?>
171
  <?php echo ($engines ? "<select name='Engine'>" . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "</select>" . on_help("getTarget(event).value", 1) . script("qsl('select').onchange = helpClose;") : ""); ?>
172
  <?php echo ($collations && !preg_match("~sqlite|mssql~", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
174
  <?php } ?>
175
 
176
  <?php if (support("columns")) { ?>
177
+ <div class="scrollable">
178
  <table cellspacing="0" id="edit-fields" class="nowrap">
179
  <?php
180
+ edit_fields($row["fields"], $collations, "TABLE", $foreign_keys);
 
 
 
 
 
 
 
 
 
181
  ?>
182
  </table>
183
+ </div>
184
  <p>
185
  <?php echo lang('Auto Increment'); ?>: <input type="number" name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
186
+ <?php echo checkbox("defaults", 1, ($_POST ? $_POST["defaults"] : adminer_setting("defaults")), lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
 
187
  <?php echo (support("comment")
188
+ ? checkbox("comments", 1, ($_POST ? $_POST["comments"] : adminer_setting("comments")), lang('Comment'), "editingCommentsClick(this, true);", "jsonly")
189
+ . ' <input name="Comment" value="' . h($row["Comment"]) . '" data-maxlength="' . (min_version(5.5) ? 2048 : 60) . '">'
 
190
  : '')
191
  ; ?>
192
  <p>
220
  ?>
221
  <input type="hidden" name="token" value="<?php echo $token; ?>">
222
  </form>
223
+ <?php echo script("qs('#form')['defaults'].onclick();" . (support("comment") ? " editingCommentsClick(qs('#form')['comments']);" : "")); ?>
adminer/adminer/adminer/database.inc.php CHANGED
@@ -60,7 +60,7 @@ if ($_POST) {
60
  <?php
61
  echo ($_POST["add_x"] || strpos($name, "\n")
62
  ? '<textarea id="name" name="name" rows="10" cols="40">' . h($name) . '</textarea><br>'
63
- : '<input name="name" id="name" value="' . h($name) . '" maxlength="64" autocapitalize="off">'
64
  ) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $row["collation"]) . doc_link(array(
65
  'sql' => "charset-charsets.html",
66
  'mariadb' => "supported-character-sets-and-collations/",
60
  <?php
61
  echo ($_POST["add_x"] || strpos($name, "\n")
62
  ? '<textarea id="name" name="name" rows="10" cols="40">' . h($name) . '</textarea><br>'
63
+ : '<input name="name" id="name" value="' . h($name) . '" data-maxlength="64" autocapitalize="off">'
64
  ) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $row["collation"]) . doc_link(array(
65
  'sql' => "charset-charsets.html",
66
  'mariadb' => "supported-character-sets-and-collations/",
adminer/adminer/adminer/db.inc.php CHANGED
@@ -66,6 +66,7 @@ if ($adminer->homepage()) {
66
  }
67
  }
68
  $doc_link = doc_link(array('sql' => 'show-table-status.html'));
 
69
  echo "<table cellspacing='0' class='nowrap checkable'>\n";
70
  echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
71
  echo '<thead><tr class="wrap">';
@@ -119,6 +120,7 @@ if ($adminer->homepage()) {
119
  }
120
 
121
  echo "</table>\n";
 
122
  if (!information_schema(DB)) {
123
  echo "<div class='footer'><div>\n";
124
  $vacuum = "<input type='submit' value='" . lang('Vacuum') . "'> " . on_help("'VACUUM'");
66
  }
67
  }
68
  $doc_link = doc_link(array('sql' => 'show-table-status.html'));
69
+ echo "<div class='scrollable'>\n";
70
  echo "<table cellspacing='0' class='nowrap checkable'>\n";
71
  echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
72
  echo '<thead><tr class="wrap">';
120
  }
121
 
122
  echo "</table>\n";
123
+ echo "</div>\n";
124
  if (!information_schema(DB)) {
125
  echo "<div class='footer'><div>\n";
126
  $vacuum = "<input type='submit' value='" . lang('Vacuum') . "'> " . on_help("'VACUUM'");
adminer/adminer/adminer/drivers/clickhouse.inc.php ADDED
@@ -0,0 +1,354 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $drivers["clickhouse"] = "ClickHouse (alpha)";
3
+
4
+ if (isset($_GET["clickhouse"])) {
5
+ define("DRIVER", "clickhouse");
6
+
7
+ class Min_DB {
8
+ var $extension = "JSON", $server_info, $errno, $_result, $error, $_url;
9
+ var $_db = 'default';
10
+
11
+ function rootQuery($db, $query) {
12
+ @ini_set('track_errors', 1); // @ - may be disabled
13
+ $file = @file_get_contents("$this->_url/?database=$db", false, stream_context_create(array('http' => array(
14
+ 'method' => 'POST',
15
+ 'content' => $this->isQuerySelectLike($query) ? "$query FORMAT JSONCompact" : $query,
16
+ 'header' => 'Content-type: application/x-www-form-urlencoded',
17
+ 'ignore_errors' => 1, // available since PHP 5.2.10
18
+ ))));
19
+
20
+ if ($file === false) {
21
+ $this->error = $php_errormsg;
22
+ return $file;
23
+ }
24
+ if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
25
+ $this->error = $file;
26
+ return false;
27
+ }
28
+ $return = json_decode($file, true);
29
+ if ($return === null) {
30
+ $this->errno = json_last_error();
31
+ if (function_exists('json_last_error_msg')) {
32
+ $this->error = json_last_error_msg();
33
+ } else {
34
+ $constants = get_defined_constants(true);
35
+ foreach ($constants['json'] as $name => $value) {
36
+ if ($value == $this->errno && preg_match('~^JSON_ERROR_~', $name)) {
37
+ $this->error = $name;
38
+ break;
39
+ }
40
+ }
41
+ }
42
+ }
43
+ return new Min_Result($return);
44
+ }
45
+
46
+ function isQuerySelectLike($query) {
47
+ return (bool) preg_match('~^(select|show)~i', $query);
48
+ }
49
+
50
+ function query($query) {
51
+ return $this->rootQuery($this->_db, $query);
52
+ }
53
+
54
+ function connect($server, $username, $password) {
55
+ preg_match('~^(https?://)?(.*)~', $server, $match);
56
+ $this->_url = ($match[1] ? $match[1] : "http://") . "$username:$password@$match[2]";
57
+ $return = $this->query('SELECT 1');
58
+ return (bool) $return;
59
+ }
60
+
61
+ function select_db($database) {
62
+ $this->_db = $database;
63
+ return true;
64
+ }
65
+
66
+ function quote($string) {
67
+ return "'" . addcslashes($string, "\\'") . "'";
68
+ }
69
+
70
+ function multi_query($query) {
71
+ return $this->_result = $this->query($query);
72
+ }
73
+
74
+ function store_result() {
75
+ return $this->_result;
76
+ }
77
+
78
+ function next_result() {
79
+ return false;
80
+ }
81
+
82
+ function result($query, $field = 0) {
83
+ $result = $this->query($query);
84
+ return $result['data'];
85
+ }
86
+ }
87
+
88
+ class Min_Result {
89
+ var $num_rows, $_rows, $columns, $meta, $_offset = 0;
90
+
91
+ function __construct($result) {
92
+ $this->num_rows = $result['rows'];
93
+ $this->_rows = $result['data'];
94
+ $this->meta = $result['meta'];
95
+ $this->columns = array_column($this->meta, 'name');
96
+ reset($this->_rows);
97
+ }
98
+
99
+ function fetch_assoc() {
100
+ $row = current($this->_rows);
101
+ next($this->_rows);
102
+ return $row === false ? false : array_combine($this->columns, $row);
103
+ }
104
+
105
+ function fetch_row() {
106
+ $row = current($this->_rows);
107
+ next($this->_rows);
108
+ return $row;
109
+ }
110
+
111
+ function fetch_field() {
112
+ $column = $this->_offset++;
113
+ $return = new stdClass;
114
+ if ($column < count($this->columns)) {
115
+ $return->name = $this->meta[$column]['name'];
116
+ $return->orgname = $return->name;
117
+ $return->type = $this->meta[$column]['type'];
118
+ }
119
+ return $return;
120
+ }
121
+ }
122
+
123
+
124
+ class Min_Driver extends Min_SQL {
125
+ function delete($table, $queryWhere, $limit = 0) {
126
+ return queries("ALTER TABLE " . table($table) . " DELETE $queryWhere");
127
+ }
128
+
129
+ function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
130
+ $values = array();
131
+ foreach ($set as $key => $val) {
132
+ $values[] = "$key = $val";
133
+ }
134
+ $query = $separator . implode(",$separator", $values);
135
+ return queries("ALTER TABLE " . table($table) . " UPDATE $query$queryWhere");
136
+ }
137
+ }
138
+
139
+ function idf_escape($idf) {
140
+ return "`" . str_replace("`", "``", $idf) . "`";
141
+ }
142
+
143
+ function table($idf) {
144
+ return idf_escape($idf);
145
+ }
146
+
147
+ function explain($connection, $query) {
148
+ return '';
149
+ }
150
+
151
+ function found_rows($table_status, $where) {
152
+ $rows = get_vals("SELECT COUNT(*) FROM " . idf_escape($table_status["Name"]) . ($where ? " WHERE " . implode(" AND ", $where) : ""));
153
+ return empty($rows) ? false : $rows[0];
154
+ }
155
+
156
+ function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
157
+ foreach ($fields as $field) {
158
+ if ($field[1][2] === " NULL") {
159
+ $field[1][1] = " Nullable({$field[1][1]})";
160
+ }
161
+ unset($field[1][2]);
162
+ }
163
+ }
164
+
165
+ function truncate_tables($tables) {
166
+ return apply_queries("TRUNCATE TABLE", $tables);
167
+ }
168
+
169
+ function drop_views($views) {
170
+ return drop_tables($views);
171
+ }
172
+
173
+ function drop_tables($tables) {
174
+ return apply_queries("DROP TABLE", $tables);
175
+ }
176
+
177
+ function connect() {
178
+ global $adminer;
179
+ $connection = new Min_DB;
180
+ $credentials = $adminer->credentials();
181
+ if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
182
+ return $connection;
183
+ }
184
+ return $connection->error;
185
+ }
186
+
187
+ function get_databases($flush) {
188
+ global $connection;
189
+ $result = get_rows('SHOW DATABASES');
190
+
191
+ $return = array();
192
+ foreach ($result as $row) {
193
+ $return[] = $row['name'];
194
+ }
195
+ sort($return);
196
+ return $return;
197
+ }
198
+
199
+ function limit($query, $where, $limit, $offset = 0, $separator = " ") {
200
+ return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? ", $offset" : "") : "");
201
+ }
202
+
203
+ function limit1($table, $query, $where, $separator = "\n") {
204
+ return limit($query, $where, 1, 0, $separator);
205
+ }
206
+
207
+ function db_collation($db, $collations) {
208
+ }
209
+
210
+ function engines() {
211
+ return array('MergeTree');
212
+ }
213
+
214
+ function logged_user() {
215
+ global $adminer;
216
+ $credentials = $adminer->credentials();
217
+ return $credentials[1];
218
+ }
219
+
220
+ function tables_list() {
221
+ $result = get_rows('SHOW TABLES');
222
+ $return = array();
223
+ foreach ($result as $row) {
224
+ $return[$row['name']] = 'table';
225
+ }
226
+ ksort($return);
227
+ return $return;
228
+ }
229
+
230
+ function count_tables($databases) {
231
+ return array();
232
+ }
233
+
234
+ function table_status($name = "", $fast = false) {
235
+ global $connection;
236
+ $return = array();
237
+ $tables = get_rows("SELECT name, engine FROM system.tables WHERE database = " . q($connection->_db));
238
+ foreach ($tables as $table) {
239
+ $return[$table['name']] = array(
240
+ 'Name' => $table['name'],
241
+ 'Engine' => $table['engine'],
242
+ );
243
+ if ($name === $table['name']) {
244
+ return $return[$table['name']];
245
+ }
246
+ }
247
+ return $return;
248
+ }
249
+
250
+ function is_view($table_status) {
251
+ return false;
252
+ }
253
+
254
+ function fk_support($table_status) {
255
+ return false;
256
+ }
257
+
258
+ function convert_field($field) {
259
+ }
260
+
261
+ function unconvert_field($field, $return) {
262
+ if (in_array($field['type'], array("Int8", "Int16", "Int32", "Int64", "UInt8", "UInt16", "UInt32", "UInt64", "Float32", "Float64"))) {
263
+ return "to$field[type]($return)";
264
+ }
265
+ return $return;
266
+ }
267
+
268
+ function fields($table) {
269
+ $return = array();
270
+ $result = get_rows("SELECT name, type, default_expression FROM system.columns WHERE " . idf_escape('table') . " = " . q($table));
271
+ foreach($result as $row) {
272
+ $type = trim($row['type']);
273
+ $nullable = strpos($type, 'Nullable(') === 0;
274
+ $return[trim($row['name'])] = array(
275
+ "field" => trim($row['name']),
276
+ "full_type" => $type,
277
+ "type" => $type,
278
+ "default" => trim($row['default_expression']),
279
+ "null" => $nullable,
280
+ "auto_increment" => '0',
281
+ "privileges" => array("insert" => 1, "select" => 1, "update" => 0),
282
+ );
283
+ }
284
+
285
+ return $return;
286
+ }
287
+
288
+ function indexes($table, $connection2 = null) {
289
+ return array();
290
+ }
291
+
292
+ function foreign_keys($table) {
293
+ return array();
294
+ }
295
+
296
+ function collations() {
297
+ return array();
298
+ }
299
+
300
+ function information_schema($db) {
301
+ return false;
302
+ }
303
+
304
+ function error() {
305
+ global $connection;
306
+ return h($connection->error);
307
+ }
308
+
309
+ function types() {
310
+ return array();
311
+ }
312
+
313
+ function schemas() {
314
+ return array();
315
+ }
316
+
317
+ function get_schema() {
318
+ return "";
319
+ }
320
+
321
+ function set_schema($schema) {
322
+ return true;
323
+ }
324
+
325
+ function auto_increment() {
326
+ return '';
327
+ }
328
+
329
+ function last_id() {
330
+ return 0; // ClickHouse doesn't have it
331
+ }
332
+
333
+ function support($feature) {
334
+ return preg_match("~^(columns|sql|status|table)$~", $feature);
335
+ }
336
+
337
+ $jush = "clickhouse";
338
+ $types = array();
339
+ $structured_types = array();
340
+ foreach (array( //! arrays
341
+ lang('Numbers') => array("Int8" => 3, "Int16" => 5, "Int32" => 10, "Int64" => 19, "UInt8" => 3, "UInt16" => 5, "UInt32" => 10, "UInt64" => 20, "Float32" => 7, "Float64" => 16, 'Decimal' => 38, 'Decimal32' => 9, 'Decimal64' => 18, 'Decimal128' => 38),
342
+ lang('Date and time') => array("Date" => 13, "DateTime" => 20),
343
+ lang('Strings') => array("String" => 0),
344
+ lang('Binary') => array("FixedString" => 0),
345
+ ) as $key => $val) {
346
+ $types += $val;
347
+ $structured_types[$key] = array_keys($val);
348
+ }
349
+ $unsigned = array();
350
+ $operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL");
351
+ $functions = array();
352
+ $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
353
+ $edit_functions = array();
354
+ }
adminer/adminer/adminer/drivers/mongo.inc.php CHANGED
@@ -526,7 +526,7 @@ if (isset($_GET["mongo"])) {
526
  $op = '$regex';
527
  break;
528
  default:
529
- continue;
530
  }
531
  if ($type == 'and') {
532
  $data['$and'][] = array($col => array($op => $val));
@@ -662,7 +662,7 @@ if (isset($_GET["mongo"])) {
662
  }
663
 
664
  function support($feature) {
665
- return preg_match("~database|indexes~", $feature);
666
  }
667
 
668
  function db_collation($db, $collations) {
526
  $op = '$regex';
527
  break;
528
  default:
529
+ continue 2;
530
  }
531
  if ($type == 'and') {
532
  $data['$and'][] = array($col => array($op => $val));
662
  }
663
 
664
  function support($feature) {
665
+ return preg_match("~database|indexes|descidx~", $feature);
666
  }
667
 
668
  function db_collation($db, $collations) {
adminer/adminer/adminer/drivers/mssql.inc.php CHANGED
@@ -24,7 +24,13 @@ if (isset($_GET["mssql"])) {
24
  }
25
 
26
  function connect($server, $username, $password) {
27
- $this->_link = @sqlsrv_connect(preg_replace('~:~', ',', $server), array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8"));
 
 
 
 
 
 
28
  if ($this->_link) {
29
  $info = sqlsrv_server_info($this->_link);
30
  $this->server_info = $info['SQLServerVersion'];
@@ -626,7 +632,7 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
626
  }
627
 
628
  function support($feature) {
629
- return preg_match('~^(columns|database|drop_col|indexes|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
630
  }
631
 
632
  $jush = "mssql";
24
  }
25
 
26
  function connect($server, $username, $password) {
27
+ global $adminer;
28
+ $db = $adminer->database();
29
+ $connection_info = array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8");
30
+ if ($db != "") {
31
+ $connection_info["Database"] = $db;
32
+ }
33
+ $this->_link = @sqlsrv_connect(preg_replace('~:~', ',', $server), $connection_info);
34
  if ($this->_link) {
35
  $info = sqlsrv_server_info($this->_link);
36
  $this->server_info = $info['SQLServerVersion'];
632
  }
633
 
634
  function support($feature) {
635
+ return preg_match('~^(columns|database|drop_col|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
636
  }
637
 
638
  $jush = "mssql";
adminer/adminer/adminer/drivers/mysql.inc.php CHANGED
@@ -579,7 +579,7 @@ if (!defined("DRIVER")) {
579
  */
580
  function foreign_keys($table) {
581
  global $connection, $on_actions;
582
- static $pattern = '`(?:[^`]|``)+`';
583
  $return = array();
584
  $create_table = $connection->result("SHOW CREATE TABLE " . table($table), 1);
585
  if ($create_table) {
@@ -810,8 +810,7 @@ if (!defined("DRIVER")) {
810
  queries("SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'");
811
  foreach ($tables as $table) {
812
  $name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
813
- if (!queries("\nDROP TABLE IF EXISTS $name")
814
- || !queries("CREATE TABLE $name LIKE " . table($table))
815
  || !queries("INSERT INTO $name SELECT * FROM " . table($table))
816
  ) {
817
  return false;
@@ -826,9 +825,7 @@ if (!defined("DRIVER")) {
826
  foreach ($views as $table) {
827
  $name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
828
  $view = view($table);
829
- if (!queries("DROP VIEW IF EXISTS $name")
830
- || !queries("CREATE VIEW $name AS $view[select]") //! USE to avoid db.table
831
- ) {
832
  return false;
833
  }
834
  }
@@ -1086,11 +1083,11 @@ if (!defined("DRIVER")) {
1086
  }
1087
 
1088
  /** Check whether a feature is supported
1089
- * @param string "comment", "copy", "database", "drop_col", "dump", "event", "kill", "materializedview", "partitioning", "privileges", "procedure", "processlist", "routine", "scheme", "sequence", "status", "table", "trigger", "type", "variables", "view", "view_trigger"
1090
  * @return bool
1091
  */
1092
  function support($feature) {
1093
- return !preg_match("~scheme|sequence|type|view_trigger|materializedview" . (min_version(5.1) ? "" : "|event|partitioning" . (min_version(5) ? "" : "|routine|trigger|view")) . "~", $feature);
1094
  }
1095
 
1096
  function kill_process($val) {
579
  */
580
  function foreign_keys($table) {
581
  global $connection, $on_actions;
582
+ static $pattern = '(?:`(?:[^`]|``)+`)|(?:"(?:[^"]|"")+")';
583
  $return = array();
584
  $create_table = $connection->result("SHOW CREATE TABLE " . table($table), 1);
585
  if ($create_table) {
810
  queries("SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'");
811
  foreach ($tables as $table) {
812
  $name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
813
+ if (!queries("CREATE TABLE $name LIKE " . table($table))
 
814
  || !queries("INSERT INTO $name SELECT * FROM " . table($table))
815
  ) {
816
  return false;
825
  foreach ($views as $table) {
826
  $name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
827
  $view = view($table);
828
+ if (!queries("CREATE VIEW $name AS $view[select]")) { //! USE to avoid db.table
 
 
829
  return false;
830
  }
831
  }
1083
  }
1084
 
1085
  /** Check whether a feature is supported
1086
+ * @param string "comment", "copy", "database", "descidx", "drop_col", "dump", "event", "indexes", "kill", "materializedview", "partitioning", "privileges", "procedure", "processlist", "routine", "scheme", "sequence", "status", "table", "trigger", "type", "variables", "view", "view_trigger"
1087
  * @return bool
1088
  */
1089
  function support($feature) {
1090
+ return !preg_match("~scheme|sequence|type|view_trigger|materializedview" . (min_version(8) ? "" : "|descidx" . (min_version(5.1) ? "" : "|event|partitioning" . (min_version(5) ? "" : "|routine|trigger|view"))) . "~", $feature);
1091
  }
1092
 
1093
  function kill_process($val) {
adminer/adminer/adminer/drivers/oracle.inc.php CHANGED
@@ -398,7 +398,7 @@ ORDER BY PROCESS
398
  }
399
 
400
  function support($feature) {
401
- return preg_match('~^(columns|database|drop_col|indexes|processlist|scheme|sql|status|table|variables|view|view_trigger)$~', $feature); //!
402
  }
403
 
404
  $jush = "oracle";
398
  }
399
 
400
  function support($feature) {
401
+ return preg_match('~^(columns|database|drop_col|indexes|descidx|processlist|scheme|sql|status|table|variables|view|view_trigger)$~', $feature); //!
402
  }
403
 
404
  $jush = "oracle";
adminer/adminer/adminer/drivers/pgsql.inc.php CHANGED
@@ -349,7 +349,10 @@ WHERE relkind IN ('r', 'm', 'v', 'f')
349
  'timestamp without time zone' => 'timestamp',
350
  'timestamp with time zone' => 'timestamptz',
351
  );
352
- foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, d.adsrc AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment
 
 
 
353
  FROM pg_class c
354
  JOIN pg_namespace n ON c.relnamespace = n.oid
355
  JOIN pg_attribute a ON c.oid = a.attrelid
@@ -372,8 +375,11 @@ ORDER BY a.attnum"
372
  $row["type"] = $type;
373
  $row["full_type"] = $row["type"] . $length . $addon . $array;
374
  }
 
 
 
375
  $row["null"] = !$row["attnotnull"];
376
- $row["auto_increment"] = preg_match('~^nextval\(~i', $row["default"]);
377
  $row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
378
  if (preg_match('~(.+)::[^)]+(.*)~', $row["default"], $match)) {
379
  $row["default"] = ($match[1] == "NULL" ? null : (($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]) . $match[2]));
@@ -758,7 +764,11 @@ AND typelem = 0"
758
  // "basic" indexes after table definition
759
  foreach ($indexes as $index_name => $index) {
760
  if ($index['type'] == 'INDEX') {
761
- $return .= "\n\nCREATE INDEX " . idf_escape($index_name) . " ON " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " USING btree (" . implode(', ', array_map('idf_escape', $index['columns'])) . ");";
 
 
 
 
762
  }
763
  }
764
 
@@ -814,7 +824,7 @@ AND typelem = 0"
814
  }
815
 
816
  function support($feature) {
817
- return preg_match('~^(database|table|columns|sql|indexes|comment|view|' . (min_version(9.3) ? 'materializedview|' : '') . 'scheme|routine|processlist|sequence|trigger|type|variables|drop_col|kill|dump)$~', $feature);
818
  }
819
 
820
  function kill_process($val) {
349
  'timestamp without time zone' => 'timestamp',
350
  'timestamp with time zone' => 'timestamptz',
351
  );
352
+
353
+ $identity_column = min_version(10) ? "(a.attidentity = 'd')::int" : '0';
354
+
355
+ foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, d.adsrc AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment, $identity_column AS identity
356
  FROM pg_class c
357
  JOIN pg_namespace n ON c.relnamespace = n.oid
358
  JOIN pg_attribute a ON c.oid = a.attrelid
375
  $row["type"] = $type;
376
  $row["full_type"] = $row["type"] . $length . $addon . $array;
377
  }
378
+ if ($row['identity']) {
379
+ $row['default'] = 'GENERATED BY DEFAULT AS IDENTITY';
380
+ }
381
  $row["null"] = !$row["attnotnull"];
382
+ $row["auto_increment"] = $row['identity'] || preg_match('~^nextval\(~i', $row["default"]);
383
  $row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
384
  if (preg_match('~(.+)::[^)]+(.*)~', $row["default"], $match)) {
385
  $row["default"] = ($match[1] == "NULL" ? null : (($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]) . $match[2]));
764
  // "basic" indexes after table definition
765
  foreach ($indexes as $index_name => $index) {
766
  if ($index['type'] == 'INDEX') {
767
+ $columns = array();
768
+ foreach ($index['columns'] as $key => $val) {
769
+ $columns[] = idf_escape($val) . ($index['descs'][$key] ? " DESC" : "");
770
+ }
771
+ $return .= "\n\nCREATE INDEX " . idf_escape($index_name) . " ON " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " USING btree (" . implode(', ', $columns) . ");";
772
  }
773
  }
774
 
824
  }
825
 
826
  function support($feature) {
827
+ return preg_match('~^(database|table|columns|sql|indexes|descidx|comment|view|' . (min_version(9.3) ? 'materializedview|' : '') . 'scheme|routine|processlist|sequence|trigger|type|variables|drop_col|kill|dump)$~', $feature);
828
  }
829
 
830
  function kill_process($val) {
adminer/adminer/adminer/drivers/sqlite.inc.php CHANGED
@@ -770,7 +770,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
770
  }
771
 
772
  function support($feature) {
773
- return preg_match('~^(columns|database|drop_col|dump|indexes|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
774
  }
775
 
776
  $jush = "sqlite";
770
  }
771
 
772
  function support($feature) {
773
+ return preg_match('~^(columns|database|drop_col|dump|indexes|descidx|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
774
  }
775
 
776
  $jush = "sqlite";
adminer/adminer/adminer/dump.inc.php CHANGED
@@ -126,7 +126,7 @@ page_header(lang('Export'), $error, ($_GET["export"] != "" ? array("table" => $_
126
  ?>
127
 
128
  <form action="" method="post">
129
- <table cellspacing="0">
130
  <?php
131
  $db_style = array('', 'USE', 'DROP+CREATE', 'CREATE');
132
  $table_style = array('', 'DROP+CREATE', 'CREATE');
126
  ?>
127
 
128
  <form action="" method="post">
129
+ <table cellspacing="0" class="layout">
130
  <?php
131
  $db_style = array('', 'USE', 'DROP+CREATE', 'CREATE');
132
  $table_style = array('', 'DROP+CREATE', 'CREATE');
adminer/adminer/adminer/event.inc.php CHANGED
@@ -35,13 +35,13 @@ if (!$row && $EVENT != "") {
35
  ?>
36
 
37
  <form action="" method="post">
38
- <table cellspacing="0">
39
- <tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" maxlength="64" autocapitalize="off">
40
  <tr><th title="datetime"><?php echo lang('Start'); ?><td><input name="STARTS" value="<?php echo h("$row[EXECUTE_AT]$row[STARTS]"); ?>">
41
  <tr><th title="datetime"><?php echo lang('End'); ?><td><input name="ENDS" value="<?php echo h($row["ENDS"]); ?>">
42
  <tr><th><?php echo lang('Every'); ?><td><input type="number" name="INTERVAL_VALUE" value="<?php echo h($row["INTERVAL_VALUE"]); ?>" class="size"> <?php echo html_select("INTERVAL_FIELD", $intervals, $row["INTERVAL_FIELD"]); ?>
43
  <tr><th><?php echo lang('Status'); ?><td><?php echo html_select("STATUS", $statuses, $row["STATUS"]); ?>
44
- <tr><th><?php echo lang('Comment'); ?><td><input name="EVENT_COMMENT" value="<?php echo h($row["EVENT_COMMENT"]); ?>" maxlength="64">
45
  <tr><th><td><?php echo checkbox("ON_COMPLETION", "PRESERVE", $row["ON_COMPLETION"] == "PRESERVE", lang('On completion preserve')); ?>
46
  </table>
47
  <p><?php textarea("EVENT_DEFINITION", $row["EVENT_DEFINITION"]); ?>
35
  ?>
36
 
37
  <form action="" method="post">
38
+ <table cellspacing="0" class="layout">
39
+ <tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" data-maxlength="64" autocapitalize="off">
40
  <tr><th title="datetime"><?php echo lang('Start'); ?><td><input name="STARTS" value="<?php echo h("$row[EXECUTE_AT]$row[STARTS]"); ?>">
41
  <tr><th title="datetime"><?php echo lang('End'); ?><td><input name="ENDS" value="<?php echo h($row["ENDS"]); ?>">
42
  <tr><th><?php echo lang('Every'); ?><td><input type="number" name="INTERVAL_VALUE" value="<?php echo h($row["INTERVAL_VALUE"]); ?>" class="size"> <?php echo html_select("INTERVAL_FIELD", $intervals, $row["INTERVAL_FIELD"]); ?>
43
  <tr><th><?php echo lang('Status'); ?><td><?php echo html_select("STATUS", $statuses, $row["STATUS"]); ?>
44
+ <tr><th><?php echo lang('Comment'); ?><td><input name="EVENT_COMMENT" value="<?php echo h($row["EVENT_COMMENT"]); ?>" data-maxlength="64">
45
  <tr><th><td><?php echo checkbox("ON_COMPLETION", "PRESERVE", $row["ON_COMPLETION"] == "PRESERVE", lang('On completion preserve')); ?>
46
  </table>
47
  <p><?php textarea("EVENT_DEFINITION", $row["EVENT_DEFINITION"]); ?>
adminer/adminer/adminer/include/adminer.inc.php CHANGED
@@ -118,11 +118,11 @@ class Adminer {
118
  */
119
  function loginForm() {
120
  global $drivers;
121
- echo "<table cellspacing='0'>\n";
122
- echo $this->loginFormField('driver', '<tr><th>' . lang('System') . '<td>', html_select("auth[driver]", $drivers, DRIVER) . "\n");
123
  echo $this->loginFormField('server', '<tr><th>' . lang('Server') . '<td>', '<input name="auth[server]" value="' . h(SERVER) . '" title="hostname[:port]" placeholder="localhost" autocapitalize="off">' . "\n");
124
- echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocapitalize="off">' . script("focus(qs('#username'));"));
125
- echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]">' . "\n");
126
  echo $this->loginFormField('db', '<tr><th>' . lang('Database') . '<td>', '<input name="auth[db]" value="' . h($_GET["db"]) . '" autocapitalize="off">' . "\n");
127
  echo "</table>\n";
128
  echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
@@ -310,6 +310,7 @@ class Adminer {
310
  * @return null
311
  */
312
  function tableStructurePrint($fields) {
 
313
  echo "<table cellspacing='0' class='nowrap'>\n";
314
  echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . (support("comment") ? "<td>" . lang('Comment') : "") . "</thead>\n";
315
  foreach ($fields as $field) {
@@ -322,6 +323,7 @@ class Adminer {
322
  echo "\n";
323
  }
324
  echo "</table>\n";
 
325
  }
326
 
327
  /** Print list of indexes on table in tabular format
@@ -639,7 +641,7 @@ class Adminer {
639
  $history[$_GET["db"]] = array();
640
  }
641
  if (strlen($query) > 1e6) {
642
- $query = preg_replace('~[\x80-\xFF]+$~', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
643
  }
644
  $history[$_GET["db"]][] = array($query, time(), $time); // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"]
645
  $sql_id = "sql-" . count($history[$_GET["db"]]);
@@ -843,7 +845,7 @@ class Adminer {
843
  foreach ($row as $key => $val) {
844
  $field = $fields[$key];
845
  $row[$key] = ($val !== null
846
- ? unconvert_field($field, preg_match(number_type(), $field["type"]) && $val != '' ? $val : q(($val === false ? 0 : $val)))
847
  : "NULL"
848
  );
849
  }
@@ -931,12 +933,12 @@ class Adminer {
931
  foreach ($usernames as $username => $password) {
932
  if ($password !== null) {
933
  if ($first) {
934
- echo "<p id='logins'>" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
935
  $first = false;
936
  }
937
  $dbs = $_SESSION["db"][$vendor][$server][$username];
938
  foreach (($dbs ? array_keys($dbs) : array("")) as $db) {
939
- echo "<a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@" . $this->serverName($server) : "") . ($db != "" ? " - $db" : "")) . "</a><br>\n";
940
  }
941
  }
942
  }
118
  */
119
  function loginForm() {
120
  global $drivers;
121
+ echo "<table cellspacing='0' class='layout'>\n";
122
+ echo $this->loginFormField('driver', '<tr><th>' . lang('System') . '<td>', html_select("auth[driver]", $drivers, DRIVER, "loginDriver(this);") . "\n");
123
  echo $this->loginFormField('server', '<tr><th>' . lang('Server') . '<td>', '<input name="auth[server]" value="' . h(SERVER) . '" title="hostname[:port]" placeholder="localhost" autocapitalize="off">' . "\n");
124
+ echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocomplete="username" autocapitalize="off">' . script("focus(qs('#username')); qs('#username').form['auth[driver]'].onchange();"));
125
+ echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]" autocomplete="current-password">' . "\n");
126
  echo $this->loginFormField('db', '<tr><th>' . lang('Database') . '<td>', '<input name="auth[db]" value="' . h($_GET["db"]) . '" autocapitalize="off">' . "\n");
127
  echo "</table>\n";
128
  echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
310
  * @return null
311
  */
312
  function tableStructurePrint($fields) {
313
+ echo "<div class='scrollable'>\n";
314
  echo "<table cellspacing='0' class='nowrap'>\n";
315
  echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . (support("comment") ? "<td>" . lang('Comment') : "") . "</thead>\n";
316
  foreach ($fields as $field) {
323
  echo "\n";
324
  }
325
  echo "</table>\n";
326
+ echo "</div>\n";
327
  }
328
 
329
  /** Print list of indexes on table in tabular format
641
  $history[$_GET["db"]] = array();
642
  }
643
  if (strlen($query) > 1e6) {
644
+ $query = preg_replace('~[\x80-\xFF]+$~', '', substr($query, 0, 1e6)) . "\n"; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
645
  }
646
  $history[$_GET["db"]][] = array($query, time(), $time); // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"]
647
  $sql_id = "sql-" . count($history[$_GET["db"]]);
845
  foreach ($row as $key => $val) {
846
  $field = $fields[$key];
847
  $row[$key] = ($val !== null
848
+ ? unconvert_field($field, preg_match(number_type(), $field["type"]) && $val != '' && !preg_match('~\[~', $field["full_type"]) ? $val : q(($val === false ? 0 : $val)))
849
  : "NULL"
850
  );
851
  }
933
  foreach ($usernames as $username => $password) {
934
  if ($password !== null) {
935
  if ($first) {
936
+ echo "<ul id='logins'>" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
937
  $first = false;
938
  }
939
  $dbs = $_SESSION["db"][$vendor][$server][$username];
940
  foreach (($dbs ? array_keys($dbs) : array("")) as $db) {
941
+ echo "<li><a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@" . $this->serverName($server) : "") . ($db != "" ? " - $db" : "")) . "</a>\n";
942
  }
943
  }
944
  }
adminer/adminer/adminer/include/auth.inc.php CHANGED
@@ -83,7 +83,7 @@ if ($auth) {
83
  set_session($key, null);
84
  }
85
  unset_permanent();
86
- redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.') . ' ' . lang('Thanks for using Adminer, consider <a href="%s">donating</a>.', 'https://sourceforge.net/donate/index.php?group_id=264133'));
87
  }
88
 
89
  } elseif ($permanent && !$_SESSION["pwds"]) {
@@ -172,7 +172,8 @@ if (isset($_GET["username"])) {
172
 
173
  $login = null;
174
  if (!is_object($connection) || ($login = $adminer->login($_GET["username"], get_password())) !== true) {
175
- auth_error((is_string($connection) ? h($connection) : (is_string($login) ? $login : lang('Invalid credentials.'))));
 
176
  }
177
 
178
  if ($auth && $_POST["token"]) {
83
  set_session($key, null);
84
  }
85
  unset_permanent();
86
+ redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.') . ' ' . lang('Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.'));
87
  }
88
 
89
  } elseif ($permanent && !$_SESSION["pwds"]) {
172
 
173
  $login = null;
174
  if (!is_object($connection) || ($login = $adminer->login($_GET["username"], get_password())) !== true) {
175
+ $error = (is_string($connection) ? h($connection) : (is_string($login) ? $login : lang('Invalid credentials.')));
176
+ auth_error($error . (preg_match('~^ | $~', get_password()) ? '<br>' . lang('There is a space in the input password which might be the cause.') : ''));
177
  }
178
 
179
  if ($auth && $_POST["token"]) {
adminer/adminer/adminer/include/bootstrap.inc.php CHANGED
@@ -79,6 +79,7 @@ include "../adminer/drivers/firebird.inc.php";
79
  include "../adminer/drivers/simpledb.inc.php";
80
  include "../adminer/drivers/mongo.inc.php";
81
  include "../adminer/drivers/elastic.inc.php";
 
82
  include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
83
 
84
  define("SERVER", $_GET[DRIVER]); // read from pgsql=localhost
79
  include "../adminer/drivers/simpledb.inc.php";
80
  include "../adminer/drivers/mongo.inc.php";
81
  include "../adminer/drivers/elastic.inc.php";
82
+ include "../adminer/drivers/clickhouse.inc.php";
83
  include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
84
 
85
  define("SERVER", $_GET[DRIVER]); // read from pgsql=localhost
adminer/adminer/adminer/include/editing.inc.php CHANGED
@@ -17,6 +17,7 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
17
  odd(''); // reset odd for each result
18
  for ($i=0; (!$limit || $i < $limit) && ($row = $result->fetch_row()); $i++) {
19
  if (!$i) {
 
20
  echo "<table cellspacing='0' class='nowrap'>\n";
21
  echo "<thead><tr>";
22
  for ($j=0; $j < count($row); $j++) {
@@ -85,7 +86,7 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
85
  echo "<td>$val";
86
  }
87
  }
88
- echo ($i ? "</table>" : "<p class='message'>" . lang('No rows.')) . "\n";
89
  return $return;
90
  }
91
 
@@ -111,6 +112,31 @@ function referencable_primary($self) {
111
  return $return;
112
  }
113
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  /** Print SQL <textarea> tag
115
  * @param string
116
  * @param string or array in which case [0] of every element is used
@@ -157,7 +183,7 @@ echo optionlist(array_merge($extra_types, $structured_types), $type);
157
  <td><input name="<?php echo h($key); ?>[length]" value="<?php echo h($field["length"]); ?>" size="3"<?php echo (!$field["length"] && preg_match('~var(char|binary)$~', $type) ? " class='required'" : ""); //! type="number" with enabled JavaScript ?> aria-labelledby="label-length"><?php echo script("mixin(qsl('input'), {onfocus: editingLengthFocus, oninput: editingLengthChange});", ""); ?><td class="options"><?php
158
  echo "<select name='" . h($key) . "[collation]'" . (preg_match('~(char|text|enum|set)$~', $type) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
159
  echo ($unsigned ? "<select name='" . h($key) . "[unsigned]'" . (!$type || preg_match(number_type(), $type) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
160
- echo (isset($field['on_update']) ? "<select name='" . h($key) . "[on_update]'" . (preg_match('~timestamp|datetime~', $type) ? "" : " class='hidden'") . '>' . optionlist(array("" => "(" . lang('ON UPDATE') . ")", "CURRENT_TIMESTAMP"), $field["on_update"]) . '</select>' : '');
161
  echo ($foreign_keys ? "<select name='" . h($key) . "[on_delete]'" . (preg_match("~`~", $type) ? "" : " class='hidden'") . "><option value=''>(" . lang('ON DELETE') . ")" . optionlist(explode("|", $on_actions), $field["on_delete"]) . "</select> " : " "); // space for IE
162
  }
163
 
@@ -235,10 +261,9 @@ function type_class($type) {
235
  * @param array
236
  * @param string TABLE or PROCEDURE
237
  * @param array returned by referencable_primary()
238
- * @param bool display comments column
239
  * @return null
240
  */
241
- function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array(), $comments = false) {
242
  global $inout;
243
  $fields = array_values($fields);
244
  ?>
@@ -258,7 +283,7 @@ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = arra
258
  'mssql' => "ms186775.aspx",
259
  )); ?>
260
  <td id="label-default"><?php echo lang('Default value'); ?>
261
- <?php echo (support("comment") ? "<td id='label-comment'" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
262
  <?php } ?>
263
  <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("row_count = " . count($fields) . ";"); ?>
264
  </thead>
@@ -272,14 +297,14 @@ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = arra
272
  ?>
273
  <tr<?php echo ($display ? "" : " style='display: none;'"); ?>>
274
  <?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", explode("|", $inout), $field["inout"]) : ""); ?>
275
- <th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" maxlength="64" autocapitalize="off" aria-labelledby="label-name"><?php echo script("qsl('input').oninput = function () { editingNameChange.call(this);" . ($field["field"] != "" || count($fields) > 1 ? "" : " editingAddRow.call(this);") . " };", ""); ?><?php } ?>
276
  <input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($orig); ?>">
277
  <?php edit_type("fields[$i]", $field, $collations, $foreign_keys); ?>
278
  <?php if ($type == "TABLE") { ?>
279
  <td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block", "label-null"); ?>
280
  <td><label class="block"><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> aria-labelledby="label-ai"></label><td><?php
281
  echo checkbox("fields[$i][has_default]", 1, $field["has_default"], "", "", "", "label-default"); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" aria-labelledby="label-default"><?php
282
- echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
283
  }
284
  echo "<td>";
285
  echo (support("move_col") ?
17
  odd(''); // reset odd for each result
18
  for ($i=0; (!$limit || $i < $limit) && ($row = $result->fetch_row()); $i++) {
19
  if (!$i) {
20
+ echo "<div class='scrollable'>\n";
21
  echo "<table cellspacing='0' class='nowrap'>\n";
22
  echo "<thead><tr>";
23
  for ($j=0; $j < count($row); $j++) {
86
  echo "<td>$val";
87
  }
88
  }
89
+ echo ($i ? "</table>\n</div>" : "<p class='message'>" . lang('No rows.')) . "\n";
90
  return $return;
91
  }
92
 
112
  return $return;
113
  }
114
 
115
+ /** Get settings stored in a cookie
116
+ * @return array
117
+ */
118
+ function adminer_settings() {
119
+ parse_str($_COOKIE["adminer_settings"], $settings);
120
+ return $settings;
121
+ }
122
+
123
+ /** Get setting stored in a cookie
124
+ * @param string
125
+ * @return array
126
+ */
127
+ function adminer_setting($key) {
128
+ $settings = adminer_settings();
129
+ return $settings[$key];
130
+ }
131
+
132
+ /** Store settings to a cookie
133
+ * @param array
134
+ * @return bool
135
+ */
136
+ function set_adminer_settings($settings) {
137
+ return cookie("adminer_settings", http_build_query($settings + adminer_settings()));
138
+ }
139
+
140
  /** Print SQL <textarea> tag
141
  * @param string
142
  * @param string or array in which case [0] of every element is used
183
  <td><input name="<?php echo h($key); ?>[length]" value="<?php echo h($field["length"]); ?>" size="3"<?php echo (!$field["length"] && preg_match('~var(char|binary)$~', $type) ? " class='required'" : ""); //! type="number" with enabled JavaScript ?> aria-labelledby="label-length"><?php echo script("mixin(qsl('input'), {onfocus: editingLengthFocus, oninput: editingLengthChange});", ""); ?><td class="options"><?php
184
  echo "<select name='" . h($key) . "[collation]'" . (preg_match('~(char|text|enum|set)$~', $type) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
185
  echo ($unsigned ? "<select name='" . h($key) . "[unsigned]'" . (!$type || preg_match(number_type(), $type) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
186
+ echo (isset($field['on_update']) ? "<select name='" . h($key) . "[on_update]'" . (preg_match('~timestamp|datetime~', $type) ? "" : " class='hidden'") . '>' . optionlist(array("" => "(" . lang('ON UPDATE') . ")", "CURRENT_TIMESTAMP"), (preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"]) ? "CURRENT_TIMESTAMP" : $field["on_update"])) . '</select>' : '');
187
  echo ($foreign_keys ? "<select name='" . h($key) . "[on_delete]'" . (preg_match("~`~", $type) ? "" : " class='hidden'") . "><option value=''>(" . lang('ON DELETE') . ")" . optionlist(explode("|", $on_actions), $field["on_delete"]) . "</select> " : " "); // space for IE
188
  }
189
 
261
  * @param array
262
  * @param string TABLE or PROCEDURE
263
  * @param array returned by referencable_primary()
 
264
  * @return null
265
  */
266
+ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array()) {
267
  global $inout;
268
  $fields = array_values($fields);
269
  ?>
283
  'mssql' => "ms186775.aspx",
284
  )); ?>
285
  <td id="label-default"><?php echo lang('Default value'); ?>
286
+ <?php echo (support("comment") ? "<td id='label-comment'>" . lang('Comment') : ""); ?>
287
  <?php } ?>
288
  <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("row_count = " . count($fields) . ";"); ?>
289
  </thead>
297
  ?>
298
  <tr<?php echo ($display ? "" : " style='display: none;'"); ?>>
299
  <?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", explode("|", $inout), $field["inout"]) : ""); ?>
300
+ <th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" data-maxlength="64" autocapitalize="off" aria-labelledby="label-name"><?php echo script("qsl('input').oninput = function () { editingNameChange.call(this);" . ($field["field"] != "" || count($fields) > 1 ? "" : " editingAddRow.call(this);") . " };", ""); ?><?php } ?>
301
  <input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($orig); ?>">
302
  <?php edit_type("fields[$i]", $field, $collations, $foreign_keys); ?>
303
  <?php if ($type == "TABLE") { ?>
304
  <td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block", "label-null"); ?>
305
  <td><label class="block"><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> aria-labelledby="label-ai"></label><td><?php
306
  echo checkbox("fields[$i][has_default]", 1, $field["has_default"], "", "", "", "label-default"); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" aria-labelledby="label-default"><?php
307
+ echo (support("comment") ? "<td><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' data-maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
308
  }
309
  echo "<td>";
310
  echo (support("move_col") ?
adminer/adminer/adminer/include/functions.inc.php CHANGED
@@ -815,7 +815,7 @@ function shorten_utf8($string, $length = 80, $suffix = "") {
815
  if (!preg_match("(^(" . repeat_pattern("[\t\r\n -\x{10FFFF}]", $length) . ")($)?)u", $string, $match)) { // ~s causes trash in $match[2] under some PHP versions, (.|\n) is slow
816
  preg_match("(^(" . repeat_pattern("[\t\r\n -~]", $length) . ")($)?)", $string, $match);
817
  }
818
- return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i>...</i>");
819
  }
820
 
821
  /** Format decimal number
@@ -1021,7 +1021,7 @@ function process_input($field) {
1021
  return null;
1022
  }
1023
  if ($function == "orig") {
1024
- return ($field["on_update"] == "CURRENT_TIMESTAMP" ? idf_escape($field["field"]) : false);
1025
  }
1026
  if ($function == "NULL") {
1027
  return "NULL";
@@ -1419,7 +1419,7 @@ function edit_form($TABLE, $fields, $row, $update) {
1419
  if (!$fields) {
1420
  echo "<p class='error'>" . lang('You have no privileges to update this table.') . "\n";
1421
  } else {
1422
- echo "<table cellspacing='0'>" . script("qsl('table').onkeydown = editingKeydown;");
1423
 
1424
  foreach ($fields as $name => $field) {
1425
  echo "<tr><th>" . $adminer->fieldName($field);
@@ -1445,12 +1445,12 @@ function edit_form($TABLE, $fields, $row, $update) {
1445
  }
1446
  $function = ($_POST["save"]
1447
  ? (string) $_POST["function"][$name]
1448
- : ($update && $field["on_update"] == "CURRENT_TIMESTAMP"
1449
  ? "now"
1450
  : ($value === false ? null : ($value !== null ? '' : 'NULL'))
1451
  )
1452
  );
1453
- if (preg_match("~time~", $field["type"]) && $value == "CURRENT_TIMESTAMP") {
1454
  $value = "";
1455
  $function = "now";
1456
  }
@@ -1476,7 +1476,7 @@ function edit_form($TABLE, $fields, $row, $update) {
1476
  ? lang('Save and continue edit')
1477
  : lang('Save and insert next')
1478
  ) . "' title='Ctrl+Shift+Enter'>\n";
1479
- echo ($update ? script("qsl('input').onclick = function () { return !ajaxForm(this.form, '" . lang('Saving') . "...', this); };") : "");
1480
  }
1481
  }
1482
  echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'>" . confirm() . "\n"
815
  if (!preg_match("(^(" . repeat_pattern("[\t\r\n -\x{10FFFF}]", $length) . ")($)?)u", $string, $match)) { // ~s causes trash in $match[2] under some PHP versions, (.|\n) is slow
816
  preg_match("(^(" . repeat_pattern("[\t\r\n -~]", $length) . ")($)?)", $string, $match);
817
  }
818
+ return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i>…</i>");
819
  }
820
 
821
  /** Format decimal number
1021
  return null;
1022
  }
1023
  if ($function == "orig") {
1024
+ return (preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"]) ? idf_escape($field["field"]) : false);
1025
  }
1026
  if ($function == "NULL") {
1027
  return "NULL";
1419
  if (!$fields) {
1420
  echo "<p class='error'>" . lang('You have no privileges to update this table.') . "\n";
1421
  } else {
1422
+ echo "<table cellspacing='0' class='layout'>" . script("qsl('table').onkeydown = editingKeydown;");
1423
 
1424
  foreach ($fields as $name => $field) {
1425
  echo "<tr><th>" . $adminer->fieldName($field);
1445
  }
1446
  $function = ($_POST["save"]
1447
  ? (string) $_POST["function"][$name]
1448
+ : ($update && preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"])
1449
  ? "now"
1450
  : ($value === false ? null : ($value !== null ? '' : 'NULL'))
1451
  )
1452
  );
1453
+ if (preg_match("~time~", $field["type"]) && preg_match('~^CURRENT_TIMESTAMP~i', $value)) {
1454
  $value = "";
1455
  $function = "now";
1456
  }
1476
  ? lang('Save and continue edit')
1477
  : lang('Save and insert next')
1478
  ) . "' title='Ctrl+Shift+Enter'>\n";
1479
+ echo ($update ? script("qsl('input').onclick = function () { return !ajaxForm(this.form, '" . lang('Saving') . "', this); };") : "");
1480
  }
1481
  }
1482
  echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'>" . confirm() . "\n"
adminer/adminer/adminer/include/lang.inc.php CHANGED
@@ -23,6 +23,7 @@ $langs = array(
23
  'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
24
  'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti
25
  'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/
 
26
  'ko' => '한국어', // dalli - skcha67@gmail.com
27
  'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
28
  'ms' => 'Bahasa Melayu', // Pisyek
23
  'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
24
  'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti
25
  'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/
26
+ 'ka' => 'ქართული', // Saba Khmaladze skhmaladze@uglt.org
27
  'ko' => '한국어', // dalli - skcha67@gmail.com
28
  'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
29
  'ms' => 'Bahasa Melayu', // Pisyek
adminer/adminer/adminer/include/version.inc.php CHANGED
@@ -1,2 +1,2 @@
1
  <?php
2
- $VERSION = "4.6.3";
1
  <?php
2
+ $VERSION = "4.7.1";
adminer/adminer/adminer/indexes.inc.php CHANGED
@@ -94,6 +94,7 @@ if (!$row) {
94
  ?>
95
 
96
  <form action="" method="post">
 
97
  <table cellspacing="0" class="nowrap">
98
  <thead><tr>
99
  <th id="label-type"><?php echo lang('Index Type'); ?>
@@ -126,7 +127,7 @@ foreach ($row["indexes"] as $index) {
126
  "partial(" . ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . ", '" . js_escape($jush == "sql" ? "" : $_GET["indexes"] . "_") . "')"
127
  );
128
  echo ($jush == "sql" || $jush == "mssql" ? "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "' title='" . lang('Length') . "'>" : "");
129
- echo ($jush != "sql" ? checkbox("indexes[$j][descs][$i]", 1, $index["descs"][$key], lang('descending')) : "");
130
  echo " </span>";
131
  $i++;
132
  }
@@ -138,6 +139,7 @@ foreach ($row["indexes"] as $index) {
138
  }
139
  ?>
140
  </table>
 
141
  <p>
142
  <input type="submit" value="<?php echo lang('Save'); ?>">
143
  <input type="hidden" name="token" value="<?php echo $token; ?>">
94
  ?>
95
 
96
  <form action="" method="post">
97
+ <div class="scrollable">
98
  <table cellspacing="0" class="nowrap">
99
  <thead><tr>
100
  <th id="label-type"><?php echo lang('Index Type'); ?>
127
  "partial(" . ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . ", '" . js_escape($jush == "sql" ? "" : $_GET["indexes"] . "_") . "')"
128
  );
129
  echo ($jush == "sql" || $jush == "mssql" ? "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "' title='" . lang('Length') . "'>" : "");
130
+ echo (support("descidx") ? checkbox("indexes[$j][descs][$i]", 1, $index["descs"][$key], lang('descending')) : "");
131
  echo " </span>";
132
  $i++;
133
  }
139
  }
140
  ?>
141
  </table>
142
+ </div>
143
  <p>
144
  <input type="submit" value="<?php echo lang('Save'); ?>">
145
  <input type="hidden" name="token" value="<?php echo $token; ?>">
adminer/adminer/adminer/lang/cs.inc.php CHANGED
@@ -10,8 +10,9 @@ $translations = array(
10
  'Logout' => 'Odhlásit',
11
  'Logged as: %s' => 'Přihlášen jako: %s',
12
  'Logout successful.' => 'Odhlášení proběhlo v pořádku.',
13
- 'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Díky za použití Admineru, <a href="%s">příspějte</a> na vývoj.',
14
  'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
 
15
  'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer nepodporuje přístup k databázi bez hesla, <a href="https://www.adminer.org/cs/password/"%s>více informací</a>.',
16
  'Database does not support password.' => 'Databáze nepodporuje heslo.',
17
  'Too many unsuccessful logins, try again in %d minute(s).' => array('Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minutu.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minuty.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minut.'),
10
  'Logout' => 'Odhlásit',
11
  'Logged as: %s' => 'Přihlášen jako: %s',
12
  'Logout successful.' => 'Odhlášení proběhlo v pořádku.',
13
+ 'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Díky za použití Admineru, <a href="https://www.adminer.org/cs/donation/">přispějte</a> na vývoj.',
14
  'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
15
+ 'There is a space in the input password which might be the cause.' => 'Problém může být, že je v zadaném hesle mezera.',
16
  'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer nepodporuje přístup k databázi bez hesla, <a href="https://www.adminer.org/cs/password/"%s>více informací</a>.',
17
  'Database does not support password.' => 'Databáze nepodporuje heslo.',
18
  'Too many unsuccessful logins, try again in %d minute(s).' => array('Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minutu.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minuty.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minut.'),
adminer/adminer/adminer/lang/he.inc.php CHANGED
@@ -279,7 +279,7 @@ $translations = array(
279
  'Default value' => 'ערך ברירת מחדל',
280
  'Full table scan' => 'סריקה טבלה מלאה',
281
  'Too many unsuccessful logins, try again in %d minute(s).' => 'יותר מידי נסיונות כניסה נכשלו, אנא נסה עוד %d דקות',
282
- 'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'תודה שהשתמש ב-adminer אנא שקול <a href="%s">לתרום</a>.',
283
  'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'סיסמת המאסטר פגה <a href="https://www.adminer.org/en/extension/"%s>התקן תוסף</a> על מנת להפוך את זה לתמידי',
284
  'If you did not send this request from Adminer then close this page.' => 'אם לא אתה שלחת בקשה ל-Adminer הינך יכול לסגור חלון זה',
285
  'You can upload a big SQL file via FTP and import it from server.' => 'ניתן לעלות קבצים ב-FTP ואז למשוך אותם מהשרת',
279
  'Default value' => 'ערך ברירת מחדל',
280
  'Full table scan' => 'סריקה טבלה מלאה',
281
  'Too many unsuccessful logins, try again in %d minute(s).' => 'יותר מידי נסיונות כניסה נכשלו, אנא נסה עוד %d דקות',
282
+ 'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'תודה שהשתמש ב-adminer אנא שקול <a href="https://www.adminer.org/en/donation/">לתרום</a>.',
283
  'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'סיסמת המאסטר פגה <a href="https://www.adminer.org/en/extension/"%s>התקן תוסף</a> על מנת להפוך את זה לתמידי',
284
  'If you did not send this request from Adminer then close this page.' => 'אם לא אתה שלחת בקשה ל-Adminer הינך יכול לסגור חלון זה',
285
  'You can upload a big SQL file via FTP and import it from server.' => 'ניתן לעלות קבצים ב-FTP ואז למשוך אותם מהשרת',
adminer/adminer/adminer/lang/ja.inc.php CHANGED
@@ -178,7 +178,7 @@ $translations = array(
178
  'Optimize' => '最適化',
179
  'Check' => 'チェック',
180
  'Repair' => '修復',
181
- 'Truncate' => 'Truncate',
182
  'Move to other database' => '別のデータベースへ移動',
183
  'Move' => '移動',
184
  'Save and continue edit' => '保存して継続',
@@ -264,4 +264,14 @@ $translations = array(
264
  'Permanent link' => 'パーマネントリンク',
265
  'Edit all' => 'すべて編集',
266
  'HH:MM:SS' => '時:分:秒',
 
 
 
 
 
 
 
 
 
 
267
  );
178
  'Optimize' => '最適化',
179
  'Check' => 'チェック',
180
  'Repair' => '修復',
181
+ 'Truncate' => '空にする',
182
  'Move to other database' => '別のデータベースへ移動',
183
  'Move' => '移動',
184
  'Save and continue edit' => '保存して継続',
264
  'Permanent link' => 'パーマネントリンク',
265
  'Edit all' => 'すべて編集',
266
  'HH:MM:SS' => '時:分:秒',
267
+ 'Selected' => '選択済',
268
+ 'Modify' => '修正',
269
+ 'Load more data' => '続きを読み込み',
270
+ 'Loading' => '読み込み中',
271
+ 'Size' => 'サイズ',
272
+ 'Compute' => '算出',
273
+ 'Saving' => '保存中',
274
+ 'yes' => 'はい',
275
+ 'no' => 'いいえ',
276
+ 'Default value' => '既定値',
277
  );
adminer/adminer/adminer/lang/ka.inc.php ADDED
@@ -0,0 +1,303 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'შესვლა',
4
+ 'Logout successful.' => 'გამოხვედით სისტემიდან.',
5
+ 'Invalid credentials.' => 'არასწორი მომხმარებელი ან პაროლი.',
6
+ 'Server' => 'სერვერი',
7
+ 'Username' => 'მომხმარებელი',
8
+ 'Password' => 'პაროლი',
9
+ 'Select database' => 'ბაზა',
10
+ 'Invalid database.' => 'არასწორი ბაზა.',
11
+ 'Table has been dropped.' => 'ცხრილი წაიშალა.',
12
+ 'Table has been altered.' => 'ცხრილი შეიცვალა.',
13
+ 'Table has been created.' => 'ცხრილი შეიქმნა.',
14
+ 'Alter table' => 'ცხრილის შეცვლა',
15
+ 'Create table' => 'ცხრილის შექმნა',
16
+ 'Table name' => 'სახელი',
17
+ 'engine' => 'სახეობა',
18
+ 'collation' => 'კოდირება',
19
+ 'Column name' => 'ველი',
20
+ 'Type' => 'სახეობა',
21
+ 'Length' => 'სიგრძე',
22
+ 'Auto Increment' => 'ავტომატურად გაზრდა',
23
+ 'Options' => 'მოქმედება',
24
+ 'Save' => 'შენახვა',
25
+ 'Drop' => 'წაშლა',
26
+ 'Database has been dropped.' => 'ბაზა წაიშალა.',
27
+ 'Database has been created.' => 'ბაზა შეიქმნა.',
28
+ 'Database has been renamed.' => 'ბაზას გადაერქვა.',
29
+ 'Database has been altered.' => 'ბაზა შეიცვალა.',
30
+ 'Alter database' => 'ბაზის შეცვლა',
31
+ 'Create database' => 'ბაზის შექმნა',
32
+ 'SQL command' => 'SQL-ბრძანება',
33
+ 'Logout' => 'გასვლა',
34
+ 'database' => 'ბაზა',
35
+ 'Use' => 'არჩევა',
36
+ 'No tables.' => 'ბაზაში ცხრილი არაა.',
37
+ 'select' => 'არჩევა',
38
+ 'Item has been deleted.' => 'ჩანაწერი წაიშალა.',
39
+ 'Item has been updated.' => 'ჩანაწერი განახლდა.',
40
+ 'Item%s has been inserted.' => 'ჩანაწერი%s ჩაჯდა.',
41
+ 'Edit' => 'შეცვლა',
42
+ 'Insert' => 'ჩასმა',
43
+ 'Save and insert next' => 'შენახვა და სხვის ჩასმა',
44
+ 'Delete' => 'წაშლა',
45
+ 'Database' => 'ბაზა',
46
+ 'Indexes have been altered.' => 'შეიცვალა ინდექსები.',
47
+ 'Indexes' => 'ინდექსები',
48
+ 'Alter indexes' => 'ინდექსის შეცვლა',
49
+ 'Add next' => 'კიდევ დამატება',
50
+ 'Language' => 'ენა',
51
+ 'Select' => 'არჩევა',
52
+ 'New item' => 'ახალი ჩანაწერი',
53
+ 'Search' => 'ძებნა',
54
+ 'Sort' => 'დალაგება',
55
+ 'descending' => 'კლებადობით',
56
+ 'Limit' => 'ზღვარი',
57
+ 'No rows.' => 'ჩანაწერი არაა.',
58
+ 'Action' => 'მოქმედება',
59
+ 'edit' => 'რედაქტირება',
60
+ 'Page' => 'გვერდი',
61
+ 'Query executed OK, %d row(s) affected.' => 'მოთხოვდა შესრულდა, შეიცვალა %d ჩანაწერი.',
62
+ 'Error in query' => 'შეცდომა მოთხოვნაში',
63
+ 'Execute' => 'შესრულება',
64
+ 'Table' => 'ცხრილი',
65
+ 'Foreign keys' => 'გარე გასაღები',
66
+ 'Triggers' => 'ტრიგერები',
67
+ 'View' => 'ნახვა',
68
+ 'Unable to select the table' => 'ცხრილიდან ინფორმაცია ვერ მოვიპოვე',
69
+ 'Invalid CSRF token. Send the form again.' => 'უმოქმედო CSRF-ტოკენი. ფორმის კიდევ ერთხელ გაგზავნა.',
70
+ 'Comment' => 'კომენტარები',
71
+ 'Default values' => 'სტანდარტული მნიშვნელობა',
72
+ '%d byte(s)' => '%d ბაიტი',
73
+ 'No commands to execute.' => 'შესასრულებელი ბრძანება არაა.',
74
+ 'Unable to upload a file.' => 'ფაილი არ აიტვირთა სერვერზე.',
75
+ 'File upload' => 'ფაილის ატვირთვა სერვერზე',
76
+ 'File uploads are disabled.' => 'ფაილის სერვერზე ატვირთვა გათიშულია.',
77
+ 'Routine has been called, %d row(s) affected.' => 'გამოძახებულია პროცედურა, შეიცვალა %d ჩანაწერი.',
78
+ 'Call' => 'გამოძახეება',
79
+ 'No extension' => 'გაფართოება არაა',
80
+ 'None of the supported PHP extensions (%s) are available.' => 'არც ერთი მხარდაჭერილი გაფართოება არ მოიძებნა (%s).',
81
+ 'Session support must be enabled.' => 'ჩართული უნდა იყოს სესია.',
82
+ 'Session expired, please login again.' => 'სესიის მოქმედების დრო ამოიწურა, გაიარეთ ხელახალი ავტორიზაცია.',
83
+ 'Text length' => 'ტექსტის სიგრძე',
84
+ 'Foreign key has been dropped.' => 'გარე გასაღები წაიშალა.',
85
+ 'Foreign key has been altered.' => 'გარე გასაღები შეიცვალა.',
86
+ 'Foreign key has been created.' => 'გარე გასაღები შეიქმნა.',
87
+ 'Foreign key' => 'გარე გასაღები',
88
+ 'Change' => 'შეცვლა',
89
+ 'Source' => 'წყარო',
90
+ 'Target' => 'სამიზნე',
91
+ 'Add column' => 'ველის დამატება',
92
+ 'Alter' => 'შეცვლა',
93
+ 'Add foreign key' => 'გარე გასაღები დამატება',
94
+ 'ON DELETE' => 'წაშლისას',
95
+ 'ON UPDATE' => 'განახლებისას',
96
+ 'Index Type' => 'ინდექსის სახეობა',
97
+ 'Column (length)' => 'ველი (სიგრძე)',
98
+ 'View has been dropped.' => 'წარმოდგენა წაიშალა.',
99
+ 'View has been altered.' => 'წარმოდგენა შეიცვალა.',
100
+ 'View has been created.' => 'წარმოდგენა შეიქმნა.',
101
+ 'Alter view' => 'წარმოდგენის შეცვლა',
102
+ 'Create view' => 'წარმოდგენის შექმნა',
103
+ 'Name' => 'სახელი',
104
+ 'Process list' => 'პროცესების სია',
105
+ '%d process(es) have been killed.' => 'გაითიშა %d პროცესი.',
106
+ 'Kill' => 'დასრულება',
107
+ 'Parameter name' => 'პარამეტრი',
108
+ 'Database schema' => 'ბაზის სქემა',
109
+ 'Create procedure' => 'პროცედურის შექმნა',
110
+ 'Create function' => 'ფუნქციის შექმნა',
111
+ 'Routine has been dropped.' => 'პროცედურა წაიშალა.',
112
+ 'Routine has been altered.' => 'პროცედურა შეიცვალა.',
113
+ 'Routine has been created.' => 'პროცედურა შეიქმნა.',
114
+ 'Alter function' => 'ფუნქციის შეცვლა',
115
+ 'Alter procedure' => 'პროცედურის შეცვლა',
116
+ 'Return type' => 'დაბრუნების სახეობა',
117
+ 'Add trigger' => 'ტრიგერის დამატება',
118
+ 'Trigger has been dropped.' => 'ტრიგერი წაიშალა.',
119
+ 'Trigger has been altered.' => 'ტრიგერი შეიცვალა.',
120
+ 'Trigger has been created.' => 'ტრიგერი შეიქმნა.',
121
+ 'Alter trigger' => 'ტრიგერის შეცვლა',
122
+ 'Create trigger' => 'ტრიგერის შექმნა',
123
+ 'Time' => 'დრო',
124
+ 'Event' => 'ღონისძიება',
125
+ '%s version: %s through PHP extension %s' => 'ვერსია %s: %s PHP-გაფართოება %s',
126
+ '%d row(s)' => '%d რიგი',
127
+ 'Remove' => 'წაშლა',
128
+ 'Are you sure?' => 'ნამდვილად?',
129
+ 'Privileges' => 'უფლებამოსილება',
130
+ 'Create user' => 'მომხმარებლის შექმან',
131
+ 'User has been dropped.' => 'მომხმარებელი წაიშალა.',
132
+ 'User has been altered.' => 'მომხმარებელი შეიცვალა.',
133
+ 'User has been created.' => 'მომხმარებელი შეიქმნა.',
134
+ 'Hashed' => 'ჰეშირებული',
135
+ 'Column' => 'ველი',
136
+ 'Routine' => 'პროცედურა',
137
+ 'Grant' => 'დაშვება',
138
+ 'Revoke' => 'შეზღუდვა',
139
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST ინფორმაცია ძალიან დიდია. შეამცირეთ ზომა ან გაზარდეს POST ინფორმაციის ზომა პარამეტრებიდან %s.',
140
+ 'Logged as: %s' => 'შესული ხართ როგორც: %s',
141
+ 'Move up' => 'ზემოთ ატანა',
142
+ 'Move down' => 'ქვემოთ ჩატანა',
143
+ 'Functions' => 'ფუნქციები',
144
+ 'Aggregation' => 'აგრეგაცია',
145
+ 'Export' => 'ექსპორტი',
146
+ 'Output' => 'გამომავალი ინფორმაცია',
147
+ 'open' => 'გახსნა',
148
+ 'save' => 'შენახვა',
149
+ 'Format' => 'ფორმატი',
150
+ 'Tables' => 'ცხრილები',
151
+ 'Data' => 'ინფორმაცია',
152
+ 'Event has been dropped.' => 'ღონისძიება წაიშალა.',
153
+ 'Event has been altered.' => 'ღონისძიება შეიცვალა.',
154
+ 'Event has been created.' => 'ღონისძიება შეიქმნა.',
155
+ 'Alter event' => 'ღონისძიების შეცვლა',
156
+ 'Create event' => 'ღონისძიების შექმნა',
157
+ 'At given time' => 'მოცემულ დროში',
158
+ 'Every' => 'ყოველ',
159
+ 'Events' => 'ღონისძიება',
160
+ 'Schedule' => 'განრიგი',
161
+ 'Start' => 'დასაწყისი',
162
+ 'End' => 'დასასრული',
163
+ 'Status' => 'მდგომარეობა',
164
+ 'On completion preserve' => 'შენახვა დასრულებისას',
165
+ 'Tables and views' => 'ცხრილები და წარმოდგენები',
166
+ 'Data Length' => 'ინფორმაციის მოცულობა',
167
+ 'Index Length' => 'ინდექსების მოცულობა',
168
+ 'Data Free' => 'თავისუფალი სივრცე',
169
+ 'Collation' => 'კოდირება',
170
+ 'Analyze' => 'ანალიზი',
171
+ 'Optimize' => 'ოპტიმიზაცია',
172
+ 'Check' => 'შემოწმება',
173
+ 'Repair' => 'გასწორება',
174
+ 'Truncate' => 'გასუფთავება',
175
+ 'Tables have been truncated.' => 'ცხრილი გასუფთავდა.',
176
+ 'Rows' => 'რიგი',
177
+ ',' => ' ',
178
+ '0123456789' => '0123456789',
179
+ 'Tables have been moved.' => 'ცხრილი გადაადგილდა.',
180
+ 'Move to other database' => 'გადატანა სხვა ბაზაში',
181
+ 'Move' => 'გადატანა',
182
+ 'Engine' => 'ძრავი',
183
+ 'Save and continue edit' => 'შენახვა და ცვლილების გაგრძელება',
184
+ 'original' => 'საწყისი',
185
+ '%d item(s) have been affected.' => 'შეიცვალა %d ჩანაწერი.',
186
+ 'Whole result' => 'სრული შედეგი',
187
+ 'Tables have been dropped.' => 'ცხრილები წაიშალა.',
188
+ 'Clone' => 'კლონირება',
189
+ 'Partition by' => 'დაყოფა',
190
+ 'Partitions' => 'დანაყოფები',
191
+ 'Partition name' => 'დანაყოფის სახელი',
192
+ 'Values' => 'პარამეტრები',
193
+ '%d row(s) have been imported.' => 'დაიმპორტდა %d რიგი.',
194
+ 'Import' => 'იმპორტი',
195
+ 'Stop on error' => 'გაჩერება შეცდომისას',
196
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'მიღწეულია დაშვებული ველების მაქსიმალური რაოდენობა, გაზარდეთ %s.',
197
+ 'anywhere' => 'ნებისმიერ ადგილას',
198
+ '%.3f s' => '%.3f s',
199
+ '$1-$3-$5' => '$5.$3.$1',
200
+ '[yyyy]-mm-dd' => 'დდ.თთ.[წწწწ]',
201
+ 'History' => 'ისტორია',
202
+ 'Variables' => 'ცვლადები',
203
+ 'Relations' => 'ურთიერთობა',
204
+ 'Run file' => 'ფაილის გაშვება',
205
+ 'Clear' => 'გასუფთავება',
206
+ 'Maximum allowed file size is %sB.' => 'ფაილის მაქსიმალური ზომა - %sB.',
207
+ 'Numbers' => 'ციფრები',
208
+ 'Date and time' => 'დრო და თარიღი',
209
+ 'Binary' => 'ორობითი',
210
+ 'Lists' => 'სია',
211
+ 'Editor' => 'რედაქტორი',
212
+ 'E-mail' => 'ელ. ფოსტა',
213
+ 'From' => 'ავტორი:',
214
+ 'Subject' => 'თემა',
215
+ 'Send' => 'გაგზავნა',
216
+ '%d e-mail(s) have been sent.' => 'გაიგზავნა %d წერილი.',
217
+ 'Webserver file %s' => 'ფაილი %s ვებსერვერზე',
218
+ 'File does not exist.' => 'ასეთი ფაილი არ არსებობს.',
219
+ '%d in total' => 'სულ %d',
220
+ 'Permanent login' => 'სისტემაში დარჩენა',
221
+ 'Databases have been dropped.' => 'ბაზა წაიშალა.',
222
+ 'Search data in tables' => 'ცხრილებში ძებნა',
223
+ 'Schema' => 'სქემა',
224
+ 'Alter schema' => 'სქემის შეცვლა',
225
+ 'Create schema' => 'ახალი სქემა',
226
+ 'Schema has been dropped.' => 'სქემა წაიშალა.',
227
+ 'Schema has been created.' => 'შეიქმნა ახალი სქემა.',
228
+ 'Schema has been altered.' => 'სქემა შეიცვალა.',
229
+ 'Sequences' => 'მიმდევრობა',
230
+ 'Create sequence' => 'მიმდევრობის შექმნა',
231
+ 'Alter sequence' => 'მიმდევრობის შეცვლა',
232
+ 'Sequence has been dropped.' => 'მიმდევრობა წაიშალა.',
233
+ 'Sequence has been created.' => 'მიმდევრობა შეიქმნა.',
234
+ 'Sequence has been altered.' => 'მიმდევრობა შეიცვალა.',
235
+ 'User types' => 'მომხმარებლის სახეობა',
236
+ 'Create type' => 'სახეობის შექმნა',
237
+ 'Alter type' => 'სახეობის შეცვლა',
238
+ 'Type has been dropped.' => 'სახეობა წაიშალა.',
239
+ 'Type has been created.' => 'სახეობა შეიქმნა.',
240
+ 'Ctrl+click on a value to modify it.' => 'შესაცვლელად გამოიყენეთ Ctrl+თაგვის ღილაკი.',
241
+ 'Use edit link to modify this value.' => 'ამ მნიშვნელობის შესაცვლელად გამოიყენეთ ბმული «შეცვლა».',
242
+ 'last' => 'ბოლო',
243
+ 'From server' => 'სერვერიდან',
244
+ 'System' => 'სისტემა',
245
+ 'Select data' => 'არჩევა',
246
+ 'Show structure' => 'სტრუქტურის ჩვენება',
247
+ 'empty' => 'ცარიელი',
248
+ 'Network' => 'ქსელი',
249
+ 'Geometry' => 'გეომეტრია',
250
+ 'File exists.' => 'ფაილი უკვე არსებობს.',
251
+ 'Attachments' => 'მიმაგრებული ფაილები',
252
+ '%d query(s) executed OK.' => '%d მოთხოვნა შესრულდა.',
253
+ 'Show only errors' => 'მხოლოდ შეცდომები',
254
+ 'Refresh' => 'განახლება',
255
+ 'Invalid schema.' => 'არასწორი სქემა.',
256
+ 'Please use one of the extensions %s.' => 'გამოიყენეთ ერთ-ერთი გაფართოება %s.',
257
+ 'now' => 'ახლა',
258
+ 'ltr' => 'ltr',
259
+ 'Tables have been copied.' => 'ცხრილი დაკოპირდა.',
260
+ 'Copy' => 'კოპირება',
261
+ 'Permanent link' => 'მუდმივი ბმული',
262
+ 'Edit all' => 'ყველას შეცვლა',
263
+ 'HH:MM:SS' => 'სთ:წთ:წმ',
264
+ 'Tables have been optimized.' => 'ცხრილებს გაუკეთდა ოპტიმიზაცია.',
265
+ 'Materialized view' => 'მატერიალური ხედი',
266
+ 'Vacuum' => 'ვაკუუმი',
267
+ 'Selected' => 'არჩეული',
268
+ 'File must be in UTF-8 encoding.' => 'ფაილი უნდა იყოს კოდირებაში UTF-8.',
269
+ 'Modify' => 'შეცვლა',
270
+ 'Loading' => 'ჩატვირთვა',
271
+ 'Load more data' => 'მეტი ინფორმაციის ჩატვირთვა',
272
+ 'ATTACH queries are not supported.' => 'ATTACH-მოთხოვნები არაა მხარდაჭერილი.',
273
+ '%d / ' => '%d / ',
274
+ 'Limit rows' => 'რიგების შეზღუდვა',
275
+ 'Default value' => 'სტანდარტული მნიშვნელობა',
276
+ 'Full table scan' => 'სრული ცხრილის ანალიზი',
277
+ 'Too many unsuccessful logins, try again in %d minute(s).' => 'ძალიან ბევრჯერ შეგეშალათ მომხმარებელი და პაროლი. სცადეთ %d წუთში.',
278
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'ძირითად პაროლს ვადა გაუვიდა. <a href="https://www.adminer.org/en/extension/"%s>გამოიყენეთ</a> მეთოდი %s, რათა ის მუდმივი გახადოთ.',
279
+ 'If you did not send this request from Adminer then close this page.' => 'ეს მოთხოვნა თქვენ თუ არ გაგიგზავნაით Adminer-იდან, დახურეთ ეს ფანჯარა..',
280
+ 'You can upload a big SQL file via FTP and import it from server.' => 'დიდი ფაილი უნდა ატვირტოთ FTP-თი და შემდეგ გაუკეთოთ იმპორტი სერვერიდან.',
281
+ 'Size' => 'ზომა',
282
+ 'Compute' => 'გამოთვლა',
283
+ 'You are offline.' => 'არ გაგივლიათ ავტორიზაცია.',
284
+ 'You have no privileges to update this table.' => 'ამ ცხრილის განახლების უფლება არ გაქვთ.',
285
+ 'Saving' => 'შენახვა',
286
+ 'yes' => 'კი',
287
+ 'no' => 'არა',
288
+ 'Routines' => 'რუტინები',
289
+ 'Target table' => 'მიზნობრივი ცხრილი',
290
+ 'Strings' => 'ველები',
291
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'საწყისი და მიზნობრივი ველები უნდა იყოს ერთიდაიგივე სახეობის, მიზნობრივ ველზე უნდა იყოს ინდექსი და უნდა არსებობდეს შესაბამისი ინფორმაცია.',
292
+ 'Drop %s?' => 'წაიშალოს %s?',
293
+ 'Warnings' => 'გაფრთხილება',
294
+ 'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'უპაროლო წვდომა ბაზასთან არაა დაშვებული Adminer-ში, მეტი ინფორმაციისთვის ეწვიეთ <a href="https://www.adminer.org/en/password/"%s>ბმულს</a>.',
295
+ 'DB' => 'ბაზა',
296
+ 'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'მადლობას გიხდით Adminer-ით სარგებლობისთვის, გადახედეთ ბმულს <a href="https://www.adminer.org/en/donation/">შემოწირულობა</a>.',
297
+ 'The action will be performed after successful login with the same credentials.' => 'მოქმედება შესრულდება იგივე მომხმარებლით წარმატებული ავტორიზაციის შემდეგ.',
298
+ 'Connecting to privileged ports is not allowed.' => 'პრივილეგირებულ პორტთან წვდომა დაუშვებელია.',
299
+ 'There is a space in the input password which might be the cause.' => 'პაროლში არის გამოტოვება, შეიძლება ეს ქმნის პრობლემას.',
300
+ 'Unknown error.' => 'უცნობი შეცდომა.',
301
+ 'Database does not support password.' => 'ბაზაში არაა მხარდაჭერილი პაროლი.',
302
+ 'Disable %s or enable %s or %s extensions.' => 'გათიშეთ %s ან ჩართეთ %s ან %s გაფართოება.',
303
+ );
adminer/adminer/adminer/lang/ms.inc.php CHANGED
@@ -10,7 +10,7 @@ $translations = array(
10
  'Logout' => 'Log keluar',
11
  'Logged as: %s' => 'Log masuk sebagai: %s',
12
  'Logout successful.' => 'Log keluar berjaya.',
13
- 'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Terima kasih kerana menggunakan Adminer, pertimbangkan untuk <a href="%s">menderma</a>.',
14
  'Invalid credentials.' => 'Akses tidak sah.',
15
  'Too many unsuccessful logins, try again in %d minute(s).' => 'Terlalu banyak percubaan log masuk yang gagal, sila cuba lagi dalam masa %d minit.',
16
  'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Kata laluan utama telah luput. <a href="https://www.adminer.org/en/extension/"%s>Gunakan</a> cara %s untuk mengekalkannya.',
10
  'Logout' => 'Log keluar',
11
  'Logged as: %s' => 'Log masuk sebagai: %s',
12
  'Logout successful.' => 'Log keluar berjaya.',
13
+ 'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Terima kasih kerana menggunakan Adminer, pertimbangkan untuk <a href="https://www.adminer.org/en/donation/">menderma</a>.',
14
  'Invalid credentials.' => 'Akses tidak sah.',
15
  'Too many unsuccessful logins, try again in %d minute(s).' => 'Terlalu banyak percubaan log masuk yang gagal, sila cuba lagi dalam masa %d minit.',
16
  'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Kata laluan utama telah luput. <a href="https://www.adminer.org/en/extension/"%s>Gunakan</a> cara %s untuk mengekalkannya.',
adminer/adminer/adminer/lang/pl.inc.php CHANGED
@@ -10,7 +10,7 @@ $translations = array(
10
  'Logout' => 'Wyloguj',
11
  'Logged as: %s' => 'Zalogowany jako: %s',
12
  'Logout successful.' => 'Wylogowano pomyślnie.',
13
- 'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Dziękujemy za używanie Adminera, rozważ proszę <a href="%s">dotację</a>.',
14
  'Invalid credentials.' => 'Nieprawidłowe dane logowania.',
15
  'Too many unsuccessful logins, try again in %d minute(s).' => array('Za dużo nieudanych prób logowania, spróbuj ponownie za %d minutę.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minuty.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minut.'),
16
  'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ważność hasła głównego wygasła. <a href="https://www.adminer.org/pl/extension/"%s>Zaimplementuj</a> własną metodę %s, aby ustawić je na stałe.',
10
  'Logout' => 'Wyloguj',
11
  'Logged as: %s' => 'Zalogowany jako: %s',
12
  'Logout successful.' => 'Wylogowano pomyślnie.',
13
+ 'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Dziękujemy za używanie Adminera, rozważ proszę <a href="https://www.adminer.org/pl/donation/">dotację</a>.',
14
  'Invalid credentials.' => 'Nieprawidłowe dane logowania.',
15
  'Too many unsuccessful logins, try again in %d minute(s).' => array('Za dużo nieudanych prób logowania, spróbuj ponownie za %d minutę.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minuty.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minut.'),
16
  'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ważność hasła głównego wygasła. <a href="https://www.adminer.org/pl/extension/"%s>Zaimplementuj</a> własną metodę %s, aby ustawić je na stałe.',
adminer/adminer/adminer/lang/tr.inc.php CHANGED
@@ -10,7 +10,7 @@ $translations = array(
10
  'Logout' => 'Çıkış',
11
  'Logged as: %s' => '%s olarak giriş yapıldı.',
12
  'Logout successful.' => 'Oturum başarıyla sonlandı.',
13
- 'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Adminer kullandığınız için teşekkür ederiz <a href="%s">bağış yapmayı düşünün</a>.',
14
  'Invalid credentials.' => 'Geçersiz kimlik bilgileri.',
15
  'Too many unsuccessful logins, try again in %d minute(s).' => array('Çok fazla oturum açma denemesi yapıldı.', '%d Dakika sonra tekrar deneyiniz.'),
16
  'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ana şifrenin süresi doldu. Kalıcı olması için <a href="https://www.adminer.org/en/extension/"%s>%s medodunu</a> kullanın.',
10
  'Logout' => 'Çıkış',
11
  'Logged as: %s' => '%s olarak giriş yapıldı.',
12
  'Logout successful.' => 'Oturum başarıyla sonlandı.',
13
+ 'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Adminer kullandığınız için teşekkür ederiz <a href="https://www.adminer.org/en/donation/">bağış yapmayı düşünün</a>.',
14
  'Invalid credentials.' => 'Geçersiz kimlik bilgileri.',
15
  'Too many unsuccessful logins, try again in %d minute(s).' => array('Çok fazla oturum açma denemesi yapıldı.', '%d Dakika sonra tekrar deneyiniz.'),
16
  'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ana şifrenin süresi doldu. Kalıcı olması için <a href="https://www.adminer.org/en/extension/"%s>%s medodunu</a> kullanın.',
adminer/adminer/adminer/lang/vi.inc.php CHANGED
@@ -206,8 +206,8 @@ $translations = array(
206
  'ON UPDATE' => 'Khi cập nhật',
207
  'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Cột gốc và cột đích phải cùng kiểu, phải đặt chỉ mục trong cột đích và dữ liệu tham chiếu phải tồn tại.',
208
 
209
- 'Triggers' => 'xx',
210
- 'Add trigger' => 'xx',
211
  'Trigger has been dropped.' => 'Đã xoá phản xạ.',
212
  'Trigger has been altered.' => 'Đã sửa phản xạ.',
213
  'Trigger has been created.' => 'Đã tạo phản xạ.',
@@ -308,12 +308,12 @@ $translations = array(
308
  'Schema has been dropped.' => 'Đã xoá schema.',
309
  'Schema has been created.' => 'Đã tạo schema.',
310
  'Schema has been altered.' => 'Đã thay đổi schema.',
311
- 'Schema' => 'schema',
312
- 'Invalid schema.' => 'Schema khong hợp lệ.',
313
 
314
  // PostgreSQL sequences support
315
  'Sequences' => 'Dãy số',
316
- 'Create sequence' => 'Tạo đãy số',
317
  'Sequence has been dropped.' => 'Dãy số đã bị xoá.',
318
  'Sequence has been created.' => 'Đã tạo dãy số.',
319
  'Sequence has been altered.' => 'Đã sửa dãy số.',
206
  'ON UPDATE' => 'Khi cập nhật',
207
  'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Cột gốc và cột đích phải cùng kiểu, phải đặt chỉ mục trong cột đích và dữ liệu tham chiếu phải tồn tại.',
208
 
209
+ 'Triggers' => 'Phản xạ',
210
+ 'Add trigger' => 'Thêm phản xạ',
211
  'Trigger has been dropped.' => 'Đã xoá phản xạ.',
212
  'Trigger has been altered.' => 'Đã sửa phản xạ.',
213
  'Trigger has been created.' => 'Đã tạo phản xạ.',
308
  'Schema has been dropped.' => 'Đã xoá schema.',
309
  'Schema has been created.' => 'Đã tạo schema.',
310
  'Schema has been altered.' => 'Đã thay đổi schema.',
311
+ 'Schema' => 'Schema',
312
+ 'Invalid schema.' => 'Schema không hợp lệ.',
313
 
314
  // PostgreSQL sequences support
315
  'Sequences' => 'Dãy số',
316
+ 'Create sequence' => 'Tạo dãy số',
317
  'Sequence has been dropped.' => 'Dãy số đã bị xoá.',
318
  'Sequence has been created.' => 'Đã tạo dãy số.',
319
  'Sequence has been altered.' => 'Đã sửa dãy số.',
adminer/adminer/adminer/lang/xx.inc.php CHANGED
@@ -10,8 +10,9 @@ $translations = array(
10
  'Logout' => 'Xx',
11
  'Logged as: %s' => 'Xx: %s',
12
  'Logout successful.' => 'Xx.',
13
- 'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Xx <a href="%s">xx</a>.',
14
  'Invalid credentials.' => 'Xx.',
 
15
  'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Xx, <a href="https://www.adminer.org/en/password/"%s>xx</a>.',
16
  'Database does not support password.' => 'Xx.',
17
  'Too many unsuccessful logins, try again in %d minute(s).' => array('Xx %d.', 'Xx %d.'),
10
  'Logout' => 'Xx',
11
  'Logged as: %s' => 'Xx: %s',
12
  'Logout successful.' => 'Xx.',
13
+ 'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Xx <a href="https://www.adminer.org/en/donation/">xx</a>.',
14
  'Invalid credentials.' => 'Xx.',
15
+ 'There is a space in the input password which might be the cause.' => 'Xx.',
16
  'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Xx, <a href="https://www.adminer.org/en/password/"%s>xx</a>.',
17
  'Database does not support password.' => 'Xx.',
18
  'Too many unsuccessful logins, try again in %d minute(s).' => array('Xx %d.', 'Xx %d.'),
adminer/adminer/adminer/lang/zh-tw.inc.php CHANGED
@@ -1,267 +1,348 @@
1
  <?php
2
  $translations = array(
3
- 'Login' => '登入',
4
- 'Logout successful.' => '成功登出。',
5
- 'Invalid credentials.' => '無效的憑證。',
6
  'Server' => '伺服器',
7
  'Username' => '帳號',
8
  'Password' => '密碼',
9
- 'Select database' => '選擇資料庫',
10
- 'Invalid database.' => '無效的資料庫。',
11
- 'Table has been altered.' => '資料表已修改。',
12
- 'Table has been created.' => '資料表已修改。',
13
- 'Alter table' => '修改資料表',
14
- 'Create table' => '建立資料表',
15
- 'Table name' => '資料表名稱',
16
- 'engine' => '引擎',
17
- 'collation' => '校對',
18
- 'Column name' => '列名',
19
- 'Type' => '類型',
20
- 'Length' => '長度',
21
- 'Auto Increment' => '自動遞增',
22
- 'Options' => '選項',
23
- 'Save' => '儲存',
24
- 'Drop' => '刪除',
25
- 'Database has been dropped.' => '資料庫已刪除。',
26
- 'Database has been created.' => '已建立資料庫。',
27
- 'Database has been renamed.' => '已重新命名資料庫。',
28
- 'Database has been altered.' => '已修改資料庫。',
29
- 'Alter database' => '修改資料庫',
30
- 'Create database' => '建立資料庫',
31
- 'SQL command' => 'SQL命令',
32
  'Logout' => '登出',
33
- 'database' => '資料庫',
34
- 'Use' => '使用',
35
- 'No tables.' => '沒有資料表。',
36
- 'select' => '選擇',
37
- 'Item has been updated.' => '已更新項目。',
38
- 'Item%s has been inserted.' => '已新增項目%s',
39
- 'Edit' => '編輯',
40
- 'Insert' => '新增',
41
- 'Save and insert next' => '儲存並新增下一筆',
42
- 'Delete' => '刪除',
43
- 'Database' => '資料庫',
44
- 'Routines' => '程序',
45
- 'Indexes have been altered.' => '已修改索引。',
46
- 'Indexes' => '索引',
47
- 'Alter indexes' => '修改索引',
48
- 'Add next' => '新增下一筆',
49
  'Language' => '語言',
50
- 'Select' => '選擇',
51
- 'New item' => '新增項目',
52
- 'Search' => '搜尋',
53
- 'Sort' => '排序',
54
- 'descending' => '降冪(遞減)',
55
- 'Limit' => '限定',
56
- 'No rows.' => '沒有行。',
57
- 'Action' => '動作',
58
- 'edit' => '編輯',
59
- 'Page' => '頁',
60
- 'Query executed OK, %d row(s) affected.' => '執行查詢OK,%d行受影響',
61
- 'Error in query' => '查詢發生錯誤',
62
- 'Execute' => '執行',
63
- 'Table' => '資料表',
64
- 'Foreign keys' => '外來鍵',
65
- 'Triggers' => '觸發器',
66
- 'View' => '檢視表',
67
- 'Unable to select the table' => '無法選擇該資料表',
68
  'Invalid CSRF token. Send the form again.' => '無效的 CSRF token。請重新發送表單。',
69
- 'Comment' => '註解',
70
- 'Default values' => '預設值',
71
- '%d byte(s)' => '%d byte(s)',
72
- 'No commands to execute.' => '沒有命令可執行。',
73
- 'Unable to upload a file.' => '無法上傳檔案。',
74
- 'File upload' => '檔案上傳',
75
- 'File uploads are disabled.' => '檔案上傳已經被停用。',
76
- 'Routine has been called, %d row(s) affected.' => '程序已被執行,%d行被影響',
77
- 'Call' => '呼叫',
78
  'No extension' => '無擴充模組',
79
- 'None of the supported PHP extensions (%s) are available.' => '沒有任何支援的PHP擴充模組(%s)。',
 
 
80
  'Session support must be enabled.' => 'Session 必須被啟用。',
81
  'Session expired, please login again.' => 'Session 已過期,請重新登入。',
82
- 'Text length' => 'Text 長度',
83
- 'Foreign key has been dropped.' => '已刪除外來鍵。',
84
- 'Foreign key has been altered.' => '已修改外來鍵。',
85
- 'Foreign key has been created.' => '已建立外來鍵。',
86
- 'Foreign key' => '外來鍵',
87
- 'Target table' => '目標資料表',
88
- 'Change' => '修改',
89
- 'Source' => '來源',
90
- 'Target' => '目標',
91
- 'Add column' => '新增資料列',
92
- 'Alter' => '修改',
93
- 'Add foreign key' => '新增外來鍵',
94
- 'ON DELETE' => 'ON DELETE',
95
- 'ON UPDATE' => 'ON UPDATE',
96
- 'Index Type' => '索引類型',
97
- 'Column (length)' => '列(長度)',
98
- 'View has been dropped.' => '已刪除檢視表。',
99
- 'View has been altered.' => '已修改檢視表。',
100
- 'View has been created.' => '已建立檢視表。',
101
- 'Alter view' => '修改檢視表',
102
- 'Create view' => '建立檢視表',
103
- 'Name' => '名稱',
104
- 'Process list' => '處理程序列表',
105
- '%d process(es) have been killed.' => '%d 個 Process(es) 被終止',
106
- 'Kill' => '終止',
107
- 'Parameter name' => '參數名稱',
108
- 'Database schema' => '資料庫架構',
109
- 'Create procedure' => '建立預存程序',
110
- 'Create function' => '建立函數',
111
- 'Routine has been dropped.' => '已刪除程序。',
112
- 'Routine has been altered.' => '已修改子程序。',
113
- 'Routine has been created.' => '已建立子程序。',
114
- 'Alter function' => '修改函數',
115
- 'Alter procedure' => '修改過程',
116
- 'Return type' => '回傳類型',
117
- 'Add trigger' => '建立觸發器',
118
- 'Trigger has been dropped.' => '已刪除觸發器。',
119
- 'Trigger has been altered.' => '已修改觸發器。',
120
- 'Trigger has been created.' => '已建立觸發器。',
121
- 'Alter trigger' => '修改觸發器',
122
- 'Create trigger' => '建立觸發器',
123
- 'Time' => '時間',
124
- 'Event' => '事件',
125
- '%s version: %s through PHP extension %s' => '%s版本:%s 透過PHP擴充模組 %s',
126
- '%d row(s)' => '%d行',
127
- 'Remove' => '移除',
128
- 'Are you sure?' => '你確定嗎?',
129
  'Privileges' => '權限',
130
  'Create user' => '建立使用者',
131
  'User has been dropped.' => '已刪除使用者。',
132
  'User has been altered.' => '已修改使用者。',
133
  'User has been created.' => '已建立使用者。',
134
  'Hashed' => 'Hashed',
135
- 'Column' => '',
136 <