ARI Adminer – WordPress Database Manager - Version 1.0.1

Version Description

  • Added PostgreSQL support
Download this release

Release Info

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

Version 1.0.1

Files changed (111) hide show
  1. adminer/adminer/.htaccess +4 -0
  2. adminer/adminer/adminer/call.inc.php +85 -0
  3. adminer/adminer/adminer/create.inc.php +226 -0
  4. adminer/adminer/adminer/database.inc.php +79 -0
  5. adminer/adminer/adminer/db.inc.php +228 -0
  6. adminer/adminer/adminer/download.inc.php +10 -0
  7. adminer/adminer/adminer/drivers/elastic.inc.php +374 -0
  8. adminer/adminer/adminer/drivers/firebird.inc.php +320 -0
  9. adminer/adminer/adminer/drivers/mongo.inc.php +357 -0
  10. adminer/adminer/adminer/drivers/mssql.inc.php +641 -0
  11. adminer/adminer/adminer/drivers/mysql.inc.php +1057 -0
  12. adminer/adminer/adminer/drivers/oracle.inc.php +430 -0
  13. adminer/adminer/adminer/drivers/pgsql.inc.php +674 -0
  14. adminer/adminer/adminer/drivers/simpledb.inc.php +473 -0
  15. adminer/adminer/adminer/drivers/sqlite.inc.php +784 -0
  16. adminer/adminer/adminer/dump.inc.php +220 -0
  17. adminer/adminer/adminer/edit.inc.php +113 -0
  18. adminer/adminer/adminer/event.inc.php +52 -0
  19. adminer/adminer/adminer/file.inc.php +32 -0
  20. adminer/adminer/adminer/foreign.inc.php +89 -0
  21. adminer/adminer/adminer/include/adminer.inc.php +907 -0
  22. adminer/adminer/adminer/include/auth.inc.php +204 -0
  23. adminer/adminer/adminer/include/bootstrap.inc.php +95 -0
  24. adminer/adminer/adminer/include/connect.inc.php +98 -0
  25. adminer/adminer/adminer/include/coverage.inc.php +18 -0
  26. adminer/adminer/adminer/include/design.inc.php +137 -0
  27. adminer/adminer/adminer/include/driver.inc.php +110 -0
  28. adminer/adminer/adminer/include/editing.inc.php +539 -0
  29. adminer/adminer/adminer/include/functions.inc.php +1393 -0
  30. adminer/adminer/adminer/include/lang.inc.php +123 -0
  31. adminer/adminer/adminer/include/pdo.inc.php +96 -0
  32. adminer/adminer/adminer/include/tmpfile.inc.php +22 -0
  33. adminer/adminer/adminer/include/version.inc.php +2 -0
  34. adminer/adminer/adminer/include/xxtea.inc.php +107 -0
  35. adminer/adminer/adminer/index.php +79 -0
  36. adminer/adminer/adminer/indexes.inc.php +140 -0
  37. adminer/adminer/adminer/lang/ar.inc.php +268 -0
  38. adminer/adminer/adminer/lang/bg.inc.php +338 -0
  39. adminer/adminer/adminer/lang/bn.inc.php +268 -0
  40. adminer/adminer/adminer/lang/bs.inc.php +322 -0
  41. adminer/adminer/adminer/lang/ca.inc.php +269 -0
  42. adminer/adminer/adminer/lang/cs.inc.php +340 -0
  43. adminer/adminer/adminer/lang/da.inc.php +283 -0
  44. adminer/adminer/adminer/lang/de.inc.php +289 -0
  45. adminer/adminer/adminer/lang/el.inc.php +338 -0
  46. adminer/adminer/adminer/lang/en.inc.php +15 -0
  47. adminer/adminer/adminer/lang/es.inc.php +269 -0
  48. adminer/adminer/adminer/lang/et.inc.php +269 -0
  49. adminer/adminer/adminer/lang/fa.inc.php +336 -0
  50. adminer/adminer/adminer/lang/fi.inc.php +338 -0
  51. adminer/adminer/adminer/lang/fr.inc.php +293 -0
  52. adminer/adminer/adminer/lang/gl.inc.php +293 -0
  53. adminer/adminer/adminer/lang/hu.inc.php +268 -0
  54. adminer/adminer/adminer/lang/id.inc.php +317 -0
  55. adminer/adminer/adminer/lang/it.inc.php +269 -0
  56. adminer/adminer/adminer/lang/ja.inc.php +268 -0
  57. adminer/adminer/adminer/lang/ko.inc.php +268 -0
  58. adminer/adminer/adminer/lang/lt.inc.php +313 -0
  59. adminer/adminer/adminer/lang/nl.inc.php +269 -0
  60. adminer/adminer/adminer/lang/no.inc.php +283 -0
  61. adminer/adminer/adminer/lang/pl.inc.php +336 -0
  62. adminer/adminer/adminer/lang/pt-br.inc.php +264 -0
  63. adminer/adminer/adminer/lang/pt.inc.php +264 -0
  64. adminer/adminer/adminer/lang/ro.inc.php +269 -0
  65. adminer/adminer/adminer/lang/ru.inc.php +269 -0
  66. adminer/adminer/adminer/lang/sk.inc.php +269 -0
  67. adminer/adminer/adminer/lang/sl.inc.php +308 -0
  68. adminer/adminer/adminer/lang/sr.inc.php +320 -0
  69. adminer/adminer/adminer/lang/ta.inc.php +268 -0
  70. adminer/adminer/adminer/lang/th.inc.php +269 -0
  71. adminer/adminer/adminer/lang/tr.inc.php +320 -0
  72. adminer/adminer/adminer/lang/uk.inc.php +317 -0
  73. adminer/adminer/adminer/lang/vi.inc.php +329 -0
  74. adminer/adminer/adminer/lang/xx.inc.php +340 -0
  75. adminer/adminer/adminer/lang/zh-tw.inc.php +268 -0
  76. adminer/adminer/adminer/lang/zh.inc.php +268 -0
  77. adminer/adminer/adminer/plugin.php +43 -0
  78. adminer/adminer/adminer/privileges.inc.php +29 -0
  79. adminer/adminer/adminer/procedure.inc.php +54 -0
  80. adminer/adminer/adminer/processlist.inc.php +56 -0
  81. adminer/adminer/adminer/schema.inc.php +110 -0
  82. adminer/adminer/adminer/scheme.inc.php +38 -0
  83. adminer/adminer/adminer/script.inc.php +45 -0
  84. adminer/adminer/adminer/select.inc.php +540 -0
  85. adminer/adminer/adminer/sequence.inc.php +35 -0
  86. adminer/adminer/adminer/sql.inc.php +250 -0
  87. adminer/adminer/adminer/static/arrow.gif +0 -0
  88. adminer/adminer/adminer/static/cross.gif +0 -0
  89. adminer/adminer/adminer/static/default.css +99 -0
  90. adminer/adminer/adminer/static/down.gif +0 -0
  91. adminer/adminer/adminer/static/editing.js +616 -0
  92. adminer/adminer/adminer/static/favicon.ico +0 -0
  93. adminer/adminer/adminer/static/functions.js +795 -0
  94. adminer/adminer/adminer/static/plus.gif +0 -0
  95. adminer/adminer/adminer/static/up.gif +0 -0
  96. adminer/adminer/adminer/table.inc.php +89 -0
  97. adminer/adminer/adminer/trigger.inc.php +49 -0
  98. adminer/adminer/adminer/type.inc.php +33 -0
  99. adminer/adminer/adminer/user.inc.php +185 -0
  100. adminer/adminer/adminer/variables.inc.php +16 -0
  101. adminer/adminer/adminer/view.inc.php +59 -0
  102. adminer/adminer/editor/db.inc.php +26 -0
  103. adminer/adminer/editor/include/adminer.inc.php +625 -0
  104. adminer/adminer/editor/include/connect.inc.php +2 -0
  105. adminer/adminer/editor/include/editing.inc.php +53 -0
  106. adminer/adminer/editor/index.php +30 -0
  107. adminer/adminer/editor/script.inc.php +16 -0
  108. adminer/adminer/editor/static/editing.js +40 -0
  109. adminer/adminer/externals/JsShrink/jsShrink.php +49 -0
  110. adminer/adminer/externals/jush/jush.css +33 -0
  111. adminer/adminer/externals/jush/modules/jush-cnf.js +19 -0
adminer/adminer/.htaccess ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <FilesMatch ".*\.php$">
2
+ Order Allow,Deny
3
+ Deny from all
4
+ </FilesMatch>
adminer/adminer/adminer/call.inc.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $PROCEDURE = $_GET["call"];
3
+ page_header(lang('Call') . ": " . h($PROCEDURE), $error);
4
+
5
+ $routine = routine($PROCEDURE, (isset($_GET["callf"]) ? "FUNCTION" : "PROCEDURE"));
6
+ $in = array();
7
+ $out = array();
8
+ foreach ($routine["fields"] as $i => $field) {
9
+ if (substr($field["inout"], -3) == "OUT") {
10
+ $out[$i] = "@" . idf_escape($field["field"]) . " AS " . idf_escape($field["field"]);
11
+ }
12
+ if (!$field["inout"] || substr($field["inout"], 0, 2) == "IN") {
13
+ $in[] = $i;
14
+ }
15
+ }
16
+
17
+ if (!$error && $_POST) {
18
+ $call = array();
19
+ foreach ($routine["fields"] as $key => $field) {
20
+ if (in_array($key, $in)) {
21
+ $val = process_input($field);
22
+ if ($val === false) {
23
+ $val = "''";
24
+ }
25
+ if (isset($out[$key])) {
26
+ $connection->query("SET @" . idf_escape($field["field"]) . " = $val");
27
+ }
28
+ }
29
+ $call[] = (isset($out[$key]) ? "@" . idf_escape($field["field"]) : $val);
30
+ }
31
+
32
+ $query = (isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . idf_escape($PROCEDURE) . "(" . implode(", ", $call) . ")";
33
+ echo "<p><code class='jush-$jush'>" . h($query) . "</code> <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a>\n";
34
+
35
+ if (!$connection->multi_query($query)) {
36
+ echo "<p class='error'>" . error() . "\n";
37
+ } else {
38
+ $connection2 = connect();
39
+ if (is_object($connection2)) {
40
+ $connection2->select_db(DB);
41
+ }
42
+
43
+ do {
44
+ $result = $connection->store_result();
45
+ if (is_object($result)) {
46
+ select($result, $connection2);
47
+ } else {
48
+ echo "<p class='message'>" . lang('Routine has been called, %d row(s) affected.', $connection->affected_rows) . "\n";
49
+ }
50
+ } while ($connection->next_result());
51
+
52
+ if ($out) {
53
+ select($connection->query("SELECT " . implode(", ", $out)));
54
+ }
55
+ }
56
+ }
57
+ ?>
58
+
59
+ <form action="" method="post">
60
+ <?php
61
+ if ($in) {
62
+ echo "<table cellspacing='0'>\n";
63
+ foreach ($in as $key) {
64
+ $field = $routine["fields"][$key];
65
+ $name = $field["field"];
66
+ echo "<tr><th>" . $adminer->fieldName($field);
67
+ $value = $_POST["fields"][$name];
68
+ if ($value != "") {
69
+ if ($field["type"] == "enum") {
70
+ $value = +$value;
71
+ }
72
+ if ($field["type"] == "set") {
73
+ $value = array_sum($value);
74
+ }
75
+ }
76
+ input($field, $value, (string) $_POST["function"][$name]); // param name can be empty
77
+ echo "\n";
78
+ }
79
+ echo "</table>\n";
80
+ }
81
+ ?>
82
+ <p>
83
+ <input type="submit" value="<?php echo lang('Call'); ?>">
84
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
85
+ </form>
adminer/adminer/adminer/create.inc.php ADDED
@@ -0,0 +1,226 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $TABLE = $_GET["create"];
3
+ $partition_by = array();
4
+ foreach (array('HASH', 'LINEAR HASH', 'KEY', 'LINEAR KEY', 'RANGE', 'LIST') as $key) {
5
+ $partition_by[$key] = $key;
6
+ }
7
+
8
+ $referencable_primary = referencable_primary($TABLE);
9
+ $foreign_keys = array();
10
+ foreach ($referencable_primary as $table_name => $field) {
11
+ $foreign_keys[str_replace("`", "``", $table_name) . "`" . str_replace("`", "``", $field["field"])] = $table_name; // not idf_escape() - used in JS
12
+ }
13
+
14
+ $orig_fields = array();
15
+ $table_status = array();
16
+ if ($TABLE != "") {
17
+ $orig_fields = fields($TABLE);
18
+ $table_status = table_status($TABLE);
19
+ if (!$table_status) {
20
+ $error = lang('No tables.');
21
+ }
22
+ }
23
+
24
+ $row = $_POST;
25
+ $row["fields"] = (array) $row["fields"];
26
+ 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)));
33
+ } else {
34
+ $fields = array();
35
+ $all_fields = array();
36
+ $use_all_fields = false;
37
+ $foreign = array();
38
+ ksort($row["fields"]);
39
+ $orig_field = reset($orig_fields);
40
+ $after = " FIRST";
41
+
42
+ foreach ($row["fields"] as $key => $field) {
43
+ $foreign_key = $foreign_keys[$field["type"]];
44
+ $type_field = ($foreign_key !== null ? $referencable_primary[$foreign_key] : $field); //! can collide with user defined type
45
+ if ($field["field"] != "") {
46
+ if (!$field["has_default"]) {
47
+ $field["default"] = null;
48
+ }
49
+ if ($key == $row["auto_increment_col"]) {
50
+ $field["auto_increment"] = true;
51
+ }
52
+ $process_field = process_field($field, $type_field);
53
+ $all_fields[] = array($field["orig"], $process_field, $after);
54
+ if ($process_field != process_field($orig_field, $orig_field)) {
55
+ $fields[] = array($field["orig"], $process_field, $after);
56
+ if ($field["orig"] != "" || $after) {
57
+ $use_all_fields = true;
58
+ }
59
+ }
60
+ if ($foreign_key !== null) {
61
+ $foreign[idf_escape($field["field"])] = ($TABLE != "" && $jush != "sqlite" ? "ADD" : " ") . format_foreign_key(array(
62
+ 'table' => $foreign_keys[$field["type"]],
63
+ 'source' => array($field["field"]),
64
+ 'target' => array($type_field["field"]),
65
+ 'on_delete' => $field["on_delete"],
66
+ ));
67
+ }
68
+ $after = " AFTER " . idf_escape($field["field"]);
69
+ } elseif ($field["orig"] != "") {
70
+ $use_all_fields = true;
71
+ $fields[] = array($field["orig"]);
72
+ }
73
+ if ($field["orig"] != "") {
74
+ $orig_field = next($orig_fields);
75
+ if (!$orig_field) {
76
+ $after = "";
77
+ }
78
+ }
79
+ }
80
+
81
+ $partitioning = "";
82
+ if ($partition_by[$row["partition_by"]]) {
83
+ $partitions = array();
84
+ if ($row["partition_by"] == 'RANGE' || $row["partition_by"] == 'LIST') {
85
+ foreach (array_filter($row["partition_names"]) as $key => $val) {
86
+ $value = $row["partition_values"][$key];
87
+ $partitions[] = "\n PARTITION " . idf_escape($val) . " VALUES " . ($row["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection
88
+ }
89
+ }
90
+ $partitioning .= "\nPARTITION BY $row[partition_by]($row[partition])" . ($partitions // $row["partition"] can be expression, not only column
91
+ ? " (" . implode(",", $partitions) . "\n)"
92
+ : ($row["partitions"] ? " PARTITIONS " . (+$row["partitions"]) : "")
93
+ );
94
+ } elseif (support("partitioning") && preg_match("~partitioned~", $table_status["Create_options"])) {
95
+ $partitioning .= "\nREMOVE PARTITIONING";
96
+ }
97
+
98
+ $message = lang('Table has been altered.');
99
+ if ($TABLE == "") {
100
+ cookie("adminer_engine", $row["Engine"]);
101
+ $message = lang('Table has been created.');
102
+ }
103
+ $name = trim($row["name"]);
104
+
105
+ queries_redirect(ME . (support("table") ? "table=" : "select=") . urlencode($name), $message, alter_table(
106
+ $TABLE,
107
+ $name,
108
+ ($jush == "sqlite" && ($use_all_fields || $foreign) ? $all_fields : $fields),
109
+ $foreign,
110
+ ($row["Comment"] != $table_status["Comment"] ? $row["Comment"] : null),
111
+ ($row["Engine"] && $row["Engine"] != $table_status["Engine"] ? $row["Engine"] : ""),
112
+ ($row["Collation"] && $row["Collation"] != $table_status["Collation"] ? $row["Collation"] : ""),
113
+ ($row["Auto_increment"] != "" ? number($row["Auto_increment"]) : ""),
114
+ $partitioning
115
+ ));
116
+ }
117
+ }
118
+
119
+ page_header(($TABLE != "" ? lang('Alter table') : lang('Create table')), $error, array("table" => $TABLE), h($TABLE));
120
+
121
+ if (!$_POST) {
122
+ $row = array(
123
+ "Engine" => $_COOKIE["adminer_engine"],
124
+ "fields" => array(array("field" => "", "type" => (isset($types["int"]) ? "int" : (isset($types["integer"]) ? "integer" : "")))),
125
+ "partition_names" => array(""),
126
+ );
127
+
128
+ if ($TABLE != "") {
129
+ $row = $table_status;
130
+ $row["name"] = $TABLE;
131
+ $row["fields"] = array();
132
+ if (!$_GET["auto_increment"]) { // don't prefill by original Auto_increment for the sake of performance and not reusing deleted ids
133
+ $row["Auto_increment"] = "";
134
+ }
135
+ foreach ($orig_fields as $field) {
136
+ $field["has_default"] = isset($field["default"]);
137
+ $row["fields"][] = $field;
138
+ }
139
+
140
+ if (support("partitioning")) {
141
+ $from = "FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = " . q(DB) . " AND TABLE_NAME = " . q($TABLE);
142
+ $result = $connection->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $from ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");
143
+ list($row["partition_by"], $row["partitions"], $row["partition"]) = $result->fetch_row();
144
+ $partitions = get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $from AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");
145
+ $partitions[""] = "";
146
+ $row["partition_names"] = array_keys($partitions);
147
+ $row["partition_values"] = array_values($partitions);
148
+ }
149
+ }
150
+ }
151
+
152
+ $collations = collations();
153
+ $engines = engines();
154
+ // case of engine may differ
155
+ foreach ($engines as $engine) {
156
+ if (!strcasecmp($engine, $row["Engine"])) {
157
+ $row["Engine"] = $engine;
158
+ break;
159
+ }
160
+ }
161
+ ?>
162
+
163
+ <form action="" method="post" id="form">
164
+ <p>
165
+ <?php if (support("columns") || $TABLE == "") { ?>
166
+ <?php echo lang('Table name'); ?>: <input name="name" maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
167
+ <?php if ($TABLE == "" && !$_POST) { ?><script type='text/javascript'>focus(document.getElementById('form')['name']);</script><?php } ?>
168
+ <?php echo ($engines ? "<select name='Engine' onchange='helpClose();'" . on_help("getTarget(event).value", 1) . ">" . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "</select>" : ""); ?>
169
+ <?php echo ($collations && !preg_match("~sqlite|mssql~", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
170
+ <input type="submit" value="<?php echo lang('Save'); ?>">
171
+ <?php } ?>
172
+
173
+ <?php if (support("columns")) { ?>
174
+ <table cellspacing="0" id="edit-fields" class="nowrap">
175
+ <?php
176
+ $comments = ($_POST ? $_POST["comments"] : $row["Comment"] != "");
177
+ if (!$_POST && !$comments) {
178
+ foreach ($row["fields"] as $field) {
179
+ if ($field["comment"] != "") {
180
+ $comments = true;
181
+ break;
182
+ }
183
+ }
184
+ }
185
+ edit_fields($row["fields"], $collations, "TABLE", $foreign_keys, $comments);
186
+ ?>
187
+ </table>
188
+ <p>
189
+ <?php echo lang('Auto Increment'); ?>: <input type="number" name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
190
+ <?php echo checkbox("defaults", 1, true, lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
191
+ <?php if (!$_POST["defaults"]) { ?><script type="text/javascript">editingHideDefaults()</script><?php } ?>
192
+ <?php echo (support("comment")
193
+ ? "<label><input type='checkbox' name='comments' value='1' class='jsonly' onclick=\"columnShow(this.checked, 6); toggle('Comment'); if (this.checked) this.form['Comment'].focus();\"" . ($comments ? " checked" : "") . ">" . lang('Comment') . "</label>"
194
+ . ' <input name="Comment" id="Comment" value="' . h($row["Comment"]) . '" maxlength="' . ($connection->server_info >= 5.5 ? 2048 : 60) . '"' . ($comments ? '' : ' class="hidden"') . '>'
195
+ : '')
196
+ ; ?>
197
+ <p>
198
+ <input type="submit" value="<?php echo lang('Save'); ?>">
199
+ <?php } ?>
200
+
201
+ <?php if ($TABLE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
202
+ <?php
203
+ if (support("partitioning")) {
204
+ $partition_table = preg_match('~RANGE|LIST~', $row["partition_by"]);
205
+ print_fieldset("partition", lang('Partition by'), $row["partition_by"]);
206
+ ?>
207
+ <p>
208
+ <?php echo "<select name='partition_by' onchange='partitionByChange(this);'" . on_help("getTarget(event).value.replace(/./, 'PARTITION BY \$&')", 1) . ">" . optionlist(array("" => "") + $partition_by, $row["partition_by"]) . "</select>"; ?>
209
+ (<input name="partition" value="<?php echo h($row["partition"]); ?>">)
210
+ <?php echo lang('Partitions'); ?>: <input type="number" name="partitions" class="size<?php echo ($partition_table || !$row["partition_by"] ? " hidden" : ""); ?>" value="<?php echo h($row["partitions"]); ?>">
211
+ <table cellspacing="0" id="partition-table"<?php echo ($partition_table ? "" : " class='hidden'"); ?>>
212
+ <thead><tr><th><?php echo lang('Partition name'); ?><th><?php echo lang('Values'); ?></thead>
213
+ <?php
214
+ foreach ($row["partition_names"] as $key => $val) {
215
+ echo '<tr>';
216
+ echo '<td><input name="partition_names[]" value="' . h($val) . '"' . ($key == count($row["partition_names"]) - 1 ? ' onchange="partitionNameChange(this);"' : '') . ' autocapitalize="off">';
217
+ echo '<td><input name="partition_values[]" value="' . h($row["partition_values"][$key]) . '">';
218
+ }
219
+ ?>
220
+ </table>
221
+ </div></fieldset>
222
+ <?php
223
+ }
224
+ ?>
225
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
226
+ </form>
adminer/adminer/adminer/database.inc.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $row = $_POST;
3
+
4
+ if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP changes add.x to add_x
5
+ $name = trim($row["name"]);
6
+ if ($_POST["drop"]) {
7
+ $_GET["db"] = ""; // to save in global history
8
+ queries_redirect(remove_from_uri("db|database"), lang('Database has been dropped.'), drop_databases(array(DB)));
9
+ } elseif (DB !== $name) {
10
+ // create or rename database
11
+ if (DB != "") {
12
+ $_GET["db"] = $name;
13
+ queries_redirect(preg_replace('~\bdb=[^&]*&~', '', ME) . "db=" . urlencode($name), lang('Database has been renamed.'), rename_database($name, $row["collation"]));
14
+ } else {
15
+ $databases = explode("\n", str_replace("\r", "", $name));
16
+ $success = true;
17
+ $last = "";
18
+ foreach ($databases as $db) {
19
+ if (count($databases) == 1 || $db != "") { // ignore empty lines but always try to create single database
20
+ if (!create_database($db, $row["collation"])) {
21
+ $success = false;
22
+ }
23
+ $last = $db;
24
+ }
25
+ }
26
+ restart_session();
27
+ set_session("dbs", null);
28
+ queries_redirect(ME . "db=" . urlencode($last), lang('Database has been created.'), $success);
29
+ }
30
+ } else {
31
+ // alter database
32
+ if (!$row["collation"]) {
33
+ redirect(substr(ME, 0, -1));
34
+ }
35
+ query_redirect("ALTER DATABASE " . idf_escape($name) . (preg_match('~^[a-z0-9_]+$~i', $row["collation"]) ? " COLLATE $row[collation]" : ""), substr(ME, 0, -1), lang('Database has been altered.'));
36
+ }
37
+ }
38
+
39
+ page_header(DB != "" ? lang('Alter database') : lang('Create database'), $error, array(), h(DB));
40
+
41
+ $collations = collations();
42
+ $name = DB;
43
+ if ($_POST) {
44
+ $name = $row["name"];
45
+ } elseif (DB != "") {
46
+ $row["collation"] = db_collation(DB, $collations);
47
+ } elseif ($jush == "sql") {
48
+ // propose database name with limited privileges
49
+ foreach (get_vals("SHOW GRANTS") as $grant) {
50
+ if (preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~', $grant, $match) && $match[1]) {
51
+ $name = stripcslashes(idf_unescape("`$match[2]`"));
52
+ break;
53
+ }
54
+ }
55
+ }
56
+ ?>
57
+
58
+ <form action="" method="post">
59
+ <p>
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
+ 'mssql' => "ms187963.aspx",
67
+ )) : "");
68
+ ?>
69
+ <script type='text/javascript'>focus(document.getElementById('name'));</script>
70
+ <input type="submit" value="<?php echo lang('Save'); ?>">
71
+ <?php
72
+ if (DB != "") {
73
+ echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
74
+ } elseif (!$_POST["add_x"] && $_GET["db"] == "") {
75
+ echo "<input type='image' class='icon' name='add' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>\n";
76
+ }
77
+ ?>
78
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
79
+ </form>
adminer/adminer/adminer/db.inc.php ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $tables_views = array_merge((array) $_POST["tables"], (array) $_POST["views"]);
3
+
4
+ if ($tables_views && !$error && !$_POST["search"]) {
5
+ $result = true;
6
+ $message = "";
7
+ if ($jush == "sql" && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"] || $_POST["copy"])) {
8
+ queries("SET foreign_key_checks = 0"); // allows to truncate or drop several tables at once
9
+ }
10
+
11
+ if ($_POST["truncate"]) {
12
+ if ($_POST["tables"]) {
13
+ $result = truncate_tables($_POST["tables"]);
14
+ }
15
+ $message = lang('Tables have been truncated.');
16
+ } elseif ($_POST["move"]) {
17
+ $result = move_tables((array) $_POST["tables"], (array) $_POST["views"], $_POST["target"]);
18
+ $message = lang('Tables have been moved.');
19
+ } elseif ($_POST["copy"]) {
20
+ $result = copy_tables((array) $_POST["tables"], (array) $_POST["views"], $_POST["target"]);
21
+ $message = lang('Tables have been copied.');
22
+ } elseif ($_POST["drop"]) {
23
+ if ($_POST["views"]) {
24
+ $result = drop_views($_POST["views"]);
25
+ }
26
+ if ($result && $_POST["tables"]) {
27
+ $result = drop_tables($_POST["tables"]);
28
+ }
29
+ $message = lang('Tables have been dropped.');
30
+ } elseif ($jush != "sql") {
31
+ $result = ($jush == "sqlite"
32
+ ? queries("VACUUM")
33
+ : apply_queries("VACUUM" . ($_POST["optimize"] ? "" : " ANALYZE"), $_POST["tables"])
34
+ );
35
+ $message = lang('Tables have been optimized.');
36
+ } elseif (!$_POST["tables"]) {
37
+ $message = lang('No tables.');
38
+ } elseif ($result = queries(($_POST["optimize"] ? "OPTIMIZE" : ($_POST["check"] ? "CHECK" : ($_POST["repair"] ? "REPAIR" : "ANALYZE"))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"])))) {
39
+ while ($row = $result->fetch_assoc()) {
40
+ $message .= "<b>" . h($row["Table"]) . "</b>: " . h($row["Msg_text"]) . "<br>";
41
+ }
42
+ }
43
+
44
+ queries_redirect(substr(ME, 0, -1), $message, $result);
45
+ }
46
+
47
+ page_header(($_GET["ns"] == "" ? lang('Database') . ": " . h(DB) : lang('Schema') . ": " . h($_GET["ns"])), $error, true);
48
+
49
+ if ($adminer->homepage()) {
50
+ if ($_GET["ns"] !== "") {
51
+ echo "<h3 id='tables-views'>" . lang('Tables and views') . "</h3>\n";
52
+ $tables_list = tables_list();
53
+ if (!$tables_list) {
54
+ echo "<p class='message'>" . lang('No tables.') . "\n";
55
+ } else {
56
+ echo "<form action='' method='post'>\n";
57
+ if (support("table")) {
58
+ echo "<fieldset><legend>" . lang('Search data in tables') . " <span id='selected2'></span></legend><div>";
59
+ echo "<input type='search' name='query' value='" . h($_POST["query"]) . "'> <input type='submit' name='search' value='" . lang('Search') . "'>\n";
60
+ echo "</div></fieldset>\n";
61
+ if ($_POST["search"] && $_POST["query"] != "") {
62
+ search_tables();
63
+ }
64
+ }
65
+ echo "<table cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
66
+
67
+ echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);">';
68
+ $doc_link = doc_link(array('sql' => 'show-table-status.html'));
69
+ echo '<th>' . lang('Table');
70
+ echo '<td>' . lang('Engine') . doc_link(array('sql' => 'storage-engines.html'));
71
+ echo '<td>' . lang('Collation') . doc_link(array('sql' => 'charset-mysql.html'));
72
+ echo '<td>' . lang('Data Length') . $doc_link;
73
+ echo '<td>' . lang('Index Length') . $doc_link;
74
+ echo '<td>' . lang('Data Free') . $doc_link;
75
+ echo '<td>' . lang('Auto Increment') . doc_link(array('sql' => 'example-auto-increment.html'));
76
+ echo '<td>' . lang('Rows') . $doc_link;
77
+ echo (support("comment") ? '<td>' . lang('Comment') . $doc_link : '');
78
+ echo "</thead>\n";
79
+
80
+ $tables = 0;
81
+ foreach ($tables_list as $name => $type) {
82
+ $view = ($type !== null && !preg_match('~table~i', $type));
83
+ echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');");
84
+ echo '<th>' . (support("table") || support("indexes") ? '<a href="' . h(ME) . 'table=' . urlencode($name) . '" title="' . lang('Show structure') . '">' . h($name) . '</a>' : h($name));
85
+ if ($view) {
86
+ echo '<td colspan="6"><a href="' . h(ME) . "view=" . urlencode($name) . '" title="' . lang('Alter view') . '">' . (preg_match('~materialized~i', $type) ? lang('Materialized View') : lang('View')) . '</a>';
87
+ echo '<td align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '" title="' . lang('Select data') . '">?</a>';
88
+ } else {
89
+ foreach (array(
90
+ "Engine" => array(),
91
+ "Collation" => array(),
92
+ "Data_length" => array("create", lang('Alter table')),
93
+ "Index_length" => array("indexes", lang('Alter indexes')),
94
+ "Data_free" => array("edit", lang('New item')),
95
+ "Auto_increment" => array("auto_increment=1&create", lang('Alter table')),
96
+ "Rows" => array("select", lang('Select data')),
97
+ ) as $key => $link) {
98
+ $id = " id='$key-" . h($name) . "'";
99
+ echo ($link ? "<td align='right'>" . (support("table") || $key == "Rows" || (support("indexes") && $key != "Data_length")
100
+ ? "<a href='" . h(ME . "$link[0]=") . urlencode($name) . "'$id title='$link[1]'>?</a>"
101
+ : "<span$id>?</span>"
102
+ ) : "<td id='$key-" . h($name) . "'>&nbsp;");
103
+ }
104
+ $tables++;
105
+ }
106
+ echo (support("comment") ? "<td id='Comment-" . h($name) . "'>&nbsp;" : "");
107
+ }
108
+
109
+ echo "<tr><td>&nbsp;<th>" . lang('%d in total', count($tables_list));
110
+ echo "<td>" . nbsp($jush == "sql" ? $connection->result("SELECT @@storage_engine") : "");
111
+ echo "<td>" . nbsp(db_collation(DB, collations()));
112
+ foreach (array("Data_length", "Index_length", "Data_free") as $key) {
113
+ echo "<td align='right' id='sum-$key'>&nbsp;";
114
+ }
115
+
116
+ echo "</table>\n";
117
+ if (!information_schema(DB)) {
118
+ $vacuum = "<input type='submit' value='" . lang('Vacuum') . "'" . on_help("'VACUUM'") . "> ";
119
+ $optimize = "<input type='submit' name='optimize' value='" . lang('Optimize') . "'" . on_help($jush == "sql" ? "'OPTIMIZE TABLE'" : "'VACUUM OPTIMIZE'") . "> ";
120
+ echo "<fieldset><legend>" . lang('Selected') . " <span id='selected'></span></legend><div>"
121
+ . ($jush == "sqlite" ? $vacuum
122
+ : ($jush == "pgsql" ? $vacuum . $optimize
123
+ : ($jush == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'" . on_help("'ANALYZE TABLE'") . "> " . $optimize
124
+ . "<input type='submit' name='check' value='" . lang('Check') . "'" . on_help("'CHECK TABLE'") . "> "
125
+ . "<input type='submit' name='repair' value='" . lang('Repair') . "'" . on_help("'REPAIR TABLE'") . "> "
126
+ : "")))
127
+ . "<input type='submit' name='truncate' value='" . lang('Truncate') . "'" . confirm() . on_help($jush == "sqlite" ? "'DELETE'" : "'TRUNCATE" . ($jush == "pgsql" ? "'" : " TABLE'")) . "> "
128
+ . "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . on_help("'DROP TABLE'") . ">\n";
129
+ $databases = (support("scheme") ? $adminer->schemas() : $adminer->databases());
130
+ if (count($databases) != 1 && $jush != "sqlite") {
131
+ $db = (isset($_POST["target"]) ? $_POST["target"] : (support("scheme") ? $_GET["ns"] : DB));
132
+ echo "<p>" . lang('Move to other database') . ": ";
133
+ echo ($databases ? html_select("target", $databases, $db) : '<input name="target" value="' . h($db) . '" autocapitalize="off">');
134
+ echo " <input type='submit' name='move' value='" . lang('Move') . "'>";
135
+ echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'>" : "");
136
+ echo "\n";
137
+ }
138
+ echo "<input type='hidden' name='all' value='' onclick=\"selectCount('selected', formChecked(this, /^(tables|views)\[/));" . (support("table") ? " selectCount('selected2', formChecked(this, /^tables\[/) || $tables);" : "") . "\">\n"; // used by trCheck()
139
+ echo "<input type='hidden' name='token' value='$token'>\n";
140
+ echo "</div></fieldset>\n";
141
+ }
142
+ echo "</form>\n";
143
+ echo "<script type='text/javascript'>tableCheck();</script>\n";
144
+ }
145
+
146
+ echo '<p class="links"><a href="' . h(ME) . 'create=">' . lang('Create table') . "</a>\n";
147
+ echo (support("view") ? '<a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n" : "");
148
+ echo (support("materializedview") ? '<a href="' . h(ME) . 'view=&amp;materialized=1">' . lang('Create materialized view') . "</a>\n" : "");
149
+
150
+ if (support("routine")) {
151
+ echo "<h3 id='routines'>" . lang('Routines') . "</h3>\n";
152
+ $routines = routines();
153
+ if ($routines) {
154
+ echo "<table cellspacing='0'>\n";
155
+ echo '<thead><tr><th>' . lang('Name') . '<td>' . lang('Type') . '<td>' . lang('Return type') . "<td>&nbsp;</thead>\n";
156
+ odd('');
157
+ foreach ($routines as $row) {
158
+ echo '<tr' . odd() . '>';
159
+ echo '<th><a href="' . h(ME) . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'callf=' : 'call=') . urlencode($row["ROUTINE_NAME"]) . '">' . h($row["ROUTINE_NAME"]) . '</a>';
160
+ echo '<td>' . h($row["ROUTINE_TYPE"]);
161
+ echo '<td>' . h($row["DTD_IDENTIFIER"]);
162
+ echo '<td><a href="' . h(ME) . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'function=' : 'procedure=') . urlencode($row["ROUTINE_NAME"]) . '">' . lang('Alter') . "</a>";
163
+ }
164
+ echo "</table>\n";
165
+ }
166
+ echo '<p class="links">'
167
+ . (support("procedure") ? '<a href="' . h(ME) . 'procedure=">' . lang('Create procedure') . '</a>' : '')
168
+ . '<a href="' . h(ME) . 'function=">' . lang('Create function') . "</a>\n"
169
+ ;
170
+ }
171
+
172
+ if (support("sequence")) {
173
+ echo "<h3 id='sequences'>" . lang('Sequences') . "</h3>\n";
174
+ $sequences = get_vals("SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = current_schema() ORDER BY sequence_name");
175
+ if ($sequences) {
176
+ echo "<table cellspacing='0'>\n";
177
+ echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
178
+ odd('');
179
+ foreach ($sequences as $val) {
180
+ echo "<tr" . odd() . "><th><a href='" . h(ME) . "sequence=" . urlencode($val) . "'>" . h($val) . "</a>\n";
181
+ }
182
+ echo "</table>\n";
183
+ }
184
+ echo "<p class='links'><a href='" . h(ME) . "sequence='>" . lang('Create sequence') . "</a>\n";
185
+ }
186
+
187
+ if (support("type")) {
188
+ echo "<h3 id='user-types'>" . lang('User types') . "</h3>\n";
189
+ $user_types = types();
190
+ if ($user_types) {
191
+ echo "<table cellspacing='0'>\n";
192
+ echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
193
+ odd('');
194
+ foreach ($user_types as $val) {
195
+ echo "<tr" . odd() . "><th><a href='" . h(ME) . "type=" . urlencode($val) . "'>" . h($val) . "</a>\n";
196
+ }
197
+ echo "</table>\n";
198
+ }
199
+ echo "<p class='links'><a href='" . h(ME) . "type='>" . lang('Create type') . "</a>\n";
200
+ }
201
+
202
+ if (support("event")) {
203
+ echo "<h3 id='events'>" . lang('Events') . "</h3>\n";
204
+ $rows = get_rows("SHOW EVENTS");
205
+ if ($rows) {
206
+ echo "<table cellspacing='0'>\n";
207
+ echo "<thead><tr><th>" . lang('Name') . "<td>" . lang('Schedule') . "<td>" . lang('Start') . "<td>" . lang('End') . "<td></thead>\n";
208
+ foreach ($rows as $row) {
209
+ echo "<tr>";
210
+ echo "<th>" . h($row["Name"]);
211
+ echo "<td>" . ($row["Execute at"] ? lang('At given time') . "<td>" . $row["Execute at"] : lang('Every') . " " . $row["Interval value"] . " " . $row["Interval field"] . "<td>$row[Starts]");
212
+ echo "<td>$row[Ends]";
213
+ echo '<td><a href="' . h(ME) . 'event=' . urlencode($row["Name"]) . '">' . lang('Alter') . '</a>';
214
+ }
215
+ echo "</table>\n";
216
+ $event_scheduler = $connection->result("SELECT @@event_scheduler");
217
+ if ($event_scheduler && $event_scheduler != "ON") {
218
+ echo "<p class='error'><code class='jush-sqlset'>event_scheduler</code>: " . h($event_scheduler) . "\n";
219
+ }
220
+ }
221
+ echo '<p class="links"><a href="' . h(ME) . 'event=">' . lang('Create event') . "</a>\n";
222
+ }
223
+
224
+ if ($tables_list) {
225
+ echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=db');</script>\n";
226
+ }
227
+ }
228
+ }
adminer/adminer/adminer/download.inc.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $TABLE = $_GET["download"];
3
+ $fields = fields($TABLE);
4
+ header("Content-Type: application/octet-stream");
5
+ header("Content-Disposition: attachment; filename=" . friendly_url("$TABLE-" . implode("_", $_GET["where"])) . "." . friendly_url($_GET["field"]));
6
+ $select = array(idf_escape($_GET["field"]));
7
+ $result = $driver->select($TABLE, $select, array(where($_GET, $fields)), $select);
8
+ $row = ($result ? $result->fetch_row() : array());
9
+ echo $row[0];
10
+ exit; // don't output footer
adminer/adminer/adminer/drivers/elastic.inc.php ADDED
@@ -0,0 +1,374 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $drivers["elastic"] = "Elasticsearch (beta)";
3
+
4
+ if (isset($_GET["elastic"])) {
5
+ $possible_drivers = array("json");
6
+ define("DRIVER", "elastic");
7
+
8
+ if (function_exists('json_decode')) {
9
+ class Min_DB {
10
+ var $extension = "JSON", $server_info, $errno, $error, $_url;
11
+
12
+ /** Performs query
13
+ * @param string
14
+ * @param array
15
+ * @param string
16
+ * @return mixed
17
+ */
18
+ function rootQuery($path, $content = array(), $method = 'GET') {
19
+ @ini_set('track_errors', 1); // @ - may be disabled
20
+ $file = @file_get_contents($this->_url . '/' . ltrim($path, '/'), false, stream_context_create(array('http' => array(
21
+ 'method' => $method,
22
+ 'content' => json_encode($content),
23
+ 'ignore_errors' => 1, // available since PHP 5.2.10
24
+ ))));
25
+ if (!$file) {
26
+ $this->error = $php_errormsg;
27
+ return $file;
28
+ }
29
+ if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
30
+ $this->error = $file;
31
+ return false;
32
+ }
33
+ $return = json_decode($file, true);
34
+ if ($return === null) {
35
+ $this->errno = json_last_error();
36
+ if (function_exists('json_last_error_msg')) {
37
+ $this->error = json_last_error_msg();
38
+ } else {
39
+ $constants = get_defined_constants(true);
40
+ foreach ($constants['json'] as $name => $value) {
41
+ if ($value == $this->errno && preg_match('~^JSON_ERROR_~', $name)) {
42
+ $this->error = $name;
43
+ break;
44
+ }
45
+ }
46
+ }
47
+ }
48
+ return $return;
49
+ }
50
+
51
+ /** Performs query relative to actual selected DB
52
+ * @param string
53
+ * @param array
54
+ * @param string
55
+ * @return mixed
56
+ */
57
+ function query($path, $content = array(), $method = 'GET') {
58
+ return $this->rootQuery(($this->_db != "" ? "$this->_db/" : "/") . ltrim($path, '/'), $content, $method);
59
+ }
60
+
61
+ function connect($server, $username, $password) {
62
+ $this->_url = "http://$username:$password@$server/";
63
+ $return = $this->query('');
64
+ if ($return) {
65
+ $this->server_info = $return['version']['number'];
66
+ }
67
+ return (bool) $return;
68
+ }
69
+
70
+ function select_db($database) {
71
+ $this->_db = $database;
72
+ return true;
73
+ }
74
+
75
+ function quote($string) {
76
+ return $string;
77
+ }
78
+
79
+ }
80
+
81
+ class Min_Result {
82
+ var $num_rows, $_rows;
83
+
84
+ function __construct($rows) {
85
+ $this->num_rows = count($this->_rows);
86
+ $this->_rows = $rows;
87
+ reset($this->_rows);
88
+ }
89
+
90
+ function fetch_assoc() {
91
+ $return = current($this->_rows);
92
+ next($this->_rows);
93
+ return $return;
94
+ }
95
+
96
+ function fetch_row() {
97
+ return array_values($this->fetch_assoc());
98
+ }
99
+
100
+ }
101
+
102
+ }
103
+
104
+
105
+
106
+ class Min_Driver extends Min_SQL {
107
+
108
+ function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
109
+ global $adminer;
110
+ $data = array();
111
+ $query = "$table/_search";
112
+ if ($select != array("*")) {
113
+ $data["fields"] = $select;
114
+ }
115
+ if ($order) {
116
+ $sort = array();
117
+ foreach ($order as $col) {
118
+ $col = preg_replace('~ DESC$~', '', $col, 1, $count);
119
+ $sort[] = ($count ? array($col => "desc") : $col);
120
+ }
121
+ $data["sort"] = $sort;
122
+ }
123
+ if ($limit) {
124
+ $data["size"] = +$limit;
125
+ if ($page) {
126
+ $data["from"] = ($page * $limit);
127
+ }
128
+ }
129
+ foreach ($where as $val) {
130
+ list($col,$op,$val) = explode(" ",$val,3);
131
+ if ($col == "_id") {
132
+ $data["query"]["ids"]["values"][] = $val;
133
+ }
134
+ elseif ($col . $val != "") {
135
+ $term = array("term" => array(($col != "" ? $col : "_all") => $val));
136
+ if ($op == "=") {
137
+ $data["query"]["filtered"]["filter"]["and"][] = $term;
138
+ } else {
139
+ $data["query"]["filtered"]["query"]["bool"]["must"][] = $term;
140
+ }
141
+ }
142
+ }
143
+ if ($data["query"] && !$data["query"]["filtered"]["query"] && !$data["query"]["ids"]) {
144
+ $data["query"]["filtered"]["query"] = array("match_all" => array());
145
+ }
146
+ $start = microtime(true);
147
+ $search = $this->_conn->query($query, $data);
148
+ if ($print) {
149
+ echo $adminer->selectQuery("$query: " . print_r($data, true), format_time($start));
150
+ }
151
+ if (!$search) {
152
+ return false;
153
+ }
154
+ $return = array();
155
+ foreach ($search['hits']['hits'] as $hit) {
156
+ $row = array();
157
+ if ($select == array("*")) {
158
+ $row["_id"] = $hit["_id"];
159
+ }
160
+ $fields = $hit['_source'];
161
+ if ($select != array("*")) {
162
+ $fields = array();
163
+ foreach ($select as $key) {
164
+ $fields[$key] = $hit['fields'][$key];
165
+ }
166
+ }
167
+ foreach ($fields as $key => $val) {
168
+ if ($data["fields"]) {
169
+ $val = $val[0];
170
+ }
171
+ $row[$key] = (is_array($val) ? json_encode($val) : $val); //! display JSON and others differently
172
+ }
173
+ $return[] = $row;
174
+ }
175
+ return new Min_Result($return);
176
+ }
177
+
178
+ }
179
+
180
+
181
+
182
+ function connect() {
183
+ global $adminer;
184
+ $connection = new Min_DB;
185
+ $credentials = $adminer->credentials();
186
+ if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
187
+ return $connection;
188
+ }
189
+ return $connection->error;
190
+ }
191
+
192
+ function support($feature) {
193
+ return preg_match("~database|table|columns~", $feature);
194
+ }
195
+
196
+ function logged_user() {
197
+ global $adminer;
198
+ $credentials = $adminer->credentials();
199
+ return $credentials[1];
200
+ }
201
+
202
+ function get_databases() {
203
+ global $connection;
204
+ $return = $connection->rootQuery('_aliases');
205
+ if ($return) {
206
+ $return = array_keys($return);
207
+ sort($return, SORT_STRING);
208
+ }
209
+ return $return;
210
+ }
211
+
212
+ function collations() {
213
+ return array();
214
+ }
215
+
216
+ function db_collation($db, $collations) {
217
+ }
218
+
219
+ function engines() {
220
+ return array();
221
+ }
222
+
223
+ function count_tables($databases) {
224
+ global $connection;
225
+ $return = $connection->query('_mapping');
226
+ if ($return) {
227
+ $return = array_map('count', $return);
228
+ }
229
+ return $return;
230
+ }
231
+
232
+ function tables_list() {
233
+ global $connection;
234
+ $return = $connection->query('_mapping');
235
+ if ($return) {
236
+ $return = array_fill_keys(array_keys($return[$connection->_db]["mappings"]), 'table');
237
+ }
238
+ return $return;
239
+ }
240
+
241
+ function table_status($name = "", $fast = false) {
242
+ global $connection;
243
+ $search = $connection->query("_search?search_type=count", array(
244
+ "facets" => array(
245
+ "count_by_type" => array(
246
+ "terms" => array(
247
+ "field" => "_type",
248
+ )
249
+ )
250
+ )
251
+ ), "POST");
252
+ $return = array();
253
+ if ($search) {
254
+ foreach ($search["facets"]["count_by_type"]["terms"] as $table) {
255
+ $return[$table["term"]] = array(
256
+ "Name" => $table["term"],
257
+ "Engine" => "table",
258
+ "Rows" => $table["count"],
259
+ );
260
+ }
261
+ if ($name != "" && $name == $table["term"]) {
262
+ return $return[$name];
263
+ }
264
+ }
265
+ return $return;
266
+ }
267
+
268
+ function error() {
269
+ global $connection;
270
+ return h($connection->error);
271
+ }
272
+
273
+ function information_schema() {
274
+ }
275
+
276
+ function is_view($table_status) {
277
+ }
278
+
279
+ function indexes($table, $connection2 = null) {
280
+ return array(
281
+ array("type" => "PRIMARY", "columns" => array("_id")),
282
+ );
283
+ }
284
+
285
+ function fields($table) {
286
+ global $connection;
287
+ $result = $connection->query("$table/_mapping");
288
+ $return = array();
289
+ if ($result) {
290
+ $mappings = $result[$table]['properties'];
291
+ if (!$mappings) {
292
+ $mappings = $result[$connection->_db]['mappings'][$table]['properties'];
293
+ }
294
+ if ($mappings) {
295
+ foreach ($mappings as $name => $field) {
296
+ $return[$name] = array(
297
+ "field" => $name,
298
+ "full_type" => $field["type"],
299
+ "type" => $field["type"],
300
+ "privileges" => array("insert" => 1, "select" => 1, "update" => 1),
301
+ );
302
+ if ($field["properties"]) { // only leaf fields can be edited
303
+ unset($return[$name]["privileges"]["insert"]);
304
+ unset($return[$name]["privileges"]["update"]);
305
+ }
306
+ }
307
+ }
308
+ }
309
+ return $return;
310
+ }
311
+
312
+ function foreign_keys($table) {
313
+ return array();
314
+ }
315
+
316
+ function table($idf) {
317
+ return $idf;
318
+ }
319
+
320
+ function idf_escape($idf) {
321
+ return $idf;
322
+ }
323
+
324
+ function convert_field($field) {
325
+ }
326
+
327
+ function unconvert_field($field, $return) {
328
+ return $return;
329
+ }
330
+
331
+ function fk_support($table_status) {
332
+ }
333
+
334
+ function found_rows($table_status, $where) {
335
+ return null;
336
+ }
337
+
338
+ /** Create database
339
+ * @param string
340
+ * @return mixed
341
+ */
342
+ function create_database($db) {
343
+ global $connection;
344
+ return $connection->rootQuery(urlencode($db), array(), 'PUT');
345
+ }
346
+
347
+ /** Drop databases
348
+ * @param array
349
+ * @return mixed
350
+ */
351
+ function drop_databases($databases) {
352
+ global $connection;
353
+ return $connection->rootQuery(urlencode(implode(',', $databases)), array(), 'DELETE');
354
+ }
355
+
356
+ /** Drop tables
357
+ * @param array
358
+ * @return bool
359
+ */
360
+ function drop_tables($tables) {
361
+ global $connection;
362
+ $return = true;
363
+ foreach ($tables as $table) { //! convert to bulk api
364
+ $return = $return && $connection->query(urlencode($table), array(), 'DELETE');
365
+ }
366
+ return $return;
367
+ }
368
+
369
+ $jush = "elastic";
370
+ $operators = array("=", "query");
371
+ $functions = array();
372
+ $grouping = array();
373
+ $edit_functions = array(array("json"));
374
+ }
adminer/adminer/adminer/drivers/firebird.inc.php ADDED
@@ -0,0 +1,320 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @author Steve Krämer
4
+ */
5
+
6
+ $drivers['firebird'] = 'Firebird (alpha)';
7
+
8
+ if (isset($_GET["firebird"])) {
9
+ $possible_drivers = array("interbase");
10
+ define("DRIVER", "firebird");
11
+
12
+ if (extension_loaded("interbase") ) {
13
+ class Min_DB {
14
+ var
15
+ $extension = "Firebird",
16
+ $server_info,
17
+ $affected_rows,
18
+ $errno,
19
+ $error,
20
+ $_link, $_result
21
+ ;
22
+
23
+ function connect($server, $username, $password) {
24
+ $this->_link = ibase_connect($server, $username, $password);
25
+ if ($this->_link) {
26
+ $url_parts = explode(':', $server);
27
+ $this->service_link = ibase_service_attach($url_parts[0], $username, $password);
28
+ $this->server_info = ibase_server_info($this->service_link, IBASE_SVC_SERVER_VERSION);
29
+ } else {
30
+ $this->errno = ibase_errcode();
31
+ $this->error = ibase_errmsg();
32
+ }
33
+ return (bool) $this->_link;
34
+ }
35
+
36
+ function quote($string) {
37
+ return "'" . str_replace("'", "''", $string) . "'";
38
+ }
39
+
40
+ function select_db($database) {
41
+ return ($database == "domain");
42
+ }
43
+
44
+ function query($query, $unbuffered = false) {
45
+ $result = ibase_query($query, $this->_link);
46
+ if (!$result) {
47
+ $this->errno = ibase_errcode();
48
+ $this->error = ibase_errmsg();
49
+ return false;
50
+ }
51
+ $this->error = "";
52
+ if ($result === true) {
53
+ $this->affected_rows = ibase_affected_rows($this->_link);
54
+ return true;
55
+ }
56
+ return new Min_Result($result);
57
+ }
58
+
59
+ function multi_query($query) {
60
+ return $this->_result = $this->query($query);
61
+ }
62
+
63
+ function store_result() {
64
+ return $this->_result;
65
+ }
66
+
67
+ function next_result() {
68
+ return false;
69
+ }
70
+
71
+ function result($query, $field = 0) {
72
+ $result = $this->query($query);
73
+ if (!$result || !$result->num_rows) {
74
+ return false;
75
+ }
76
+ $row = $result->fetch_row();
77
+ return $row[$field];
78
+ }
79
+ }
80
+
81
+ class Min_Result {
82
+ var $num_rows, $_result, $_offset = 0;
83
+
84
+ function __construct($result) {
85
+ $this->_result = $result;
86
+ // $this->num_rows = ibase_num_rows($result);
87
+ }
88
+
89
+ function fetch_assoc() {
90
+ return ibase_fetch_assoc($this->_result);
91
+ }
92
+
93
+ function fetch_row() {
94
+ return ibase_fetch_row($this->_result);
95
+ }
96
+
97
+ function fetch_field() {
98
+ $field = ibase_field_info($this->_result, $this->_offset++);
99
+ return (object) array(
100
+ 'name' => $field['name'],
101
+ 'orgname' => $field['name'],
102
+ 'type' => $field['type'],
103
+ 'charsetnr' => $field['length'],
104
+ );
105
+ }
106
+
107
+ function __destruct() {
108
+ ibase_free_result($this->_result);
109
+ }
110
+ }
111
+
112
+ }
113
+
114
+
115
+
116
+ class Min_Driver extends Min_SQL {
117
+ }
118
+
119
+
120
+
121
+ function idf_escape($idf) {
122
+ return '"' . str_replace('"', '""', $idf) . '"';
123
+ }
124
+
125
+ function table($idf) {
126
+ return idf_escape($idf);
127
+ }
128
+
129
+ function connect() {
130
+ global $adminer;
131
+ $connection = new Min_DB;
132
+ $credentials = $adminer->credentials();
133
+ if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
134
+ return $connection;
135
+ }
136
+ return $connection->error;
137
+ }
138
+
139
+ function get_databases($flush) {
140
+ return array("domain");
141
+ }
142
+
143
+ function limit($query, $where, $limit, $offset = 0, $separator = " ") {
144
+ $return = '';
145
+ $return .= ($limit !== null ? $separator . "FIRST $limit" . ($offset ? " SKIP $offset" : "") : "");
146
+ $return .= " $query$where";
147
+ return $return;
148
+ }
149
+
150
+ function limit1($query, $where) {
151
+ return limit($query, $where, 1);
152
+ }
153
+
154
+ function db_collation($db, $collations) {
155
+ }
156
+
157
+ function engines() {
158
+ return array();
159
+ }
160
+
161
+ function logged_user() {
162
+ global $adminer;
163
+ $credentials = $adminer->credentials();
164
+ return $credentials[1];
165
+ }
166
+
167
+ function tables_list() {
168
+ global $connection;
169
+ $query = 'SELECT RDB$RELATION_NAME FROM rdb$relations WHERE rdb$system_flag = 0';
170
+ $result = ibase_query($connection->_link, $query);
171
+ $return = array();
172
+ while ($row = ibase_fetch_assoc($result)) {
173
+ $return[$row['RDB$RELATION_NAME']] = 'table';
174
+ }
175
+ ksort($return);
176
+ return $return;
177
+ }
178
+
179
+ function count_tables($databases) {
180
+ return array();
181
+ }
182
+
183
+ function table_status($name = "", $fast = false) {
184
+ global $connection;
185
+ $return = array();
186
+ $data = tables_list();
187
+ foreach ($data as $index => $val) {
188
+ $index = trim($index);
189
+ $return[$index] = array(
190
+ 'Name' => $index,
191
+ 'Engine' => 'standard',
192
+ );
193
+ if ($name == $index) {
194
+ return $return[$index];
195
+ }
196
+ }
197
+ return $return;
198
+ }
199
+
200
+ function is_view($table_status) {
201
+ return false;
202
+ }
203
+
204
+ function fk_support($table_status) {
205
+ return preg_match('~InnoDB|IBMDB2I~i', $table_status["Engine"]);
206
+ }
207
+
208
+ function fields($table) {
209
+ global $connection;
210
+ $return = array();
211
+ $query = 'SELECT r.RDB$FIELD_NAME AS field_name,
212
+ r.RDB$DESCRIPTION AS field_description,
213
+ r.RDB$DEFAULT_VALUE AS field_default_value,
214
+ r.RDB$NULL_FLAG AS field_not_null_constraint,
215
+ f.RDB$FIELD_LENGTH AS field_length,
216
+ f.RDB$FIELD_PRECISION AS field_precision,
217
+ f.RDB$FIELD_SCALE AS field_scale,
218
+ CASE f.RDB$FIELD_TYPE
219
+ WHEN 261 THEN \'BLOB\'
220
+ WHEN 14 THEN \'CHAR\'
221
+ WHEN 40 THEN \'CSTRING\'
222
+ WHEN 11 THEN \'D_FLOAT\'
223
+ WHEN 27 THEN \'DOUBLE\'
224
+ WHEN 10 THEN \'FLOAT\'
225
+ WHEN 16 THEN \'INT64\'
226
+ WHEN 8 THEN \'INTEGER\'
227
+ WHEN 9 THEN \'QUAD\'
228
+ WHEN 7 THEN \'SMALLINT\'
229
+ WHEN 12 THEN \'DATE\'
230
+ WHEN 13 THEN \'TIME\'
231
+ WHEN 35 THEN \'TIMESTAMP\'
232
+ WHEN 37 THEN \'VARCHAR\'
233
+ ELSE \'UNKNOWN\'
234
+ END AS field_type,
235
+ f.RDB$FIELD_SUB_TYPE AS field_subtype,
236
+ coll.RDB$COLLATION_NAME AS field_collation,
237
+ cset.RDB$CHARACTER_SET_NAME AS field_charset
238
+ FROM RDB$RELATION_FIELDS r
239
+ LEFT JOIN RDB$FIELDS f ON r.RDB$FIELD_SOURCE = f.RDB$FIELD_NAME
240
+ LEFT JOIN RDB$COLLATIONS coll ON f.RDB$COLLATION_ID = coll.RDB$COLLATION_ID
241
+ LEFT JOIN RDB$CHARACTER_SETS cset ON f.RDB$CHARACTER_SET_ID = cset.RDB$CHARACTER_SET_ID
242
+ WHERE r.RDB$RELATION_NAME = ' . q($table) . '
243
+ ORDER BY r.RDB$FIELD_POSITION';
244
+ $result = ibase_query($connection->_link, $query);
245
+ while ($row = ibase_fetch_assoc($result)) {
246
+ $return[trim($row['FIELD_NAME'])] = array(
247
+ "field" => trim($row["FIELD_NAME"]),
248
+ "full_type" => trim($row["FIELD_TYPE"]),
249
+ "type" => trim($row["FIELD_SUB_TYPE"]),
250
+ "default" => trim($row['FIELD_DEFAULT_VALUE']),
251
+ "null" => (trim($row["FIELD_NOT_NULL_CONSTRAINT"]) == "YES"),
252
+ "auto_increment" => '0',
253
+ "collation" => trim($row["FIELD_COLLATION"]),
254
+ "privileges" => array("insert" => 1, "select" => 1, "update" => 1),
255
+ "comment" => trim($row["FIELD_DESCRIPTION"]),
256
+ );
257
+ }
258
+ return $return;
259
+ }
260
+
261
+ function indexes($table, $connection2 = null) {
262
+ $return = array();
263
+ /*
264
+ $query = 'SELECT RDB$INDEX_SEGMENTS.RDB$FIELD_NAME AS field_name,
265
+ RDB$INDICES.RDB$DESCRIPTION AS description,
266
+ (RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION + 1) AS field_position
267
+ FROM RDB$INDEX_SEGMENTS
268
+ LEFT JOIN RDB$INDICES ON RDB$INDICES.RDB$INDEX_NAME = RDB$INDEX_SEGMENTS.RDB$INDEX_NAME
269
+ LEFT JOIN RDB$RELATION_CONSTRAINTS ON RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDEX_SEGMENTS.RDB$INDEX_NAME
270
+ WHERE UPPER(RDB$INDICES.RDB$RELATION_NAME) = ' . q($table) . '
271
+ // AND UPPER(RDB$INDICES.RDB$INDEX_NAME) = \'TEST2_FIELD5_IDX\'
272
+ AND RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE IS NULL
273
+ ORDER BY RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION';
274
+ */
275
+ return $return;
276
+ }
277
+
278
+ function foreign_keys($table) {
279
+ return array();
280
+ }
281
+
282
+ function collations() {
283
+ return array();
284
+ }
285
+
286
+ function information_schema($db) {
287
+ return false;
288
+ }
289
+
290
+ function error() {
291
+ global $connection;
292
+ return h($connection->error);
293
+ }
294
+
295
+ function types() {
296
+ return array();
297
+ }
298
+
299
+ function schemas() {
300
+ return array();
301
+ }
302
+
303
+ function get_schema() {
304
+ return "";
305
+ }
306
+
307
+ function set_schema($schema) {
308
+ return true;
309
+ }
310
+
311
+ function support($feature) {
312
+ return preg_match("~^(columns|sql|status|table)$~", $feature);
313
+ }
314
+
315
+ $jush = "firebird";
316
+ $operators = array("=");
317
+ $functions = array();
318
+ $grouping = array();
319
+ $edit_functions = array();
320
+ }
adminer/adminer/adminer/drivers/mongo.inc.php ADDED
@@ -0,0 +1,357 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $drivers["mongo"] = "MongoDB (beta)";
3
+
4
+ if (isset($_GET["mongo"])) {
5
+ $possible_drivers = array("mongo");
6
+ define("DRIVER", "mongo");
7
+
8
+ if (class_exists('MongoDB')) {
9
+ class Min_DB {
10
+ var $extension = "Mongo", $error, $last_id, $_link, $_db;
11
+
12
+ function connect($server, $username, $password) {
13
+ global $adminer;
14
+ $db = $adminer->database();
15
+ $options = array();
16
+ if ($username != "") {
17
+ $options["username"] = $username;
18
+ $options["password"] = $password;
19
+ }
20
+ if ($db != "") {
21
+ $options["db"] = $db;
22
+ }
23
+ try {
24
+ $this->_link = @new MongoClient("mongodb://$server", $options);
25
+ return true;
26
+ } catch (Exception $ex) {
27
+ $this->error = $ex->getMessage();
28
+ return false;
29
+ }
30
+ }
31
+
32
+ function query($query) {
33
+ return false;
34
+ }
35
+
36
+ function select_db($database) {
37
+ try {
38
+ $this->_db = $this->_link->selectDB($database);
39
+ return true;
40
+ } catch (Exception $ex) {
41
+ $this->error = $ex->getMessage();
42
+ return false;
43
+ }
44
+ }
45
+
46
+ function quote($string) {
47
+ return $string;
48
+ }
49
+
50
+ }
51
+
52
+ class Min_Result {
53
+ var $num_rows, $_rows = array(), $_offset = 0, $_charset = array();
54
+
55
+ function __construct($result) {
56
+ foreach ($result as $item) {
57
+ $row = array();
58
+ foreach ($item as $key => $val) {
59
+ if (is_a($val, 'MongoBinData')) {
60
+ $this->_charset[$key] = 63;
61
+ }
62
+ $row[$key] =
63
+ (is_a($val, 'MongoId') ? 'ObjectId("' . strval($val) . '")' :
64
+ (is_a($val, 'MongoDate') ? gmdate("Y-m-d H:i:s", $val->sec) . " GMT" :
65
+ (is_a($val, 'MongoBinData') ? $val->bin : //! allow downloading
66
+ (is_a($val, 'MongoRegex') ? strval($val) :
67
+ (is_object($val) ? get_class($val) : // MongoMinKey, MongoMaxKey
68
+ $val
69
+ )))));
70
+ }
71
+ $this->_rows[] = $row;
72
+ foreach ($row as $key => $val) {
73
+ if (!isset($this->_rows[0][$key])) {
74
+ $this->_rows[0][$key] = null;
75
+ }
76
+ }
77
+ }
78
+ $this->num_rows = count($this->_rows);
79
+ }
80
+
81
+ function fetch_assoc() {
82
+ $row = current($this->_rows);
83
+ if (!$row) {
84
+ return $row;
85
+ }
86
+ $return = array();
87
+ foreach ($this->_rows[0] as $key => $val) {
88
+ $return[$key] = $row[$key];
89
+ }
90
+ next($this->_rows);
91
+ return $return;
92
+ }
93
+
94
+ function fetch_row() {
95
+ $return = $this->fetch_assoc();
96
+ if (!$return) {
97
+ return $return;
98
+ }
99
+ return array_values($return);
100
+ }
101
+
102
+ function fetch_field() {
103
+ $keys = array_keys($this->_rows[0]);
104
+ $name = $keys[$this->_offset++];
105
+ return (object) array(
106
+ 'name' => $name,
107
+ 'charsetnr' => $this->_charset[$name],
108
+ );
109
+ }
110
+
111
+ }
112
+ }
113
+
114
+
115
+
116
+ class Min_Driver extends Min_SQL {
117
+ public $primary = "_id";
118
+
119
+ function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
120
+ $select = ($select == array("*")
121
+ ? array()
122
+ : array_fill_keys($select, true)
123
+ );
124
+ $sort = array();
125
+ foreach ($order as $val) {
126
+ $val = preg_replace('~ DESC$~', '', $val, 1, $count);
127
+ $sort[$val] = ($count ? -1 : 1);
128
+ }
129
+ return new Min_Result($this->_conn->_db->selectCollection($table)
130
+ ->find(array(), $select)
131
+ ->sort($sort)
132
+ ->limit(+$limit)
133
+ ->skip($page * $limit)
134
+ );
135
+ }
136
+
137
+ function insert($table, $set) {
138
+ try {
139
+ $return = $this->_conn->_db->selectCollection($table)->insert($set);
140
+ $this->_conn->errno = $return['code'];
141
+ $this->_conn->error = $return['err'];
142
+ $this->_conn->last_id = $set['_id'];
143
+ return !$return['err'];
144
+ } catch (Exception $ex) {
145
+ $this->_conn->error = $ex->getMessage();
146
+ return false;
147
+ }
148
+ }
149
+ }
150
+
151
+
152
+
153
+ function connect() {
154
+ global $adminer;
155
+ $connection = new Min_DB;
156
+ $credentials = $adminer->credentials();
157
+ if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
158
+ return $connection;
159
+ }
160
+ return $connection->error;
161
+ }
162
+
163
+ function error() {
164
+ global $connection;
165
+ return h($connection->error);
166
+ }
167
+
168
+ function logged_user() {
169
+ global $adminer;
170
+ $credentials = $adminer->credentials();
171
+ return $credentials[1];
172
+ }
173
+
174
+ function get_databases($flush) {
175
+ global $connection;
176
+ $return = array();
177
+ $dbs = $connection->_link->listDBs();
178
+ foreach ($dbs['databases'] as $db) {
179
+ $return[] = $db['name'];
180
+ }
181
+ return $return;
182
+ }
183
+
184
+ function collations() {
185
+ return array();
186
+ }
187
+
188
+ function db_collation($db, $collations) {
189
+ }
190
+
191
+ function count_tables($databases) {
192
+ global $connection;
193
+ $return = array();
194
+ foreach ($databases as $db) {
195
+ $return[$db] = count($connection->_link->selectDB($db)->getCollectionNames(true));
196
+ }
197
+ return $return;
198
+ }
199
+
200
+ function tables_list() {
201
+ global $connection;
202
+ return array_fill_keys($connection->_db->getCollectionNames(true), 'table');
203
+ }
204
+
205
+ function table_status($name = "", $fast = false) {
206
+ $return = array();
207
+ foreach (tables_list() as $table => $type) {
208
+ $return[$table] = array("Name" => $table);
209
+ if ($name == $table) {
210
+ return $return[$table];
211
+ }
212
+ }
213
+ return $return;
214
+ }
215
+
216
+ function information_schema() {
217
+ }
218
+
219
+ function is_view($table_status) {
220
+ }
221
+
222
+ function drop_databases($databases) {
223
+ global $connection;
224
+ foreach ($databases as $db) {
225
+ $response = $connection->_link->selectDB($db)->drop();
226
+ if (!$response['ok']) {
227
+ return false;
228
+ }
229
+ }
230
+ return true;
231
+ }
232
+
233
+ function indexes($table, $connection2 = null) {
234
+ global $connection;
235
+ $return = array();
236
+ foreach ($connection->_db->selectCollection($table)->getIndexInfo() as $index) {
237
+ $descs = array();
238
+ foreach ($index["key"] as $column => $type) {
239
+ $descs[] = ($type == -1 ? '1' : null);
240
+ }
241
+ $return[$index["name"]] = array(
242
+ "type" => ($index["name"] == "_id_" ? "PRIMARY" : ($index["unique"] ? "UNIQUE" : "INDEX")),
243
+ "columns" => array_keys($index["key"]),
244
+ "lengths" => array(),
245
+ "descs" => $descs,
246
+ );
247
+ }
248
+ return $return;
249
+ }
250
+
251
+ function fields($table) {
252
+ return fields_from_edit();
253
+ }
254
+
255
+ function convert_field($field) {
256
+ }
257
+
258
+ function unconvert_field($field, $return) {
259
+ return $return;
260
+ }
261
+
262
+ function foreign_keys($table) {
263
+ return array();
264
+ }
265
+
266
+ function fk_support($table_status) {
267
+ }
268
+
269
+ function engines() {
270
+ return array();
271
+ }
272
+
273
+ function found_rows($table_status, $where) {
274
+ global $connection;
275
+ //! don't call count_rows()
276
+ return $connection->_db->selectCollection($_GET["select"])->count($where);
277
+ }
278
+
279
+ function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
280
+ global $connection;
281
+ if ($table == "") {
282
+ $connection->_db->createCollection($name);
283
+ return true;
284
+ }
285
+ }
286
+
287
+ function drop_tables($tables) {
288
+ global $connection;
289
+ foreach ($tables as $table) {
290
+ $response = $connection->_db->selectCollection($table)->drop();
291
+ if (!$response['ok']) {
292
+ return false;
293
+ }
294
+ }
295
+ return true;
296
+ }
297
+
298
+ function truncate_tables($tables) {
299
+ global $connection;
300
+ foreach ($tables as $table) {
301
+ $response = $connection->_db->selectCollection($table)->remove();
302
+ if (!$response['ok']) {
303
+ return false;
304
+ }
305
+ }
306
+ return true;
307
+ }
308
+
309
+ function alter_indexes($table, $alter) {
310
+ global $connection;
311
+ foreach ($alter as $val) {
312
+ list($type, $name, $set) = $val;
313
+ if ($set == "DROP") {
314
+ $return = $connection->_db->command(array("deleteIndexes" => $table, "index" => $name));
315
+ } else {
316
+ $columns = array();
317
+ foreach ($set as $column) {
318
+ $column = preg_replace('~ DESC$~', '', $column, 1, $count);
319
+ $columns[$column] = ($count ? -1 : 1);
320
+ }
321
+ $return = $connection->_db->selectCollection($table)->ensureIndex($columns, array(
322
+ "unique" => ($type == "UNIQUE"),
323
+ "name" => $name,
324
+ //! "sparse"
325
+ ));
326
+ }
327
+ if ($return['errmsg']) {
328
+ $connection->error = $return['errmsg'];
329
+ return false;
330
+ }
331
+ }
332
+ return true;
333
+ }
334
+
335
+ function last_id() {
336
+ global $connection;
337
+ return $connection->last_id;
338
+ }
339
+
340
+ function table($idf) {
341
+ return $idf;
342
+ }
343
+
344
+ function idf_escape($idf) {
345
+ return $idf;
346
+ }
347
+
348
+ function support($feature) {
349
+ return preg_match("~database|indexes~", $feature);
350
+ }
351
+
352
+ $jush = "mongo";
353
+ $operators = array("=");
354
+ $functions = array();
355
+ $grouping = array();
356
+ $edit_functions = array(array("json"));
357
+ }
adminer/adminer/adminer/drivers/mssql.inc.php ADDED
@@ -0,0 +1,641 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @author Jakub Cernohuby
4
+ * @author Vladimir Stastka
5
+ * @author Jakub Vrana
6
+ */
7
+
8
+ $drivers["mssql"] = "MS SQL";
9
+
10
+ if (isset($_GET["mssql"])) {
11
+ $possible_drivers = array("SQLSRV", "MSSQL");
12
+ define("DRIVER", "mssql");
13
+ if (extension_loaded("sqlsrv")) {
14
+ class Min_DB {
15
+ var $extension = "sqlsrv", $_link, $_result, $server_info, $affected_rows, $errno, $error;
16
+
17
+ function _get_error() {
18
+ $this->error = "";
19
+ foreach (sqlsrv_errors() as $error) {
20
+ $this->errno = $error["code"];
21
+ $this->error .= "$error[message]\n";
22
+ }
23
+ $this->error = rtrim($this->error);
24
+ }
25
+
26
+ function connect($server, $username, $password) {
27
+ $this->_link = @sqlsrv_connect($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'];
31
+ } else {
32
+ $this->_get_error();
33
+ }
34
+ return (bool) $this->_link;
35
+ }
36
+
37
+ function quote($string) {
38
+ return "'" . str_replace("'", "''", $string) . "'";
39
+ }
40
+
41
+ function select_db($database) {
42
+ return $this->query("USE " . idf_escape($database));
43
+ }
44
+
45
+ function query($query, $unbuffered = false) {
46
+ $result = sqlsrv_query($this->_link, $query); //! , array(), ($unbuffered ? array() : array("Scrollable" => "keyset"))
47
+ $this->error = "";
48
+ if (!$result) {
49
+ $this->_get_error();
50
+ return false;
51
+ }
52
+ return $this->store_result($result);
53
+ }
54
+
55
+ function multi_query($query) {
56
+ $this->_result = sqlsrv_query($this->_link, $query);
57
+ $this->error = "";
58
+ if (!$this->_result) {
59
+ $this->_get_error();
60
+ return false;
61
+ }
62
+ return true;
63
+ }
64
+
65
+ function store_result($result = null) {
66
+ if (!$result) {
67
+ $result = $this->_result;
68
+ }
69
+ if (!$result) {
70
+ return false;
71
+ }
72
+ if (sqlsrv_field_metadata($result)) {
73
+ return new Min_Result($result);
74
+ }
75
+ $this->affected_rows = sqlsrv_rows_affected($result);
76
+ return true;
77
+ }
78
+
79
+ function next_result() {
80
+ return $this->_result ? sqlsrv_next_result($this->_result) : null;
81
+ }
82
+
83
+ function result($query, $field = 0) {
84
+ $result = $this->query($query);
85
+ if (!is_object($result)) {
86
+ return false;
87
+ }
88
+ $row = $result->fetch_row();
89
+ return $row[$field];
90
+ }
91
+ }
92
+
93
+ class Min_Result {
94
+ var $_result, $_offset = 0, $_fields, $num_rows;
95
+
96
+ function __construct($result) {
97
+ $this->_result = $result;
98
+ // $this->num_rows = sqlsrv_num_rows($result); // available only in scrollable results
99
+ }
100
+
101
+ function _convert($row) {
102
+ foreach ((array) $row as $key => $val) {
103
+ if (is_a($val, 'DateTime')) {
104
+ $row[$key] = $val->format("Y-m-d H:i:s");
105
+ }
106
+ //! stream
107
+ }
108
+ return $row;
109
+ }
110
+
111
+ function fetch_assoc() {
112
+ return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_NEXT));
113
+ }
114
+
115
+ function fetch_row() {
116
+ return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_NUMERIC, SQLSRV_SCROLL_NEXT));
117
+ }
118
+
119
+ function fetch_field() {
120
+ if (!$this->_fields) {
121
+ $this->_fields = sqlsrv_field_metadata($this->_result);
122
+ }
123
+ $field = $this->_fields[$this->_offset++];
124
+ $return = new stdClass;
125
+ $return->name = $field["Name"];
126
+ $return->orgname = $field["Name"];
127
+ $return->type = ($field["Type"] == 1 ? 254 : 0);
128
+ return $return;
129
+ }
130
+
131
+ function seek($offset) {
132
+ for ($i=0; $i < $offset; $i++) {
133
+ sqlsrv_fetch($this->_result); // SQLSRV_SCROLL_ABSOLUTE added in sqlsrv 1.1
134
+ }
135
+ }
136
+
137
+ function __destruct() {
138
+ sqlsrv_free_stmt($this->_result);
139
+ }
140
+ }
141
+
142
+ } elseif (extension_loaded("mssql")) {
143
+ class Min_DB {
144
+ var $extension = "MSSQL", $_link, $_result, $server_info, $affected_rows, $error;
145
+
146
+ function connect($server, $username, $password) {
147
+ $this->_link = @mssql_connect($server, $username, $password);
148
+ if ($this->_link) {
149
+ $result = $this->query("SELECT SERVERPROPERTY('ProductLevel'), SERVERPROPERTY('Edition')");
150
+ $row = $result->fetch_row();
151
+ $this->server_info = $this->result("sp_server_info 2", 2) . " [$row[0]] $row[1]";
152
+ } else {
153
+ $this->error = mssql_get_last_message();
154
+ }
155
+ return (bool) $this->_link;
156
+ }
157
+
158
+ function quote($string) {
159
+ return "'" . str_replace("'", "''", $string) . "'";
160
+ }
161
+
162
+ function select_db($database) {
163
+ return mssql_select_db($database);
164
+ }
165
+
166
+ function query($query, $unbuffered = false) {
167
+ $result = mssql_query($query, $this->_link); //! $unbuffered
168
+ $this->error = "";
169
+ if (!$result) {
170
+ $this->error = mssql_get_last_message();
171
+ return false;
172
+ }
173
+ if ($result === true) {
174
+ $this->affected_rows = mssql_rows_affected($this->_link);
175
+ return true;
176
+ }
177
+ return new Min_Result($result);
178
+ }
179
+
180
+ function multi_query($query) {
181
+ return $this->_result = $this->query($query);
182
+ }
183
+
184
+ function store_result() {
185
+ return $this->_result;
186
+ }
187
+
188
+ function next_result() {
189
+ return mssql_next_result($this->_result);
190
+ }
191
+
192
+ function result($query, $field = 0) {
193
+ $result = $this->query($query);
194
+ if (!is_object($result)) {
195
+ return false;
196
+ }
197
+ return mssql_result($result->_result, 0, $field);
198
+ }
199
+ }
200
+
201
+ class Min_Result {
202
+ var $_result, $_offset = 0, $_fields, $num_rows;
203
+
204
+ function __construct($result) {
205
+ $this->_result = $result;
206
+ $this->num_rows = mssql_num_rows($result);
207
+ }
208
+
209
+ function fetch_assoc() {
210
+ return mssql_fetch_assoc($this->_result);
211
+ }
212
+
213
+ function fetch_row() {
214
+ return mssql_fetch_row($this->_result);
215
+ }
216
+
217
+ function num_rows() {
218
+ return mssql_num_rows($this->_result);
219
+ }
220
+
221
+ function fetch_field() {
222
+ $return = mssql_fetch_field($this->_result);
223
+ $return->orgtable = $return->table;
224
+ $return->orgname = $return->name;
225
+ return $return;
226
+ }
227
+
228
+ function seek($offset) {
229
+ mssql_data_seek($this->_result, $offset);
230
+ }
231
+
232
+ function __destruct() {
233
+ mssql_free_result($this->_result);
234
+ }
235
+ }
236
+
237
+ }
238
+
239
+
240
+
241
+ class Min_Driver extends Min_SQL {
242
+
243
+ function insertUpdate($table, $rows, $primary) {
244
+ foreach ($rows as $set) {
245
+ $update = array();
246
+ $where = array();
247
+ foreach ($set as $key => $val) {
248
+ $update[] = "$key = $val";
249
+ if (isset($primary[idf_unescape($key)])) {
250
+ $where[] = "$key = $val";
251
+ }
252
+ }
253
+ //! can use only one query for all rows
254
+ if (!queries("MERGE " . table($table) . " USING (VALUES(" . implode(", ", $set) . ")) AS source (c" . implode(", c", range(1, count($set))) . ") ON " . implode(" AND ", $where) //! source, c1 - possible conflict
255
+ . " WHEN MATCHED THEN UPDATE SET " . implode(", ", $update)
256
+ . " WHEN NOT MATCHED THEN INSERT (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ");" // ; is mandatory
257
+ )) {
258
+ return false;
259
+ }
260
+ }
261
+ return true;
262
+ }
263
+
264
+ function begin() {
265
+ return queries("BEGIN TRANSACTION");
266
+ }
267
+
268
+ }
269
+
270
+
271
+
272
+ function idf_escape($idf) {
273
+ return "[" . str_replace("]", "]]", $idf) . "]";
274
+ }
275
+
276
+ function table($idf) {
277
+ return ($_GET["ns"] != "" ? idf_escape($_GET["ns"]) . "." : "") . idf_escape($idf);
278
+ }
279
+
280
+ function connect() {
281
+ global $adminer;
282
+ $connection = new Min_DB;
283
+ $credentials = $adminer->credentials();
284
+ if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
285
+ return $connection;
286
+ }
287
+ return $connection->error;
288
+ }
289
+
290
+ function get_databases() {
291
+ return get_vals("EXEC sp_databases");
292
+ }
293
+
294
+ function limit($query, $where, $limit, $offset = 0, $separator = " ") {
295
+ return ($limit !== null ? " TOP (" . ($limit + $offset) . ")" : "") . " $query$where"; // seek later
296
+ }
297
+
298
+ function limit1($query, $where) {
299
+ return limit($query, $where, 1);
300
+ }
301
+
302
+ function db_collation($db, $collations) {
303
+ global $connection;
304
+ return $connection->result("SELECT collation_name FROM sys.databases WHERE name = " . q($db));
305
+ }
306
+
307
+ function engines() {
308
+ return array();
309
+ }
310
+
311
+ function logged_user() {
312
+ global $connection;
313
+ return $connection->result("SELECT SUSER_NAME()");
314
+ }
315
+
316
+ function tables_list() {
317
+ return get_key_vals("SELECT name, type_desc FROM sys.all_objects WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') ORDER BY name");
318
+ }
319
+
320
+ function count_tables($databases) {
321
+ global $connection;
322
+ $return = array();
323
+ foreach ($databases as $db) {
324
+ $connection->select_db($db);
325
+ $return[$db] = $connection->result("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES");
326
+ }
327
+ return $return;
328
+ }
329
+
330
+ function table_status($name = "") {
331
+ $return = array();
332
+ foreach (get_rows("SELECT name AS Name, type_desc AS Engine FROM sys.all_objects WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
333
+ if ($name != "") {
334
+ return $row;
335
+ }
336
+ $return[$row["Name"]] = $row;
337
+ }
338
+ return $return;
339
+ }
340
+
341
+ function is_view($table_status) {
342
+ return $table_status["Engine"] == "VIEW";
343
+ }
344
+
345
+ function fk_support($table_status) {
346
+ return true;
347
+ }
348
+
349
+ function fields($table) {
350
+ $return = array();
351
+ foreach (get_rows("SELECT c.*, t.name type, d.definition [default]
352
+ FROM sys.all_columns c
353
+ JOIN sys.all_objects o ON c.object_id = o.object_id
354
+ JOIN sys.types t ON c.user_type_id = t.user_type_id
355
+ LEFT JOIN sys.default_constraints d ON c.default_object_id = d.parent_column_id
356
+ WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U', 'V') AND o.name = " . q($table)
357
+ ) as $row) {
358
+ $type = $row["type"];
359
+ $length = (preg_match("~char|binary~", $type) ? $row["max_length"] : ($type == "decimal" ? "$row[precision],$row[scale]" : ""));
360
+ $return[$row["name"]] = array(
361
+ "field" => $row["name"],
362
+ "full_type" => $type . ($length ? "($length)" : ""),
363
+ "type" => $type,
364
+ "length" => $length,
365
+ "default" => $row["default"],
366
+ "null" => $row["is_nullable"],
367
+ "auto_increment" => $row["is_identity"],
368
+ "collation" => $row["collation_name"],
369
+ "privileges" => array("insert" => 1, "select" => 1, "update" => 1),
370
+ "primary" => $row["is_identity"], //! or indexes.is_primary_key
371
+ );
372
+ }
373
+ return $return;
374
+ }
375
+
376
+ function indexes($table, $connection2 = null) {
377
+ $return = array();
378
+ // sp_statistics doesn't return information about primary key
379
+ foreach (get_rows("SELECT i.name, key_ordinal, is_unique, is_primary_key, c.name AS column_name, is_descending_key
380
+ FROM sys.indexes i
381
+ INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
382
+ INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
383
+ WHERE OBJECT_NAME(i.object_id) = " . q($table)
384
+ , $connection2) as $row) {
385
+ $name = $row["name"];
386
+ $return[$name]["type"] = ($row["is_primary_key"] ? "PRIMARY" : ($row["is_unique"] ? "UNIQUE" : "INDEX"));
387
+ $return[$name]["lengths"] = array();
388
+ $return[$name]["columns"][$row["key_ordinal"]] = $row["column_name"];
389
+ $return[$name]["descs"][$row["key_ordinal"]] = ($row["is_descending_key"] ? '1' : null);
390
+ }
391
+ return $return;
392
+ }
393
+
394
+ function view($name) {
395
+ global $connection;
396
+ return array("select" => preg_replace('~^(?:[^[]|\\[[^]]*])*\\s+AS\\s+~isU', '', $connection->result("SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = SCHEMA_NAME() AND TABLE_NAME = " . q($name))));
397
+ }
398
+
399
+ function collations() {
400
+ $return = array();
401
+ foreach (get_vals("SELECT name FROM fn_helpcollations()") as $collation) {
402
+ $return[preg_replace('~_.*~', '', $collation)][] = $collation;
403
+ }
404
+ return $return;
405
+ }
406
+
407
+ function information_schema($db) {
408
+ return false;
409
+ }
410
+
411
+ function error() {
412
+ global $connection;
413
+ return nl_br(h(preg_replace('~^(\\[[^]]*])+~m', '', $connection->error)));
414
+ }
415
+
416
+ function create_database($db, $collation) {
417
+ return queries("CREATE DATABASE " . idf_escape($db) . (preg_match('~^[a-z0-9_]+$~i', $collation) ? " COLLATE $collation" : ""));
418
+ }
419
+
420
+ function drop_databases($databases) {
421
+ return queries("DROP DATABASE " . implode(", ", array_map('idf_escape', $databases)));
422
+ }
423
+
424
+ function rename_database($name, $collation) {
425
+ if (preg_match('~^[a-z0-9_]+$~i', $collation)) {
426
+ queries("ALTER DATABASE " . idf_escape(DB) . " COLLATE $collation");
427
+ }
428
+ queries("ALTER DATABASE " . idf_escape(DB) . " MODIFY NAME = " . idf_escape($name));
429
+ return true; //! false negative "The database name 'test2' has been set."
430
+ }
431
+
432
+ function auto_increment() {
433
+ return " IDENTITY" . ($_POST["Auto_increment"] != "" ? "(" . number($_POST["Auto_increment"]) . ",1)" : "") . " PRIMARY KEY";
434
+ }
435
+
436
+ function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
437
+ $alter = array();
438
+ foreach ($fields as $field) {
439
+ $column = idf_escape($field[0]);
440
+ $val = $field[1];
441
+ if (!$val) {
442
+ $alter["DROP"][] = " COLUMN $column";
443
+ } else {
444
+ $val[1] = preg_replace("~( COLLATE )'(\\w+)'~", "\\1\\2", $val[1]);
445
+ if ($field[0] == "") {
446
+ $alter["ADD"][] = "\n " . implode("", $val) . ($table == "" ? substr($foreign[$val[0]], 16 + strlen($val[0])) : ""); // 16 - strlen(" FOREIGN KEY ()")
447
+ } else {
448
+ unset($val[6]); //! identity can't be removed
449
+ if ($column != $val[0]) {
450
+ queries("EXEC sp_rename " . q(table($table) . ".$column") . ", " . q(idf_unescape($val[0])) . ", 'COLUMN'");
451
+ }
452
+ $alter["ALTER COLUMN " . implode("", $val)][] = "";
453
+ }
454
+ }
455
+ }
456
+ if ($table == "") {
457
+ return queries("CREATE TABLE " . table($name) . " (" . implode(",", (array) $alter["ADD"]) . "\n)");
458
+ }
459
+ if ($table != $name) {
460
+ queries("EXEC sp_rename " . q(table($table)) . ", " . q($name));
461
+ }
462
+ if ($foreign) {
463
+ $alter[""] = $foreign;
464
+ }
465
+ foreach ($alter as $key => $val) {
466
+ if (!queries("ALTER TABLE " . idf_escape($name) . " $key" . implode(",", $val))) {
467
+ return false;
468
+ }
469
+ }
470
+ return true;
471
+ }
472
+
473
+ function alter_indexes($table, $alter) {
474
+ $index = array();
475
+ $drop = array();
476
+ foreach ($alter as $val) {
477
+ if ($val[2] == "DROP") {
478
+ if ($val[0] == "PRIMARY") { //! sometimes used also for UNIQUE
479
+ $drop[] = idf_escape($val[1]);
480
+ } else {
481
+ $index[] = idf_escape($val[1]) . " ON " . table($table);
482
+ }
483
+ } elseif (!queries(($val[0] != "PRIMARY"
484
+ ? "CREATE $val[0] " . ($val[0] != "INDEX" ? "INDEX " : "") . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table)
485
+ : "ALTER TABLE " . table($table) . " ADD PRIMARY KEY"
486
+ ) . " (" . implode(", ", $val[2]) . ")")) {
487
+ return false;
488
+ }
489
+ }
490
+ return (!$index || queries("DROP INDEX " . implode(", ", $index)))
491
+ && (!$drop || queries("ALTER TABLE " . table($table) . " DROP " . implode(", ", $drop)))
492
+ ;
493
+ }
494
+
495
+ function last_id() {
496
+ global $connection;
497
+ return $connection->result("SELECT SCOPE_IDENTITY()"); // @@IDENTITY can return trigger INSERT
498
+ }
499
+
500
+ function explain($connection, $query) {
501
+ $connection->query("SET SHOWPLAN_ALL ON");
502
+ $return = $connection->query($query);
503
+ $connection->query("SET SHOWPLAN_ALL OFF"); // connection is used also for indexes
504
+ return $return;
505
+ }
506
+
507
+ function found_rows($table_status, $where) {
508
+ }
509
+
510
+ function foreign_keys($table) {
511
+ $return = array();
512
+ foreach (get_rows("EXEC sp_fkeys @fktable_name = " . q($table)) as $row) {
513
+ $foreign_key = &$return[$row["FK_NAME"]];
514
+ $foreign_key["table"] = $row["PKTABLE_NAME"];
515
+ $foreign_key["source"][] = $row["FKCOLUMN_NAME"];
516
+ $foreign_key["target"][] = $row["PKCOLUMN_NAME"];
517
+ }
518
+ return $return;
519
+ }
520
+
521
+ function truncate_tables($tables) {
522
+ return apply_queries("TRUNCATE TABLE", $tables);
523
+ }
524
+
525
+ function drop_views($views) {
526
+ return queries("DROP VIEW " . implode(", ", array_map('table', $views)));
527
+ }
528
+
529
+ function drop_tables($tables) {
530
+ return queries("DROP TABLE " . implode(", ", array_map('table', $tables)));
531
+ }
532
+
533
+ function move_tables($tables, $views, $target) {
534
+ return apply_queries("ALTER SCHEMA " . idf_escape($target) . " TRANSFER", array_merge($tables, $views));
535
+ }
536
+
537
+ function trigger($name) {
538
+ if ($name == "") {
539
+ return array();
540
+ }
541
+ $rows = get_rows("SELECT s.name [Trigger],
542
+ CASE WHEN OBJECTPROPERTY(s.id, 'ExecIsInsertTrigger') = 1 THEN 'INSERT' WHEN OBJECTPROPERTY(s.id, 'ExecIsUpdateTrigger') = 1 THEN 'UPDATE' WHEN OBJECTPROPERTY(s.id, 'ExecIsDeleteTrigger') = 1 THEN 'DELETE' END [Event],
543
+ CASE WHEN OBJECTPROPERTY(s.id, 'ExecIsInsteadOfTrigger') = 1 THEN 'INSTEAD OF' ELSE 'AFTER' END [Timing],
544
+ c.text
545
+ FROM sysobjects s
546
+ JOIN syscomments c ON s.id = c.id
547
+ WHERE s.xtype = 'TR' AND s.name = " . q($name)
548
+ ); // triggers are not schema-scoped
549
+ $return = reset($rows);
550
+ if ($return) {
551
+ $return["Statement"] = preg_replace('~^.+\\s+AS\\s+~isU', '', $return["text"]); //! identifiers, comments
552
+ }
553
+ return $return;
554
+ }
555
+
556
+ function triggers($table) {
557
+ $return = array();
558
+ foreach (get_rows("SELECT sys1.name,
559
+ CASE WHEN OBJECTPROPERTY(sys1.id, 'ExecIsInsertTrigger') = 1 THEN 'INSERT' WHEN OBJECTPROPERTY(sys1.id, 'ExecIsUpdateTrigger') = 1 THEN 'UPDATE' WHEN OBJECTPROPERTY(sys1.id, 'ExecIsDeleteTrigger') = 1 THEN 'DELETE' END [Event],
560
+ CASE WHEN OBJECTPROPERTY(sys1.id, 'ExecIsInsteadOfTrigger') = 1 THEN 'INSTEAD OF' ELSE 'AFTER' END [Timing]
561
+ FROM sysobjects sys1
562
+ JOIN sysobjects sys2 ON sys1.parent_obj = sys2.id
563
+ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
564
+ ) as $row) { // triggers are not schema-scoped
565
+ $return[$row["name"]] = array($row["Timing"], $row["Event"]);
566
+ }
567
+ return $return;
568
+ }
569
+
570
+ function trigger_options() {
571
+ return array(
572
+ "Timing" => array("AFTER", "INSTEAD OF"),
573
+ "Event" => array("INSERT", "UPDATE", "DELETE"),
574
+ "Type" => array("AS"),
575
+ );
576
+ }
577
+
578
+ function schemas() {
579
+ return get_vals("SELECT name FROM sys.schemas");
580
+ }
581
+
582
+ function get_schema() {
583
+ global $connection;
584
+ if ($_GET["ns"] != "") {
585
+ return $_GET["ns"];
586
+ }
587
+ return $connection->result("SELECT SCHEMA_NAME()");
588
+ }
589
+
590
+ function set_schema($schema) {
591
+ return true; // ALTER USER is permanent
592
+ }
593
+
594
+ function use_sql($database) {
595
+ return "USE " . idf_escape($database);
596
+ }
597
+
598
+ function show_variables() {
599
+ return array();
600
+ }
601
+
602
+ function show_status() {
603
+ return array();
604
+ }
605
+
606
+ function convert_field($field) {
607
+ }
608
+
609
+ function unconvert_field($field, $return) {
610
+ return $return;
611
+ }
612
+
613
+ function support($feature) {
614
+ return preg_match('~^(columns|database|drop_col|indexes|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
615
+ }
616
+
617
+ $jush = "mssql";
618
+ $types = array();
619
+ $structured_types = array();
620
+ foreach (array( //! use sys.types
621
+ lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "int" => 10, "bigint" => 20, "bit" => 1, "decimal" => 0, "real" => 12, "float" => 53, "smallmoney" => 10, "money" => 20),
622
+ lang('Date and time') => array("date" => 10, "smalldatetime" => 19, "datetime" => 19, "datetime2" => 19, "time" => 8, "datetimeoffset" => 10),
623
+ lang('Strings') => array("char" => 8000, "varchar" => 8000, "text" => 2147483647, "nchar" => 4000, "nvarchar" => 4000, "ntext" => 1073741823),
624
+ lang('Binary') => array("binary" => 8000, "varbinary" => 8000, "image" => 2147483647),
625
+ ) as $key => $val) {
626
+ $types += $val;
627
+ $structured_types[$key] = array_keys($val);
628
+ }
629
+ $unsigned = array();
630
+ $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL");
631
+ $functions = array("len", "lower", "round", "upper");
632
+ $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
633
+ $edit_functions = array(
634
+ array(
635
+ "date|time" => "getdate",
636
+ ), array(
637
+ "int|decimal|real|float|money|datetime" => "+/-",
638
+ "char|text" => "+",
639
+ )
640
+ );
641
+ }
adminer/adminer/adminer/drivers/mysql.inc.php ADDED
@@ -0,0 +1,1057 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $drivers = array("server" => "MySQL") + $drivers;
3
+
4
+ if (!defined("DRIVER")) {
5
+ $possible_drivers = array("MySQLi", "MySQL", "PDO_MySQL");
6
+ define("DRIVER", "server"); // server - backwards compatibility
7
+ // MySQLi supports everything, MySQL doesn't support multiple result sets, PDO_MySQL doesn't support orgtable
8
+ if (extension_loaded("mysqli")) {
9
+ class Min_DB extends MySQLi {
10
+ var $extension = "MySQLi";
11
+
12
+ function __construct() {
13
+ parent::init();
14
+ }
15
+
16
+ function connect($server = "", $username = "", $password = "", $database = null, $port = null, $socket = null) {
17
+ mysqli_report(MYSQLI_REPORT_OFF); // stays between requests, not required since PHP 5.3.4
18
+ list($host, $port) = explode(":", $server, 2); // part after : is used for port or socket
19
+ $return = @$this->real_connect(
20
+ ($server != "" ? $host : ini_get("mysqli.default_host")),
21
+ ($server . $username != "" ? $username : ini_get("mysqli.default_user")),
22
+ ($server . $username . $password != "" ? $password : ini_get("mysqli.default_pw")),
23
+ $database,
24
+ (is_numeric($port) ? $port : ini_get("mysqli.default_port")),
25
+ (!is_numeric($port) ? $port : $socket)
26
+ );
27
+ return $return;
28
+ }
29
+
30
+ function set_charset($charset) {
31
+ if (parent::set_charset($charset)) {
32
+ return true;
33
+ }
34
+ // the client library may not support utf8mb4
35
+ parent::set_charset('utf8');
36
+ return $this->query("SET NAMES $charset");
37
+ }
38
+
39
+ function result($query, $field = 0) {
40
+ $result = $this->query($query);
41
+ if (!$result) {
42
+ return false;
43
+ }
44
+ $row = $result->fetch_array();
45
+ return $row[$field];
46
+ }
47
+
48
+ function quote($string) {
49
+ return "'" . $this->escape_string($string) . "'";
50
+ }
51
+ }
52
+
53
+ } elseif (extension_loaded("mysql") && !(ini_get("sql.safe_mode") && extension_loaded("pdo_mysql"))) {
54
+ class Min_DB {
55
+ var
56
+ $extension = "MySQL", ///< @var string extension name
57
+ $server_info, ///< @var string server version
58
+ $affected_rows, ///< @var int number of affected rows
59
+ $errno, ///< @var int last error code
60
+ $error, ///< @var string last error message
61
+ $_link, $_result ///< @access private
62
+ ;
63
+
64
+ /** Connect to server
65
+ * @param string
66
+ * @param string
67
+ * @param string
68
+ * @return bool
69
+ */
70
+ function connect($server, $username, $password) {
71
+ $this->_link = @mysql_connect(
72
+ ($server != "" ? $server : ini_get("mysql.default_host")),
73
+ ("$server$username" != "" ? $username : ini_get("mysql.default_user")),
74
+ ("$server$username$password" != "" ? $password : ini_get("mysql.default_password")),
75
+ true,
76
+ 131072 // CLIENT_MULTI_RESULTS for CALL
77
+ );
78
+ if ($this->_link) {
79
+ $this->server_info = mysql_get_server_info($this->_link);
80
+ } else {
81
+ $this->error = mysql_error();
82
+ }
83
+ return (bool) $this->_link;
84
+ }
85
+
86
+ /** Sets the client character set
87
+ * @param string
88
+ * @return bool
89
+ */
90
+ function set_charset($charset) {
91
+ if (function_exists('mysql_set_charset')) {
92
+ if (mysql_set_charset($charset, $this->_link)) {
93
+ return true;
94
+ }
95
+ // the client library may not support utf8mb4
96
+ mysql_set_charset('utf8', $this->_link);
97
+ }
98
+ return $this->query("SET NAMES $charset");
99
+ }
100
+
101
+ /** Quote string to use in SQL
102
+ * @param string
103
+ * @return string escaped string enclosed in '
104
+ */
105
+ function quote($string) {
106
+ return "'" . mysql_real_escape_string($string, $this->_link) . "'";
107
+ }
108
+
109
+ /** Select database
110
+ * @param string
111
+ * @return bool
112
+ */
113
+ function select_db($database) {
114
+ return mysql_select_db($database, $this->_link);
115
+ }
116
+
117
+ /** Send query
118
+ * @param string
119
+ * @param bool
120
+ * @return mixed bool or Min_Result
121
+ */
122
+ function query($query, $unbuffered = false) {
123
+ $result = @($unbuffered ? mysql_unbuffered_query($query, $this->_link) : mysql_query($query, $this->_link)); // @ - mute mysql.trace_mode
124
+ $this->error = "";
125
+ if (!$result) {
126
+ $this->errno = mysql_errno($this->_link);
127
+ $this->error = mysql_error($this->_link);
128
+ return false;
129
+ }
130
+ if ($result === true) {
131
+ $this->affected_rows = mysql_affected_rows($this->_link);
132
+ $this->info = mysql_info($this->_link);
133
+ return true;
134
+ }
135
+ return new Min_Result($result);
136
+ }
137
+
138
+ /** Send query with more resultsets
139
+ * @param string
140
+ * @return bool
141
+ */
142
+ function multi_query($query) {
143
+ return $this->_result = $this->query($query);
144
+ }
145
+
146
+ /** Get current resultset
147
+ * @return Min_Result
148
+ */
149
+ function store_result() {
150
+ return $this->_result;
151
+ }
152
+
153
+ /** Fetch next resultset
154
+ * @return bool
155
+ */
156
+ function next_result() {
157
+ // MySQL extension doesn't support multiple results
158
+ return false;
159
+ }
160
+
161
+ /** Get single field from result
162
+ * @param string
163
+ * @param int
164
+ * @return string
165
+ */
166
+ function result($query, $field = 0) {
167
+ $result = $this->query($query);
168
+ if (!$result || !$result->num_rows) {
169
+ return false;
170
+ }
171
+ return mysql_result($result->_result, 0, $field);
172
+ }
173
+ }
174
+
175
+ class Min_Result {
176
+ var
177
+ $num_rows, ///< @var int number of rows in the result
178
+ $_result, $_offset = 0 ///< @access private
179
+ ;
180
+
181
+ /** Constructor
182
+ * @param resource
183
+ */
184
+ function __construct($result) {
185
+ $this->_result = $result;
186
+ $this->num_rows = mysql_num_rows($result);
187
+ }
188
+
189
+ /** Fetch next row as associative array
190
+ * @return array
191
+ */
192
+ function fetch_assoc() {
193
+ return mysql_fetch_assoc($this->_result);
194
+ }
195
+
196
+ /** Fetch next row as numbered array
197
+ * @return array
198
+ */
199
+ function fetch_row() {
200
+ return mysql_fetch_row($this->_result);
201
+ }
202
+
203
+ /** Fetch next field
204
+ * @return object properties: name, type, orgtable, orgname, charsetnr
205
+ */
206
+ function fetch_field() {
207
+ $return = mysql_fetch_field($this->_result, $this->_offset++); // offset required under certain conditions
208
+ $return->orgtable = $return->table;
209
+ $return->orgname = $return->name;
210
+ $return->charsetnr = ($return->blob ? 63 : 0);
211
+ return $return;
212
+ }
213
+
214
+ /** Free result set
215
+ */
216
+ function __destruct() {
217
+ mysql_free_result($this->_result);
218
+ }
219
+ }
220
+
221
+ } elseif (extension_loaded("pdo_mysql")) {
222
+ class Min_DB extends Min_PDO {
223
+ var $extension = "PDO_MySQL";
224
+
225
+ function connect($server, $username, $password) {
226
+ $this->dsn("mysql:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\\d)~', ';port=\\1', $server)), $username, $password);
227
+ return true;
228
+ }
229
+
230
+ function set_charset($charset) {
231
+ $this->query("SET NAMES $charset"); // charset in DSN is ignored before PHP 5.3.6
232
+ }
233
+
234
+ function select_db($database) {
235
+ // database selection is separated from the connection so dbname in DSN can't be used
236
+ return $this->query("USE " . idf_escape($database));
237
+ }
238
+
239
+ function query($query, $unbuffered = false) {
240
+ $this->setAttribute(1000, !$unbuffered); // 1000 - PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
241
+ return parent::query($query, $unbuffered);
242
+ }
243
+ }
244
+
245
+ }
246
+
247
+
248
+
249
+ class Min_Driver extends Min_SQL {
250
+
251
+ function insert($table, $set) {
252
+ return ($set ? parent::insert($table, $set) : queries("INSERT INTO " . table($table) . " ()\nVALUES ()"));
253
+ }
254
+
255
+ function insertUpdate($table, $rows, $primary) {
256
+ $columns = array_keys(reset($rows));
257
+ $prefix = "INSERT INTO " . table($table) . " (" . implode(", ", $columns) . ") VALUES\n";
258
+ $values = array();
259
+ foreach ($columns as $key) {
260
+ $values[$key] = "$key = VALUES($key)";
261
+ }
262
+ $suffix = "\nON DUPLICATE KEY UPDATE " . implode(", ", $values);
263
+ $values = array();
264
+ $length = 0;
265
+ foreach ($rows as $set) {
266
+ $value = "(" . implode(", ", $set) . ")";
267
+ if ($values && (strlen($prefix) + $length + strlen($value) + strlen($suffix) > 1e6)) { // 1e6 - default max_allowed_packet
268
+ if (!queries($prefix . implode(",\n", $values) . $suffix)) {
269
+ return false;
270
+ }
271
+ $values = array();
272
+ $length = 0;
273
+ }
274
+ $values[] = $value;
275
+ $length += strlen($value) + 2; // 2 - strlen(",\n")
276
+ }
277
+ return queries($prefix . implode(",\n", $values) . $suffix);
278
+ }
279
+
280
+ }
281
+
282
+
283
+
284
+ /** Escape database identifier
285
+ * @param string
286
+ * @return string
287
+ */
288
+ function idf_escape($idf) {
289
+ return "`" . str_replace("`", "``", $idf) . "`";
290
+ }
291
+
292
+ /** Get escaped table name
293
+ * @param string
294
+ * @return string
295
+ */
296
+ function table($idf) {
297
+ return idf_escape($idf);
298
+ }
299
+
300
+ /** Connect to the database
301
+ * @return mixed Min_DB or string for error
302
+ */
303
+ function connect() {
304
+ global $adminer;
305
+ $connection = new Min_DB;
306
+ $credentials = $adminer->credentials();
307
+ if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
308
+ $connection->set_charset(charset($connection)); // available in MySQLi since PHP 5.0.5
309
+ $connection->query("SET sql_quote_show_create = 1, autocommit = 1");
310
+ return $connection;
311
+ }
312
+ $return = $connection->error;
313
+ if (function_exists('iconv') && !is_utf8($return) && strlen($s = iconv("windows-1250", "utf-8", $return)) > strlen($return)) { // windows-1250 - most common Windows encoding
314
+ $return = $s;
315
+ }
316
+ return $return;
317
+ }
318
+
319
+ /** Get cached list of databases
320
+ * @param bool
321
+ * @return array
322
+ */
323
+ function get_databases($flush) {
324
+ global $connection;
325
+ // SHOW DATABASES can take a very long time so it is cached
326
+ $return = get_session("dbs");
327
+ if ($return === null) {
328
+ $query = ($connection->server_info >= 5
329
+ ? "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA"
330
+ : "SHOW DATABASES"
331
+ ); // SHOW DATABASES can be disabled by skip_show_database
332
+ $return = ($flush ? slow_query($query) : get_vals($query));
333
+ restart_session();
334
+ set_session("dbs", $return);
335
+ stop_session();
336
+ }
337
+ return $return;
338
+ }
339
+
340
+ /** Formulate SQL query with limit
341
+ * @param string everything after SELECT
342
+ * @param string including WHERE
343
+ * @param int
344
+ * @param int
345
+ * @param string
346
+ * @return string
347
+ */
348
+ function limit($query, $where, $limit, $offset = 0, $separator = " ") {
349
+ return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
350
+ }
351
+
352
+ /** Formulate SQL modification query with limit 1
353
+ * @param string everything after UPDATE or DELETE
354
+ * @param string
355
+ * @return string
356
+ */
357
+ function limit1($query, $where) {
358
+ return limit($query, $where, 1);
359
+ }
360
+
361
+ /** Get database collation
362
+ * @param string
363
+ * @param array result of collations()
364
+ * @return string
365
+ */
366
+ function db_collation($db, $collations) {
367
+ global $connection;
368
+ $return = null;
369
+ $create = $connection->result("SHOW CREATE DATABASE " . idf_escape($db), 1);
370
+ if (preg_match('~ COLLATE ([^ ]+)~', $create, $match)) {
371
+ $return = $match[1];
372
+ } elseif (preg_match('~ CHARACTER SET ([^ ]+)~', $create, $match)) {
373
+ // default collation
374
+ $return = $collations[$match[1]][-1];
375
+ }
376
+ return $return;
377
+ }
378
+
379
+ /** Get supported engines
380
+ * @return array
381
+ */
382
+ function engines() {
383
+ $return = array();
384
+ foreach (get_rows("SHOW ENGINES") as $row) {
385
+ if (preg_match("~YES|DEFAULT~", $row["Support"])) {
386
+ $return[] = $row["Engine"];
387
+ }
388
+ }
389
+ return $return;
390
+ }
391
+
392
+ /** Get logged user
393
+ * @return string
394
+ */
395
+ function logged_user() {
396
+ global $connection;
397
+ return $connection->result("SELECT USER()");
398
+ }
399
+
400
+ /** Get tables list
401
+ * @return array array($name => $type)
402
+ */
403
+ function tables_list() {
404
+ global $connection;
405
+ return get_key_vals($connection->server_info >= 5
406
+ ? "SELECT TABLE_NAME, TABLE_TYPE FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() ORDER BY TABLE_NAME"
407
+ : "SHOW TABLES"
408
+ );
409
+ }
410
+
411
+ /** Count tables in all databases
412
+ * @param array
413
+ * @return array array($db => $tables)
414
+ */
415
+ function count_tables($databases) {
416
+ $return = array();
417
+ foreach ($databases as $db) {
418
+ $return[$db] = count(get_vals("SHOW TABLES IN " . idf_escape($db)));
419
+ }
420
+ return $return;
421
+ }
422
+
423
+ /** Get table status
424
+ * @param string
425
+ * @param bool return only "Name", "Engine" and "Comment" fields
426
+ * @return array array($name => array("Name" => , "Engine" => , "Comment" => , "Oid" => , "Rows" => , "Collation" => , "Auto_increment" => , "Data_length" => , "Index_length" => , "Data_free" => )) or only inner array with $name
427
+ */
428
+ function table_status($name = "", $fast = false) {
429
+ global $connection;
430
+ $return = array();
431
+ foreach (get_rows($fast && $connection->server_info >= 5
432
+ ? "SELECT TABLE_NAME AS Name, Engine, TABLE_COMMENT AS Comment FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() " . ($name != "" ? "AND TABLE_NAME = " . q($name) : "ORDER BY Name")
433
+ : "SHOW TABLE STATUS" . ($name != "" ? " LIKE " . q(addcslashes($name, "%_\\")) : "")
434
+ ) as $row) {
435
+ if ($row["Engine"] == "InnoDB") {
436
+ // ignore internal comment, unnecessary since MySQL 5.1.21
437
+ $row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]);
438
+ }
439
+ if (!isset($row["Engine"])) {
440
+ $row["Comment"] = "";
441
+ }
442
+ if ($name != "") {
443
+ return $row;
444
+ }
445
+ $return[$row["Name"]] = $row;
446
+ }
447
+ return $return;
448
+ }
449
+
450
+ /** Find out whether the identifier is view
451
+ * @param array
452
+ * @return bool
453
+ */
454
+ function is_view($table_status) {
455
+ return $table_status["Engine"] === null;
456
+ }
457
+
458
+ /** Check if table supports foreign keys
459
+ * @param array result of table_status
460
+ * @return bool
461
+ */
462
+ function fk_support($table_status) {
463
+ global $connection;
464
+ return preg_match('~InnoDB|IBMDB2I~i', $table_status["Engine"])
465
+ || (preg_match('~NDB~i', $table_status["Engine"]) && version_compare($connection->server_info, '5.6') >= 0);
466
+ }
467
+
468
+ /** Get information about fields
469
+ * @param string
470
+ * @return array array($name => array("field" => , "full_type" => , "type" => , "length" => , "unsigned" => , "default" => , "null" => , "auto_increment" => , "on_update" => , "collation" => , "privileges" => , "comment" => , "primary" => ))
471
+ */
472
+ function fields($table) {
473
+ $return = array();
474
+ foreach (get_rows("SHOW FULL COLUMNS FROM " . table($table)) as $row) {
475
+ preg_match('~^([^( ]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match);
476
+ $return[$row["Field"]] = array(
477
+ "field" => $row["Field"],
478
+ "full_type" => $row["Type"],
479
+ "type" => $match[1],
480
+ "length" => $match[2],
481
+ "unsigned" => ltrim($match[3] . $match[4]),
482
+ "default" => ($row["Default"] != "" || preg_match("~char|set~", $match[1]) ? $row["Default"] : null),
483
+ "null" => ($row["Null"] == "YES"),
484
+ "auto_increment" => ($row["Extra"] == "auto_increment"),
485
+ "on_update" => (preg_match('~^on update (.+)~i', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23
486
+ "collation" => $row["Collation"],
487
+ "privileges" => array_flip(preg_split('~, *~', $row["Privileges"])),
488
+ "comment" => $row["Comment"],
489
+ "primary" => ($row["Key"] == "PRI"),
490
+ );
491
+ }
492
+ return $return;
493
+ }
494
+
495
+ /** Get table indexes
496
+ * @param string
497
+ * @param string Min_DB to use
498
+ * @return array array($key_name => array("type" => , "columns" => array(), "lengths" => array(), "descs" => array()))
499
+ */
500
+ function indexes($table, $connection2 = null) {
501
+ $return = array();
502
+ foreach (get_rows("SHOW INDEX FROM " . table($table), $connection2) as $row) {
503
+ $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE")));
504
+ $return[$row["Key_name"]]["columns"][] = $row["Column_name"];
505
+ $return[$row["Key_name"]]["lengths"][] = $row["Sub_part"];
506
+ $return[$row["Key_name"]]["descs"][] = null;
507
+ }
508
+ return $return;
509
+ }
510
+
511
+ /** Get foreign keys in table
512
+ * @param string
513
+ * @return array array($name => array("db" => , "ns" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => ))
514
+ */
515
+ function foreign_keys($table) {
516
+ global $connection, $on_actions;
517
+ static $pattern = '`(?:[^`]|``)+`';
518
+ $return = array();
519
+ $create_table = $connection->result("SHOW CREATE TABLE " . table($table), 1);
520
+ if ($create_table) {
521
+ preg_match_all("~CONSTRAINT ($pattern) FOREIGN KEY ?\\(((?:$pattern,? ?)+)\\) REFERENCES ($pattern)(?:\\.($pattern))? \\(((?:$pattern,? ?)+)\\)(?: ON DELETE ($on_actions))?(?: ON UPDATE ($on_actions))?~", $create_table, $matches, PREG_SET_ORDER);
522
+ foreach ($matches as $match) {
523
+ preg_match_all("~$pattern~", $match[2], $source);
524
+ preg_match_all("~$pattern~", $match[5], $target);
525
+ $return[idf_unescape($match[1])] = array(
526
+ "db" => idf_unescape($match[4] != "" ? $match[3] : $match[4]),
527
+ "table" => idf_unescape($match[4] != "" ? $match[4] : $match[3]),
528
+ "source" => array_map('idf_unescape', $source[0]),
529
+ "target" => array_map('idf_unescape', $target[0]),
530
+ "on_delete" => ($match[6] ? $match[6] : "RESTRICT"),
531
+ "on_update" => ($match[7] ? $match[7] : "RESTRICT"),
532
+ );
533
+ }
534
+ }
535
+ return $return;
536
+ }
537
+
538
+ /** Get view SELECT
539
+ * @param string
540
+ * @return array array("select" => )
541
+ */
542
+ function view($name) {
543
+ global $connection;
544
+ return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)*\\s+AS\\s+~isU', '', $connection->result("SHOW CREATE VIEW " . table($name), 1)));
545
+ }
546
+
547
+ /** Get sorted grouped list of collations
548
+ * @return array
549
+ */
550
+ function collations() {
551
+ $return = array();
552
+ foreach (get_rows("SHOW COLLATION") as $row) {
553
+ if ($row["Default"]) {
554
+ $return[$row["Charset"]][-1] = $row["Collation"];
555
+ } else {
556
+ $return[$row["Charset"]][] = $row["Collation"];
557
+ }
558
+ }
559
+ ksort($return);
560
+ foreach ($return as $key => $val) {
561
+ asort($return[$key]);
562
+ }
563
+ return $return;
564
+ }
565
+
566
+ /** Find out if database is information_schema
567
+ * @param string
568
+ * @return bool
569
+ */
570
+ function information_schema($db) {
571
+ global $connection;
572
+ return ($connection->server_info >= 5 && $db == "information_schema")
573
+ || ($connection->server_info >= 5.5 && $db == "performance_schema");
574
+ }
575
+
576
+ /** Get escaped error message
577
+ * @return string
578
+ */
579
+ function error() {
580
+ global $connection;
581
+ return h(preg_replace('~^You have an error.*syntax to use~U', "Syntax error", $connection->error));
582
+ }
583
+
584
+ /** Create database
585
+ * @param string
586
+ * @param string
587
+ * @return string
588
+ */
589
+ function create_database($db, $collation) {
590
+ return queries("CREATE DATABASE " . idf_escape($db) . ($collation ? " COLLATE " . q($collation) : ""));
591
+ }
592
+
593
+ /** Drop databases
594
+ * @param array
595
+ * @return bool
596
+ */
597
+ function drop_databases($databases) {
598
+ $return = apply_queries("DROP DATABASE", $databases, 'idf_escape');
599
+ restart_session();
600
+ set_session("dbs", null);
601
+ return $return;
602
+ }
603
+
604
+ /** Rename database from DB
605
+ * @param string new name
606
+ * @param string
607
+ * @return bool
608
+ */
609
+ function rename_database($name, $collation) {
610
+ $return = false;
611
+ if (create_database($name, $collation)) {
612
+ //! move triggers
613
+ $rename = array();
614
+ foreach (tables_list() as $table => $type) {
615
+ $rename[] = table($table) . " TO " . idf_escape($name) . "." . table($table);
616
+ }
617
+ $return = (!$rename || queries("RENAME TABLE " . implode(", ", $rename)));
618
+ if ($return) {
619
+ queries("DROP DATABASE " . idf_escape(DB));
620
+ }
621
+ restart_session();
622
+ set_session("dbs", null);
623
+ }
624
+ return $return;
625
+ }
626
+
627
+ /** Generate modifier for auto increment column
628
+ * @return string
629
+ */
630
+ function auto_increment() {
631
+ $auto_increment_index = " PRIMARY KEY";
632
+ // don't overwrite primary key by auto_increment
633
+ if ($_GET["create"] != "" && $_POST["auto_increment_col"]) {
634
+ foreach (indexes($_GET["create"]) as $index) {
635
+ if (in_array($_POST["fields"][$_POST["auto_increment_col"]]["orig"], $index["columns"], true)) {
636
+ $auto_increment_index = "";
637
+ break;
638
+ }
639
+ if ($index["type"] == "PRIMARY") {
640
+ $auto_increment_index = " UNIQUE";
641
+ }
642
+ }
643
+ }
644
+ return " AUTO_INCREMENT$auto_increment_index";
645
+ }
646
+
647
+ /** Run commands to create or alter table
648
+ * @param string "" to create
649
+ * @param string new name
650
+ * @param array of array($orig, $process_field, $after)
651
+ * @param array of strings
652
+ * @param string
653
+ * @param string
654
+ * @param string
655
+ * @param string number
656
+ * @param string
657
+ * @return bool
658
+ */
659
+ function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
660
+ $alter = array();
661
+ foreach ($fields as $field) {
662
+ $alter[] = ($field[1]
663
+ ? ($table != "" ? ($field[0] != "" ? "CHANGE " . idf_escape($field[0]) : "ADD") : " ") . " " . implode($field[1]) . ($table != "" ? $field[2] : "")
664
+ : "DROP " . idf_escape($field[0])
665
+ );
666
+ }
667
+ $alter = array_merge($alter, $foreign);
668
+ $status = ($comment !== null ? " COMMENT=" . q($comment) : "")
669
+ . ($engine ? " ENGINE=" . q($engine) : "")
670
+ . ($collation ? " COLLATE " . q($collation) : "")
671
+ . ($auto_increment != "" ? " AUTO_INCREMENT=$auto_increment" : "")
672
+ ;
673
+ if ($table == "") {
674
+ return queries("CREATE TABLE " . table($name) . " (\n" . implode(",\n", $alter) . "\n)$status$partitioning");
675
+ }
676
+ if ($table != $name) {
677
+ $alter[] = "RENAME TO " . table($name);
678
+ }
679
+ if ($status) {
680
+ $alter[] = ltrim($status);
681
+ }
682
+ return ($alter || $partitioning ? queries("ALTER TABLE " . table($table) . "\n" . implode(",\n", $alter) . $partitioning) : true);
683
+ }
684
+
685
+ /** Run commands to alter indexes
686
+ * @param string escaped table name
687
+ * @param array of array("index type", "name", array("column definition", ...)) or array("index type", "name", "DROP")
688
+ * @return bool
689
+ */
690
+ function alter_indexes($table, $alter) {
691
+ foreach ($alter as $key => $val) {
692
+ $alter[$key] = ($val[2] == "DROP"
693
+ ? "\nDROP INDEX " . idf_escape($val[1])
694
+ : "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . ($val[1] != "" ? idf_escape($val[1]) . " " : "") . "(" . implode(", ", $val[2]) . ")"
695
+ );
696
+ }
697
+ return queries("ALTER TABLE " . table($table) . implode(",", $alter));
698
+ }
699
+
700
+ /** Run commands to truncate tables
701
+ * @param array
702
+ * @return bool
703
+ */
704
+ function truncate_tables($tables) {
705
+ return apply_queries("TRUNCATE TABLE", $tables);
706
+ }
707
+
708
+ /** Drop views
709
+ * @param array
710
+ * @return bool
711
+ */
712
+ function drop_views($views) {
713
+ return queries("DROP VIEW " . implode(", ", array_map('table', $views)));
714
+ }
715
+
716
+ /** Drop tables
717
+ * @param array
718
+ * @return bool
719
+ */
720
+ function drop_tables($tables) {
721
+ return queries("DROP TABLE " . implode(", ", array_map('table', $tables)));
722
+ }
723
+
724
+ /** Move tables to other schema
725
+ * @param array
726
+ * @param array
727
+ * @param string
728
+ * @return bool
729
+ */
730
+ function move_tables($tables, $views, $target) {
731
+ $rename = array();
732
+ foreach (array_merge($tables, $views) as $table) { // views will report SQL error
733
+ $rename[] = table($table) . " TO " . idf_escape($target) . "." . table($table);
734
+ }
735
+ return queries("RENAME TABLE " . implode(", ", $rename));
736
+ //! move triggers
737
+ }
738
+
739
+ /** Copy tables to other schema
740
+ * @param array
741
+ * @param array
742
+ * @param string
743
+ * @return bool
744
+ */
745
+ function copy_tables($tables, $views, $target) {
746
+ queries("SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'");
747
+ foreach ($tables as $table) {
748
+ $name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
749
+ if (!queries("\nDROP TABLE IF EXISTS $name")
750
+ || !queries("CREATE TABLE $name LIKE " . table($table))
751
+ || !queries("INSERT INTO $name SELECT * FROM " . table($table))
752
+ ) {
753
+ return false;
754
+ }
755
+ }
756
+ foreach ($views as $table) {
757
+ $name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
758
+ $view = view($table);
759
+ if (!queries("DROP VIEW IF EXISTS $name")
760
+ || !queries("CREATE VIEW $name AS $view[select]") //! USE to avoid db.table
761
+ ) {
762
+ return false;
763
+ }
764
+ }
765
+ return true;
766
+ }
767
+
768
+ /** Get information about trigger
769
+ * @param string trigger name
770
+ * @return array array("Trigger" => , "Timing" => , "Event" => , "Of" => , "Type" => , "Statement" => )
771
+ */
772
+ function trigger($name) {
773
+ if ($name == "") {
774
+ return array();
775
+ }
776
+ $rows = get_rows("SHOW TRIGGERS WHERE `Trigger` = " . q($name));
777
+ return reset($rows);
778
+ }
779
+
780
+ /** Get defined triggers
781
+ * @param string
782
+ * @return array array($name => array($timing, $event))
783
+ */
784
+ function triggers($table) {
785
+ $return = array();
786
+ foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_\\"))) as $row) {
787
+ $return[$row["Trigger"]] = array($row["Timing"], $row["Event"]);
788
+ }
789
+ return $return;
790
+ }
791
+
792
+ /** Get trigger options
793
+ * @return array ("Timing" => array(), "Event" => array(), "Type" => array())
794
+ */
795
+ function trigger_options() {
796
+ return array(
797
+ "Timing" => array("BEFORE", "AFTER"),
798
+ "Event" => array("INSERT", "UPDATE", "DELETE"),
799
+ "Type" => array("FOR EACH ROW"),
800
+ );
801
+ }
802
+
803
+ /** Get information about stored routine
804
+ * @param string
805
+ * @param string "FUNCTION" or "PROCEDURE"
806
+ * @return array ("fields" => array("field" => , "type" => , "length" => , "unsigned" => , "inout" => , "collation" => ), "returns" => , "definition" => , "language" => )
807
+ */
808
+ function routine($name, $type) {
809
+ global $connection, $enum_length, $inout, $types;
810
+ $aliases = array("bool", "boolean", "integer", "double precision", "real", "dec", "numeric", "fixed", "national char", "national varchar");
811
+ $type_pattern = "((" . implode("|", array_merge(array_keys($types), $aliases)) . ")\\b(?:\\s*\\(((?:[^'\")]|$enum_length)++)\\))?\\s*(zerofill\\s*)?(unsigned(?:\\s+zerofill)?)?)(?:\\s*(?:CHARSET|CHARACTER\\s+SET)\\s*['\"]?([^'\"\\s,]+)['\"]?)?";
812
+ $pattern = "\\s*(" . ($type == "FUNCTION" ? "" : $inout) . ")?\\s*(?:`((?:[^`]|``)*)`\\s*|\\b(\\S+)\\s+)$type_pattern";
813
+ $create = $connection->result("SHOW CREATE $type " . idf_escape($name), 2);
814
+ preg_match("~\\(((?:$pattern\\s*,?)*)\\)\\s*" . ($type == "FUNCTION" ? "RETURNS\\s+$type_pattern\\s+" : "") . "(.*)~is", $create, $match);
815
+ $fields = array();
816
+ preg_match_all("~$pattern\\s*,?~is", $match[1], $matches, PREG_SET_ORDER);
817
+ foreach ($matches as $param) {
818
+ $name = str_replace("``", "`", $param[2]) . $param[3];
819
+ $fields[] = array(
820
+ "field" => $name,
821
+ "type" => strtolower($param[5]),
822
+ "length" => preg_replace_callback("~$enum_length~s", 'normalize_enum', $param[6]),
823
+ "unsigned" => strtolower(preg_replace('~\\s+~', ' ', trim("$param[8] $param[7]"))),
824
+ "null" => 1,
825
+ "full_type" => $param[4],
826
+ "inout" => strtoupper($param[1]),
827
+ "collation" => strtolower($param[9]),
828
+ );
829
+ }
830
+ if ($type != "FUNCTION") {
831
+ return array("fields" => $fields, "definition" => $match[11]);
832
+ }
833
+ return array(
834
+ "fields" => $fields,
835
+ "returns" => array("type" => $match[12], "length" => $match[13], "unsigned" => $match[15], "collation" => $match[16]),
836
+ "definition" => $match[17],
837
+ "language" => "SQL", // available in information_schema.ROUTINES.PARAMETER_STYLE
838
+ );
839
+ }
840
+
841
+ /** Get list of routines
842
+ * @return array ("ROUTINE_TYPE" => , "ROUTINE_NAME" => , "DTD_IDENTIFIER" => )
843
+ */
844
+ function routines() {
845
+ return get_rows("SELECT ROUTINE_NAME, ROUTINE_TYPE, DTD_IDENTIFIER FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = " . q(DB));
846
+ }
847
+
848
+ /** Get list of available routine languages
849
+ * @return array
850
+ */
851
+ function routine_languages() {
852
+ return array(); // "SQL" not required
853
+ }
854
+
855
+ /** Get last auto increment ID
856
+ * @return string
857
+ */
858
+ function last_id() {
859
+ global $connection;
860
+ return $connection->result("SELECT LAST_INSERT_ID()"); // mysql_insert_id() truncates bigint
861
+ }
862
+
863
+ /** Explain select
864
+ * @param Min_DB
865
+ * @param string
866
+ * @return Min_Result
867
+ */
868
+ function explain($connection, $query) {
869
+ return $connection->query("EXPLAIN " . ($connection->server_info >= 5.1 ? "PARTITIONS " : "") . $query);
870
+ }
871
+
872
+ /** Get approximate number of rows
873
+ * @param array
874
+ * @param array
875
+ * @return int or null if approximate number can't be retrieved
876
+ */
877
+ function found_rows($table_status, $where) {
878
+ return ($where || $table_status["Engine"] != "InnoDB" ? null : $table_status["Rows"]);
879
+ }
880
+
881
+ /** Get user defined types
882
+ * @return array
883
+ */
884
+ function types() {
885
+ return array();
886
+ }
887
+
888
+ /** Get existing schemas
889
+ * @return array
890
+ */
891
+ function schemas() {
892
+ return array();
893
+ }
894
+
895
+ /** Get current schema
896
+ * @return string
897
+ */
898
+ function get_schema() {
899
+ return "";
900
+ }
901
+
902
+ /** Set current schema
903
+ * @param string
904
+ * @return bool
905
+ */
906
+ function set_schema($schema) {
907
+ return true;
908
+ }
909
+
910
+ /** Get SQL command to create table
911
+ * @param string
912
+ * @param bool
913
+ * @return string
914
+ */
915
+ function create_sql($table, $auto_increment) {
916
+ global $connection;
917
+ $return = $connection->result("SHOW CREATE TABLE " . table($table), 1);
918
+ if (!$auto_increment) {
919
+ $return = preg_replace('~ AUTO_INCREMENT=\\d+~', '', $return); //! skip comments
920
+ }
921
+ return $return;
922
+ }
923
+
924
+ /** Get SQL command to truncate table
925
+ * @param string
926
+ * @return string
927
+ */
928
+ function truncate_sql($table) {
929
+ return "TRUNCATE " . table($table);
930
+ }
931
+
932
+ /** Get SQL command to change database
933
+ * @param string
934
+ * @return string
935
+ */
936
+ function use_sql($database) {
937
+ return "USE " . idf_escape($database);
938
+ }
939
+
940
+ /** Get SQL commands to create triggers
941
+ * @param string
942
+ * @param string
943
+ * @return string
944
+ */
945
+ function trigger_sql($table, $style) {
946
+ $return = "";
947
+ foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_\\")), null, "-- ") as $row) {
948
+ $return .= "\n" . ($style == 'CREATE+ALTER' ? "DROP TRIGGER IF EXISTS " . idf_escape($row["Trigger"]) . ";;\n" : "")
949
+ . "CREATE TRIGGER " . idf_escape($row["Trigger"]) . " $row[Timing] $row[Event] ON " . table($row["Table"]) . " FOR EACH ROW\n$row[Statement];;\n";
950
+ }
951
+ return $return;
952
+ }
953
+
954
+ /** Get server variables
955
+ * @return array ($name => $value)
956
+ */
957
+ function show_variables() {
958
+ return get_key_vals("SHOW VARIABLES");
959
+ }
960
+
961
+ /** Get process list
962
+ * @return array ($row)
963
+ */
964
+ function process_list() {
965
+ return get_rows("SHOW FULL PROCESSLIST");
966
+ }
967
+
968
+ /** Get status variables
969
+ * @return array ($name => $value)
970
+ */
971
+ function show_status() {
972
+ return get_key_vals("SHOW STATUS");
973
+ }
974
+
975
+ /** Convert field in select and edit
976
+ * @param array one element from fields()
977
+ * @return string
978
+ */
979
+ function convert_field($field) {
980
+ if (preg_match("~binary~", $field["type"])) {
981
+ return "HEX(" . idf_escape($field["field"]) . ")";
982
+ }
983
+ if ($field["type"] == "bit") {
984
+ return "BIN(" . idf_escape($field["field"]) . " + 0)"; // + 0 is required outside MySQLnd
985
+ }
986
+ if (preg_match("~geometry|point|linestring|polygon~", $field["type"])) {
987
+ return "AsWKT(" . idf_escape($field["field"]) . ")";
988
+ }
989
+ }
990
+
991
+ /** Convert value in edit after applying functions back
992
+ * @param array one element from fields()
993
+ * @param string
994
+ * @return string
995
+ */
996
+ function unconvert_field($field, $return) {
997
+ if (preg_match("~binary~", $field["type"])) {
998
+ $return = "UNHEX($return)";
999
+ }
1000
+ if ($field["type"] == "bit") {
1001
+ $return = "CONV($return, 2, 10) + 0";
1002
+ }
1003
+ if (preg_match("~geometry|point|linestring|polygon~", $field["type"])) {
1004
+ $return = "GeomFromText($return)";
1005
+ }
1006
+ return $return;
1007
+ }
1008
+
1009
+ /** Check whether a feature is supported
1010
+ * @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"
1011
+ * @return bool
1012
+ */
1013
+ function support($feature) {
1014
+ global $connection;
1015
+ return !preg_match("~scheme|sequence|type|view_trigger" . ($connection->server_info < 5.1 ? "|event|partitioning" . ($connection->server_info < 5 ? "|routine|trigger|view" : "") : "") . "~", $feature);
1016
+ }
1017
+
1018
+ function kill_process($val) {
1019
+ return queries("KILL " . number($val));
1020
+ }
1021
+
1022
+ function max_connections() {
1023
+ global $connection;
1024
+ return $connection->result("SELECT @@max_connections");
1025
+ }
1026
+
1027
+ $jush = "sql"; ///< @var string JUSH identifier
1028
+ $types = array(); ///< @var array ($type => $maximum_unsigned_length, ...)
1029
+ $structured_types = array(); ///< @var array ($description => array($type, ...), ...)
1030
+ foreach (array(
1031
+ lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "decimal" => 66, "float" => 12, "double" => 21),
1032
+ lang('Date and time') => array("date" => 10, "datetime" => 19, "timestamp" => 19, "time" => 10, "year" => 4),
1033
+ lang('Strings') => array("char" => 255, "varchar" => 65535, "tinytext" => 255, "text" => 65535, "mediumtext" => 16777215, "longtext" => 4294967295),
1034
+ lang('Lists') => array("enum" => 65535, "set" => 64),
1035
+ lang('Binary') => array("bit" => 20, "binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295),
1036
+ lang('Geometry') => array("geometry" => 0, "point" => 0, "linestring" => 0, "polygon" => 0, "multipoint" => 0, "multilinestring" => 0, "multipolygon" => 0, "geometrycollection" => 0),
1037
+ ) as $key => $val) {
1038
+ $types += $val;
1039
+ $structured_types[$key] = array_keys($val);
1040
+ }
1041
+ $unsigned = array("unsigned", "zerofill", "unsigned zerofill"); ///< @var array number variants
1042
+ $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL"); ///< @var array operators used in select
1043
+ $functions = array("char_length", "date", "from_unixtime", "lower", "round", "sec_to_time", "time_to_sec", "upper"); ///< @var array functions used in select
1044
+ $grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"); ///< @var array grouping functions used in select
1045
+ $edit_functions = array( ///< @var array of array("$type|$type2" => "$function/$function2") functions used in editing, [0] - edit and insert, [1] - edit only
1046
+ array(
1047
+ "char" => "md5/sha1/password/encrypt/uuid", //! JavaScript for disabling maxlength
1048
+ "binary" => "md5/sha1",
1049
+ "date|time" => "now",
1050
+ ), array(
1051
+ "(^|[^o])int|float|double|decimal" => "+/-", // not point
1052
+ "date" => "+ interval/- interval",
1053
+ "time" => "addtime/subtime",
1054
+ "char|text" => "concat",
1055
+ )
1056
+ );
1057
+ }
adminer/adminer/adminer/drivers/oracle.inc.php ADDED
@@ -0,0 +1,430 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $drivers["oracle"] = "Oracle";
3
+
4
+ if (isset($_GET["oracle"])) {
5
+ $possible_drivers = array("OCI8", "PDO_OCI");
6
+ define("DRIVER", "oracle");
7
+ if (extension_loaded("oci8")) {
8
+ class Min_DB {
9
+ var $extension = "oci8", $_link, $_result, $server_info, $affected_rows, $errno, $error;
10
+
11
+ function _error($errno, $error) {
12
+ if (ini_bool("html_errors")) {
13
+ $error = html_entity_decode(strip_tags($error));
14
+ }
15
+ $error = preg_replace('~^[^:]*: ~', '', $error);
16
+ $this->error = $error;
17
+ }
18
+
19
+ function connect($server, $username, $password) {
20
+ $this->_link = @oci_new_connect($username, $password, $server, "AL32UTF8");
21
+ if ($this->_link) {
22
+ $this->server_info = oci_server_version($this->_link);
23
+ return true;
24
+ }
25
+ $error = oci_error();
26
+ $this->error = $error["message"];
27
+ return false;
28
+ }
29
+
30
+ function quote($string) {
31
+ return "'" . str_replace("'", "''", $string) . "'";
32
+ }
33
+
34
+ function select_db($database) {
35
+ return true;
36
+ }
37
+
38
+ function query($query, $unbuffered = false) {
39
+ $result = oci_parse($this->_link, $query);
40
+ $this->error = "";
41
+ if (!$result) {
42
+ $error = oci_error($this->_link);
43
+ $this->errno = $error["code"];
44
+ $this->error = $error["message"];
45
+ return false;
46
+ }
47
+ set_error_handler(array($this, '_error'));
48
+ $return = @oci_execute($result);
49
+ restore_error_handler();
50
+ if ($return) {
51
+ if (oci_num_fields($result)) {
52
+ return new Min_Result($result);
53
+ }
54
+ $this->affected_rows = oci_num_rows($result);
55
+ }
56
+ return $return;
57
+ }
58
+
59
+ function multi_query($query) {
60
+ return $this->_result = $this->query($query);
61
+ }
62
+
63
+ function store_result() {
64
+ return $this->_result;
65
+ }
66
+
67
+ function next_result() {
68
+ return false;
69
+ }
70
+
71
+ function result($query, $field = 1) {
72
+ $result = $this->query($query);
73
+ if (!is_object($result) || !oci_fetch($result->_result)) {
74
+ return false;
75
+ }
76
+ return oci_result($result->_result, $field);
77
+ }
78
+ }
79
+
80
+ class Min_Result {
81
+ var $_result, $_offset = 1, $num_rows;
82
+
83
+ function __construct($result) {
84
+ $this->_result = $result;
85
+ }
86
+
87
+ function _convert($row) {
88
+ foreach ((array) $row as $key => $val) {
89
+ if (is_a($val, 'OCI-Lob')) {
90
+ $row[$key] = $val->load();
91
+ }
92
+ }
93
+ return $row;
94
+ }
95
+
96
+ function fetch_assoc() {
97
+ return $this->_convert(oci_fetch_assoc($this->_result));
98
+ }
99
+
100
+ function fetch_row() {
101
+ return $this->_convert(oci_fetch_row($this->_result));
102
+ }
103
+
104
+ function fetch_field() {
105
+ $column = $this->_offset++;
106
+ $return = new stdClass;
107
+ $return->name = oci_field_name($this->_result, $column);
108
+ $return->orgname = $return->name;
109
+ $return->type = oci_field_type($this->_result, $column);
110
+ $return->charsetnr = (preg_match("~raw|blob|bfile~", $return->type) ? 63 : 0); // 63 - binary
111
+ return $return;
112
+ }
113
+
114
+ function __destruct() {
115
+ oci_free_statement($this->_result);
116
+ }
117
+ }
118
+
119
+ } elseif (extension_loaded("pdo_oci")) {
120
+ class Min_DB extends Min_PDO {
121
+ var $extension = "PDO_OCI";
122
+
123
+ function connect($server, $username, $password) {
124
+ $this->dsn("oci:dbname=//$server;charset=AL32UTF8", $username, $password);
125
+ return true;
126
+ }
127
+
128
+ function select_db($database) {
129
+ return true;
130
+ }
131
+ }
132
+
133
+ }
134
+
135
+
136
+
137
+ class Min_Driver extends Min_SQL {
138
+
139
+ //! support empty $set in insert()
140
+
141
+ function begin() {
142
+ return true; // automatic start
143
+ }
144
+
145
+ }
146
+
147
+
148
+
149
+ function idf_escape($idf) {
150
+ return '"' . str_replace('"', '""', $idf) . '"';
151
+ }
152
+
153
+ function table($idf) {
154
+ return idf_escape($idf);
155
+ }
156
+
157
+ function connect() {
158
+ global $adminer;
159
+ $connection = new Min_DB;
160
+ $credentials = $adminer->credentials();
161
+ if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
162
+ return $connection;
163
+ }
164
+ return $connection->error;
165
+ }
166
+
167
+ function get_databases() {
168
+ return get_vals("SELECT tablespace_name FROM user_tablespaces");
169
+ }
170
+
171
+ function limit($query, $where, $limit, $offset = 0, $separator = " ") {
172
+ return ($offset ? " * FROM (SELECT t.*, rownum AS rnum FROM (SELECT $query$where) t WHERE rownum <= " . ($limit + $offset) . ") WHERE rnum > $offset"
173
+ : ($limit !== null ? " * FROM (SELECT $query$where) WHERE rownum <= " . ($limit + $offset)
174
+ : " $query$where"
175
+ ));
176
+ }
177
+
178
+ function limit1($query, $where) {
179
+ return " $query$where";
180
+ }
181
+
182
+ function db_collation($db, $collations) {
183
+ global $connection;
184
+ return $connection->result("SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'"); //! respect $db
185
+ }
186
+
187
+ function engines() {
188
+ return array();
189
+ }
190
+
191
+ function logged_user() {
192
+ global $connection;
193
+ return $connection->result("SELECT USER FROM DUAL");
194
+ }
195
+
196
+ function tables_list() {
197
+ return get_key_vals("SELECT table_name, 'table' FROM all_tables WHERE tablespace_name = " . q(DB) . "
198
+ UNION SELECT view_name, 'view' FROM user_views
199
+ ORDER BY 1"
200
+ ); //! views don't have schema
201
+ }
202
+
203
+ function count_tables($databases) {
204
+ return array();
205
+ }
206
+
207
+ function table_status($name = "") {
208
+ $return = array();
209
+ $search = q($name);
210
+ foreach (get_rows('SELECT table_name "Name", \'table\' "Engine", avg_row_len * num_rows "Data_length", num_rows "Rows" FROM all_tables WHERE tablespace_name = ' . q(DB) . ($name != "" ? " AND table_name = $search" : "") . "
211
+ UNION SELECT view_name, 'view', 0, 0 FROM user_views" . ($name != "" ? " WHERE view_name = $search" : "") . "
212
+ ORDER BY 1"
213
+ ) as $row) {
214
+ if ($name != "") {
215
+ return $row;
216
+ }
217
+ $return[$row["Name"]] = $row;
218
+ }
219
+ return $return;
220
+ }
221
+
222
+ function is_view($table_status) {
223
+ return $table_status["Engine"] == "view";
224
+ }
225
+
226
+ function fk_support($table_status) {
227
+ return true;
228
+ }
229
+
230
+ function fields($table) {
231
+ $return = array();
232
+ foreach (get_rows("SELECT * FROM all_tab_columns WHERE table_name = " . q($table) . " ORDER BY column_id") as $row) {
233
+ $type = $row["DATA_TYPE"];
234
+ $length = "$row[DATA_PRECISION],$row[DATA_SCALE]";
235
+ if ($length == ",") {
236
+ $length = $row["DATA_LENGTH"];
237
+ } //! int
238
+ $return[$row["COLUMN_NAME"]] = array(
239
+ "field" => $row["COLUMN_NAME"],
240
+ "full_type" => $type . ($length ? "($length)" : ""),
241
+ "type" => strtolower($type),
242
+ "length" => $length,
243
+ "default" => $row["DATA_DEFAULT"],
244
+ "null" => ($row["NULLABLE"] == "Y"),
245
+ //! "auto_increment" => false,
246
+ //! "collation" => $row["CHARACTER_SET_NAME"],
247
+ "privileges" => array("insert" => 1, "select" => 1, "update" => 1),
248
+ //! "comment" => $row["Comment"],
249
+ //! "primary" => ($row["Key"] == "PRI"),
250
+ );
251
+ }
252
+ return $return;
253
+ }
254
+
255
+ function indexes($table, $connection2 = null) {
256
+ $return = array();
257
+ foreach (get_rows("SELECT uic.*, uc.constraint_type
258
+ FROM user_ind_columns uic
259
+ LEFT JOIN user_constraints uc ON uic.index_name = uc.constraint_name AND uic.table_name = uc.table_name
260
+ WHERE uic.table_name = " . q($table) . "
261
+ ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
262
+ $index_name = $row["INDEX_NAME"];
263
+ $return[$index_name]["type"] = ($row["CONSTRAINT_TYPE"] == "P" ? "PRIMARY" : ($row["CONSTRAINT_TYPE"] == "U" ? "UNIQUE" : "INDEX"));
264
+ $return[$index_name]["columns"][] = $row["COLUMN_NAME"];
265
+ $return[$index_name]["lengths"][] = ($row["CHAR_LENGTH"] && $row["CHAR_LENGTH"] != $row["COLUMN_LENGTH"] ? $row["CHAR_LENGTH"] : null);
266
+ $return[$index_name]["descs"][] = ($row["DESCEND"] ? '1' : null);
267
+ }
268
+ return $return;
269
+ }
270
+
271
+ function view($name) {
272
+ $rows = get_rows('SELECT text "select" FROM user_views WHERE view_name = ' . q($name));
273
+ return reset($rows);
274
+ }
275
+
276
+ function collations() {
277
+ return array(); //!
278
+ }
279
+
280
+ function information_schema($db) {
281
+ return false;
282
+ }
283
+
284
+ function error() {
285
+ global $connection;
286
+ return h($connection->error); //! highlight sqltext from offset
287
+ }
288
+
289
+ function explain($connection, $query) {
290
+ $connection->query("EXPLAIN PLAN FOR $query");
291
+ return $connection->query("SELECT * FROM plan_table");
292
+ }
293
+
294
+ function found_rows($table_status, $where) {
295
+ }
296
+
297
+ function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
298
+ $alter = $drop = array();
299
+ foreach ($fields as $field) {
300
+ $val = $field[1];
301
+ if ($val && $field[0] != "" && idf_escape($field[0]) != $val[0]) {
302
+ queries("ALTER TABLE " . table($table) . " RENAME COLUMN " . idf_escape($field[0]) . " TO $val[0]");
303
+ }
304
+ if ($val) {
305
+ $alter[] = ($table != "" ? ($field[0] != "" ? "MODIFY (" : "ADD (") : " ") . implode($val) . ($table != "" ? ")" : ""); //! error with name change only
306
+ } else {
307
+ $drop[] = idf_escape($field[0]);
308
+ }
309
+ }
310
+ if ($table == "") {
311
+ return queries("CREATE TABLE " . table($name) . " (\n" . implode(",\n", $alter) . "\n)");
312
+ }
313
+ return (!$alter || queries("ALTER TABLE " . table($table) . "\n" . implode("\n", $alter)))
314
+ && (!$drop || queries("ALTER TABLE " . table($table) . " DROP (" . implode(", ", $drop) . ")"))
315
+ && ($table == $name || queries("ALTER TABLE " . table($table) . " RENAME TO " . table($name)))
316
+ ;
317
+ }
318
+
319
+ function foreign_keys($table) {
320
+ $return = array();
321
+ $query = "SELECT c_list.CONSTRAINT_NAME as NAME,
322
+ c_src.COLUMN_NAME as SRC_COLUMN,
323
+ c_dest.OWNER as DEST_DB,
324
+ c_dest.TABLE_NAME as DEST_TABLE,
325
+ c_dest.COLUMN_NAME as DEST_COLUMN,
326
+ c_list.DELETE_RULE as ON_DELETE
327
+ FROM ALL_CONSTRAINTS c_list, ALL_CONS_COLUMNS c_src, ALL_CONS_COLUMNS c_dest
328
+ WHERE c_list.CONSTRAINT_NAME = c_src.CONSTRAINT_NAME
329
+ AND c_list.R_CONSTRAINT_NAME = c_dest.CONSTRAINT_NAME
330
+ AND c_list.CONSTRAINT_TYPE = 'R'
331
+ AND c_src.TABLE_NAME = " . q($table);
332
+ foreach (get_rows($query) as $row) {
333
+ $return[$row['NAME']] = array(
334
+ "db" => $row['DEST_DB'],
335
+ "table" => $row['DEST_TABLE'],
336
+ "source" => array($row['SRC_COLUMN']),
337
+ "target" => array($row['DEST_COLUMN']),
338
+ "on_delete" => $row['ON_DELETE'],
339
+ "on_update" => null,
340
+ );
341
+ }
342
+ return $return;
343
+ }
344
+
345
+ function truncate_tables($tables) {
346
+ return apply_queries("TRUNCATE TABLE", $tables);
347
+ }
348
+
349
+ function drop_views($views) {
350
+ return apply_queries("DROP VIEW", $views);
351
+ }
352
+
353
+ function drop_tables($tables) {
354
+ return apply_queries("DROP TABLE", $tables);
355
+ }
356
+
357
+ function last_id() {
358
+ return 0; //!
359
+ }
360
+
361
+ function schemas() {
362
+ return get_vals("SELECT DISTINCT owner FROM dba_segments WHERE owner IN (SELECT username FROM dba_users WHERE default_tablespace NOT IN ('SYSTEM','SYSAUX'))");
363
+ }
364
+
365
+ function get_schema() {
366
+ global $connection;
367
+ return $connection->result("SELECT sys_context('USERENV', 'SESSION_USER') FROM dual");
368
+ }
369
+
370
+ function set_schema($scheme) {
371
+ global $connection;
372
+ return $connection->query("ALTER SESSION SET CURRENT_SCHEMA = " . idf_escape($scheme));
373
+ }
374
+
375
+ function show_variables() {
376
+ return get_key_vals('SELECT name, display_value FROM v$parameter');
377
+ }
378
+
379
+ function process_list() {
380
+ return get_rows('SELECT sess.process AS "process", sess.username AS "user", sess.schemaname AS "schema", sess.status AS "status", sess.wait_class AS "wait_class", sess.seconds_in_wait AS "seconds_in_wait", sql.sql_text AS "sql_text", sess.machine AS "machine", sess.port AS "port"
381
+ FROM v$session sess LEFT OUTER JOIN v$sql sql
382
+ ON sql.sql_id = sess.sql_id
383
+ WHERE sess.type = \'USER\'
384
+ ORDER BY PROCESS
385
+ ');
386
+ }
387
+
388
+ function show_status() {
389
+ $rows = get_rows('SELECT * FROM v$instance');
390
+ return reset($rows);
391
+ }
392
+
393
+ function convert_field($field) {
394
+ }
395
+
396
+ function unconvert_field($field, $return) {
397
+ return $return;
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";
405
+ $types = array();
406
+ $structured_types = array();
407
+ foreach (array(
408
+ lang('Numbers') => array("number" => 38, "binary_float" => 12, "binary_double" => 21),
409
+ lang('Date and time') => array("date" => 10, "timestamp" => 29, "interval year" => 12, "interval day" => 28), //! year(), day() to second()
410
+ lang('Strings') => array("char" => 2000, "varchar2" => 4000, "nchar" => 2000, "nvarchar2" => 4000, "clob" => 4294967295, "nclob" => 4294967295),
411
+ lang('Binary') => array("raw" => 2000, "long raw" => 2147483648, "blob" => 4294967295, "bfile" => 4294967296),
412
+ ) as $key => $val) {
413
+ $types += $val;
414
+ $structured_types[$key] = array_keys($val);
415
+ }
416
+ $unsigned = array();
417
+ $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL");
418
+ $functions = array("length", "lower", "round", "upper");
419
+ $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
420
+ $edit_functions = array(
421
+ array( //! no parentheses
422
+ "date" => "current_date",
423
+ "timestamp" => "current_timestamp",
424
+ ), array(
425
+ "number|float|double" => "+/-",
426
+ "date|timestamp" => "+ interval/- interval",
427
+ "char|clob" => "||",
428
+ )
429
+ );
430
+ }
adminer/adminer/adminer/drivers/pgsql.inc.php ADDED
@@ -0,0 +1,674 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $drivers["pgsql"] = "PostgreSQL";
3
+
4
+ if (isset($_GET["pgsql"])) {
5
+ $possible_drivers = array("PgSQL", "PDO_PgSQL");
6
+ define("DRIVER", "pgsql");
7
+ if (extension_loaded("pgsql")) {
8
+ class Min_DB {
9
+ var $extension = "PgSQL", $_link, $_result, $_string, $_database = true, $server_info, $affected_rows, $error;
10
+
11
+ function _error($errno, $error) {
12
+ if (ini_bool("html_errors")) {
13
+ $error = html_entity_decode(strip_tags($error));
14
+ }
15
+ $error = preg_replace('~^[^:]*: ~', '', $error);
16
+ $this->error = $error;
17
+ }
18
+
19
+ function connect($server, $username, $password) {
20
+ global $adminer;
21
+ $db = $adminer->database();
22
+ set_error_handler(array($this, '_error'));
23
+ $this->_string = "host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' user='" . addcslashes($username, "'\\") . "' password='" . addcslashes($password, "'\\") . "'";
24
+ $this->_link = @pg_connect("$this->_string dbname='" . ($db != "" ? addcslashes($db, "'\\") : "postgres") . "'", PGSQL_CONNECT_FORCE_NEW);
25
+ if (!$this->_link && $db != "") {
26
+ // try to connect directly with database for performance
27
+ $this->_database = false;
28
+ $this->_link = @pg_connect("$this->_string dbname='postgres'", PGSQL_CONNECT_FORCE_NEW);
29
+ }
30
+ restore_error_handler();
31
+ if ($this->_link) {
32
+ $version = pg_version($this->_link);
33
+ $this->server_info = $version["server"];
34
+ pg_set_client_encoding($this->_link, "UTF8");
35
+ }
36
+ return (bool) $this->_link;
37
+ }
38
+
39
+ function quote($string) {
40
+ return "'" . pg_escape_string($this->_link, $string) . "'"; //! bytea
41
+ }
42
+
43
+ function select_db($database) {
44
+ global $adminer;
45
+ if ($database == $adminer->database()) {
46
+ return $this->_database;
47
+ }
48
+ $return = @pg_connect("$this->_string dbname='" . addcslashes($database, "'\\") . "'", PGSQL_CONNECT_FORCE_NEW);
49
+ if ($return) {
50
+ $this->_link = $return;
51
+ }
52
+ return $return;
53
+ }
54
+
55
+ function close() {
56
+ $this->_link = @pg_connect("$this->_string dbname='postgres'");
57
+ }
58
+
59
+ function query($query, $unbuffered = false) {
60
+ $result = @pg_query($this->_link, $query);
61
+ $this->error = "";
62
+ if (!$result) {
63
+ $this->error = pg_last_error($this->_link);
64
+ return false;
65
+ } elseif (!pg_num_fields($result)) {
66
+ $this->affected_rows = pg_affected_rows($result);
67
+ return true;
68
+ }
69
+ return new Min_Result($result);
70
+ }
71
+
72
+ function multi_query($query) {
73
+ return $this->_result = $this->query($query);
74
+ }
75
+
76
+ function store_result() {
77
+ return $this->_result;
78
+ }
79
+
80
+ function next_result() {
81
+ // PgSQL extension doesn't support multiple results
82
+ return false;
83
+ }
84
+
85
+ function result($query, $field = 0) {
86
+ $result = $this->query($query);
87
+ if (!$result || !$result->num_rows) {
88
+ return false;
89
+ }
90
+ return pg_fetch_result($result->_result, 0, $field);
91
+ }
92
+ }
93
+
94
+ class Min_Result {
95
+ var $_result, $_offset = 0, $num_rows;
96
+
97
+ function __construct($result) {
98
+ $this->_result = $result;
99
+ $this->num_rows = pg_num_rows($result);
100
+ }
101
+
102
+ function fetch_assoc() {
103
+ return pg_fetch_assoc($this->_result);
104
+ }
105
+
106
+ function fetch_row() {
107
+ return pg_fetch_row($this->_result);
108
+ }
109
+
110
+ function fetch_field() {
111
+ $column = $this->_offset++;
112
+ $return = new stdClass;
113
+ if (function_exists('pg_field_table')) {
114
+ $return->orgtable = pg_field_table($this->_result, $column);
115
+ }
116
+ $return->name = pg_field_name($this->_result, $column);
117
+ $return->orgname = $return->name;
118
+ $return->type = pg_field_type($this->_result, $column);
119
+ $return->charsetnr = ($return->type == "bytea" ? 63 : 0); // 63 - binary
120
+ return $return;
121
+ }
122
+
123
+ function __destruct() {
124
+ pg_free_result($this->_result);
125
+ }
126
+ }
127
+
128
+ } elseif (extension_loaded("pdo_pgsql")) {
129
+ class Min_DB extends Min_PDO {
130
+ var $extension = "PDO_PgSQL";
131
+
132
+ function connect($server, $username, $password) {
133
+ global $adminer;
134
+ $db = $adminer->database();
135
+ $string = "pgsql:host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' options='-c client_encoding=utf8'";
136
+ $this->dsn("$string dbname='" . ($db != "" ? addcslashes($db, "'\\") : "postgres") . "'", $username, $password);
137
+ //! connect without DB in case of an error
138
+ return true;
139
+ }
140
+
141
+ function select_db($database) {
142
+ global $adminer;
143
+ return ($adminer->database() == $database);
144
+ }
145
+
146
+ function close() {
147
+ }
148
+ }
149
+
150
+ }
151
+
152
+
153
+
154
+ class Min_Driver extends Min_SQL {
155
+
156
+ function insertUpdate($table, $rows, $primary) {
157
+ global $connection;
158
+ foreach ($rows as $set) {
159
+ $update = array();
160
+ $where = array();
161
+ foreach ($set as $key => $val) {
162
+ $update[] = "$key = $val";
163
+ if (isset($primary[idf_unescape($key)])) {
164
+ $where[] = "$key = $val";
165
+ }
166
+ }
167
+ if (!(($where && queries("UPDATE " . table($table) . " SET " . implode(", ", $update) . " WHERE " . implode(" AND ", $where)) && $connection->affected_rows)
168
+ || queries("INSERT INTO " . table($table) . " (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ")")
169
+ )) {
170
+ return false;
171
+ }
172
+ }
173
+ return true;
174
+ }
175
+
176
+ }
177
+
178
+
179
+
180
+ function idf_escape($idf) {
181
+ return '"' . str_replace('"', '""', $idf) . '"';
182
+ }
183
+
184
+ function table($idf) {
185
+ return idf_escape($idf);
186
+ }
187
+
188
+ function connect() {
189
+ global $adminer;
190
+ $connection = new Min_DB;
191
+ $credentials = $adminer->credentials();
192
+ if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
193
+ if ($connection->server_info >= 9) {
194
+ $connection->query("SET application_name = 'Adminer'");
195
+ }
196
+ return $connection;
197
+ }
198
+ return $connection->error;
199
+ }
200
+
201
+ function get_databases() {
202
+ return get_vals("SELECT datname FROM pg_database ORDER BY datname");
203
+ }
204
+
205
+ function limit($query, $where, $limit, $offset = 0, $separator = " ") {
206
+ return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
207
+ }
208
+
209
+ function limit1($query, $where) {
210
+ return " $query$where";
211
+ }
212
+
213
+ function db_collation($db, $collations) {
214
+ global $connection;
215
+ return $connection->result("SHOW LC_COLLATE"); //! respect $db
216
+ }
217
+
218
+ function engines() {
219
+ return array();
220
+ }
221
+
222
+ function logged_user() {
223
+ global $connection;
224
+ return $connection->result("SELECT user");
225
+ }
226
+
227
+ function tables_list() {
228
+ $query = "SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = current_schema()";
229
+ if (support('materializedview')) {
230
+ $query .= "
231
+ UNION ALL
232
+ SELECT matviewname, 'MATERIALIZED VIEW'
233
+ FROM pg_matviews
234
+ WHERE schemaname = current_schema()";
235
+ }
236
+ $query .= "
237
+ ORDER BY 1";
238
+ return get_key_vals($query);
239
+ }
240
+
241
+ function count_tables($databases) {
242
+ return array(); // would require reconnect
243
+ }
244
+
245
+ function table_status($name = "") {
246
+ $return = array();
247
+ foreach (get_rows("SELECT relname AS \"Name\", CASE relkind WHEN 'r' THEN 'table' WHEN 'mv' THEN 'materialized view' WHEN 'f' THEN 'foreign table' ELSE 'view' END AS \"Engine\", pg_relation_size(oid) AS \"Data_length\", pg_total_relation_size(oid) - pg_relation_size(oid) AS \"Index_length\", obj_description(oid, 'pg_class') AS \"Comment\", relhasoids::int AS \"Oid\", reltuples as \"Rows\"
248
+ FROM pg_class
249
+ WHERE relkind IN ('r','v','mv','f')
250
+ AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())
251
+ " . ($name != "" ? "AND relname = " . q($name) : "ORDER BY relname")
252
+ ) as $row) { //! Index_length, Auto_increment
253
+ $return[$row["Name"]] = $row;
254
+ }
255
+ return ($name != "" ? $return[$name] : $return);
256
+ }
257
+
258
+ function is_view($table_status) {
259
+ return in_array($table_status["Engine"], array("view", "materialized view"));
260
+ }
261
+
262
+ function fk_support($table_status) {
263
+ return true;
264
+ }
265
+
266
+ function fields($table) {
267
+ $return = array();
268
+ $aliases = array(
269
+ 'timestamp without time zone' => 'timestamp',
270
+ 'timestamp with time zone' => 'timestamptz',
271
+ );
272
+ 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
273
+ FROM pg_class c
274
+ JOIN pg_namespace n ON c.relnamespace = n.oid
275
+ JOIN pg_attribute a ON c.oid = a.attrelid
276
+ LEFT JOIN pg_attrdef d ON c.oid = d.adrelid AND a.attnum = d.adnum
277
+ WHERE c.relname = " . q($table) . "
278
+ AND n.nspname = current_schema()
279
+ AND NOT a.attisdropped
280
+ AND a.attnum > 0
281
+ ORDER BY a.attnum"
282
+ ) as $row) {
283
+ //! collation, primary
284
+ preg_match('~([^([]+)(\((.*)\))?([a-z ]+)?((\[[0-9]*])*)$~', $row["full_type"], $match);
285
+ list(, $type, $length, $row["length"], $addon, $array) = $match;
286
+ $row["length"] .= $array;
287
+ $check_type = $type . $addon;
288
+ if (isset($aliases[$check_type])) {
289
+ $row["type"] = $aliases[$check_type];
290
+ $row["full_type"] = $row["type"] . $length . $array;
291
+ } else {
292
+ $row["type"] = $type;
293
+ $row["full_type"] = $row["type"] . $length . $addon . $array;
294
+ }
295
+ $row["null"] = !$row["attnotnull"];
296
+ $row["auto_increment"] = preg_match('~^nextval\\(~i', $row["default"]);
297
+ $row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
298
+ if (preg_match('~(.+)::[^)]+(.*)~', $row["default"], $match)) {
299
+ $row["default"] = ($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]) . $match[2];
300
+ }
301
+ $return[$row["field"]] = $row;
302
+ }
303
+ return $return;
304
+ }
305
+
306
+ function indexes($table, $connection2 = null) {
307
+ global $connection;
308
+ if (!is_object($connection2)) {
309
+ $connection2 = $connection;
310
+ }
311
+ $return = array();
312
+ $table_oid = $connection2->result("SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) AND relname = " . q($table));
313
+ $columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = $table_oid AND attnum > 0", $connection2);
314
+ foreach (get_rows("SELECT relname, indisunique::int, indisprimary::int, indkey, indoption FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid", $connection2) as $row) {
315
+ $relname = $row["relname"];
316
+ $return[$relname]["type"] = ($row["indisprimary"] ? "PRIMARY" : ($row["indisunique"] ? "UNIQUE" : "INDEX"));
317
+ $return[$relname]["columns"] = array();
318
+ foreach (explode(" ", $row["indkey"]) as $indkey) {
319
+ $return[$relname]["columns"][] = $columns[$indkey];
320
+ }
321
+ $return[$relname]["descs"] = array();
322
+ foreach (explode(" ", $row["indoption"]) as $indoption) {
323
+ $return[$relname]["descs"][] = ($indoption & 1 ? '1' : null); // 1 - INDOPTION_DESC
324
+ }
325
+ $return[$relname]["lengths"] = array();
326
+ }
327
+ return $return;
328
+ }
329
+
330
+ function foreign_keys($table) {
331
+ global $on_actions;
332
+ $return = array();
333
+ foreach (get_rows("SELECT conname, pg_get_constraintdef(oid) AS definition
334
+ FROM pg_constraint
335
+ WHERE conrelid = (SELECT pc.oid FROM pg_class AS pc INNER JOIN pg_namespace AS pn ON (pn.oid = pc.relnamespace) WHERE pc.relname = " . q($table) . " AND pn.nspname = current_schema())
336
+ AND contype = 'f'::char
337
+ ORDER BY conkey, conname") as $row) {
338
+ if (preg_match('~FOREIGN KEY\s*\((.+)\)\s*REFERENCES (.+)\((.+)\)(.*)$~iA', $row['definition'], $match)) {
339
+ $row['source'] = array_map('trim', explode(',', $match[1]));
340
+ if (preg_match('~^(("([^"]|"")+"|[^"]+)\.)?"?("([^"]|"")+"|[^"]+)$~', $match[2], $match2)) {
341
+ $row['ns'] = str_replace('""', '"', preg_replace('~^"(.+)"$~', '\1', $match2[2]));
342
+ $row['table'] = str_replace('""', '"', preg_replace('~^"(.+)"$~', '\1', $match2[4]));
343
+ }
344
+ $row['target'] = array_map('trim', explode(',', $match[3]));
345
+ $row['on_delete'] = (preg_match("~ON DELETE ($on_actions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION');
346
+ $row['on_update'] = (preg_match("~ON UPDATE ($on_actions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION');
347
+ $return[$row['conname']] = $row;
348
+ }
349
+ }
350
+ return $return;
351
+ }
352
+
353
+ function view($name) {
354
+ global $connection;
355
+ return array("select" => $connection->result("SELECT pg_get_viewdef(" . q($name) . ")"));
356
+ }
357
+
358
+ function collations() {
359
+ //! supported in CREATE DATABASE
360
+ return array();
361
+ }
362
+
363
+ function information_schema($db) {
364
+ return ($db == "information_schema");
365
+ }
366
+
367
+ function error() {
368
+ global $connection;
369
+ $return = h($connection->error);
370
+ if (preg_match('~^(.*\\n)?([^\\n]*)\\n( *)\\^(\\n.*)?$~s', $return, $match)) {
371
+ $return = $match[1] . preg_replace('~((?:[^&]|&[^;]*;){' . strlen($match[3]) . '})(.*)~', '\\1<b>\\2</b>', $match[2]) . $match[4];
372
+ }
373
+ return nl_br($return);
374
+ }
375
+
376
+ function create_database($db, $collation) {
377
+ return queries("CREATE DATABASE " . idf_escape($db) . ($collation ? " ENCODING " . idf_escape($collation) : ""));
378
+ }
379
+
380
+ function drop_databases($databases) {
381
+ global $connection;
382
+ $connection->close();
383
+ return apply_queries("DROP DATABASE", $databases, 'idf_escape');
384
+ }
385
+
386
+ function rename_database($name, $collation) {
387
+ //! current database cannot be renamed
388
+ return queries("ALTER DATABASE " . idf_escape(DB) . " RENAME TO " . idf_escape($name));
389
+ }
390
+
391
+ function auto_increment() {
392
+ return "";
393
+ }
394
+
395
+ function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
396
+ $alter = array();
397
+ $queries = array();
398
+ foreach ($fields as $field) {
399
+ $column = idf_escape($field[0]);
400
+ $val = $field[1];
401
+ if (!$val) {
402
+ $alter[] = "DROP $column";
403
+ } else {
404
+ $val5 = $val[5];
405
+ unset($val[5]);
406
+ if (isset($val[6]) && $field[0] == "") { // auto_increment
407
+ $val[1] = ($val[1] == "bigint" ? " big" : " ") . "serial";
408
+ }
409
+ if ($field[0] == "") {
410
+ $alter[] = ($table != "" ? "ADD " : " ") . implode($val);
411
+ } else {
412
+ if ($column != $val[0]) {
413
+ $queries[] = "ALTER TABLE " . table($table) . " RENAME $column TO $val[0]";
414
+ }
415
+ $alter[] = "ALTER $column TYPE$val[1]";
416
+ if (!$val[6]) {
417
+ $alter[] = "ALTER $column " . ($val[3] ? "SET$val[3]" : "DROP DEFAULT");
418
+ $alter[] = "ALTER $column " . ($val[2] == " NULL" ? "DROP NOT" : "SET") . $val[2];
419
+ }
420
+ }
421
+ if ($field[0] != "" || $val5 != "") {
422
+ $queries[] = "COMMENT ON COLUMN " . table($table) . ".$val[0] IS " . ($val5 != "" ? substr($val5, 9) : "''");
423
+ }
424
+ }
425
+ }
426
+ $alter = array_merge($alter, $foreign);
427
+ if ($table == "") {
428
+ array_unshift($queries, "CREATE TABLE " . table($name) . " (\n" . implode(",\n", $alter) . "\n)");
429
+ } elseif ($alter) {
430
+ array_unshift($queries, "ALTER TABLE " . table($table) . "\n" . implode(",\n", $alter));
431
+ }
432
+ if ($table != "" && $table != $name) {
433
+ $queries[] = "ALTER TABLE " . table($table) . " RENAME TO " . table($name);
434
+ }
435
+ if ($table != "" || $comment != "") {
436
+ $queries[] = "COMMENT ON TABLE " . table($name) . " IS " . q($comment);
437
+ }
438
+ if ($auto_increment != "") {
439
+ //! $queries[] = "SELECT setval(pg_get_serial_sequence(" . q($name) . ", ), $auto_increment)";
440
+ }
441
+ foreach ($queries as $query) {
442
+ if (!queries($query)) {
443
+ return false;
444
+ }
445
+ }
446
+ return true;
447
+ }
448
+
449
+ function alter_indexes($table, $alter) {
450
+ $create = array();
451
+ $drop = array();
452
+ $queries = array();
453
+ foreach ($alter as $val) {
454
+ if ($val[0] != "INDEX") {
455
+ //! descending UNIQUE indexes results in syntax error
456
+ $create[] = ($val[2] == "DROP"
457
+ ? "\nDROP CONSTRAINT " . idf_escape($val[1])
458
+ : "\nADD" . ($val[1] != "" ? " CONSTRAINT " . idf_escape($val[1]) : "") . " $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . "(" . implode(", ", $val[2]) . ")"
459
+ );
460
+ } elseif ($val[2] == "DROP") {
461
+ $drop[] = idf_escape($val[1]);
462
+ } else {
463
+ $queries[] = "CREATE INDEX " . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table) . " (" . implode(", ", $val[2]) . ")";
464
+ }
465
+ }
466
+ if ($create) {
467
+ array_unshift($queries, "ALTER TABLE " . table($table) . implode(",", $create));
468
+ }
469
+ if ($drop) {
470
+ array_unshift($queries, "DROP INDEX " . implode(", ", $drop));
471
+ }
472
+ foreach ($queries as $query) {
473
+ if (!queries($query)) {
474
+ return false;
475
+ }
476
+ }
477
+ return true;
478
+ }
479
+
480
+ function truncate_tables($tables) {
481
+ return queries("TRUNCATE " . implode(", ", array_map('table', $tables)));
482
+ return true;
483
+ }
484
+
485
+ function drop_views($views) {
486
+ return drop_tables($views);
487
+ }
488
+
489
+ function drop_tables($tables) {
490
+ foreach ($tables as $table) {
491
+ $status = table_status($table);
492
+ if (!queries("DROP " . strtoupper($status["Engine"]) . " " . table($table))) {
493
+ return false;
494
+ }
495
+ }
496
+ return true;
497
+ }
498
+
499
+ function move_tables($tables, $views, $target) {
500
+ foreach (array_merge($tables, $views) as $table) {
501
+ $status = table_status($table);
502
+ if (!queries("ALTER " . strtoupper($status["Engine"]) . " " . table($table) . " SET SCHEMA " . idf_escape($target))) {
503
+ return false;
504
+ }
505
+ }
506
+ return true;
507
+ }
508
+
509
+ function trigger($name) {
510
+ if ($name == "") {
511
+ return array("Statement" => "EXECUTE PROCEDURE ()");
512
+ }
513
+ $rows = get_rows('SELECT trigger_name AS "Trigger", condition_timing AS "Timing", event_manipulation AS "Event", \'FOR EACH \' || action_orientation AS "Type", action_statement AS "Statement" FROM information_schema.triggers WHERE event_object_table = ' . q($_GET["trigger"]) . ' AND trigger_name = ' . q($name));
514
+ return reset($rows);
515
+ }
516
+
517
+ function triggers($table) {
518
+ $return = array();
519
+ foreach (get_rows("SELECT * FROM information_schema.triggers WHERE event_object_table = " . q($table)) as $row) {
520
+ $return[$row["trigger_name"]] = array($row["condition_timing"], $row["event_manipulation"]);
521
+ }
522
+ return $return;
523
+ }
524
+
525
+ function trigger_options() {
526
+ return array(
527
+ "Timing" => array("BEFORE", "AFTER"),
528
+ "Event" => array("INSERT", "UPDATE", "DELETE"),
529
+ "Type" => array("FOR EACH ROW", "FOR EACH STATEMENT"),
530
+ );
531
+ }
532
+
533
+ /*
534
+ function routine($name, $type) {
535
+ //! there can be more functions with the same name differing only in parameters, it must be also passed to DROP FUNCTION
536
+ //! no procedures, only functions
537
+ //! different syntax of CREATE FUNCTION
538
+ $rows = get_rows('SELECT pg_catalog.format_type(p.prorettype, NULL) AS "returns", p.prosrc AS "definition"
539
+ FROM pg_catalog.pg_namespace n
540
+ JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid
541
+ WHERE n.nspname = current_schema() AND p.proname = ' . q($name));
542
+ $rows[0]["fields"] = array(); //!
543
+ return $rows[0];
544
+ }
545
+ */
546
+
547
+ function routines() {
548
+ return get_rows('SELECT p.proname AS "ROUTINE_NAME", p.proargtypes AS "ROUTINE_TYPE", pg_catalog.format_type(p.prorettype, NULL) AS "DTD_IDENTIFIER"
549
+ FROM pg_catalog.pg_namespace n
550
+ JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid
551
+ WHERE n.nspname = current_schema()
552
+ ORDER BY p.proname');
553
+ }
554
+
555
+ function routine_languages() {
556
+ return get_vals("SELECT langname FROM pg_catalog.pg_language");
557
+ }
558
+
559
+ function last_id() {
560
+ return 0; // there can be several sequences
561
+ }
562
+
563
+ function explain($connection, $query) {
564
+ return $connection->query("EXPLAIN $query");
565
+ }
566
+
567
+ function found_rows($table_status, $where) {
568
+ global $connection;
569
+ if (preg_match(
570
+ "~ rows=([0-9]+)~",
571
+ $connection->result("EXPLAIN SELECT * FROM " . idf_escape($table_status["Name"]) . ($where ? " WHERE " . implode(" AND ", $where) : "")),
572
+ $regs
573
+ )) {
574
+ return $regs[1];
575
+ }
576
+ return false;
577
+ }
578
+
579
+ function types() {
580
+ return get_vals("SELECT typname
581
+ FROM pg_type
582
+ WHERE typnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())
583
+ AND typtype IN ('b','d','e')
584
+ AND typelem = 0"
585
+ );
586
+ }
587
+
588
+ function schemas() {
589
+ return get_vals("SELECT nspname FROM pg_namespace ORDER BY nspname");
590
+ }
591
+
592
+ function get_schema() {
593
+ global $connection;
594
+ return $connection->result("SELECT current_schema()");
595
+ }
596
+
597
+ function set_schema($schema) {
598
+ global $connection, $types, $structured_types;
599
+ $return = $connection->query("SET search_path TO " . idf_escape($schema));
600
+ foreach (types() as $type) { //! get types from current_schemas('t')
601
+ if (!isset($types[$type])) {
602
+ $types[$type] = 0;
603
+ $structured_types[lang('User types')][] = $type;
604
+ }
605
+ }
606
+ return $return;
607
+ }
608
+
609
+ function use_sql($database) {
610
+ return "\connect " . idf_escape($database);
611
+ }
612
+
613
+ function show_variables() {
614
+ return get_key_vals("SHOW ALL");
615
+ }
616
+
617
+ function process_list() {
618
+ global $connection;
619
+ return get_rows("SELECT * FROM pg_stat_activity ORDER BY " . ($connection->server_info < 9.2 ? "procpid" : "pid"));
620
+ }
621
+
622
+ function show_status() {
623
+ }
624
+
625
+ function convert_field($field) {
626
+ }
627
+
628
+ function unconvert_field($field, $return) {
629
+ return $return;
630
+ }
631
+
632
+ function support($feature) {
633
+ global $connection;
634
+ return preg_match('~^(database|table|columns|sql|indexes|comment|view|' . ($connection->server_info >= 9.3 ? 'materializedview|' : '') . 'scheme|processlist|sequence|trigger|type|variables|drop_col|kill)$~', $feature); //! routine|
635
+ }
636
+
637
+ function kill_process($val) {
638
+ return queries("SELECT pg_terminate_backend(" . number($val).")");
639
+ }
640
+
641
+ function max_connections() {
642
+ global $connection;
643
+ return $connection->result("SHOW max_connections");
644
+ }
645
+
646
+ $jush = "pgsql";
647
+ $types = array();
648
+ $structured_types = array();
649
+ foreach (array( //! arrays
650
+ lang('Numbers') => array("smallint" => 5, "integer" => 10, "bigint" => 19, "boolean" => 1, "numeric" => 0, "real" => 7, "double precision" => 16, "money" => 20),
651
+ lang('Date and time') => array("date" => 13, "time" => 17, "timestamp" => 20, "timestamptz" => 21, "interval" => 0),
652
+ lang('Strings') => array("character" => 0, "character varying" => 0, "text" => 0, "tsquery" => 0, "tsvector" => 0, "uuid" => 0, "xml" => 0),
653
+ lang('Binary') => array("bit" => 0, "bit varying" => 0, "bytea" => 0),
654
+ lang('Network') => array("cidr" => 43, "inet" => 43, "macaddr" => 17, "txid_snapshot" => 0),
655
+ lang('Geometry') => array("box" => 0, "circle" => 0, "line" => 0, "lseg" => 0, "path" => 0, "point" => 0, "polygon" => 0),
656
+ ) as $key => $val) { //! can be retrieved from pg_type
657
+ $types += $val;
658
+ $structured_types[$key] = array_keys($val);
659
+ }
660
+ $unsigned = array();
661
+ $operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "SQL" to avoid SQL injection
662
+ $functions = array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper");
663
+ $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
664
+ $edit_functions = array(
665
+ array(
666
+ "char" => "md5",
667
+ "date|time" => "now",
668
+ ), array(
669
+ "int|numeric|real|money" => "+/-",
670
+ "date|time" => "+ interval/- interval", //! escape
671
+ "char|text" => "||",
672
+ )
673
+ );
674
+ }
adminer/adminer/adminer/drivers/simpledb.inc.php ADDED
@@ -0,0 +1,473 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $drivers["simpledb"] = "SimpleDB";
3
+
4
+ if (isset($_GET["simpledb"])) {
5
+ $possible_drivers = array("SimpleXML");
6
+ define("DRIVER", "simpledb");
7
+
8
+ if (class_exists('SimpleXMLElement')) {
9
+ class Min_DB {
10
+ var $extension = "SimpleXML", $server_info = '2009-04-15', $error, $timeout, $next, $affected_rows, $_result;
11
+
12
+ function select_db($database) {
13
+ return ($database == "domain");
14
+ }
15
+
16
+ function query($query, $unbuffered = false) {
17
+ $params = array('SelectExpression' => $query, 'ConsistentRead' => 'true');
18
+ if ($this->next) {
19
+ $params['NextToken'] = $this->next;
20
+ }
21
+ $result = sdb_request_all('Select', 'Item', $params, $this->timeout); //! respect $unbuffered
22
+ if ($result === false) {
23
+ return $result;
24
+ }
25
+ if (preg_match('~^\s*SELECT\s+COUNT\(~i', $query)) {
26
+ $sum = 0;
27
+ foreach ($result as $item) {
28
+ $sum += $item->Attribute->Value;
29
+ }
30
+ $result = array((object) array('Attribute' => array((object) array(
31
+ 'Name' => 'Count',
32
+ 'Value' => $sum,
33
+ ))));
34
+ }
35
+ return new Min_Result($result);
36
+ }
37
+
38
+ function multi_query($query) {
39
+ return $this->_result = $this->query($query);
40
+ }
41
+
42
+ function store_result() {
43
+ return $this->_result;
44
+ }
45
+
46
+ function next_result() {
47
+ return false;
48
+ }
49
+
50
+ function quote($string) {
51
+ return "'" . str_replace("'", "''", $string) . "'";
52
+ }
53
+
54
+ }
55
+
56
+ class Min_Result {
57
+ var $num_rows, $_rows = array(), $_offset = 0;
58
+
59
+ function __construct($result) {
60
+ foreach ($result as $item) {
61
+ $row = array();
62
+ if ($item->Name != '') { // SELECT COUNT(*)
63
+ $row['itemName()'] = (string) $item->Name;
64
+ }
65
+ foreach ($item->Attribute as $attribute) {
66
+ $name = $this->_processValue($attribute->Name);
67
+ $value = $this->_processValue($attribute->Value);
68
+ if (isset($row[$name])) {
69
+ $row[$name] = (array) $row[$name];
70
+ $row[$name][] = $value;
71
+ } else {
72
+ $row[$name] = $value;
73
+ }
74
+ }
75
+ $this->_rows[] = $row;
76
+ foreach ($row as $key => $val) {
77
+ if (!isset($this->_rows[0][$key])) {
78
+ $this->_rows[0][$key] = null;
79
+ }
80
+ }
81
+ }
82
+ $this->num_rows = count($this->_rows);
83
+ }
84
+
85
+ function _processValue($element) {
86
+ return (is_object($element) && $element['encoding'] == 'base64' ? base64_decode($element) : (string) $element);
87
+ }
88
+
89
+ function fetch_assoc() {
90
+ $row = current($this->_rows);
91
+ if (!$row) {
92
+ return $row;
93
+ }
94
+ $return = array();
95
+ foreach ($this->_rows[0] as $key => $val) {
96
+ $return[$key] = $row[$key];
97
+ }
98
+ next($this->_rows);
99
+ return $return;
100
+ }
101
+
102
+ function fetch_row() {
103
+ $return = $this->fetch_assoc();
104
+ if (!$return) {
105
+ return $return;
106
+ }
107
+ return array_values($return);
108
+ }
109
+
110
+ function fetch_field() {
111
+ $keys = array_keys($this->_rows[0]);
112
+ return (object) array('name' => $keys[$this->_offset++]);
113
+ }
114
+
115
+ }
116
+ }
117
+
118
+
119
+
120
+ class Min_Driver extends Min_SQL {
121
+ public $primary = "itemName()";
122
+
123
+ function _chunkRequest($ids, $action, $params, $expand = array()) {
124
+ global $connection;
125
+ foreach (array_chunk($ids, 25) as $chunk) {
126
+ $params2 = $params;
127
+ foreach ($chunk as $i => $id) {
128
+ $params2["Item.$i.ItemName"] = $id;
129
+ foreach ($expand as $key => $val) {
130
+ $params2["Item.$i.$key"] = $val;
131
+ }
132
+ }
133
+ if (!sdb_request($action, $params2)) {
134
+ return false;
135
+ }
136
+ }
137
+ $connection->affected_rows = count($ids);
138
+ return true;
139
+ }
140
+
141
+ function _extractIds($table, $queryWhere, $limit) {
142
+ $return = array();
143
+ if (preg_match_all("~itemName\(\) = (('[^']*+')+)~", $queryWhere, $matches)) {
144
+ $return = array_map('idf_unescape', $matches[1]);
145
+ } else {
146
+ foreach (sdb_request_all('Select', 'Item', array('SelectExpression' => 'SELECT itemName() FROM ' . table($table) . $queryWhere . ($limit ? " LIMIT 1" : ""))) as $item) {
147
+ $return[] = $item->Name;
148
+ }
149
+ }
150
+ return $return;
151
+ }
152
+
153
+ function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
154
+ global $connection;
155
+ $connection->next = $_GET["next"];
156
+ $return = parent::select($table, $select, $where, $group, $order, $limit, $page, $print);
157
+ $connection->next = 0;
158
+ return $return;
159
+ }
160
+
161
+ function delete($table, $queryWhere, $limit = 0) {
162
+ return $this->_chunkRequest(
163
+ $this->_extractIds($table, $queryWhere, $limit),
164
+ 'BatchDeleteAttributes',
165
+ array('DomainName' => $table)
166
+ );
167
+ }
168
+
169
+ function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
170
+ $delete = array();
171
+ $insert = array();
172
+ $i = 0;
173
+ $ids = $this->_extractIds($table, $queryWhere, $limit);
174
+ $id = idf_unescape($set["`itemName()`"]);
175
+ unset($set["`itemName()`"]);
176
+ foreach ($set as $key => $val) {
177
+ $key = idf_unescape($key);
178
+ if ($val == "NULL" || ($id != "" && array($id) != $ids)) {
179
+ $delete["Attribute." . count($delete) . ".Name"] = $key;
180
+ }
181
+ if ($val != "NULL") {
182
+ foreach ((array) $val as $k => $v) {
183
+ $insert["Attribute.$i.Name"] = $key;
184
+ $insert["Attribute.$i.Value"] = (is_array($val) ? $v : idf_unescape($v));
185
+ if (!$k) {
186
+ $insert["Attribute.$i.Replace"] = "true";
187
+ }
188
+ $i++;
189
+ }
190
+ }
191
+ }
192
+ $params = array('DomainName' => $table);
193
+ return (!$insert || $this->_chunkRequest(($id != "" ? array($id) : $ids), 'BatchPutAttributes', $params, $insert))
194
+ && (!$delete || $this->_chunkRequest($ids, 'BatchDeleteAttributes', $params, $delete))
195
+ ;
196
+ }
197
+
198
+ function insert($table, $set) {
199
+ $params = array("DomainName" => $table);
200
+ $i = 0;
201
+ foreach ($set as $name => $value) {
202
+ if ($value != "NULL") {
203
+ $name = idf_unescape($name);
204
+ if ($name == "itemName()") {
205
+ $params["ItemName"] = idf_unescape($value);
206
+ } else {
207
+ foreach ((array) $value as $val) {
208
+ $params["Attribute.$i.Name"] = $name;
209
+ $params["Attribute.$i.Value"] = (is_array($value) ? $val : idf_unescape($value));
210
+ $i++;
211
+ }
212
+ }
213
+ }
214
+ }
215
+ return sdb_request('PutAttributes', $params);
216
+ }
217
+
218
+ function insertUpdate($table, $rows, $primary) {
219
+ //! use one batch request
220
+ foreach ($rows as $set) {
221
+ if (!$this->update($table, $set, "WHERE `itemName()` = " . q($set["`itemName()`"]))) {
222
+ return false;
223
+ }
224
+ }
225
+ return true;
226
+ }
227
+
228
+ function begin() {
229
+ return false;
230
+ }
231
+
232
+ function commit() {
233
+ return false;
234
+ }
235
+
236
+ function rollback() {
237
+ return false;
238
+ }
239
+
240
+ }
241
+
242
+
243
+
244
+ function connect() {
245
+ return new Min_DB;
246
+ }
247
+
248
+ function support($feature) {
249
+ return preg_match('~sql~', $feature);
250
+ }
251
+
252
+ function logged_user() {
253
+ global $adminer;
254
+ $credentials = $adminer->credentials();
255
+ return $credentials[1];
256
+ }
257
+
258
+ function get_databases() {
259
+ return array("domain");
260
+ }
261
+
262
+ function collations() {
263
+ return array();
264
+ }
265
+
266
+ function db_collation($db, $collations) {
267
+ }
268
+
269
+ function tables_list() {
270
+ global $connection;
271
+ $return = array();
272
+ foreach (sdb_request_all('ListDomains', 'DomainName') as $table) {
273
+ $return[(string) $table] = 'table';
274
+ }
275
+ if ($connection->error && defined("PAGE_HEADER")) {
276
+ echo "<p class='error'>" . error() . "\n";
277
+ }
278
+ return $return;
279
+ }
280
+
281
+ function table_status($name = "", $fast = false) {
282
+ $return = array();
283
+ foreach (($name != "" ? array($name => true) : tables_list()) as $table => $type) {
284
+ $row = array("Name" => $table, "Auto_increment" => "");
285
+ if (!$fast) {
286
+ $meta = sdb_request('DomainMetadata', array('DomainName' => $table));
287
+ if ($meta) {
288
+ foreach (array(
289
+ "Rows" => "ItemCount",
290
+ "Data_length" => "ItemNamesSizeBytes",
291
+ "Index_length" => "AttributeValuesSizeBytes",
292
+ "Data_free" => "AttributeNamesSizeBytes",
293
+ ) as $key => $val) {
294
+ $row[$key] = (string) $meta->$val;
295
+ }
296
+ }
297
+ }
298
+ if ($name != "") {
299
+ return $row;
300
+ }
301
+ $return[$table] = $row;
302
+ }
303
+ return $return;
304
+ }
305
+
306
+ function explain($connection, $query) {
307
+ }
308
+
309
+ function error() {
310
+ global $connection;
311
+ return h($connection->error);
312
+ }
313
+
314
+ function information_schema() {
315
+ }
316
+
317
+ function is_view($table_status) {
318
+ }
319
+
320
+ function indexes($table, $connection2 = null) {
321
+ return array(
322
+ array("type" => "PRIMARY", "columns" => array("itemName()")),
323
+ );
324
+ }
325
+
326
+ function fields($table) {
327
+ return fields_from_edit();
328
+ }
329
+
330
+ function foreign_keys($table) {
331
+ return array();
332
+ }
333
+
334
+ function table($idf) {
335
+ return idf_escape($idf);
336
+ }
337
+
338
+ function idf_escape($idf) {
339
+ return "`" . str_replace("`", "``", $idf) . "`";
340
+ }
341
+
342
+ function limit($query, $where, $limit, $offset = 0, $separator = " ") {
343
+ return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" : "");
344
+ }
345
+
346
+ function unconvert_field($field, $return) {
347
+ return $return;
348
+ }
349
+
350
+ function fk_support($table_status) {
351
+ }
352
+
353
+ function engines() {
354
+ return array();
355
+ }
356
+
357
+ function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
358
+ return ($table == "" && sdb_request('CreateDomain', array('DomainName' => $name)));
359
+ }
360
+
361
+ function drop_tables($tables) {
362
+ foreach ($tables as $table) {
363
+ if (!sdb_request('DeleteDomain', array('DomainName' => $table))) {
364
+ return false;
365
+ }
366
+ }
367
+ return true;
368
+ }
369
+
370
+ function count_tables($databases) {
371
+ foreach ($databases as $db) {
372
+ return array($db => count(tables_list()));
373
+ }
374
+ }
375
+
376
+ function found_rows($table_status, $where) {
377
+ return ($where ? null : $table_status["Rows"]);
378
+ }
379
+
380
+ function last_id() {
381
+ }
382
+
383
+ function hmac($algo, $data, $key, $raw_output = false) {
384
+ // can use hash_hmac() since PHP 5.1.2
385
+ $blocksize = 64;
386
+ if (strlen($key) > $blocksize) {
387
+ $key = pack("H*", $algo($key));
388
+ }
389
+ $key = str_pad($key, $blocksize, "\0");
390
+ $k_ipad = $key ^ str_repeat("\x36", $blocksize);
391
+ $k_opad = $key ^ str_repeat("\x5C", $blocksize);
392
+ $return = $algo($k_opad . pack("H*", $algo($k_ipad . $data)));
393
+ if ($raw_output) {
394
+ $return = pack("H*", $return);
395
+ }
396
+ return $return;
397
+ }
398
+
399
+ function sdb_request($action, $params = array()) {
400
+ global $adminer, $connection;
401
+ list($host, $params['AWSAccessKeyId'], $secret) = $adminer->credentials();
402
+ $params['Action'] = $action;
403
+ $params['Timestamp'] = gmdate('Y-m-d\TH:i:s+00:00');
404
+ $params['Version'] = '2009-04-15';
405
+ $params['SignatureVersion'] = 2;
406
+ $params['SignatureMethod'] = 'HmacSHA1';
407
+ ksort($params);
408
+ $query = '';
409
+ foreach ($params as $key => $val) {
410
+ $query .= '&' . rawurlencode($key) . '=' . rawurlencode($val);
411
+ }
412
+ $query = str_replace('%7E', '~', substr($query, 1));
413
+ $query .= "&Signature=" . urlencode(base64_encode(hmac('sha1', "POST\n" . preg_replace('~^https?://~', '', $host) . "\n/\n$query", $secret, true)));
414
+ @ini_set('track_errors', 1); // @ - may be disabled
415
+ $file = @file_get_contents((preg_match('~^https?://~', $host) ? $host : "http://$host"), false, stream_context_create(array('http' => array(
416
+ 'method' => 'POST', // may not fit in URL with GET
417
+ 'content' => $query,
418
+ 'ignore_errors' => 1, // available since PHP 5.2.10
419
+ ))));
420
+ if (!$file) {
421
+ $connection->error = $php_errormsg;
422
+ return false;
423
+ }
424
+ libxml_use_internal_errors(true);
425
+ $xml = simplexml_load_string($file);
426
+ if (!$xml) {
427
+ $error = libxml_get_last_error();
428
+ $connection->error = $error->message;
429
+ return false;
430
+ }
431
+ if ($xml->Errors) {
432
+ $error = $xml->Errors->Error;
433
+ $connection->error = "$error->Message ($error->Code)";
434
+ return false;
435
+ }
436
+ $connection->error = '';
437
+ $tag = $action . "Result";
438
+ return ($xml->$tag ? $xml->$tag : true);
439
+ }
440
+
441
+ function sdb_request_all($action, $tag, $params = array(), $timeout = 0) {
442
+ $return = array();
443
+ $start = ($timeout ? microtime(true) : 0);
444
+ $limit = (preg_match('~LIMIT\s+(\d+)\s*$~i', $params['SelectExpression'], $match) ? $match[1] : 0);
445
+ do {
446
+ $xml = sdb_request($action, $params);
447
+ if (!$xml) {
448
+ break;
449
+ }
450
+ foreach ($xml->$tag as $element) {
451
+ $return[] = $element;
452
+ }
453
+ if ($limit && count($return) >= $limit) {
454
+ $_GET["next"] = $xml->NextToken;
455
+ break;
456
+ }
457
+ if ($timeout && microtime(true) - $start > $timeout) {
458
+ return false;
459
+ }
460
+ $params['NextToken'] = $xml->NextToken;
461
+ if ($limit) {
462
+ $params['SelectExpression'] = preg_replace('~\d+\s*$~', $limit - count($return), $params['SelectExpression']);
463
+ }
464
+ } while ($xml->NextToken);
465
+ return $return;
466
+ }
467
+
468
+ $jush = "simpledb";
469
+ $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "IS NOT NULL");
470
+ $functions = array();
471
+ $grouping = array("count");
472
+ $edit_functions = array(array("json"));
473
+ }
adminer/adminer/adminer/drivers/sqlite.inc.php ADDED
@@ -0,0 +1,784 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $drivers["sqlite"] = "SQLite 3";
3
+ $drivers["sqlite2"] = "SQLite 2";
4
+
5
+ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
6
+ $possible_drivers = array((isset($_GET["sqlite"]) ? "SQLite3" : "SQLite"), "PDO_SQLite");
7
+ define("DRIVER", (isset($_GET["sqlite"]) ? "sqlite" : "sqlite2"));
8
+ if (class_exists(isset($_GET["sqlite"]) ? "SQLite3" : "SQLiteDatabase")) {
9
+ if (isset($_GET["sqlite"])) {
10
+
11
+ class Min_SQLite {
12
+ var $extension = "SQLite3", $server_info, $affected_rows, $errno, $error, $_link;
13
+
14
+ function __construct($filename) {
15
+ $this->_link = new SQLite3($filename);
16
+ $version = $this->_link->version();
17
+ $this->server_info = $version["versionString"];
18
+ }
19
+
20
+ function query($query) {
21
+ $result = @$this->_link->query($query);
22
+ $this->error = "";
23
+ if (!$result) {
24
+ $this->errno = $this->_link->lastErrorCode();
25
+ $this->error = $this->_link->lastErrorMsg();
26
+ return false;
27
+ } elseif ($result->numColumns()) {
28
+ return new Min_Result($result);
29
+ }
30
+ $this->affected_rows = $this->_link->changes();
31
+ return true;
32
+ }
33
+
34
+ function quote($string) {
35
+ return (is_utf8($string)
36
+ ? "'" . $this->_link->escapeString($string) . "'"
37
+ : "x'" . reset(unpack('H*', $string)) . "'"
38
+ );
39
+ }
40
+
41
+ function store_result() {
42
+ return $this->_result;
43
+ }
44
+
45
+ function result($query, $field = 0) {
46
+ $result = $this->query($query);
47
+ if (!is_object($result)) {
48
+ return false;
49
+ }
50
+ $row = $result->_result->fetchArray();
51
+ return $row[$field];
52
+ }
53
+ }
54
+
55
+ class Min_Result {
56
+ var $_result, $_offset = 0, $num_rows;
57
+
58
+ function __construct($result) {
59
+ $this->_result = $result;
60
+ }
61
+
62
+ function fetch_assoc() {
63
+ return $this->_result->fetchArray(SQLITE3_ASSOC);
64
+ }
65
+
66
+ function fetch_row() {
67
+ return $this->_result->fetchArray(SQLITE3_NUM);
68
+ }
69
+
70
+ function fetch_field() {
71
+ $column = $this->_offset++;
72
+ $type = $this->_result->columnType($column);
73
+ return (object) array(
74
+ "name" => $this->_result->columnName($column),
75
+ "type" => $type,
76
+ "charsetnr" => ($type == SQLITE3_BLOB ? 63 : 0), // 63 - binary
77
+ );
78
+ }
79
+
80
+ function __desctruct() {
81
+ return $this->_result->finalize();
82
+ }
83
+ }
84
+
85
+ } else {
86
+
87
+ class Min_SQLite {
88
+ var $extension = "SQLite", $server_info, $affected_rows, $error, $_link;
89
+
90
+ function __construct($filename) {
91
+ $this->server_info = sqlite_libversion();
92
+ $this->_link = new SQLiteDatabase($filename);
93
+ }
94
+
95
+ function query($query, $unbuffered = false) {
96
+ $method = ($unbuffered ? "unbufferedQuery" : "query");
97
+ $result = @$this->_link->$method($query, SQLITE_BOTH, $error);
98
+ $this->error = "";
99
+ if (!$result) {
100
+ $this->error = $error;
101
+ return false;
102
+ } elseif ($result === true) {
103
+ $this->affected_rows = $this->changes();
104
+ return true;
105
+ }
106
+ return new Min_Result($result);
107
+ }
108
+
109
+ function quote($string) {
110
+ return "'" . sqlite_escape_string($string) . "'";
111
+ }
112
+
113
+ function store_result() {
114
+ return $this->_result;
115
+ }
116
+
117
+ function result($query, $field = 0) {
118
+ $result = $this->query($query);
119
+ if (!is_object($result)) {
120
+ return false;
121
+ }
122
+ $row = $result->_result->fetch();
123
+ return $row[$field];
124
+ }
125
+ }
126
+
127
+ class Min_Result {
128
+ var $_result, $_offset = 0, $num_rows;
129
+
130
+ function __construct($result) {
131
+ $this->_result = $result;
132
+ if (method_exists($result, 'numRows')) { // not available in unbuffered query
133
+ $this->num_rows = $result->numRows();
134
+ }
135
+ }
136
+
137
+ function fetch_assoc() {
138
+ $row = $this->_result->fetch(SQLITE_ASSOC);
139
+ if (!$row) {
140
+ return false;
141
+ }
142
+ $return = array();
143
+ foreach ($row as $key => $val) {
144
+ $return[($key[0] == '"' ? idf_unescape($key) : $key)] = $val;
145
+ }
146
+ return $return;
147
+ }
148
+
149
+ function fetch_row() {
150
+ return $this->_result->fetch(SQLITE_NUM);
151
+ }
152
+
153
+ function fetch_field() {
154
+ $name = $this->_result->fieldName($this->_offset++);
155
+ $pattern = '(\\[.*]|"(?:[^"]|"")*"|(.+))';
156
+ if (preg_match("~^($pattern\\.)?$pattern\$~", $name, $match)) {
157
+ $table = ($match[3] != "" ? $match[3] : idf_unescape($match[2]));
158
+ $name = ($match[5] != "" ? $match[5] : idf_unescape($match[4]));
159
+ }
160
+ return (object) array(
161
+ "name" => $name,
162
+ "orgname" => $name,
163
+ "orgtable" => $table,
164
+ );
165
+ }
166
+
167
+ }
168
+
169
+ }
170
+
171
+ } elseif (extension_loaded("pdo_sqlite")) {
172
+ class Min_SQLite extends Min_PDO {
173
+ var $extension = "PDO_SQLite";
174
+
175
+ function __construct($filename) {
176
+ $this->dsn(DRIVER . ":$filename", "", "");
177
+ }
178
+ }
179
+
180
+ }
181
+
182
+ if (class_exists("Min_SQLite")) {
183
+ class Min_DB extends Min_SQLite {
184
+
185
+ function __construct() {
186
+ parent::__construct(":memory:");
187
+ }
188
+
189
+ function select_db($filename) {
190
+ if (is_readable($filename) && $this->query("ATTACH " . $this->quote(preg_match("~(^[/\\\\]|:)~", $filename) ? $filename : dirname($_SERVER["SCRIPT_FILENAME"]) . "/$filename") . " AS a")) { // is_readable - SQLite 3
191
+ parent::__construct($filename);
192
+ return true;
193
+ }
194
+ return false;
195
+ }
196
+
197
+ function multi_query($query) {
198
+ return $this->_result = $this->query($query);
199
+ }
200
+
201
+ function next_result() {
202
+ return false;
203
+ }
204
+ }
205
+ }
206
+
207
+
208
+
209
+ class Min_Driver extends Min_SQL {
210
+
211
+ function insertUpdate($table, $rows, $primary) {
212
+ $values = array();
213
+ foreach ($rows as $set) {
214
+ $values[] = "(" . implode(", ", $set) . ")";
215
+ }
216
+ return queries("REPLACE INTO " . table($table) . " (" . implode(", ", array_keys(reset($rows))) . ") VALUES\n" . implode(",\n", $values));
217
+ }
218
+
219
+ }
220
+
221
+
222
+
223
+ function idf_escape($idf) {
224
+ return '"' . str_replace('"', '""', $idf) . '"';
225
+ }
226
+
227
+ function table($idf) {
228
+ return idf_escape($idf);
229
+ }
230
+
231
+ function connect() {
232
+ return new Min_DB;
233
+ }
234
+
235
+ function get_databases() {
236
+ return array();
237
+ }
238
+
239
+ function limit($query, $where, $limit, $offset = 0, $separator = " ") {
240
+ return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
241
+ }
242
+
243
+ function limit1($query, $where) {
244
+ global $connection;
245
+ return ($connection->result("SELECT sqlite_compileoption_used('ENABLE_UPDATE_DELETE_LIMIT')") ? limit($query, $where, 1) : " $query$where");
246
+ }
247
+
248
+ function db_collation($db, $collations) {
249
+ global $connection;
250
+ return $connection->result("PRAGMA encoding"); // there is no database list so $db == DB
251
+ }
252
+
253
+ function engines() {
254
+ return array();
255
+ }
256
+
257
+ function logged_user() {
258
+ return get_current_user(); // should return effective user
259
+ }
260
+
261
+ function tables_list() {
262
+ return get_key_vals("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') ORDER BY (name = 'sqlite_sequence'), name", 1);
263
+ }
264
+
265
+ function count_tables($databases) {
266
+ return array();
267
+ }
268
+
269
+ function table_status($name = "") {
270
+ global $connection;
271
+ $return = array();
272
+ foreach (get_rows("SELECT name AS Name, type AS Engine FROM sqlite_master WHERE type IN ('table', 'view') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
273
+ $row["Oid"] = 1;
274
+ $row["Auto_increment"] = "";
275
+ $row["Rows"] = $connection->result("SELECT COUNT(*) FROM " . idf_escape($row["Name"]));
276
+ $return[$row["Name"]] = $row;
277
+ }
278
+ foreach (get_rows("SELECT * FROM sqlite_sequence", null, "") as $row) {
279
+ $return[$row["name"]]["Auto_increment"] = $row["seq"];
280
+ }
281
+ return ($name != "" ? $return[$name] : $return);
282
+ }
283
+
284
+ function is_view($table_status) {
285
+ return $table_status["Engine"] == "view";
286
+ }
287
+
288
+ function fk_support($table_status) {
289
+ global $connection;
290
+ return !$connection->result("SELECT sqlite_compileoption_used('OMIT_FOREIGN_KEY')");
291
+ }
292
+
293
+ function fields($table) {
294
+ global $connection;
295
+ $return = array();
296
+ $primary = "";
297
+ foreach (get_rows("PRAGMA table_info(" . table($table) . ")") as $row) {
298
+ $name = $row["name"];
299
+ $type = strtolower($row["type"]);
300
+ $default = $row["dflt_value"];
301
+ $return[$name] = array(
302
+ "field" => $name,
303
+ "type" => (preg_match('~int~i', $type) ? "integer" : (preg_match('~char|clob|text~i', $type) ? "text" : (preg_match('~blob~i', $type) ? "blob" : (preg_match('~real|floa|doub~i', $type) ? "real" : "numeric")))),
304
+ "full_type" => $type,
305
+ "default" => (preg_match("~'(.*)'~", $default, $match) ? str_replace("''", "'", $match[1]) : ($default == "NULL" ? null : $default)),
306
+ "null" => !$row["notnull"],
307
+ "privileges" => array("select" => 1, "insert" => 1, "update" => 1),
308
+ "primary" => $row["pk"],
309
+ );
310
+ if ($row["pk"]) {
311
+ if ($primary != "") {
312
+ $return[$primary]["auto_increment"] = false;
313
+ } elseif (preg_match('~^integer$~i', $type)) {
314
+ $return[$name]["auto_increment"] = true;
315
+ }
316
+ $primary = $name;
317
+ }
318
+ }
319
+ $sql = $connection->result("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table));
320
+ preg_match_all('~(("[^"]*+")+|[a-z0-9_]+)\s+text\s+COLLATE\s+(\'[^\']+\'|\S+)~i', $sql, $matches, PREG_SET_ORDER);
321
+ foreach ($matches as $match) {
322
+ $name = str_replace('""', '"', preg_replace('~^"|"$~', '', $match[1]));
323
+ if ($return[$name]) {
324
+ $return[$name]["collation"] = trim($match[3], "'");
325
+ }
326
+ }
327
+ return $return;
328
+ }
329
+
330
+ function indexes($table, $connection2 = null) {
331
+ global $connection;
332
+ if (!is_object($connection2)) {
333
+ $connection2 = $connection;
334
+ }
335
+ $return = array();
336
+ $sql = $connection2->result("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table));
337
+ if (preg_match('~\bPRIMARY\s+KEY\s*\((([^)"]+|"[^"]*")++)~i', $sql, $match)) {
338
+ $return[""] = array("type" => "PRIMARY", "columns" => array(), "lengths" => array(), "descs" => array());
339
+ preg_match_all('~((("[^"]*+")+)|(\S+))(\s+(ASC|DESC))?(,\s*|$)~i', $match[1], $matches, PREG_SET_ORDER);
340
+ foreach ($matches as $match) {
341
+ $return[""]["columns"][] = idf_unescape($match[2]) . $match[4];
342
+ $return[""]["descs"][] = (preg_match('~DESC~i', $match[5]) ? '1' : null);
343
+ }
344
+ }
345
+ if (!$return) {
346
+ foreach (fields($table) as $name => $field) {
347
+ if ($field["primary"]) {
348
+ $return[""] = array("type" => "PRIMARY", "columns" => array($name), "lengths" => array(), "descs" => array(null));
349
+ }
350
+ }
351
+ }
352
+ $sqls = get_key_vals("SELECT name, sql FROM sqlite_master WHERE type = 'index' AND tbl_name = " . q($table), $connection2);
353
+ foreach (get_rows("PRAGMA index_list(" . table($table) . ")", $connection2) as $row) {
354
+ $name = $row["name"];
355
+ $index = array("type" => ($row["unique"] ? "UNIQUE" : "INDEX"));
356
+ $index["lengths"] = array();
357
+ $index["descs"] = array();
358
+ foreach (get_rows("PRAGMA index_info(" . idf_escape($name) . ")", $connection2) as $row1) {
359
+ $index["columns"][] = $row1["name"];
360
+ $index["descs"][] = null;
361
+ }
362
+ if (preg_match('~^CREATE( UNIQUE)? INDEX ' . preg_quote(idf_escape($name) . ' ON ' . idf_escape($table), '~') . ' \((.*)\)$~i', $sqls[$name], $regs)) {
363
+ preg_match_all('/("[^"]*+")+( DESC)?/', $regs[2], $matches);
364
+ foreach ($matches[2] as $key => $val) {
365
+ if ($val) {
366
+ $index["descs"][$key] = '1';
367
+ }
368
+ }
369
+ }
370
+ if (!$return[""] || $index["type"] != "UNIQUE" || $index["columns"] != $return[""]["columns"] || $index["descs"] != $return[""]["descs"] || !preg_match("~^sqlite_~", $name)) {
371
+ $return[$name] = $index;
372
+ }
373
+ }
374
+ return $return;
375
+ }
376
+
377
+ function foreign_keys($table) {
378
+ $return = array();
379
+ foreach (get_rows("PRAGMA foreign_key_list(" . table($table) . ")") as $row) {
380
+ $foreign_key = &$return[$row["id"]];
381
+ //! idf_unescape in SQLite2
382
+ if (!$foreign_key) {
383
+ $foreign_key = $row;
384
+ }
385
+ $foreign_key["source"][] = $row["from"];
386
+ $foreign_key["target"][] = $row["to"];
387
+ }
388
+ return $return;
389
+ }
390
+
391
+ function view($name) {
392
+ global $connection;
393
+ return array("select" => preg_replace('~^(?:[^`"[]+|`[^`]*`|"[^"]*")* AS\\s+~iU', '', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . q($name)))); //! identifiers may be inside []
394
+ }
395
+
396
+ function collations() {
397
+ return (isset($_GET["create"]) ? get_vals("PRAGMA collation_list", 1) : array());
398
+ }
399
+
400
+ function information_schema($db) {
401
+ return false;
402
+ }
403
+
404
+ function error() {
405
+ global $connection;
406
+ return h($connection->error);
407
+ }
408
+
409
+ function check_sqlite_name($name) {
410
+ // avoid creating PHP files on unsecured servers
411
+ global $connection;
412
+ $extensions = "db|sdb|sqlite";
413
+ if (!preg_match("~^[^\\0]*\\.($extensions)\$~", $name)) {
414
+ $connection->error = lang('Please use one of the extensions %s.', str_replace("|", ", ", $extensions));
415
+ return false;
416
+ }
417
+ return true;
418
+ }
419
+
420
+ function create_database($db, $collation) {
421
+ global $connection;
422
+ if (file_exists($db)) {
423
+ $connection->error = lang('File exists.');
424
+ return false;
425
+ }
426
+ if (!check_sqlite_name($db)) {
427
+ return false;
428
+ }
429
+ try {
430
+ $link = new Min_SQLite($db);
431
+ } catch (Exception $ex) {
432
+ $connection->error = $ex->getMessage();
433
+ return false;
434
+ }
435
+ $link->query('PRAGMA encoding = "UTF-8"');
436
+ $link->query('CREATE TABLE adminer (i)'); // otherwise creates empty file
437
+ $link->query('DROP TABLE adminer');
438
+ return true;
439
+ }
440
+
441
+ function drop_databases($databases) {
442
+ global $connection;
443
+ $connection->__construct(":memory:"); // to unlock file, doesn't work in PDO on Windows
444
+ foreach ($databases as $db) {
445
+ if (!@unlink($db)) {
446
+ $connection->error = lang('File exists.');
447
+ return false;
448
+ }
449
+ }
450
+ return true;
451
+ }
452
+
453
+ function rename_database($name, $collation) {
454
+ global $connection;
455
+ if (!check_sqlite_name($name)) {
456
+ return false;
457
+ }
458
+ $connection->__construct(":memory:");
459
+ $connection->error = lang('File exists.');
460
+ return @rename(DB, $name);
461
+ }
462
+
463
+ function auto_increment() {
464
+ return " PRIMARY KEY" . (DRIVER == "sqlite" ? " AUTOINCREMENT" : "");
465
+ }
466
+
467
+ function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
468
+ $use_all_fields = ($table == "" || $foreign);
469
+ foreach ($fields as $field) {
470
+ if ($field[0] != "" || !$field[1] || $field[2]) {
471
+ $use_all_fields = true;
472
+ break;
473
+ }
474
+ }
475
+ $alter = array();
476
+ $originals = array();
477
+ foreach ($fields as $field) {
478
+ if ($field[1]) {
479
+ $alter[] = ($use_all_fields ? $field[1] : "ADD " . implode($field[1]));
480
+ if ($field[0] != "") {
481
+ $originals[$field[0]] = $field[1][0];
482
+ }
483
+ }
484
+ }
485
+ if (!$use_all_fields) {
486
+ foreach ($alter as $val) {
487
+ if (!queries("ALTER TABLE " . table($table) . " $val")) {
488
+ return false;
489
+ }
490
+ }
491
+ if ($table != $name && !queries("ALTER TABLE " . table($table) . " RENAME TO " . table($name))) {
492
+ return false;
493
+ }
494
+ } elseif (!recreate_table($table, $name, $alter, $originals, $foreign)) {
495
+ return false;
496
+ }
497
+ if ($auto_increment) {
498
+ queries("UPDATE sqlite_sequence SET seq = $auto_increment WHERE name = " . q($name)); // ignores error
499
+ }
500
+ return true;
501
+ }
502
+
503
+ function recreate_table($table, $name, $fields, $originals, $foreign, $indexes = array()) {
504
+ if ($table != "") {
505
+ if (!$fields) {
506
+ foreach (fields($table) as $key => $field) {
507
+ $fields[] = process_field($field, $field);
508
+ $originals[$key] = idf_escape($key);
509
+ }
510
+ }
511
+ $primary_key = false;
512
+ foreach ($fields as $field) {
513
+ if ($field[6]) {
514
+ $primary_key = true;
515
+ }
516
+ }
517
+ $drop_indexes = array();
518
+ foreach ($indexes as $key => $val) {
519
+ if ($val[2] == "DROP") {
520
+ $drop_indexes[$val[1]] = true;
521
+ unset($indexes[$key]);
522
+ }
523
+ }
524
+ foreach (indexes($table) as $key_name => $index) {
525
+ $columns = array();
526
+ foreach ($index["columns"] as $key => $column) {
527
+ if (!$originals[$column]) {
528
+ continue 2;
529
+ }
530
+ $columns[] = $originals[$column] . ($index["descs"][$key] ? " DESC" : "");
531
+ }
532
+ if (!$drop_indexes[$key_name]) {
533
+ if ($index["type"] != "PRIMARY" || !$primary_key) {
534
+ $indexes[] = array($index["type"], $key_name, $columns);
535
+ }
536
+ }
537
+ }
538
+ foreach ($indexes as $key => $val) {
539
+ if ($val[0] == "PRIMARY") {
540
+ unset($indexes[$key]);
541
+ $foreign[] = " PRIMARY KEY (" . implode(", ", $val[2]) . ")";
542
+ }
543
+ }
544
+ foreach (foreign_keys($table) as $key_name => $foreign_key) {
545
+ foreach ($foreign_key["source"] as $key => $column) {
546
+ if (!$originals[$column]) {
547
+ continue 2;
548
+ }
549
+ $foreign_key["source"][$key] = idf_unescape($originals[$column]);
550
+ }
551
+ if (!isset($foreign[" $key_name"])) {
552
+ $foreign[] = " " . format_foreign_key($foreign_key);
553
+ }
554
+ }
555
+ queries("BEGIN");
556
+ }
557
+ foreach ($fields as $key => $field) {
558
+ $fields[$key] = " " . implode($field);
559
+ }
560
+ $fields = array_merge($fields, array_filter($foreign));
561
+ if (!queries("CREATE TABLE " . table($table != "" ? "adminer_$name" : $name) . " (\n" . implode(",\n", $fields) . "\n)")) {
562
+ // implicit ROLLBACK to not overwrite $connection->error
563
+ return false;
564
+ }
565
+ if ($table != "") {
566
+ if ($originals && !queries("INSERT INTO " . table("adminer_$name") . " (" . implode(", ", $originals) . ") SELECT " . implode(", ", array_map('idf_escape', array_keys($originals))) . " FROM " . table($table))) {
567
+ return false;
568
+ }
569
+ $triggers = array();
570
+ foreach (triggers($table) as $trigger_name => $timing_event) {
571
+ $trigger = trigger($trigger_name);
572
+ $triggers[] = "CREATE TRIGGER " . idf_escape($trigger_name) . " " . implode(" ", $timing_event) . " ON " . table($name) . "\n$trigger[Statement]";
573
+ }
574
+ if (!queries("DROP TABLE " . table($table))) { // drop before creating indexes and triggers to allow using old names
575
+ return false;
576
+ }
577
+ queries("ALTER TABLE " . table("adminer_$name") . " RENAME TO " . table($name));
578
+ if (!alter_indexes($name, $indexes)) {
579
+ return false;
580
+ }
581
+ foreach ($triggers as $trigger) {
582
+ if (!queries($trigger)) {
583
+ return false;
584
+ }
585
+ }
586
+ queries("COMMIT");
587
+ }
588
+ return true;
589
+ }
590
+
591
+ function index_sql($table, $type, $name, $columns) {
592
+ return "CREATE $type " . ($type != "INDEX" ? "INDEX " : "")
593
+ . idf_escape($name != "" ? $name : uniqid($table . "_"))
594
+ . " ON " . table($table)
595
+ . " $columns"
596
+ ;
597
+ }
598
+
599
+ function alter_indexes($table, $alter) {
600
+ foreach ($alter as $primary) {
601
+ if ($primary[0] == "PRIMARY") {
602
+ return recreate_table($table, $table, array(), array(), array(), $alter);
603
+ }
604
+ }
605
+ foreach (array_reverse($alter) as $val) {
606
+ if (!queries($val[2] == "DROP"
607
+ ? "DROP INDEX " . idf_escape($val[1])
608
+ : index_sql($table, $val[0], $val[1], "(" . implode(", ", $val[2]) . ")")
609
+ )) {
610
+ return false;
611
+ }
612
+ }
613
+ return true;
614
+ }
615
+
616
+ function truncate_tables($tables) {
617
+ return apply_queries("DELETE FROM", $tables);
618
+ }
619
+
620
+ function drop_views($views) {
621
+ return apply_queries("DROP VIEW", $views);
622
+ }
623
+
624
+ function drop_tables($tables) {
625
+ return apply_queries("DROP TABLE", $tables);
626
+ }
627
+
628
+ function move_tables($tables, $views, $target) {
629
+ return false;
630
+ }
631
+
632
+ function trigger($name) {
633
+ global $connection;
634
+ if ($name == "") {
635
+ return array("Statement" => "BEGIN\n\t;\nEND");
636
+ }
637
+ $idf = '(?:[^`"\\s]+|`[^`]*`|"[^"]*")+';
638
+ $trigger_options = trigger_options();
639
+ preg_match(
640
+ "~^CREATE\\s+TRIGGER\\s*$idf\\s*(" . implode("|", $trigger_options["Timing"]) . ")\\s+([a-z]+)(?:\\s+OF\\s+($idf))?\\s+ON\\s*$idf\\s*(?:FOR\\s+EACH\\s+ROW\\s)?(.*)~is",
641
+ $connection->result("SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = " . q($name)),
642
+ $match
643
+ );
644
+ $of = $match[3];
645
+ return array(
646
+ "Timing" => strtoupper($match[1]),
647
+ "Event" => strtoupper($match[2]) . ($of ? " OF" : ""),
648
+ "Of" => ($of[0] == '`' || $of[0] == '"' ? idf_unescape($of) : $of),
649
+ "Trigger" => $name,
650
+ "Statement" => $match[4],
651
+ );
652
+ }
653
+
654
+ function triggers($table) {
655
+ $return = array();
656
+ $trigger_options = trigger_options();
657
+ foreach (get_rows("SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . q($table)) as $row) {
658
+ preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*(' . implode("|", $trigger_options["Timing"]) . ')\\s*(.*)\\s+ON\\b~iU', $row["sql"], $match);
659
+ $return[$row["name"]] = array($match[1], $match[2]);
660
+ }
661
+ return $return;
662
+ }
663
+
664
+ function trigger_options() {
665
+ return array(
666
+ "Timing" => array("BEFORE", "AFTER", "INSTEAD OF"),
667
+ "Event" => array("INSERT", "UPDATE", "UPDATE OF", "DELETE"),
668
+ "Type" => array("FOR EACH ROW"),
669
+ );
670
+ }
671
+
672
+ function routine($name, $type) {
673
+ // not supported by SQLite
674
+ }
675
+
676
+ function routines() {
677
+ // not supported by SQLite
678
+ }
679
+
680
+ function routine_languages() {
681
+ // not supported by SQLite
682
+ }
683
+
684
+ function begin() {
685
+ return queries("BEGIN");
686
+ }
687
+
688
+ function last_id() {
689
+ global $connection;
690
+ return $connection->result("SELECT LAST_INSERT_ROWID()");
691
+ }
692
+
693
+ function explain($connection, $query) {
694
+ return $connection->query("EXPLAIN QUERY PLAN $query");
695
+ }
696
+
697
+ function found_rows($table_status, $where) {
698
+ }
699
+
700
+ function types() {
701
+ return array();
702
+ }
703
+
704
+ function schemas() {
705
+ return array();
706
+ }
707
+
708
+ function get_schema() {
709
+ return "";
710
+ }
711
+
712
+ function set_schema($scheme) {
713
+ return true;
714
+ }
715
+
716
+ function create_sql($table, $auto_increment) {
717
+ global $connection;
718
+ $return = $connection->result("SELECT sql FROM sqlite_master WHERE type IN ('table', 'view') AND name = " . q($table));
719
+ foreach (indexes($table) as $name => $index) {
720
+ if ($name == '') {
721
+ continue;
722
+ }
723
+ $return .= ";\n\n" . index_sql($table, $index['type'], $name, "(" . implode(", ", array_map('idf_escape', $index['columns'])) . ")");
724
+ }
725
+ return $return;
726
+ }
727
+
728
+ function truncate_sql($table) {
729
+ return "DELETE FROM " . table($table);
730
+ }
731
+
732
+ function use_sql($database) {
733
+ }
734
+
735
+ function trigger_sql($table, $style) {
736
+ return implode(get_vals("SELECT sql || ';;\n' FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . q($table)));
737
+ }
738
+
739
+ function show_variables() {
740
+ global $connection;
741
+ $return = array();
742
+ foreach (array("auto_vacuum", "cache_size", "count_changes", "default_cache_size", "empty_result_callbacks", "encoding", "foreign_keys", "full_column_names", "fullfsync", "journal_mode", "journal_size_limit", "legacy_file_format", "locking_mode", "page_size", "max_page_count", "read_uncommitted", "recursive_triggers", "reverse_unordered_selects", "secure_delete", "short_column_names", "synchronous", "temp_store", "temp_store_directory", "schema_version", "integrity_check", "quick_check") as $key) {
743
+ $return[$key] = $connection->result("PRAGMA $key");
744
+ }
745
+ return $return;
746
+ }
747
+
748
+ function show_status() {
749
+ $return = array();
750
+ foreach (get_vals("PRAGMA compile_options") as $option) {
751
+ list($key, $val) = explode("=", $option, 2);
752
+ $return[$key] = $val;
753
+ }
754
+ return $return;
755
+ }
756
+
757
+ function convert_field($field) {
758
+ }
759
+
760
+ function unconvert_field($field, $return) {
761
+ return $return;
762
+ }
763
+
764
+ function support($feature) {
765
+ return preg_match('~^(columns|database|drop_col|dump|indexes|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
766
+ }
767
+
768
+ $jush = "sqlite";
769
+ $types = array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0);
770
+ $structured_types = array_keys($types);
771
+ $unsigned = array();
772
+ $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"); // REGEXP can be user defined function
773
+ $functions = array("hex", "length", "lower", "round", "unixepoch", "upper");
774
+ $grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum");
775
+ $edit_functions = array(
776
+ array(
777
+ // "text" => "date('now')/time('now')/datetime('now')",
778
+ ), array(
779
+ "integer|real|numeric" => "+/-",
780
+ // "text" => "date/time/datetime",
781
+ "text" => "||",
782
+ )
783
+ );
784
+ }
adminer/adminer/adminer/dump.inc.php ADDED
@@ -0,0 +1,220 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $TABLE = $_GET["dump"];
3
+
4
+ if ($_POST && !$error) {
5
+ $cookie = "";
6
+ foreach (array("output", "format", "db_style", "routines", "events", "table_style", "auto_increment", "triggers", "data_style") as $key) {
7
+ $cookie .= "&$key=" . urlencode($_POST[$key]);
8
+ }
9
+ cookie("adminer_export", substr($cookie, 1));
10
+ $tables = array_flip((array) $_POST["tables"]) + array_flip((array) $_POST["data"]);
11
+ $ext = dump_headers(
12
+ (count($tables) == 1 ? key($tables) : DB),
13
+ (DB == "" || count($tables) > 1));
14
+ $is_sql = preg_match('~sql~', $_POST["format"]);
15
+
16
+ if ($is_sql) {
17
+ echo "-- Adminer $VERSION " . $drivers[DRIVER] . " dump\n\n";
18
+ if ($jush == "sql") {
19
+ echo "SET NAMES utf8;
20
+ SET time_zone = '+00:00';
21
+ " . ($_POST["data_style"] ? "SET foreign_key_checks = 0;
22
+ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
23
+ " : "") . "
24
+ ";
25
+ $connection->query("SET time_zone = '+00:00';");
26
+ }
27
+ }
28
+
29
+ $style = $_POST["db_style"];
30
+ $databases = array(DB);
31
+ if (DB == "") {
32
+ $databases = $_POST["databases"];
33
+ if (is_string($databases)) {
34
+ $databases = explode("\n", rtrim(str_replace("\r", "", $databases), "\n"));
35
+ }
36
+ }
37
+
38
+ foreach ((array) $databases as $db) {
39
+ $adminer->dumpDatabase($db);
40
+ if ($connection->select_db($db)) {
41
+ if ($is_sql && preg_match('~CREATE~', $style) && ($create = $connection->result("SHOW CREATE DATABASE " . idf_escape($db), 1))) {
42
+ set_utf8mb4($create);
43
+ if ($style == "DROP+CREATE") {
44
+ echo "DROP DATABASE IF EXISTS " . idf_escape($db) . ";\n";
45
+ }
46
+ echo "$create;\n";
47
+ }
48
+ if ($is_sql) {
49
+ if ($style) {
50
+ echo use_sql($db) . ";\n\n";
51
+ }
52
+ $out = "";
53
+
54
+ if ($_POST["routines"]) {
55
+ foreach (array("FUNCTION", "PROCEDURE") as $routine) {
56
+ foreach (get_rows("SHOW $routine STATUS WHERE Db = " . q($db), null, "-- ") as $row) {
57
+ $create = remove_definer($connection->result("SHOW CREATE $routine " . idf_escape($row["Name"]), 2));
58
+ set_utf8mb4($create);
59
+ $out .= ($style != 'DROP+CREATE' ? "DROP $routine IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") . "$create;;\n\n";
60
+ }
61
+ }
62
+ }
63
+
64
+ if ($_POST["events"]) {
65
+ foreach (get_rows("SHOW EVENTS", null, "-- ") as $row) {
66
+ $create = remove_definer($connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3));
67
+ set_utf8mb4($create);
68
+ $out .= ($style != 'DROP+CREATE' ? "DROP EVENT IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") . "$create;;\n\n";
69
+ }
70
+ }
71
+
72
+ if ($out) {
73
+ echo "DELIMITER ;;\n\n$out" . "DELIMITER ;\n\n";
74
+ }
75
+ }
76
+
77
+ if ($_POST["table_style"] || $_POST["data_style"]) {
78
+ $views = array();
79
+ foreach (table_status('', true) as $name => $table_status) {
80
+ $table = (DB == "" || in_array($name, (array) $_POST["tables"]));
81
+ $data = (DB == "" || in_array($name, (array) $_POST["data"]));
82
+ if ($table || $data) {
83
+ if ($ext == "tar") {
84
+ $tmp_file = new TmpFile;
85
+ ob_start(array($tmp_file, 'write'), 1e5);
86
+ }
87
+
88
+ $adminer->dumpTable($name, ($table ? $_POST["table_style"] : ""), (is_view($table_status) ? 2 : 0));
89
+ if (is_view($table_status)) {
90
+ $views[] = $name;
91
+ } elseif ($data) {
92
+ $fields = fields($name);
93
+ $adminer->dumpData($name, $_POST["data_style"], "SELECT *" . convert_fields($fields, $fields) . " FROM " . table($name));
94
+ }
95
+ if ($is_sql && $_POST["triggers"] && $table && ($triggers = trigger_sql($name, $_POST["table_style"]))) {
96
+ echo "\nDELIMITER ;;\n$triggers\nDELIMITER ;\n";
97
+ }
98
+
99
+ if ($ext == "tar") {
100
+ ob_end_flush();
101
+ tar_file((DB != "" ? "" : "$db/") . "$name.csv", $tmp_file);
102
+ } elseif ($is_sql) {
103
+ echo "\n";
104
+ }
105
+ }
106
+ }
107
+
108
+ foreach ($views as $view) {
109
+ $adminer->dumpTable($view, $_POST["table_style"], 1);
110
+ }
111
+
112
+ if ($ext == "tar") {
113
+ echo pack("x512");
114
+ }
115
+ }
116
+ }
117
+ }
118
+
119
+ if ($is_sql) {
120
+ echo "-- " . $connection->result("SELECT NOW()") . "\n";
121
+ }
122
+ exit;
123
+ }
124
+
125
+ page_header(lang('Export'), $error, ($_GET["export"] != "" ? array("table" => $_GET["export"]) : array()), h(DB));
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');
133
+ $data_style = array('', 'TRUNCATE+INSERT', 'INSERT');
134
+ if ($jush == "sql") { //! use insertUpdate() in all drivers
135
+ $data_style[] = 'INSERT+UPDATE';
136
+ }
137
+ parse_str($_COOKIE["adminer_export"], $row);
138
+ if (!$row) {
139
+ $row = array("output" => "text", "format" => "sql", "db_style" => (DB != "" ? "" : "CREATE"), "table_style" => "DROP+CREATE", "data_style" => "INSERT");
140
+ }
141
+ if (!isset($row["events"])) { // backwards compatibility
142
+ $row["routines"] = $row["events"] = ($_GET["dump"] == "");
143
+ $row["triggers"] = $row["table_style"];
144
+ }
145
+
146
+ echo "<tr><th>" . lang('Output') . "<td>" . html_select("output", $adminer->dumpOutput(), $row["output"], 0) . "\n"; // 0 - radio
147
+
148
+ echo "<tr><th>" . lang('Format') . "<td>" . html_select("format", $adminer->dumpFormat(), $row["format"], 0) . "\n"; // 0 - radio
149
+
150
+ echo ($jush == "sqlite" ? "" : "<tr><th>" . lang('Database') . "<td>" . html_select('db_style', $db_style, $row["db_style"])
151
+ . (support("routine") ? checkbox("routines", 1, $row["routines"], lang('Routines')) : "")
152
+ . (support("event") ? checkbox("events", 1, $row["events"], lang('Events')) : "")
153
+ );
154
+
155
+ echo "<tr><th>" . lang('Tables') . "<td>" . html_select('table_style', $table_style, $row["table_style"])
156
+ . checkbox("auto_increment", 1, $row["auto_increment"], lang('Auto Increment'))
157
+ . (support("trigger") ? checkbox("triggers", 1, $row["triggers"], lang('Triggers')) : "")
158
+ ;
159
+
160
+ echo "<tr><th>" . lang('Data') . "<td>" . html_select('data_style', $data_style, $row["data_style"]);
161
+ ?>
162
+ </table>
163
+ <p><input type="submit" value="<?php echo lang('Export'); ?>">
164
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
165
+
166
+ <table cellspacing="0">
167
+ <?php
168
+ $prefixes = array();
169
+ if (DB != "") {
170
+ $checked = ($TABLE != "" ? "" : " checked");
171
+ echo "<thead><tr>";
172
+ echo "<th style='text-align: left;'><label class='block'><input type='checkbox' id='check-tables'$checked onclick='formCheck(this, /^tables\\[/);'>" . lang('Tables') . "</label>";
173
+ echo "<th style='text-align: right;'><label class='block'>" . lang('Data') . "<input type='checkbox' id='check-data'$checked onclick='formCheck(this, /^data\\[/);'></label>";
174
+ echo "</thead>\n";
175
+
176
+ $views = "";
177
+ $tables_list = tables_list();
178
+ foreach ($tables_list as $name => $type) {
179
+ $prefix = preg_replace('~_.*~', '', $name);
180
+ $checked = ($TABLE == "" || $TABLE == (substr($TABLE, -1) == "%" ? "$prefix%" : $name)); //! % may be part of table name
181
+ $print = "<tr><td>" . checkbox("tables[]", $name, $checked, $name, "checkboxClick(event, this); formUncheck('check-tables');", "block");
182
+ if ($type !== null && !preg_match('~table~i', $type)) {
183
+ $views .= "$print\n";
184
+ } else {
185
+ echo "$print<td align='right'><label class='block'><span id='Rows-" . h($name) . "'></span>" . checkbox("data[]", $name, $checked, "", "checkboxClick(event, this); formUncheck('check-data');") . "</label>\n";
186
+ }
187
+ $prefixes[$prefix]++;
188
+ }
189
+ echo $views;
190
+
191
+ if ($tables_list) {
192
+ echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=db');</script>\n";
193
+ }
194
+
195
+ } else {
196
+ echo "<thead><tr><th style='text-align: left;'><label class='block'><input type='checkbox' id='check-databases'" . ($TABLE == "" ? " checked" : "") . " onclick='formCheck(this, /^databases\\[/);'>" . lang('Database') . "</label></thead>\n";
197
+ $databases = $adminer->databases();
198
+ if ($databases) {
199
+ foreach ($databases as $db) {
200
+ if (!information_schema($db)) {
201
+ $prefix = preg_replace('~_.*~', '', $db);
202
+ echo "<tr><td>" . checkbox("databases[]", $db, $TABLE == "" || $TABLE == "$prefix%", $db, "formUncheck('check-databases');", "block") . "\n";
203
+ $prefixes[$prefix]++;
204
+ }
205
+ }
206
+ } else {
207
+ echo "<tr><td><textarea name='databases' rows='10' cols='20'></textarea>";
208
+ }
209
+ }
210
+ ?>
211
+ </table>
212
+ </form>
213
+ <?php
214
+ $first = true;
215
+ foreach ($prefixes as $key => $val) {
216
+ if ($key != "" && $val > 1) {
217
+ echo ($first ? "<p>" : " ") . "<a href='" . h(ME) . "dump=" . urlencode("$key%") . "'>" . h($key) . "</a>";
218
+ $first = false;
219
+ }
220
+ }
adminer/adminer/adminer/edit.inc.php ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $TABLE = $_GET["edit"];
3
+ $fields = fields($TABLE);
4
+ $where = (isset($_GET["select"]) ? (count($_POST["check"]) == 1 ? where_check($_POST["check"][0], $fields) : "") : where($_GET, $fields));
5
+ $update = (isset($_GET["select"]) ? $_POST["edit"] : $where);
6
+ foreach ($fields as $name => $field) {
7
+ if (!isset($field["privileges"][$update ? "update" : "insert"]) || $adminer->fieldName($field) == "") {
8
+ unset($fields[$name]);
9
+ }
10
+ }
11
+
12
+ if ($_POST && !$error && !isset($_GET["select"])) {
13
+ $location = $_POST["referer"];
14
+ if ($_POST["insert"]) { // continue edit or insert
15
+ $location = ($update ? null : $_SERVER["REQUEST_URI"]);
16
+ } elseif (!preg_match('~^.+&select=.+$~', $location)) {
17
+ $location = ME . "select=" . urlencode($TABLE);
18
+ }
19
+
20
+ $indexes = indexes($TABLE);
21
+ $unique_array = unique_array($_GET["where"], $indexes);
22
+ $query_where = "\nWHERE $where";
23
+
24
+ if (isset($_POST["delete"])) {
25
+ queries_redirect(
26
+ $location,
27
+ lang('Item has been deleted.'),
28
+ $driver->delete($TABLE, $query_where, !$unique_array)
29
+ );
30
+
31
+ } else {
32
+ $set = array();
33
+ foreach ($fields as $name => $field) {
34
+ $val = process_input($field);
35
+ if ($val !== false && $val !== null) {
36
+ $set[idf_escape($name)] = $val;
37
+ }
38
+ }
39
+
40
+ if ($update) {
41
+ if (!$set) {
42
+ redirect($location);
43
+ }
44
+ queries_redirect(
45
+ $location,
46
+ lang('Item has been updated.'),
47
+ $driver->update($TABLE, $set, $query_where, !$unique_array)
48
+ );
49
+ if (is_ajax()) {
50
+ page_headers();
51
+ page_messages($error);
52
+ exit;
53
+ }
54
+ } else {
55
+ $result = $driver->insert($TABLE, $set);
56
+ $last_id = ($result ? last_id() : 0);
57
+ queries_redirect($location, lang('Item%s has been inserted.', ($last_id ? " $last_id" : "")), $result); //! link
58
+ }
59
+ }
60
+ }
61
+
62
+ $row = null;
63
+ if ($_POST["save"]) {
64
+ $row = (array) $_POST["fields"];
65
+ } elseif ($where) {
66
+ $select = array();
67
+ foreach ($fields as $name => $field) {
68
+ if (isset($field["privileges"]["select"])) {
69
+ $as = convert_field($field);
70
+ if ($_POST["clone"] && $field["auto_increment"]) {
71
+ $as = "''";
72
+ }
73
+ if ($jush == "sql" && preg_match("~enum|set~", $field["type"])) {
74
+ $as = "1*" . idf_escape($name);
75
+ }
76
+ $select[] = ($as ? "$as AS " : "") . idf_escape($name);
77
+ }
78
+ }
79
+ $row = array();
80
+ if (!support("table")) {
81
+ $select = array("*");
82
+ }
83
+ if ($select) {
84
+ $result = $driver->select($TABLE, $select, array($where), $select, array(), (isset($_GET["select"]) ? 2 : 1));
85
+ $row = $result->fetch_assoc();
86
+ if (!$row) { // MySQLi returns null
87
+ $row = false;
88
+ }
89
+ if (isset($_GET["select"]) && (!$row || $result->fetch_assoc())) { // $result->num_rows != 1 isn't available in all drivers
90
+ $row = null;
91
+ }
92
+ }
93
+ }
94
+
95
+ if (!support("table") && !$fields) {
96
+ if (!$where) { // insert
97
+ $result = $driver->select($TABLE, array("*"), $where, array("*"));
98
+ $row = ($result ? $result->fetch_assoc() : false);
99
+ if (!$row) {
100
+ $row = array($driver->primary => "");
101
+ }
102
+ }
103
+ if ($row) {
104
+ foreach ($row as $key => $val) {
105
+ if (!$where) {
106
+ $row[$key] = null;
107
+ }
108
+ $fields[$key] = array("field" => $key, "null" => ($key != $driver->primary), "auto_increment" => ($key == $driver->primary));
109
+ }
110
+ }
111
+ }
112
+
113
+ edit_form($TABLE, $fields, $row, $update);
adminer/adminer/adminer/event.inc.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $EVENT = $_GET["event"];
3
+ $intervals = array("YEAR", "QUARTER", "MONTH", "DAY", "HOUR", "MINUTE", "WEEK", "SECOND", "YEAR_MONTH", "DAY_HOUR", "DAY_MINUTE", "DAY_SECOND", "HOUR_MINUTE", "HOUR_SECOND", "MINUTE_SECOND");
4
+ $statuses = array("ENABLED" => "ENABLE", "DISABLED" => "DISABLE", "SLAVESIDE_DISABLED" => "DISABLE ON SLAVE");
5
+ $row = $_POST;
6
+
7
+ if ($_POST && !$error) {
8
+ if ($_POST["drop"]) {
9
+ query_redirect("DROP EVENT " . idf_escape($EVENT), substr(ME, 0, -1), lang('Event has been dropped.'));
10
+ } elseif (in_array($row["INTERVAL_FIELD"], $intervals) && isset($statuses[$row["STATUS"]])) {
11
+ $schedule = "\nON SCHEDULE " . ($row["INTERVAL_VALUE"]
12
+ ? "EVERY " . q($row["INTERVAL_VALUE"]) . " $row[INTERVAL_FIELD]"
13
+ . ($row["STARTS"] ? " STARTS " . q($row["STARTS"]) : "")
14
+ . ($row["ENDS"] ? " ENDS " . q($row["ENDS"]) : "") //! ALTER EVENT doesn't drop ENDS - MySQL bug #39173
15
+ : "AT " . q($row["STARTS"])
16
+ ) . " ON COMPLETION" . ($row["ON_COMPLETION"] ? "" : " NOT") . " PRESERVE"
17
+ ;
18
+
19
+ queries_redirect(substr(ME, 0, -1), ($EVENT != "" ? lang('Event has been altered.') : lang('Event has been created.')), queries(($EVENT != ""
20
+ ? "ALTER EVENT " . idf_escape($EVENT) . $schedule
21
+ . ($EVENT != $row["EVENT_NAME"] ? "\nRENAME TO " . idf_escape($row["EVENT_NAME"]) : "")
22
+ : "CREATE EVENT " . idf_escape($row["EVENT_NAME"]) . $schedule
23
+ ) . "\n" . $statuses[$row["STATUS"]] . " COMMENT " . q($row["EVENT_COMMENT"])
24
+ . rtrim(" DO\n$row[EVENT_DEFINITION]", ";") . ";"
25
+ ));
26
+ }
27
+ }
28
+
29
+ page_header(($EVENT != "" ? lang('Alter event') . ": " . h($EVENT) : lang('Create event')), $error);
30
+
31
+ if (!$row && $EVENT != "") {
32
+ $rows = get_rows("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = " . q(DB) . " AND EVENT_NAME = " . q($EVENT));
33
+ $row = reset($rows);
34
+ }
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>&nbsp;<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"]); ?>
48
+ <p>
49
+ <input type="submit" value="<?php echo lang('Save'); ?>">
50
+ <?php if ($EVENT != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
51
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
52
+ </form>
adminer/adminer/adminer/file.inc.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ($_SERVER["HTTP_IF_MODIFIED_SINCE"]) {
3
+ header("HTTP/1.1 304 Not Modified");
4
+ exit;
5
+ }
6
+
7
+ header("Expires: " . gmdate("D, d M Y H:i:s", time() + 365*24*60*60) . " GMT");
8
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
9
+
10
+ if ($_GET["file"] == "favicon.ico") {
11
+ header("Content-Type: image/x-icon");
12
+ echo lzw_decompress(compile_file('../adminer/static/favicon.ico', 'lzw_compress'));
13
+ } elseif ($_GET["file"] == "default.css") {
14
+ header("Content-Type: text/css; charset=utf-8");
15
+ echo lzw_decompress(compile_file('../adminer/static/default.css;../externals/jush/jush.css', 'minify_css'));
16
+ } elseif ($_GET["file"] == "functions.js") {
17
+ header("Content-Type: text/javascript; charset=utf-8");
18
+ echo lzw_decompress(compile_file('../adminer/static/functions.js;static/editing.js', 'minify_js'));
19
+ } elseif ($_GET["file"] == "jush.js") {
20
+ header("Content-Type: text/javascript; charset=utf-8");
21
+ echo lzw_decompress(compile_file('../externals/jush/modules/jush.js;../externals/jush/modules/jush-textarea.js;../externals/jush/modules/jush-txt.js;../externals/jush/modules/jush-sql.js;../externals/jush/modules/jush-pgsql.js;../externals/jush/modules/jush-sqlite.js;../externals/jush/modules/jush-mssql.js;../externals/jush/modules/jush-oracle.js;../externals/jush/modules/jush-simpledb.js', 'minify_js'));
22
+ } else {
23
+ header("Content-Type: image/gif");
24
+ switch ($_GET["file"]) {
25
+ case "plus.gif": echo compile_file('../adminer/static/plus.gif'); break;
26
+ case "cross.gif": echo compile_file('../adminer/static/cross.gif'); break;
27
+ case "up.gif": echo compile_file('../adminer/static/up.gif'); break;
28
+ case "down.gif": echo compile_file('../adminer/static/down.gif'); break;
29
+ case "arrow.gif": echo compile_file('../adminer/static/arrow.gif'); break;
30
+ }
31
+ }
32
+ exit;
adminer/adminer/adminer/foreign.inc.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $TABLE = $_GET["foreign"];
3
+ $name = $_GET["name"];
4
+ $row = $_POST;
5
+
6
+ if ($_POST && !$error && !$_POST["add"] && !$_POST["change"] && !$_POST["change-js"]) {
7
+ $message = ($_POST["drop"] ? lang('Foreign key has been dropped.') : ($name != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.')));
8
+ $location = ME . "table=" . urlencode($TABLE);
9
+
10
+ $row["source"] = array_filter($row["source"], 'strlen');
11
+ ksort($row["source"]); // enforce input order
12
+ $target = array();
13
+ foreach ($row["source"] as $key => $val) {
14
+ $target[$key] = $row["target"][$key];
15
+ }
16
+ $row["target"] = $target;
17
+
18
+ if ($jush == "sqlite") {
19
+ queries_redirect($location, $message, recreate_table($TABLE, $TABLE, array(), array(), array(" $name" => ($_POST["drop"] ? "" : " " . format_foreign_key($row)))));
20
+ } else {
21
+ $alter = "ALTER TABLE " . table($TABLE);
22
+ $drop = "\nDROP " . ($jush == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($name);
23
+ if ($_POST["drop"]) {
24
+ query_redirect($alter . $drop, $location, $message);
25
+ } else {
26
+ query_redirect($alter . ($name != "" ? "$drop," : "") . "\nADD" . format_foreign_key($row), $location, $message);
27
+ $error = lang('Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.') . "<br>$error"; //! no partitioning
28
+ }
29
+ }
30
+ }
31
+
32
+ page_header(lang('Foreign key'), $error, array("table" => $TABLE), h($TABLE));
33
+
34
+ if ($_POST) {
35
+ ksort($row["source"]);
36
+ if ($_POST["add"]) {
37
+ $row["source"][] = "";
38
+ } elseif ($_POST["change"] || $_POST["change-js"]) {
39
+ $row["target"] = array();
40
+ }
41
+ } elseif ($name != "") {
42
+ $foreign_keys = foreign_keys($TABLE);
43
+ $row = $foreign_keys[$name];
44
+ $row["source"][] = "";
45
+ } else {
46
+ $row["table"] = $TABLE;
47
+ $row["source"] = array("");
48
+ }
49
+
50
+ $source = array_keys(fields($TABLE)); //! no text and blob
51
+ $target = ($TABLE === $row["table"] ? $source : array_keys(fields($row["table"])));
52
+ $referencable = array_keys(array_filter(table_status('', true), 'fk_support'));
53
+ ?>
54
+
55
+ <form action="" method="post">
56
+ <p>
57
+ <?php if ($row["db"] == "" && $row["ns"] == "") { ?>
58
+ <?php echo lang('Target table'); ?>:
59
+ <?php echo html_select("table", $referencable, $row["table"], "this.form['change-js'].value = '1'; this.form.submit();"); ?>
60
+ <input type="hidden" name="change-js" value="">
61
+ <noscript><p><input type="submit" name="change" value="<?php echo lang('Change'); ?>"></noscript>
62
+ <table cellspacing="0">
63
+ <thead><tr><th><?php echo lang('Source'); ?><th><?php echo lang('Target'); ?></thead>
64
+ <?php
65
+ $j = 0;
66
+ foreach ($row["source"] as $key => $val) {
67
+ echo "<tr>";
68
+ echo "<td>" . html_select("source[" . (+$key) . "]", array(-1 => "") + $source, $val, ($j == count($row["source"]) - 1 ? "foreignAddRow(this);" : 1));
69
+ echo "<td>" . html_select("target[" . (+$key) . "]", $target, $row["target"][$key]);
70
+ $j++;
71
+ }
72
+ ?>
73
+ </table>
74
+ <p>
75
+ <?php echo lang('ON DELETE'); ?>: <?php echo html_select("on_delete", array(-1 => "") + explode("|", $on_actions), $row["on_delete"]); ?>
76
+ <?php echo lang('ON UPDATE'); ?>: <?php echo html_select("on_update", array(-1 => "") + explode("|", $on_actions), $row["on_update"]); ?>
77
+ <?php echo doc_link(array(
78
+ 'sql' => "innodb-foreign-key-constraints.html",
79
+ 'pgsql' => "sql-createtable.html#SQL-CREATETABLE-REFERENCES",
80
+ 'mssql' => "ms174979.aspx",
81
+ 'oracle' => "clauses002.htm#sthref2903",
82
+ )); ?>
83
+ <p>
84
+ <input type="submit" value="<?php echo lang('Save'); ?>">
85
+ <noscript><p><input type="submit" name="add" value="<?php echo lang('Add column'); ?>"></noscript>
86
+ <?php } ?>
87
+ <?php if ($name != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
88
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
89
+ </form>
adminer/adminer/adminer/include/adminer.inc.php ADDED
@@ -0,0 +1,907 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // any method change in this file should be transferred to editor/include/adminer.inc.php and plugins/plugin.php
3
+
4
+ class Adminer {
5
+ /** @var array operators used in select, null for all operators */
6
+ var $operators;
7
+
8
+ /** Name in title and navigation
9
+ * @return string HTML code
10
+ */
11
+ function name() {
12
+ return "<a href='https://www.adminer.org/' target='_blank' id='h1'>Adminer</a>";
13
+ }
14
+
15
+ /** Connection parameters
16
+ * @return array ($server, $username, $password)
17
+ */
18
+ function credentials() {
19
+ return array(SERVER, $_GET["username"], get_password());
20
+ }
21
+
22
+ /** Get key used for permanent login
23
+ * @param bool
24
+ * @return string cryptic string which gets combined with password or false in case of an error
25
+ */
26
+ function permanentLogin($create = false) {
27
+ return password_file($create);
28
+ }
29
+
30
+ /** Return key used to group brute force attacks; behind a reverse proxy, you want to return the last part of X-Forwarded-For
31
+ * @return string
32
+ */
33
+ function bruteForceKey() {
34
+ return $_SERVER["REMOTE_ADDR"];
35
+ }
36
+
37
+ /** Identifier of selected database
38
+ * @return string
39
+ */
40
+ function database() {
41
+ // should be used everywhere instead of DB
42
+ return DB;
43
+ }
44
+
45
+ /** Get cached list of databases
46
+ * @param bool
47
+ * @return array
48
+ */
49
+ function databases($flush = true) {
50
+ return get_databases($flush);
51
+ }
52
+
53
+ /** Get list of schemas
54
+ * @return array
55
+ */
56
+ function schemas() {
57
+ return schemas();
58
+ }
59
+
60
+ /** Specify limit for waiting on some slow queries like DB list
61
+ * @return float number of seconds
62
+ */
63
+ function queryTimeout() {
64
+ return 5;
65
+ }
66
+
67
+ /** Headers to send before HTML output
68
+ * @return bool true to send security headers
69
+ */
70
+ function headers() {
71
+ return true;
72
+ }
73
+
74
+ /** Print HTML code inside <head>
75
+ * @return bool true to link adminer.css if exists
76
+ */
77
+ function head() {
78
+ ?>
79
+ <link rel="stylesheet" type="text/css" href="../externals/jush/jush.css">
80
+ <?php
81
+ return true;
82
+ }
83
+
84
+ /** Print login form
85
+ * @return null
86
+ */
87
+ function loginForm() {
88
+ global $drivers;
89
+ ?>
90
+ <table cellspacing="0">
91
+ <tr><th><?php echo lang('System'); ?><td><?php echo html_select("auth[driver]", $drivers, DRIVER); ?>
92
+ <tr><th><?php echo lang('Server'); ?><td><input name="auth[server]" value="<?php echo h(SERVER); ?>" title="hostname[:port]" placeholder="localhost" autocapitalize="off">
93
+ <tr><th><?php echo lang('Username'); ?><td><input name="auth[username]" id="username" value="<?php echo h($_GET["username"]); ?>" autocapitalize="off">
94
+ <tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
95
+ <tr><th><?php echo lang('Database'); ?><td><input name="auth[db]" value="<?php echo h($_GET["db"]); ?>" autocapitalize="off">
96
+ </table>
97
+ <script type="text/javascript">
98
+ focus(document.getElementById('username'));
99
+ </script>
100
+ <?php
101
+ echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
102
+ echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
103
+ }
104
+
105
+ /** Authorize the user
106
+ * @param string
107
+ * @param string
108
+ * @return mixed true for success, string for error message, false for unknown error
109
+ */
110
+ function login($login, $password) {
111
+ global $jush;
112
+ if ($jush == "sqlite") {
113
+ return lang('Implement %s method to use SQLite.', 'login()');
114
+ }
115
+ return true;
116
+ }
117
+
118
+ /** Table caption used in navigation and headings
119
+ * @param array result of SHOW TABLE STATUS
120
+ * @return string HTML code, "" to ignore table
121
+ */
122
+ function tableName($tableStatus) {
123
+ return h($tableStatus["Name"]);
124
+ }
125
+
126
+ /** Field caption used in select and edit
127
+ * @param array single field returned from fields()
128
+ * @param int order of column in select
129
+ * @return string HTML code, "" to ignore field
130
+ */
131
+ function fieldName($field, $order = 0) {
132
+ return '<span title="' . h($field["full_type"]) . '">' . h($field["field"]) . '</span>';
133
+ }
134
+
135
+ /** Print links after select heading
136
+ * @param array result of SHOW TABLE STATUS
137
+ * @param string new item options, NULL for no new item
138
+ * @return null
139
+ */
140
+ function selectLinks($tableStatus, $set = "") {
141
+ echo '<p class="links">';
142
+ $links = array("select" => lang('Select data'));
143
+ if (support("table") || support("indexes")) {
144
+ $links["table"] = lang('Show structure');
145
+ }
146
+ if (support("table")) {
147
+ if (is_view($tableStatus)) {
148
+ $links["view"] = lang('Alter view');
149
+ } else {
150
+ $links["create"] = lang('Alter table');
151
+ }
152
+ }
153
+ if ($set !== null) {
154
+ $links["edit"] = lang('New item');
155
+ }
156
+ foreach ($links as $key => $val) {
157
+ echo " <a href='" . h(ME) . "$key=" . urlencode($tableStatus["Name"]) . ($key == "edit" ? $set : "") . "'" . bold(isset($_GET[$key])) . ">$val</a>";
158
+ }
159
+ echo "\n";
160
+ }
161
+
162
+ /** Get foreign keys for table
163
+ * @param string
164
+ * @return array same format as foreign_keys()
165
+ */
166
+ function foreignKeys($table) {
167
+ return foreign_keys($table);
168
+ }
169
+
170
+ /** Find backward keys for table
171
+ * @param string
172
+ * @param string
173
+ * @return array $return[$target_table]["keys"][$key_name][$target_column] = $source_column; $return[$target_table]["name"] = $this->tableName($target_table);
174
+ */
175
+ function backwardKeys($table, $tableName) {
176
+ return array();
177
+ }
178
+
179
+ /** Print backward keys for row
180
+ * @param array result of $this->backwardKeys()
181
+ * @param array
182
+ * @return null
183
+ */
184
+ function backwardKeysPrint($backwardKeys, $row) {
185
+ }
186
+
187
+ /** Query printed in select before execution
188
+ * @param string query to be executed
189
+ * @param string elapsed time
190
+ * @return string
191
+ */
192
+ function selectQuery($query, $time) {
193
+ global $jush;
194
+ return "<p><code class='jush-$jush'>" . h(str_replace("\n", " ", $query)) . "</code> <span class='time'>($time)</span>"
195
+ . (support("sql") ? " <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a>" : "")
196
+ . "</p>" // </p> - required for IE9 inline edit
197
+ ;
198
+ }
199
+
200
+ /** Description of a row in a table
201
+ * @param string
202
+ * @return string SQL expression, empty string for no description
203
+ */
204
+ function rowDescription($table) {
205
+ return "";
206
+ }
207
+
208
+ /** Get descriptions of selected data
209
+ * @param array all data to print
210
+ * @param array
211
+ * @return array
212
+ */
213
+ function rowDescriptions($rows, $foreignKeys) {
214
+ return $rows;
215
+ }
216
+
217
+ /** Get a link to use in select table
218
+ * @param string raw value of the field
219
+ * @param array single field returned from fields()
220
+ * @return string or null to create the default link
221
+ */
222
+ function selectLink($val, $field) {
223
+ }
224
+
225
+ /** Value printed in select table
226
+ * @param string HTML-escaped value to print
227
+ * @param string link to foreign key
228
+ * @param array single field returned from fields()
229
+ * @param array original value before applying editVal() and escaping
230
+ * @return string
231
+ */
232
+ function selectVal($val, $link, $field, $original) {
233
+ $return = ($val === null ? "<i>NULL</i>" : (preg_match("~char|binary~", $field["type"]) && !preg_match("~var~", $field["type"]) ? "<code>$val</code>" : $val));
234
+ if (preg_match('~blob|bytea|raw|file~', $field["type"]) && !is_utf8($val)) {
235
+ $return = lang('%d byte(s)', strlen($original));
236
+ }
237
+ return ($link ? "<a href='" . h($link) . "'" . (is_url($link) ? " rel='noreferrer'" : "") . ">$return</a>" : $return);
238
+ }
239
+
240
+ /** Value conversion used in select and edit
241
+ * @param string
242
+ * @param array single field returned from fields()
243
+ * @return string
244
+ */
245
+ function editVal($val, $field) {
246
+ return $val;
247
+ }
248
+
249
+ /** Print columns box in select
250
+ * @param array result of selectColumnsProcess()[0]
251
+ * @param array selectable columns
252
+ * @return null
253
+ */
254
+ function selectColumnsPrint($select, $columns) {
255
+ global $functions, $grouping;
256
+ print_fieldset("select", lang('Select'), $select);
257
+ $i = 0;
258
+ $select[""] = array();
259
+ foreach ($select as $key => $val) {
260
+ $val = $_GET["columns"][$key];
261
+ $column = select_input(" name='columns[$i][col]' onchange='" . ($key !== "" ? "selectFieldChange(this.form)" : "selectAddRow(this)") . ";'", $columns, $val["col"]);
262
+ echo "<div>" . ($functions || $grouping ? "<select name='columns[$i][fun]' onchange='helpClose();" . ($key !== "" ? "" : " this.nextSibling.nextSibling.onchange();") . "'"
263
+ . on_help("getTarget(event).value && getTarget(event).value.replace(/ |\$/, '(') + ')'", 1) . ">" . optionlist(array(-1 => "") + array_filter(array(lang('Functions') => $functions, lang('Aggregation') => $grouping)), $val["fun"]) . "</select>"
264
+ . "($column)" : $column) . "</div>\n";
265
+ $i++;
266
+ }
267
+ echo "</div></fieldset>\n";
268
+ }
269
+
270
+ /** Print search box in select
271
+ * @param array result of selectSearchProcess()
272
+ * @param array selectable columns
273
+ * @param array
274
+ * @return null
275
+ */
276
+ function selectSearchPrint($where, $columns, $indexes) {
277
+ print_fieldset("search", lang('Search'), $where);
278
+ foreach ($indexes as $i => $index) {
279
+ if ($index["type"] == "FULLTEXT") {
280
+ echo "(<i>" . implode("</i>, <i>", array_map('h', $index["columns"])) . "</i>) AGAINST";
281
+ echo " <input type='search' name='fulltext[$i]' value='" . h($_GET["fulltext"][$i]) . "' onchange='selectFieldChange(this.form);'>";
282
+ echo checkbox("boolean[$i]", 1, isset($_GET["boolean"][$i]), "BOOL");
283
+ echo "<br>\n";
284
+ }
285
+ }
286
+ $_GET["where"] = (array) $_GET["where"];
287
+ reset($_GET["where"]);
288
+ $change_next = "this.nextSibling.onchange();";
289
+ for ($i = 0; $i <= count($_GET["where"]); $i++) {
290
+ list(, $val) = each($_GET["where"]);
291
+ if (!$val || ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators))) {
292
+ echo "<div>" . select_input(" name='where[$i][col]' onchange='$change_next'", $columns, $val["col"], "(" . lang('anywhere') . ")");
293
+ echo html_select("where[$i][op]", $this->operators, $val["op"], $change_next);
294
+ echo "<input type='search' name='where[$i][val]' value='" . h($val["val"]) . "' onchange='" . ($val ? "selectFieldChange(this.form)" : "selectAddRow(this)") . ";' onkeydown='selectSearchKeydown(this, event);' onsearch='selectSearchSearch(this);'></div>\n";
295
+ }
296
+ }
297
+ echo "</div></fieldset>\n";
298
+ }
299
+
300
+ /** Print order box in select
301
+ * @param array result of selectOrderProcess()
302
+ * @param array selectable columns
303
+ * @param array
304
+ * @return null
305
+ */
306
+ function selectOrderPrint($order, $columns, $indexes) {
307
+ print_fieldset("sort", lang('Sort'), $order);
308
+ $i = 0;
309
+ foreach ((array) $_GET["order"] as $key => $val) {
310
+ if ($val != "") {
311
+ echo "<div>" . select_input(" name='order[$i]' onchange='selectFieldChange(this.form);'", $columns, $val);
312
+ echo checkbox("desc[$i]", 1, isset($_GET["desc"][$key]), lang('descending')) . "</div>\n";
313
+ $i++;
314
+ }
315
+ }
316
+ echo "<div>" . select_input(" name='order[$i]' onchange='selectAddRow(this);'", $columns);
317
+ echo checkbox("desc[$i]", 1, false, lang('descending')) . "</div>\n";
318
+ echo "</div></fieldset>\n";
319
+ }
320
+
321
+ /** Print limit box in select
322
+ * @param string result of selectLimitProcess()
323
+ * @return null
324
+ */
325
+ function selectLimitPrint($limit) {
326
+ echo "<fieldset><legend>" . lang('Limit') . "</legend><div>"; // <div> for easy styling
327
+ echo "<input type='number' name='limit' class='size' value='" . h($limit) . "' onchange='selectFieldChange(this.form);'>";
328
+ echo "</div></fieldset>\n";
329
+ }
330
+
331
+ /** Print text length box in select
332
+ * @param string result of selectLengthProcess()
333
+ * @return null
334
+ */
335
+ function selectLengthPrint($text_length) {
336
+ if ($text_length !== null) {
337
+ echo "<fieldset><legend>" . lang('Text length') . "</legend><div>";
338
+ echo "<input type='number' name='text_length' class='size' value='" . h($text_length) . "'>";
339
+ echo "</div></fieldset>\n";
340
+ }
341
+ }
342
+
343
+ /** Print action box in select
344
+ * @param array
345
+ * @return null
346
+ */
347
+ function selectActionPrint($indexes) {
348
+ echo "<fieldset><legend>" . lang('Action') . "</legend><div>";
349
+ echo "<input type='submit' value='" . lang('Select') . "'>";
350
+ echo " <span id='noindex' title='" . lang('Full table scan') . "'></span>";
351
+ echo "<script type='text/javascript'>\n";
352
+ echo "var indexColumns = ";
353
+ $columns = array();
354
+ foreach ($indexes as $index) {
355
+ if ($index["type"] != "FULLTEXT") {
356
+ $columns[reset($index["columns"])] = 1;
357
+ }
358
+ }
359
+ $columns[""] = 1;
360
+ foreach ($columns as $key => $val) {
361
+ json_row($key);
362
+ }
363
+ echo ";\n";
364
+ echo "selectFieldChange(document.getElementById('form'));\n";
365
+ echo "</script>\n";
366
+ echo "</div></fieldset>\n";
367
+ }
368
+
369
+ /** Print command box in select
370
+ * @return bool whether to print default commands
371
+ */
372
+ function selectCommandPrint() {
373
+ return !information_schema(DB);
374
+ }
375
+
376
+ /** Print import box in select
377
+ * @return bool whether to print default import
378
+ */
379
+ function selectImportPrint() {
380
+ return !information_schema(DB);
381
+ }
382
+
383
+ /** Print extra text in the end of a select form
384
+ * @param array fields holding e-mails
385
+ * @param array selectable columns
386
+ * @return null
387
+ */
388
+ function selectEmailPrint($emailFields, $columns) {
389
+ }
390
+
391
+ /** Process columns box in select
392
+ * @param array selectable columns
393
+ * @param array
394
+ * @return array (array(select_expressions), array(group_expressions))
395
+ */
396
+ function selectColumnsProcess($columns, $indexes) {
397
+ global $functions, $grouping;
398
+ $select = array(); // select expressions, empty for *
399
+ $group = array(); // expressions without aggregation - will be used for GROUP BY if an aggregation function is used
400
+ foreach ((array) $_GET["columns"] as $key => $val) {
401
+ if ($val["fun"] == "count" || ($val["col"] != "" && (!$val["fun"] || in_array($val["fun"], $functions) || in_array($val["fun"], $grouping)))) {
402
+ $select[$key] = apply_sql_function($val["fun"], ($val["col"] != "" ? idf_escape($val["col"]) : "*"));
403
+ if (!in_array($val["fun"], $grouping)) {
404
+ $group[] = $select[$key];
405
+ }
406
+ }
407
+ }
408
+ return array($select, $group);
409
+ }
410
+
411
+ /** Process search box in select
412
+ * @param array
413
+ * @param array
414
+ * @return array expressions to join by AND
415
+ */
416
+ function selectSearchProcess($fields, $indexes) {
417
+ global $connection, $jush;
418
+ $return = array();
419
+ foreach ($indexes as $i => $index) {
420
+ if ($index["type"] == "FULLTEXT" && $_GET["fulltext"][$i] != "") {
421
+ $return[] = "MATCH (" . implode(", ", array_map('idf_escape', $index["columns"])) . ") AGAINST (" . q($_GET["fulltext"][$i]) . (isset($_GET["boolean"][$i]) ? " IN BOOLEAN MODE" : "") . ")";
422
+ }
423
+ }
424
+ foreach ((array) $_GET["where"] as $val) {
425
+ if ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators)) {
426
+ $cond = " $val[op]";
427
+ if (preg_match('~IN$~', $val["op"])) {
428
+ $in = process_length($val["val"]);
429
+ $cond .= " " . ($in != "" ? $in : "(NULL)");
430
+ } elseif ($val["op"] == "SQL") {
431
+ $cond = " $val[val]"; // SQL injection
432
+ } elseif ($val["op"] == "LIKE %%") {
433
+ $cond = " LIKE " . $this->processInput($fields[$val["col"]], "%$val[val]%");
434
+ } elseif ($val["op"] == "ILIKE %%") {
435
+ $cond = " ILIKE " . $this->processInput($fields[$val["col"]], "%$val[val]%");
436
+ } elseif (!preg_match('~NULL$~', $val["op"])) {
437
+ $cond .= " " . $this->processInput($fields[$val["col"]], $val["val"]);
438
+ }
439
+ if ($val["col"] != "") {
440
+ $return[] = idf_escape($val["col"]) . $cond;
441
+ } else {
442
+ // find anywhere
443
+ $cols = array();
444
+ foreach ($fields as $name => $field) {
445
+ $is_text = preg_match('~char|text|enum|set~', $field["type"]);
446
+ if ((is_numeric($val["val"]) || !preg_match('~(^|[^o])int|float|double|decimal|bit~', $field["type"]))
447
+ && (!preg_match("~[\x80-\xFF]~", $val["val"]) || $is_text)
448
+ ) {
449
+ $name = idf_escape($name);
450
+ $cols[] = ($jush == "sql" && $is_text && !preg_match("~^utf8_~", $field["collation"]) ? "CONVERT($name USING " . charset($connection) . ")" : $name);
451
+ }
452
+ }
453
+ $return[] = ($cols ? "(" . implode("$cond OR ", $cols) . "$cond)" : "0");
454
+ }
455
+ }
456
+ }
457
+ return $return;
458
+ }
459
+
460
+ /** Process order box in select
461
+ * @param array
462
+ * @param array
463
+ * @return array expressions to join by comma
464
+ */
465
+ function selectOrderProcess($fields, $indexes) {
466
+ $return = array();
467
+ foreach ((array) $_GET["order"] as $key => $val) {
468
+ if ($val != "") {
469
+ $return[] = (preg_match('~^((COUNT\\(DISTINCT |[A-Z0-9_]+\\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\\)|COUNT\\(\\*\\))$~', $val) ? $val : idf_escape($val)) //! MS SQL uses []
470
+ . (isset($_GET["desc"][$key]) ? " DESC" : "")
471
+ ;
472
+ }
473
+ }
474
+ return $return;
475
+ }
476
+
477
+ /** Process limit box in select
478
+ * @return string expression to use in LIMIT, will be escaped
479
+ */
480
+ function selectLimitProcess() {
481
+ return (isset($_GET["limit"]) ? $_GET["limit"] : "50");
482
+ }
483
+
484
+ /** Process length box in select
485
+ * @return string number of characters to shorten texts, will be escaped
486
+ */
487
+ function selectLengthProcess() {
488
+ return (isset($_GET["text_length"]) ? $_GET["text_length"] : "100");
489
+ }
490
+
491
+ /** Process extras in select form
492
+ * @param array AND conditions
493
+ * @param array
494
+ * @return bool true if processed, false to process other parts of form
495
+ */
496
+ function selectEmailProcess($where, $foreignKeys) {
497
+ return false;
498
+ }
499
+
500
+ /** Build SQL query used in select
501
+ * @param array result of selectColumnsProcess()[0]
502
+ * @param array result of selectSearchProcess()
503
+ * @param array result of selectColumnsProcess()[1]
504
+ * @param array result of selectOrderProcess()
505
+ * @param int result of selectLimitProcess()
506
+ * @param int index of page starting at zero
507
+ * @return string empty string to use default query
508
+ */
509
+ function selectQueryBuild($select, $where, $group, $order, $limit, $page) {
510
+ return "";
511
+ }
512
+
513
+ /** Query printed after execution in the message
514
+ * @param string executed query
515
+ * @param string elapsed time
516
+ * @return string
517
+ */
518
+ function messageQuery($query, $time) {
519
+ global $jush;
520
+ restart_session();
521
+ $history = &get_session("queries");
522
+ $id = "sql-" . count($history[$_GET["db"]]);
523
+ if (strlen($query) > 1e6) {
524
+ $query = preg_replace('~[\x80-\xFF]+$~', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
525
+ }
526
+ $history[$_GET["db"]][] = array($query, time(), $time); // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"]
527
+ return " <span class='time'>" . @date("H:i:s") . "</span> <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a>" // @ - time zone may be not set
528
+ . "<div id='$id' class='hidden'><pre><code class='jush-$jush'>" . shorten_utf8($query, 1000) . '</code></pre>'
529
+ . ($time ? " <span class='time'>($time)</span>" : '')
530
+ . (support("sql") ? '<p><a href="' . h(str_replace("db=" . urlencode(DB), "db=" . urlencode($_GET["db"]), ME) . 'sql=&history=' . (count($history[$_GET["db"]]) - 1)) . '">' . lang('Edit') . '</a>' : '')
531
+ . '</div>'
532
+ ;
533
+ }
534
+
535
+ /** Functions displayed in edit form
536
+ * @param array single field from fields()
537
+ * @return array
538
+ */
539
+ function editFunctions($field) {
540
+ global $edit_functions;
541
+ $return = ($field["null"] ? "NULL/" : "");
542
+ foreach ($edit_functions as $key => $functions) {
543
+ if (!$key || (!isset($_GET["call"]) && (isset($_GET["select"]) || where($_GET)))) { // relative functions
544
+ foreach ($functions as $pattern => $val) {
545
+ if (!$pattern || preg_match("~$pattern~", $field["type"])) {
546
+ $return .= "/$val";
547
+ }
548
+ }
549
+ if ($key && !preg_match('~set|blob|bytea|raw|file~', $field["type"])) {
550
+ $return .= "/SQL";
551
+ }
552
+ }
553
+ }
554
+ if ($field["auto_increment"] && !isset($_GET["select"]) && !where($_GET)) {
555
+ $return = lang('Auto Increment');
556
+ }
557
+ return explode("/", $return);
558
+ }
559
+
560
+ /** Get options to display edit field
561
+ * @param string table name
562
+ * @param array single field from fields()
563
+ * @param string attributes to use inside the tag
564
+ * @param string
565
+ * @return string custom input field or empty string for default
566
+ */
567
+ function editInput($table, $field, $attrs, $value) {
568
+ if ($field["type"] == "enum") {
569
+ return (isset($_GET["select"]) ? "<label><input type='radio'$attrs value='-1' checked><i>" . lang('original') . "</i></label> " : "")
570
+ . ($field["null"] ? "<label><input type='radio'$attrs value=''" . ($value !== null || isset($_GET["select"]) ? "" : " checked") . "><i>NULL</i></label> " : "")
571
+ . enum_input("radio", $attrs, $field, $value, 0) // 0 - empty
572
+ ;
573
+ }
574
+ return "";
575
+ }
576
+
577
+ /** Process sent input
578
+ * @param array single field from fields()
579
+ * @param string
580
+ * @param string
581
+ * @return string expression to use in a query
582
+ */
583
+ function processInput($field, $value, $function = "") {
584
+ if ($function == "SQL") {
585
+ return $value; // SQL injection
586
+ }
587
+ $name = $field["field"];
588
+ $return = q($value);
589
+ if (preg_match('~^(now|getdate|uuid)$~', $function)) {
590
+ $return = "$function()";
591
+ } elseif (preg_match('~^current_(date|timestamp)$~', $function)) {
592
+ $return = $function;
593
+ } elseif (preg_match('~^([+-]|\\|\\|)$~', $function)) {
594
+ $return = idf_escape($name) . " $function $return";
595
+ } elseif (preg_match('~^[+-] interval$~', $function)) {
596
+ $return = idf_escape($name) . " $function " . (preg_match("~^(\\d+|'[0-9.: -]') [A-Z_]+$~i", $value) ? $value : $return);
597
+ } elseif (preg_match('~^(addtime|subtime|concat)$~', $function)) {
598
+ $return = "$function(" . idf_escape($name) . ", $return)";
599
+ } elseif (preg_match('~^(md5|sha1|password|encrypt)$~', $function)) {
600
+ $return = "$function($return)";
601
+ }
602
+ return unconvert_field($field, $return);
603
+ }
604
+
605
+ /** Returns export output options
606
+ * @return array
607
+ */
608
+ function dumpOutput() {
609
+ $return = array('text' => lang('open'), 'file' => lang('save'));
610
+ if (function_exists('gzencode')) {
611
+ $return['gz'] = 'gzip';
612
+ }
613
+ return $return;
614
+ }
615
+
616
+ /** Returns export format options
617
+ * @return array empty to disable export
618
+ */
619
+ function dumpFormat() {
620
+ return array('sql' => 'SQL', 'csv' => 'CSV,', 'csv;' => 'CSV;', 'tsv' => 'TSV');
621
+ }
622
+
623
+ /** Export database structure
624
+ * @param string
625
+ * @return null prints data
626
+ */
627
+ function dumpDatabase($db) {
628
+ }
629
+
630
+ /** Export table structure
631
+ * @param string
632
+ * @param string
633
+ * @param int 0 table, 1 view, 2 temporary view table
634
+ * @return null prints data
635
+ */
636
+ function dumpTable($table, $style, $is_view = 0) {
637
+ if ($_POST["format"] != "sql") {
638
+ echo "\xef\xbb\xbf"; // UTF-8 byte order mark
639
+ if ($style) {
640
+ dump_csv(array_keys(fields($table)));
641
+ }
642
+ } else {
643
+ if ($is_view == 2) {
644
+ $fields = array();
645
+ foreach (fields($table) as $name => $field) {
646
+ $fields[] = idf_escape($name) . " $field[full_type]";
647
+ }
648
+ $create = "CREATE TABLE " . table($table) . " (" . implode(", ", $fields) . ")";
649
+ } else {
650
+ $create = create_sql($table, $_POST["auto_increment"]);
651
+ }
652
+ set_utf8mb4($create);
653
+ if ($style && $create) {
654
+ if ($style == "DROP+CREATE" || $is_view == 1) {
655
+ echo "DROP " . ($is_view == 2 ? "VIEW" : "TABLE") . " IF EXISTS " . table($table) . ";\n";
656
+ }
657
+ if ($is_view == 1) {
658
+ $create = remove_definer($create);
659
+ }
660
+ echo "$create;\n\n";
661
+ }
662
+ }
663
+ }
664
+
665
+ /** Export table data
666
+ * @param string
667
+ * @param string
668
+ * @param string
669
+ * @return null prints data
670
+ */
671
+ function dumpData($table, $style, $query) {
672
+ global $connection, $jush;
673
+ $max_packet = ($jush == "sqlite" ? 0 : 1048576); // default, minimum is 1024
674
+ if ($style) {
675
+ if ($_POST["format"] == "sql") {
676
+ if ($style == "TRUNCATE+INSERT") {
677
+ echo truncate_sql($table) . ";\n";
678
+ }
679
+ $fields = fields($table);
680
+ }
681
+ $result = $connection->query($query, 1); // 1 - MYSQLI_USE_RESULT //! enum and set as numbers
682
+ if ($result) {
683
+ $insert = "";
684
+ $buffer = "";
685
+ $keys = array();
686
+ $suffix = "";
687
+ $fetch_function = ($table != '' ? 'fetch_assoc' : 'fetch_row');
688
+ while ($row = $result->$fetch_function()) {
689
+ if (!$keys) {
690
+ $values = array();
691
+ foreach ($row as $val) {
692
+ $field = $result->fetch_field();
693
+ $keys[] = $field->name;
694
+ $key = idf_escape($field->name);
695
+ $values[] = "$key = VALUES($key)";
696
+ }
697
+ $suffix = ($style == "INSERT+UPDATE" ? "\nON DUPLICATE KEY UPDATE " . implode(", ", $values) : "") . ";\n";
698
+ }
699
+ if ($_POST["format"] != "sql") {
700
+ if ($style == "table") {
701
+ dump_csv($keys);
702
+ $style = "INSERT";
703
+ }
704
+ dump_csv($row);
705
+ } else {
706
+ if (!$insert) {
707
+ $insert = "INSERT INTO " . table($table) . " (" . implode(", ", array_map('idf_escape', $keys)) . ") VALUES";
708
+ }
709
+ foreach ($row as $key => $val) {
710
+ $field = $fields[$key];
711
+ $row[$key] = ($val !== null
712
+ ? unconvert_field($field, preg_match('~(^|[^o])int|float|double|decimal~', $field["type"]) && $val != '' ? $val : q($val))
713
+ : "NULL"
714
+ );
715
+ }
716
+ $s = ($max_packet ? "\n" : " ") . "(" . implode(",\t", $row) . ")";
717
+ if (!$buffer) {
718
+ $buffer = $insert . $s;
719
+ } elseif (strlen($buffer) + 4 + strlen($s) + strlen($suffix) < $max_packet) { // 4 - length specification
720
+ $buffer .= ",$s";
721
+ } else {
722
+ echo $buffer . $suffix;
723
+ $buffer = $insert . $s;
724
+ }
725
+ }
726
+ }
727
+ if ($buffer) {
728
+ echo $buffer . $suffix;
729
+ }
730
+ } elseif ($_POST["format"] == "sql") {
731
+ echo "-- " . str_replace("\n", " ", $connection->error) . "\n";
732
+ }
733
+ }
734
+ }
735
+
736
+ /** Set export filename
737
+ * @param string
738
+ * @return string filename without extension
739
+ */
740
+ function dumpFilename($identifier) {
741
+ return friendly_url($identifier != "" ? $identifier : (SERVER != "" ? SERVER : "localhost"));
742
+ }
743
+
744
+ /** Send headers for export
745
+ * @param string
746
+ * @param bool
747
+ * @return string extension
748
+ */
749
+ function dumpHeaders($identifier, $multi_table = false) {
750
+ $output = $_POST["output"];
751
+ $ext = (preg_match('~sql~', $_POST["format"]) ? "sql" : ($multi_table ? "tar" : "csv")); // multiple CSV packed to TAR
752
+ header("Content-Type: " .
753
+ ($output == "gz" ? "application/x-gzip" :
754
+ ($ext == "tar" ? "application/x-tar" :
755
+ ($ext == "sql" || $output != "file" ? "text/plain" : "text/csv") . "; charset=utf-8"
756
+ )));
757
+ if ($output == "gz") {
758
+ ob_start('ob_gzencode', 1e6);
759
+ }
760
+ return $ext;
761
+ }
762
+
763
+ /** Print homepage
764
+ * @return bool whether to print default homepage
765
+ */
766
+ function homepage() {
767
+ echo '<p class="links">' . ($_GET["ns"] == "" && support("database") ? '<a href="' . h(ME) . 'database=">' . lang('Alter database') . "</a>\n" : "");
768
+ echo (support("scheme") ? "<a href='" . h(ME) . "scheme='>" . ($_GET["ns"] != "" ? lang('Alter schema') : lang('Create schema')) . "</a>\n" : "");
769
+ echo ($_GET["ns"] !== "" ? '<a href="' . h(ME) . 'schema=">' . lang('Database schema') . "</a>\n" : "");
770
+ echo (support("privileges") ? "<a href='" . h(ME) . "privileges='>" . lang('Privileges') . "</a>\n" : "");
771
+ return true;
772
+ }
773
+
774
+ /** Prints navigation after Adminer title
775
+ * @param string can be "auth" if there is no database connection, "db" if there is no database selected, "ns" with invalid schema
776
+ * @return null
777
+ */
778
+ function navigation($missing) {
779
+ global $VERSION, $jush, $drivers, $connection;
780
+ ?>
781
+ <h1>
782
+ <?php echo $this->name(); ?> <span class="version"><?php echo $VERSION; ?></span>
783
+ <a href="https://www.adminer.org/#download" target="_blank" id="version"><?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?></a>
784
+ </h1>
785
+ <?php
786
+ if ($missing == "auth") {
787
+ $first = true;
788
+ foreach ((array) $_SESSION["pwds"] as $vendor => $servers) {
789
+ foreach ($servers as $server => $usernames) {
790
+ foreach ($usernames as $username => $password) {
791
+ if ($password !== null) {
792
+ if ($first) {
793
+ echo "<p id='logins' onmouseover='menuOver(this, event);' onmouseout='menuOut(this);'>\n";
794
+ $first = false;
795
+ }
796
+ $dbs = $_SESSION["db"][$vendor][$server][$username];
797
+ foreach (($dbs ? array_keys($dbs) : array("")) as $db) {
798
+ echo "<a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@$server" : "") . ($db != "" ? " - $db" : "")) . "</a><br>\n";
799
+ }
800
+ }
801
+ }
802
+ }
803
+ }
804
+ } else {
805
+ if ($_GET["ns"] !== "" && !$missing && DB != "") {
806
+ $connection->select_db(DB);
807
+ $tables = table_status('', true);
808
+ }
809
+ if (support("sql")) {
810
+ ?>
811
+ <script type="text/javascript" src="../externals/jush/modules/jush.js"></script>
812
+ <script type="text/javascript" src="../externals/jush/modules/jush-textarea.js"></script>
813
+ <script type="text/javascript" src="../externals/jush/modules/jush-txt.js"></script>
814
+ <script type="text/javascript" src="../externals/jush/modules/jush-<?php echo $jush; ?>.js"></script>
815
+ <script type="text/javascript">
816
+ <?php
817
+ if ($tables) {
818
+ $links = array();
819
+ foreach ($tables as $table => $type) {
820
+ $links[] = preg_quote($table, '/');
821
+ }
822
+ echo "var jushLinks = { $jush: [ '" . js_escape(ME) . (support("table") ? "table=" : "select=") . "\$&', /\\b(" . implode("|", $links) . ")\\b/g ] };\n";
823
+ foreach (array("bac", "bra", "sqlite_quo", "mssql_bra") as $val) {
824
+ echo "jushLinks.$val = jushLinks.$jush;\n";
825
+ }
826
+ }
827
+ ?>
828
+ bodyLoad('<?php echo (is_object($connection) ? substr($connection->server_info, 0, 3) : ""); ?>');
829
+ </script>
830
+ <?php
831
+ }
832
+ $this->databasesPrint($missing);
833
+ if (DB == "" || !$missing) {
834
+ echo "<p class='links'>" . (support("sql") ? "<a href='" . h(ME) . "sql='" . bold(isset($_GET["sql"]) && !isset($_GET["import"])) . ">" . lang('SQL command') . "</a>\n<a href='" . h(ME) . "import='" . bold(isset($_GET["import"])) . ">" . lang('Import') . "</a>\n" : "") . "";
835
+ if (support("dump")) {
836
+ echo "<a href='" . h(ME) . "dump=" . urlencode(isset($_GET["table"]) ? $_GET["table"] : $_GET["select"]) . "' id='dump'" . bold(isset($_GET["dump"])) . ">" . lang('Export') . "</a>\n";
837
+ }
838
+ }
839
+ if ($_GET["ns"] !== "" && !$missing && DB != "") {
840
+ echo '<a href="' . h(ME) . 'create="' . bold($_GET["create"] === "") . ">" . lang('Create table') . "</a>\n";
841
+ if (!$tables) {
842
+ echo "<p class='message'>" . lang('No tables.') . "\n";
843
+ } else {
844
+ $this->tablesPrint($tables);
845
+ }
846
+ }
847
+ }
848
+ }
849
+
850
+ /** Prints databases list in menu
851
+ * @param string
852
+ * @return null
853
+ */
854
+ function databasesPrint($missing) {
855
+ global $adminer, $connection;
856
+ $databases = $this->databases();
857
+ ?>
858
+ <form action="">
859
+ <p id="dbs">
860
+ <?php
861
+ hidden_fields_get();
862
+ $db_events = " onmousedown='dbMouseDown(event, this);' onchange='dbChange(this);'";
863
+ echo "<span title='" . lang('database') . "'>DB</span>: " . ($databases
864
+ ? "<select name='db'$db_events>" . optionlist(array("" => "") + $databases, DB) . "</select>"
865
+ : '<input name="db" value="' . h(DB) . '" autocapitalize="off">'
866
+ );
867
+ echo "<input type='submit' value='" . lang('Use') . "'" . ($databases ? " class='hidden'" : "") . ">\n";
868
+ if ($missing != "db" && DB != "" && $connection->select_db(DB)) {
869
+ if (support("scheme")) {
870
+ echo "<br>" . lang('Schema') . ": <select name='ns'$db_events>" . optionlist(array("" => "") + $adminer->schemas(), $_GET["ns"]) . "</select>";
871
+ if ($_GET["ns"] != "") {
872
+ set_schema($_GET["ns"]);
873
+ }
874
+ }
875
+ }
876
+ echo (isset($_GET["sql"]) ? '<input type="hidden" name="sql" value="">'
877
+ : (isset($_GET["schema"]) ? '<input type="hidden" name="schema" value="">'
878
+ : (isset($_GET["dump"]) ? '<input type="hidden" name="dump" value="">'
879
+ : (isset($_GET["privileges"]) ? '<input type="hidden" name="privileges" value="">'
880
+ : ""))));
881
+ echo "</p></form>\n";
882
+ }
883
+
884
+ /** Prints table list in menu
885
+ * @param array result of table_status('', true)
886
+ * @return null
887
+ */
888
+ function tablesPrint($tables) {
889
+ echo "<p id='tables' onmouseover='menuOver(this, event);' onmouseout='menuOut(this);'>\n";
890
+ foreach ($tables as $table => $status) {
891
+ echo '<a href="' . h(ME) . 'select=' . urlencode($table) . '"' . bold($_GET["select"] == $table || $_GET["edit"] == $table, "select") . ">" . lang('select') . "</a> ";
892
+ $name = $this->tableName($status);
893
+ echo (support("table") || support("indexes")
894
+ ? '<a href="' . h(ME) . 'table=' . urlencode($table) . '"'
895
+ . bold(in_array($table, array($_GET["table"], $_GET["create"], $_GET["indexes"], $_GET["foreign"], $_GET["trigger"])), (is_view($status) ? "view" : ""), "structure")
896
+ . " title='" . lang('Show structure') . "'>$name</a>"
897
+ : "<span>$name</span>"
898
+ ) . "<br>\n";
899
+ }
900
+ }
901
+
902
+ }
903
+
904
+ $adminer = (function_exists('adminer_object') ? adminer_object() : new Adminer);
905
+ if ($adminer->operators === null) {
906
+ $adminer->operators = $operators;
907
+ }
adminer/adminer/adminer/include/auth.inc.php ADDED
@@ -0,0 +1,204 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $connection = '';
3
+
4
+ $has_token = $_SESSION["token"];
5
+ if (!$has_token) {
6
+ $_SESSION["token"] = rand(1, 1e6); // defense against cross-site request forgery
7
+ }
8
+ $token = get_token(); ///< @var string CSRF protection
9
+
10
+ $permanent = array();
11
+ if ($_COOKIE["adminer_permanent"]) {
12
+ foreach (explode(" ", $_COOKIE["adminer_permanent"]) as $val) {
13
+ list($key) = explode(":", $val);
14
+ $permanent[$key] = $val;
15
+ }
16
+ }
17
+
18
+ function add_invalid_login() {
19
+ global $adminer;
20
+ $filename = get_temp_dir() . "/adminer.invalid";
21
+ $fp = @fopen($filename, "r+"); // @ - may not exist
22
+ if (!$fp) { // c+ is available since PHP 5.2.6
23
+ $fp = @fopen($filename, "w"); // @ - may not be writable
24
+ if (!$fp) {
25
+ return;
26
+ }
27
+ }
28
+ flock($fp, LOCK_EX);
29
+ $invalids = unserialize(stream_get_contents($fp));
30
+ $time = time();
31
+ if ($invalids) {
32
+ foreach ($invalids as $ip => $val) {
33
+ if ($val[0] < $time) {
34
+ unset($invalids[$ip]);
35
+ }
36
+ }
37
+ }
38
+ $invalid = &$invalids[$adminer->bruteForceKey()];
39
+ if (!$invalid) {
40
+ $invalid = array($time + 30*60, 0); // active for 30 minutes
41
+ }
42
+ $invalid[1]++;
43
+ $serialized = serialize($invalids);
44
+ rewind($fp);
45
+ fwrite($fp, $serialized);
46
+ ftruncate($fp, strlen($serialized));
47
+ flock($fp, LOCK_UN);
48
+ fclose($fp);
49
+ }
50
+
51
+ $auth = $_POST["auth"];
52
+ if ($auth) {
53
+ $invalids = unserialize(@file_get_contents(get_temp_dir() . "/adminer.invalid")); // @ - may not exist
54
+ $invalid = $invalids[$adminer->bruteForceKey()];
55
+ $next_attempt = ($invalid[1] > 30 ? $invalid[0] - time() : 0); // allow 30 invalid attempts
56
+ if ($next_attempt > 0) { //! do the same with permanent login
57
+ auth_error(lang('Too many unsuccessful logins, try again in %d minute(s).', ceil($next_attempt / 60)));
58
+ }
59
+ session_regenerate_id(); // defense against session fixation
60
+ $vendor = $auth["driver"];
61
+ $server = $auth["server"];
62
+ $username = $auth["username"];
63
+ $password = (string) $auth["password"];
64
+ $db = $auth["db"];
65
+ set_password($vendor, $server, $username, $password);
66
+ $_SESSION["db"][$vendor][$server][$username][$db] = true;
67
+ if ($auth["permanent"]) {
68
+ $key = base64_encode($vendor) . "-" . base64_encode($server) . "-" . base64_encode($username) . "-" . base64_encode($db);
69
+ $private = $adminer->permanentLogin(true);
70
+ $permanent[$key] = "$key:" . base64_encode($private ? encrypt_string($password, $private) : "");
71
+ cookie("adminer_permanent", implode(" ", $permanent));
72
+ }
73
+ if (count($_POST) == 1 // 1 - auth
74
+ || DRIVER != $vendor
75
+ || SERVER != $server
76
+ || $_GET["username"] !== $username // "0" == "00"
77
+ || DB != $db
78
+ ) {
79
+ redirect(auth_url($vendor, $server, $username, $db));
80
+ }
81
+
82
+ } elseif ($_POST["logout"]) {
83
+ if ($has_token && !verify_token()) {
84
+ page_header(lang('Logout'), lang('Invalid CSRF token. Send the form again.'));
85
+ page_footer("db");
86
+ exit;
87
+ } else {
88
+ foreach (array("pwds", "db", "dbs", "queries") as $key) {
89
+ set_session($key, null);
90
+ }
91
+ unset_permanent();
92
+ redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.'));
93
+ }
94
+
95
+ } elseif ($permanent && !$_SESSION["pwds"]) {
96
+ session_regenerate_id();
97
+ $private = $adminer->permanentLogin();
98
+ foreach ($permanent as $key => $val) {
99
+ list(, $cipher) = explode(":", $val);
100
+ list($vendor, $server, $username, $db) = array_map('base64_decode', explode("-", $key));
101
+ set_password($vendor, $server, $username, decrypt_string(base64_decode($cipher), $private));
102
+ $_SESSION["db"][$vendor][$server][$username][$db] = true;
103
+ }
104
+ }
105
+
106
+ function unset_permanent() {
107
+ global $permanent;
108
+ foreach ($permanent as $key => $val) {
109
+ list($vendor, $server, $username, $db) = array_map('base64_decode', explode("-", $key));
110
+ if ($vendor == DRIVER && $server == SERVER && $username == $_GET["username"] && $db == DB) {
111
+ unset($permanent[$key]);
112
+ }
113
+ }
114
+ cookie("adminer_permanent", implode(" ", $permanent));
115
+ }
116
+
117
+ /** Renders an error message and a login form
118
+ * @param string plain text
119
+ * @return null exits
120
+ */
121
+ function auth_error($error) {
122
+ global $adminer, $has_token;
123
+ $error = h($error);
124
+ $session_name = session_name();
125
+ if (isset($_GET["username"])) {
126
+ header("HTTP/1.1 403 Forbidden"); // 401 requires sending WWW-Authenticate header
127
+ if (($_COOKIE[$session_name] || $_GET[$session_name]) && !$has_token) {
128
+ $error = lang('Session expired, please login again.');
129
+ } else {
130
+ add_invalid_login();
131
+ $password = get_password();
132
+ if ($password !== null) {
133
+ if ($password === false) {
134
+ $error .= '<br>' . lang('Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.', '<code>permanentLogin()</code>');
135
+ }
136
+ set_password(DRIVER, SERVER, $_GET["username"], null);
137
+ }
138
+ unset_permanent();
139
+ }
140
+ }
141
+ if (!$_COOKIE[$session_name] && $_GET[$session_name] && ini_bool("session.use_only_cookies")) {
142
+ $error = lang('Session support must be enabled.');
143
+ }
144
+ $params = session_get_cookie_params();
145
+ cookie("adminer_key", ($_COOKIE["adminer_key"] ? $_COOKIE["adminer_key"] : rand_string()), $params["lifetime"]);
146
+ page_header(lang('Login'), $error, null);
147
+ echo "<form action='' method='post'>\n";
148
+ $adminer->loginForm();
149
+ echo "<div>";
150
+ hidden_fields($_POST, array("auth")); // expired session
151
+ echo "</div>\n";
152
+ echo "</form>\n";
153
+ page_footer("auth");
154
+ exit;
155
+ }
156
+
157
+ if (isset($_GET["username"])) {
158
+ if (!class_exists("Min_DB")) {
159
+ unset($_SESSION["pwds"][DRIVER]);
160
+ unset_permanent();
161
+ page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', implode(", ", $possible_drivers)), false);
162
+ page_footer("auth");
163
+ exit;
164
+ }
165
+ $connection = connect();
166
+ }
167
+
168
+ $driver = new Min_Driver($connection);
169
+
170
+ if (!is_object($connection) || ($login = $adminer->login($_GET["username"], get_password())) !== true) {
171
+ auth_error((is_string($connection) ? $connection : (is_string($login) ? $login : lang('Invalid credentials.'))));
172
+ }
173
+
174
+ if ($auth && $_POST["token"]) {
175
+ $_POST["token"] = $token; // reset token after explicit login
176
+ }
177
+
178
+ $error = ''; ///< @var string
179
+ if ($_POST) {
180
+ if (!verify_token()) {
181
+ $ini = "max_input_vars";
182
+ $max_vars = ini_get($ini);
183
+ if (extension_loaded("suhosin")) {
184
+ foreach (array("suhosin.request.max_vars", "suhosin.post.max_vars") as $key) {
185
+ $val = ini_get($key);
186
+ if ($val && (!$max_vars || $val < $max_vars)) {
187
+ $ini = $key;
188
+ $max_vars = $val;
189
+ }
190
+ }
191
+ }
192
+ $error = (!$_POST["token"] && $max_vars
193
+ ? lang('Maximum number of allowed fields exceeded. Please increase %s.', "'$ini'")
194
+ : lang('Invalid CSRF token. Send the form again.') . ' ' . lang('If you did not send this request from Adminer then close this page.')
195
+ );
196
+ }
197
+
198
+ } elseif ($_SERVER["REQUEST_METHOD"] == "POST") {
199
+ // posted form with no data means that post_max_size exceeded because Adminer always sends token at least
200
+ $error = lang('Too big POST data. Reduce the data or increase the %s configuration directive.', "'post_max_size'");
201
+ if (isset($_GET["sql"])) {
202
+ $error .= ' ' . lang('You can upload a big SQL file via FTP and import it from server.');
203
+ }
204
+ }
adminer/adminer/adminer/include/bootstrap.inc.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ error_reporting(6135); // errors and warnings
3
+
4
+ include "../adminer/include/coverage.inc.php";
5
+
6
+ // disable filter.default
7
+ $filter = !preg_match('~^(unsafe_raw)?$~', ini_get("filter.default"));
8
+ if ($filter || ini_get("filter.default_flags")) {
9
+ foreach (array('_GET', '_POST', '_COOKIE', '_SERVER') as $val) {
10
+ $unsafe = filter_input_array(constant("INPUT$val"), FILTER_UNSAFE_RAW);
11
+ if ($unsafe) {
12
+ $$val = $unsafe;
13
+ }
14
+ }
15
+ }
16
+
17
+ if (function_exists("mb_internal_encoding")) {
18
+ mb_internal_encoding("8bit");
19
+ }
20
+
21
+ // used only in compiled file
22
+ if (isset($_GET["file"])) {
23
+ include "../adminer/file.inc.php";
24
+ }
25
+
26
+ include "../adminer/include/functions.inc.php";
27
+
28
+ global $adminer, $connection, $drivers, $edit_functions, $enum_length, $error, $functions, $grouping, $HTTPS, $inout, $jush, $LANG, $langs, $on_actions, $permanent, $structured_types, $has_token, $token, $translations, $types, $unsigned, $VERSION; // allows including Adminer inside a function
29
+
30
+ if (!$_SERVER["REQUEST_URI"]) { // IIS 5 compatibility
31
+ $_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"];
32
+ }
33
+ if (!strpos($_SERVER["REQUEST_URI"], '?') && $_SERVER["QUERY_STRING"] != "") { // IIS 7 compatibility
34
+ $_SERVER["REQUEST_URI"] .= "?$_SERVER[QUERY_STRING]";
35
+ }
36
+ $HTTPS = $_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off");
37
+
38
+ @ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled
39
+ session_cache_limiter(""); // to allow restarting session and to not send Cache-Control: no-store
40
+ if (!defined("SID")) {
41
+ session_name("adminer_sid"); // use specific session name to get own namespace
42
+ $params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $HTTPS);
43
+ if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
44
+ $params[] = true; // HttpOnly
45
+ }
46
+ call_user_func_array('session_set_cookie_params', $params); // ini_set() may be disabled
47
+ session_start();
48
+ }
49
+
50
+ // disable magic quotes to be able to use database escaping function
51
+ remove_slashes(array(&$_GET, &$_POST, &$_COOKIE), $filter);
52
+ if (get_magic_quotes_runtime()) {
53
+ set_magic_quotes_runtime(false);
54
+ }
55
+ @set_time_limit(0); // @ - can be disabled
56
+ @ini_set("zend.ze1_compatibility_mode", false); // @ - deprecated
57
+ @ini_set("precision", 20); // @ - can be disabled
58
+
59
+ include "../adminer/include/lang.inc.php";
60
+ include "../adminer/lang/$LANG.inc.php";
61
+ include "../adminer/include/pdo.inc.php";
62
+ include "../adminer/include/driver.inc.php";
63
+ include "../adminer/drivers/sqlite.inc.php";
64
+ include "../adminer/drivers/pgsql.inc.php";
65
+ include "../adminer/drivers/oracle.inc.php";
66
+ include "../adminer/drivers/mssql.inc.php";
67
+ include "../adminer/drivers/firebird.inc.php";
68
+ include "../adminer/drivers/simpledb.inc.php";
69
+ include "../adminer/drivers/mongo.inc.php";
70
+ include "../adminer/drivers/elastic.inc.php";
71
+ include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
72
+
73
+ define("SERVER", $_GET[DRIVER]); // read from pgsql=localhost
74
+ define("DB", $_GET["db"]); // for the sake of speed and size
75
+ define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\\1', $_SERVER["REQUEST_URI"]) . '?'
76
+ . (sid() ? SID . '&' : '')
77
+ . (SERVER !== null ? DRIVER . "=" . urlencode(SERVER) . '&' : '')
78
+ . (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '')
79
+ . (DB != "" ? 'db=' . urlencode(DB) . '&' . (isset($_GET["ns"]) ? "ns=" . urlencode($_GET["ns"]) . "&" : "") : '')
80
+ );
81
+
82
+ include "../adminer/include/version.inc.php";
83
+ include "./include/adminer.inc.php";
84
+ include "../adminer/include/design.inc.php";
85
+ include "../adminer/include/xxtea.inc.php";
86
+ include "../adminer/include/auth.inc.php";
87
+
88
+ if (!ini_bool("session.use_cookies") || @ini_set("session.use_cookies", false) !== false) { // @ - may be disabled
89
+ session_write_close(); // improves concurrency if a user opens several pages at once, may be restarted later
90
+ }
91
+
92
+ include "./include/editing.inc.php";
93
+ include "./include/connect.inc.php";
94
+
95
+ $on_actions = "RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT"; ///< @var string used in foreign_keys()
adminer/adminer/adminer/include/connect.inc.php ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ function connect_error() {
3
+ global $adminer, $connection, $token, $error, $drivers;
4
+ if (DB != "") {
5
+ header("HTTP/1.1 404 Not Found");
6
+ page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), true);
7
+ } else {
8
+ if ($_POST["db"] && !$error) {
9
+ queries_redirect(substr(ME, 0, -1), lang('Databases have been dropped.'), drop_databases($_POST["db"]));
10
+ }
11
+
12
+ page_header(lang('Select database'), $error, false);
13
+ echo "<p class='links'>\n";
14
+ foreach (array(
15
+ 'database' => lang('Create new database'),
16
+ 'privileges' => lang('Privileges'),
17
+ 'processlist' => lang('Process list'),
18
+ 'variables' => lang('Variables'),
19
+ 'status' => lang('Status'),
20
+ ) as $key => $val) {
21
+ if (support($key)) {
22
+ echo "<a href='" . h(ME) . "$key='>$val</a>\n";
23
+ }
24
+ }
25
+ echo "<p>" . lang('%s version: %s through PHP extension %s', $drivers[DRIVER], "<b>" . h($connection->server_info) . "</b>", "<b>$connection->extension</b>") . "\n";
26
+ echo "<p>" . lang('Logged as: %s', "<b>" . h(logged_user()) . "</b>") . "\n";
27
+ $databases = $adminer->databases();
28
+ if ($databases) {
29
+ $scheme = support("scheme");
30
+ $collations = collations();
31
+ echo "<form action='' method='post'>\n";
32
+ echo "<table cellspacing='0' class='checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
33
+ echo "<thead><tr>"
34
+ . (support("database") ? "<td>&nbsp;" : "")
35
+ . "<th>" . lang('Database') . " - <a href='" . h(ME) . "refresh=1'>" . lang('Refresh') . "</a>"
36
+ . "<td>" . lang('Collation')
37
+ . "<td>" . lang('Tables')
38
+ . "<td>" . lang('Size') . " - <a href='" . h(ME) . "dbsize=1' onclick=\"return !ajaxSetHtml('" . h(js_escape(ME)) . "script=connect');\">" . lang('Compute') . "</a>"
39
+ . "</thead>\n"
40
+ ;
41
+
42
+ $databases = ($_GET["dbsize"] ? count_tables($databases) : array_flip($databases));
43
+
44
+ foreach ($databases as $db => $tables) {
45
+ $root = h(ME) . "db=" . urlencode($db);
46
+ echo "<tr" . odd() . ">" . (support("database") ? "<td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"])) : "");
47
+ echo "<th><a href='$root'>" . h($db) . "</a>";
48
+ $collation = nbsp(db_collation($db, $collations));
49
+ echo "<td>" . (support("database") ? "<a href='$root" . ($scheme ? "&amp;ns=" : "") . "&amp;database=' title='" . lang('Alter database') . "'>$collation</a>" : $collation);
50
+ echo "<td align='right'><a href='$root&amp;schema=' id='tables-" . h($db) . "' title='" . lang('Database schema') . "'>" . ($_GET["dbsize"] ? $tables : "?") . "</a>";
51
+ echo "<td align='right' id='size-" . h($db) . "'>" . ($_GET["dbsize"] ? db_size($db) : "?");
52
+ echo "\n";
53
+ }
54
+
55
+ echo "</table>\n";
56
+ echo (support("database")
57
+ ? "<fieldset><legend>" . lang('Selected') . " <span id='selected'></span></legend><div>\n"
58
+ . "<input type='hidden' name='all' value='' onclick=\"selectCount('selected', formChecked(this, /^db/));\">\n" // used by trCheck()
59
+ . "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n"
60
+ . "</div></fieldset>\n"
61
+ : ""
62
+ );
63
+ echo "<script type='text/javascript'>tableCheck();</script>\n";
64
+ echo "<input type='hidden' name='token' value='$token'>\n";
65
+ echo "</form>\n";
66
+ }
67
+ }
68
+
69
+ page_footer("db");
70
+ }
71
+
72
+ if (isset($_GET["status"])) {
73
+ $_GET["variables"] = $_GET["status"];
74
+ }
75
+ if (isset($_GET["import"])) {
76
+ $_GET["sql"] = $_GET["import"];
77
+ }
78
+
79
+ if (!(DB != "" ? $connection->select_db(DB) : isset($_GET["sql"]) || isset($_GET["dump"]) || isset($_GET["database"]) || isset($_GET["processlist"]) || isset($_GET["privileges"]) || isset($_GET["user"]) || isset($_GET["variables"]) || $_GET["script"] == "connect" || $_GET["script"] == "kill")) {
80
+ if (DB != "" || $_GET["refresh"]) {
81
+ restart_session();
82
+ set_session("dbs", null);
83
+ }
84
+ connect_error(); // separate function to catch SQLite error
85
+ exit;
86
+ }
87
+
88
+ if (support("scheme") && DB != "" && $_GET["ns"] !== "") {
89
+ if (!isset($_GET["ns"])) {
90
+ redirect(preg_replace('~ns=[^&]*&~', '', ME) . "ns=" . get_schema());
91
+ }
92
+ if (!set_schema($_GET["ns"])) {
93
+ header("HTTP/1.1 404 Not Found");
94
+ page_header(lang('Schema') . ": " . h($_GET["ns"]), lang('Invalid schema.'), true);
95
+ page_footer("ns");
96
+ exit;
97
+ }
98
+ }
adminer/adminer/adminer/include/coverage.inc.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // coverage is used in tests and removed in compilation
3
+ if (extension_loaded("xdebug") && file_exists(sys_get_temp_dir() . "/adminer_coverage.ser")) {
4
+ function save_coverage() {
5
+ $coverage_filename = sys_get_temp_dir() . "/adminer_coverage.ser";
6
+ $coverage = unserialize(file_get_contents($coverage_filename));
7
+ foreach (xdebug_get_code_coverage() as $filename => $lines) {
8
+ foreach ($lines as $l => $val) {
9
+ if (!$coverage[$filename][$l] || $val > 0) {
10
+ $coverage[$filename][$l] = $val;
11
+ }
12
+ }
13
+ file_put_contents($coverage_filename, serialize($coverage));
14
+ }
15
+ }
16
+ xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
17
+ register_shutdown_function('save_coverage');
18
+ }
adminer/adminer/adminer/include/design.inc.php ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** Print HTML header
3
+ * @param string used in title, breadcrumb and heading, should be HTML escaped
4
+ * @param string
5
+ * @param mixed array("key" => "link", "key2" => array("link", "desc")), null for nothing, false for driver only, true for driver and server
6
+ * @param string used after colon in title and heading, should be HTML escaped
7
+ * @return null
8
+ */
9
+ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
10
+ global $LANG, $VERSION, $adminer, $drivers, $jush;
11
+ page_headers();
12
+ if (is_ajax() && $error) {
13
+ page_messages($error);
14
+ exit;
15
+ }
16
+ $title_all = $title . ($title2 != "" ? ": $title2" : "");
17
+ $title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name());
18
+ ?>
19
+ <!DOCTYPE html>
20
+ <html lang="<?php echo $LANG; ?>" dir="<?php echo lang('ltr'); ?>">
21
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
22
+ <meta http-equiv="Content-Script-Type" content="text/javascript">
23
+ <meta name="robots" content="noindex">
24
+ <meta name="referrer" content="origin-when-crossorigin">
25
+ <title><?php echo $title_page; ?></title>
26
+ <link rel="stylesheet" type="text/css" href="../adminer/static/default.css">
27
+ <script type="text/javascript" src="../adminer/static/functions.js"></script>
28
+ <script type="text/javascript" src="static/editing.js"></script>
29
+ <?php if ($adminer->head()) { ?>
30
+ <link rel="shortcut icon" type="image/x-icon" href="../adminer/static/favicon.ico">
31
+ <link rel="apple-touch-icon" href="../adminer/static/favicon.ico">
32
+ <?php if (file_exists("adminer.css")) { ?>
33
+ <link rel="stylesheet" type="text/css" href="adminer.css">
34
+ <?php } ?>
35
+ <?php } ?>
36
+
37
+ <body class="<?php echo lang('ltr'); ?> nojs" onkeydown="bodyKeydown(event);" onclick="bodyClick(event);"<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " onload=\"verifyVersion('$VERSION');\""); ?>>
38
+ <script type="text/javascript">
39
+ document.body.className = document.body.className.replace(/ nojs/, ' js');
40
+ var offlineMessage = '<?php echo js_escape(lang('You are offline.')); ?>';
41
+ </script>
42
+
43
+ <div id="help" class="jush-<?php echo $jush; ?> jsonly hidden" onmouseover="helpOpen = 1;" onmouseout="helpMouseout(this, event);"></div>
44
+
45
+ <div id="content">
46
+ <?php
47
+ if ($breadcrumb !== null) {
48
+ $link = substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1);
49
+ echo '<p id="breadcrumb"><a href="' . h($link ? $link : ".") . '">' . $drivers[DRIVER] . '</a> &raquo; ';
50
+ $link = substr(preg_replace('~\b(db|ns)=[^&]*&~', '', ME), 0, -1);
51
+ $server = (SERVER != "" ? h(SERVER) : lang('Server'));
52
+ if ($breadcrumb === false) {
53
+ echo "$server\n";
54
+ } else {
55
+ echo "<a href='" . ($link ? h($link) : ".") . "' accesskey='1' title='Alt+Shift+1'>$server</a> &raquo; ";
56
+ if ($_GET["ns"] != "" || (DB != "" && is_array($breadcrumb))) {
57
+ echo '<a href="' . h($link . "&db=" . urlencode(DB) . (support("scheme") ? "&ns=" : "")) . '">' . h(DB) . '</a> &raquo; ';
58
+ }
59
+ if (is_array($breadcrumb)) {
60
+ if ($_GET["ns"] != "") {
61
+ echo '<a href="' . h(substr(ME, 0, -1)) . '">' . h($_GET["ns"]) . '</a> &raquo; ';
62
+ }
63
+ foreach ($breadcrumb as $key => $val) {
64
+ $desc = (is_array($val) ? $val[1] : h($val));
65
+ if ($desc != "") {
66
+ echo "<a href='" . h(ME . "$key=") . urlencode(is_array($val) ? $val[0] : $val) . "'>$desc</a> &raquo; ";
67
+ }
68
+ }
69
+ }
70
+ echo "$title\n";
71
+ }
72
+ }
73
+ echo "<h2>$title_all</h2>\n";
74
+ echo "<div id='ajaxstatus' class='jsonly hidden'></div>\n";
75
+ restart_session();
76
+ page_messages($error);
77
+ $databases = &get_session("dbs");
78
+ if (DB != "" && $databases && !in_array(DB, $databases, true)) {
79
+ $databases = null;
80
+ }
81
+ stop_session();
82
+ define("PAGE_HEADER", 1);
83
+ }
84
+
85
+ /** Send HTTP headers
86
+ * @return null
87
+ */
88
+ function page_headers() {
89
+ global $adminer;
90
+ header("Content-Type: text/html; charset=utf-8");
91
+ header("Cache-Control: no-cache");
92
+ if ($adminer->headers()) {
93
+ header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, Firefox 3.6.9
94
+ header("X-XSS-Protection: 0"); // prevents introducing XSS in IE8 by removing safe parts of the page
95
+ }
96
+ }
97
+
98
+ /** Print flash and error messages
99
+ * @param string
100
+ * @return null
101
+ */
102
+ function page_messages($error) {
103
+ $uri = preg_replace('~^[^?]*~', '', $_SERVER["REQUEST_URI"]);
104
+ $messages = $_SESSION["messages"][$uri];
105
+ if ($messages) {
106
+ echo "<div class='message'>" . implode("</div>\n<div class='message'>", $messages) . "</div>\n";
107
+ unset($_SESSION["messages"][$uri]);
108
+ }
109
+ if ($error) {
110
+ echo "<div class='error'>$error</div>\n";
111
+ }
112
+ }
113
+
114
+ /** Print HTML footer
115
+ * @param string "auth", "db", "ns"
116
+ * @return null
117
+ */
118
+ function page_footer($missing = "") {
119
+ global $adminer, $token;
120
+ ?>
121
+ </div>
122
+
123
+ <?php switch_lang(); ?>
124
+ <?php if ($missing != "auth") { ?>
125
+ <form action="" method="post">
126
+ <p class="logout">
127
+ <input type="submit" name="logout" value="<?php echo lang('Logout'); ?>" id="logout">
128
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
129
+ </p>
130
+ </form>
131
+ <?php } ?>
132
+ <div id="menu">
133
+ <?php $adminer->navigation($missing); ?>
134
+ </div>
135
+ <script type="text/javascript">setupSubmitHighlight(document);</script>
136
+ <?php
137
+ }
adminer/adminer/adminer/include/driver.inc.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*abstract*/ class Min_SQL {
4
+ var $_conn;
5
+
6
+ /** Create object for performing database operations
7
+ * @param Min_DB
8
+ */
9
+ function __construct($connection) {
10
+ $this->_conn = $connection;
11
+ }
12
+
13
+ /** Select data from table
14
+ * @param string
15
+ * @param array result of $adminer->selectColumnsProcess()[0]
16
+ * @param array result of $adminer->selectSearchProcess()
17
+ * @param array result of $adminer->selectColumnsProcess()[1]
18
+ * @param array result of $adminer->selectOrderProcess()
19
+ * @param int result of $adminer->selectLimitProcess()
20
+ * @param int index of page starting at zero
21
+ * @param bool whether to print the query
22
+ * @return Min_Result
23
+ */
24
+ function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
25
+ global $adminer, $jush;
26
+ $is_group = (count($group) < count($select));
27
+ $query = $adminer->selectQueryBuild($select, $where, $group, $order, $limit, $page);
28
+ if (!$query) {
29
+ $query = "SELECT" . limit(
30
+ ($_GET["page"] != "last" && +$limit && $group && $is_group && $jush == "sql" ? "SQL_CALC_FOUND_ROWS " : "") . implode(", ", $select) . "\nFROM " . table($table),
31
+ ($where ? "\nWHERE " . implode(" AND ", $where) : "") . ($group && $is_group ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : ""),
32
+ ($limit != "" ? +$limit : null),
33
+ ($page ? $limit * $page : 0),
34
+ "\n"
35
+ );
36
+ }
37
+ $start = microtime(true);
38
+ $return = $this->_conn->query($query);
39
+ if ($print) {
40
+ echo $adminer->selectQuery($query, format_time($start));
41
+ }
42
+ return $return;
43
+ }
44
+
45
+ /** Delete data from table
46
+ * @param string
47
+ * @param string " WHERE ..."
48
+ * @param int 0 or 1
49
+ * @return bool
50
+ */
51
+ function delete($table, $queryWhere, $limit = 0) {
52
+ $query = "FROM " . table($table);
53
+ return queries("DELETE" . ($limit ? limit1($query, $queryWhere) : " $query$queryWhere"));
54
+ }
55
+
56
+ /** Update data in table
57
+ * @param string
58
+ * @param array escaped columns in keys, quoted data in values
59
+ * @param string " WHERE ..."
60
+ * @param int 0 or 1
61
+ * @param string
62
+ * @return bool
63
+ */
64
+ function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
65
+ $values = array();
66
+ foreach ($set as $key => $val) {
67
+ $values[] = "$key = $val";
68
+ }
69
+ $query = table($table) . " SET$separator" . implode(",$separator", $values);
70
+ return queries("UPDATE" . ($limit ? limit1($query, $queryWhere) : " $query$queryWhere"));
71
+ }
72
+
73
+ /** Insert data into table
74
+ * @param string
75
+ * @param array escaped columns in keys, quoted data in values
76
+ * @return bool
77
+ */
78
+ function insert($table, $set) {
79
+ return queries("INSERT INTO " . table($table) . ($set
80
+ ? " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")"
81
+ : " DEFAULT VALUES"
82
+ ));
83
+ }
84
+
85
+ /** Insert or update data in table
86
+ * @param string
87
+ * @param array
88
+ * @param array of arrays with escaped columns in keys and quoted data in values
89
+ * @return bool
90
+ */
91
+ /*abstract*/ function insertUpdate($table, $rows, $primary) {
92
+ return false;
93
+ }
94
+
95
+ /** Begin transaction
96
+ * @return bool
97
+ */
98
+ function begin() {
99
+ return queries("BEGIN");
100
+ }
101
+
102
+ function commit() {
103
+ return queries("COMMIT");
104
+ }
105
+
106
+ function rollback() {
107
+ return queries("ROLLBACK");
108
+ }
109
+
110
+ }
adminer/adminer/adminer/include/editing.inc.php ADDED
@@ -0,0 +1,539 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** Print select result
3
+ * @param Min_Result
4
+ * @param Min_DB connection to examine indexes
5
+ * @param array
6
+ * @param int
7
+ * @return array $orgtables
8
+ */
9
+ function select($result, $connection2 = null, $orgtables = array(), $limit = 0) {
10
+ global $jush;
11
+ $links = array(); // colno => orgtable - create links from these columns
12
+ $indexes = array(); // orgtable => array(column => colno) - primary keys
13
+ $columns = array(); // orgtable => array(column => ) - not selected columns in primary key
14
+ $blobs = array(); // colno => bool - display bytes for blobs
15
+ $types = array(); // colno => type - display char in <code>
16
+ $return = array(); // table => orgtable - mapping to use in EXPLAIN
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++) {
23
+ $field = $result->fetch_field();
24
+ $name = $field->name;
25
+ $orgtable = $field->orgtable;
26
+ $orgname = $field->orgname;
27
+ $return[$field->table] = $orgtable;
28
+ if ($orgtables && $jush == "sql") { // MySQL EXPLAIN
29
+ $links[$j] = ($name == "table" ? "table=" : ($name == "possible_keys" ? "indexes=" : null));
30
+ } elseif ($orgtable != "") {
31
+ if (!isset($indexes[$orgtable])) {
32
+ // find primary key in each table
33
+ $indexes[$orgtable] = array();
34
+ foreach (indexes($orgtable, $connection2) as $index) {
35
+ if ($index["type"] == "PRIMARY") {
36
+ $indexes[$orgtable] = array_flip($index["columns"]);
37
+ break;
38
+ }
39
+ }
40
+ $columns[$orgtable] = $indexes[$orgtable];
41
+ }
42
+ if (isset($columns[$orgtable][$orgname])) {
43
+ unset($columns[$orgtable][$orgname]);
44
+ $indexes[$orgtable][$orgname] = $j;
45
+ $links[$j] = $orgtable;
46
+ }
47
+ }
48
+ if ($field->charsetnr == 63) { // 63 - binary
49
+ $blobs[$j] = true;
50
+ }
51
+ $types[$j] = $field->type;
52
+ echo "<th" . ($orgtable != "" || $field->name != $orgname ? " title='" . h(($orgtable != "" ? "$orgtable." : "") . $orgname) . "'" : "") . ">" . h($name)
53
+ . ($orgtables ? doc_link(array('sql' => "explain-output.html#explain_" . strtolower($name))) : "")
54
+ ;
55
+ }
56
+ echo "</thead>\n";
57
+ }
58
+ echo "<tr" . odd() . ">";
59
+ foreach ($row as $key => $val) {
60
+ if ($val === null) {
61
+ $val = "<i>NULL</i>";
62
+ } elseif ($blobs[$key] && !is_utf8($val)) {
63
+ $val = "<i>" . lang('%d byte(s)', strlen($val)) . "</i>"; //! link to download
64
+ } elseif (!strlen($val)) { // strlen - SQLite can return int
65
+ $val = "&nbsp;"; // some content to print a border
66
+ } else {
67
+ $val = h($val);
68
+ if ($types[$key] == 254) { // 254 - char
69
+ $val = "<code>$val</code>";
70
+ }
71
+ }
72
+ if (isset($links[$key]) && !$columns[$links[$key]]) {
73
+ if ($orgtables && $jush == "sql") { // MySQL EXPLAIN
74
+ $table = $row[array_search("table=", $links)];
75
+ $link = $links[$key] . urlencode($orgtables[$table] != "" ? $orgtables[$table] : $table);
76
+ } else {
77
+ $link = "edit=" . urlencode($links[$key]);
78
+ foreach ($indexes[$links[$key]] as $col => $j) {
79
+ $link .= "&where" . urlencode("[" . bracket_escape($col) . "]") . "=" . urlencode($row[$j]);
80
+ }
81
+ }
82
+ $val = "<a href='" . h(ME . $link) . "'>$val</a>";
83
+ }
84
+ echo "<td>$val";
85
+ }
86
+ }
87
+ echo ($i ? "</table>" : "<p class='message'>" . lang('No rows.')) . "\n";
88
+ return $return;
89
+ }
90
+
91
+ /** Get referencable tables with single column primary key except self
92
+ * @param string
93
+ * @return array ($table_name => $field)
94
+ */
95
+ function referencable_primary($self) {
96
+ $return = array(); // table_name => field
97
+ foreach (table_status('', true) as $table_name => $table) {
98
+ if ($table_name != $self && fk_support($table)) {
99
+ foreach (fields($table_name) as $field) {
100
+ if ($field["primary"]) {
101
+ if ($return[$table_name]) { // multi column primary key
102
+ unset($return[$table_name]);
103
+ break;
104
+ }
105
+ $return[$table_name] = $field;
106
+ }
107
+ }
108
+ }
109
+ }
110
+ return $return;
111
+ }
112
+
113
+ /** Print SQL <textarea> tag
114
+ * @param string
115
+ * @param string or array in which case [0] of every element is used
116
+ * @param int
117
+ * @param int
118
+ * @return null
119
+ */
120
+ function textarea($name, $value, $rows = 10, $cols = 80) {
121
+ global $jush;
122
+ echo "<textarea name='$name' rows='$rows' cols='$cols' class='sqlarea jush-$jush' spellcheck='false' wrap='off'>";
123
+ if (is_array($value)) {
124
+ foreach ($value as $val) { // not implode() to save memory
125
+ echo h($val[0]) . "\n\n\n"; // $val == array($query, $time, $elapsed)
126
+ }
127
+ } else {
128
+ echo h($value);
129
+ }
130
+ echo "</textarea>";
131
+ }
132
+
133
+ /** Print table columns for type edit
134
+ * @param string
135
+ * @param array
136
+ * @param array
137
+ * @param array returned by referencable_primary()
138
+ * @return null
139
+ */
140
+ function edit_type($key, $field, $collations, $foreign_keys = array()) {
141
+ global $structured_types, $types, $unsigned, $on_actions;
142
+ $type = $field["type"];
143
+ ?>
144
+ <td><select name="<?php echo h($key); ?>[type]" class="type" onfocus="lastType = selectValue(this);" onchange="editingTypeChange(this);"<?php echo on_help("getTarget(event).value", 1); ?>><?php
145
+ if ($type && !isset($types[$type]) && !isset($foreign_keys[$type])) {
146
+ array_unshift($structured_types, $type);
147
+ }
148
+ if ($foreign_keys) {
149
+ $structured_types[lang('Foreign keys')] = $foreign_keys;
150
+ }
151
+ echo optionlist($structured_types, $type);
152
+ ?></select>
153
+ <td><input name="<?php echo h($key); ?>[length]" value="<?php echo h($field["length"]); ?>" size="3" onfocus="editingLengthFocus(this);"<?php echo (!$field["length"] && preg_match('~var(char|binary)$~', $type) ? " class='required'" : ""); ?> onchange="editingLengthChange(this);" onkeyup="this.onchange();"><td class="options"><?php //! type="number" with enabled JavaScript
154
+ echo "<select name='" . h($key) . "[collation]'" . (preg_match('~(char|text|enum|set)$~', $type) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
155
+ echo ($unsigned ? "<select name='" . h($key) . "[unsigned]'" . (!$type || preg_match('~((^|[^o])int|float|double|decimal)$~', $type) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
156
+ 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>' : '');
157
+ 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
158
+ }
159
+
160
+ /** Filter length value including enums
161
+ * @param string
162
+ * @return string
163
+ */
164
+ function process_length($length) {
165
+ global $enum_length;
166
+ return (preg_match("~^\\s*\\(?\\s*$enum_length(?:\\s*,\\s*$enum_length)*+\\s*\\)?\\s*\$~", $length) && preg_match_all("~$enum_length~", $length, $matches)
167
+ ? "(" . implode(",", $matches[0]) . ")"
168
+ : preg_replace('~^[0-9].*~', '(\0)', preg_replace('~[^-0-9,+()[\]]~', '', $length))
169
+ );
170
+ }
171
+
172
+ /** Create SQL string from field type
173
+ * @param array
174
+ * @param string
175
+ * @return string
176
+ */
177
+ function process_type($field, $collate = "COLLATE") {
178
+ global $unsigned;
179
+ return " $field[type]"
180
+ . process_length($field["length"])
181
+ . (preg_match('~(^|[^o])int|float|double|decimal~', $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "")
182
+ . (preg_match('~char|text|enum|set~', $field["type"]) && $field["collation"] ? " $collate " . q($field["collation"]) : "")
183
+ ;
184
+ }
185
+
186
+ /** Create SQL string from field
187
+ * @param array basic field information
188
+ * @param array information about field type
189
+ * @return array array("field", "type", "NULL", "DEFAULT", "ON UPDATE", "COMMENT", "AUTO_INCREMENT")
190
+ */
191
+ function process_field($field, $type_field) {
192
+ global $jush;
193
+ $default = $field["default"];
194
+ return array(
195
+ idf_escape(trim($field["field"])),
196
+ process_type($type_field),
197
+ ($field["null"] ? " NULL" : " NOT NULL"), // NULL for timestamp
198
+ (isset($default) ? " DEFAULT " . (
199
+ (preg_match('~time~', $field["type"]) && preg_match('~^CURRENT_TIMESTAMP$~i', $default))
200
+ || ($jush == "sqlite" && preg_match('~^CURRENT_(TIME|TIMESTAMP|DATE)$~i', $default))
201
+ || ($field["type"] == "bit" && preg_match("~^([0-9]+|b'[0-1]+')\$~", $default))
202
+ || ($jush == "pgsql" && preg_match("~^[a-z]+\\(('[^']*')+\\)\$~", $default))
203
+ ? $default : q($default)) : ""),
204
+ (preg_match('~timestamp|datetime~', $field["type"]) && $field["on_update"] ? " ON UPDATE $field[on_update]" : ""),
205
+ (support("comment") && $field["comment"] != "" ? " COMMENT " . q($field["comment"]) : ""),
206
+ ($field["auto_increment"] ? auto_increment() : null),
207
+ );
208
+ }
209
+
210
+ /** Get type class to use in CSS
211
+ * @param string
212
+ * @return string class=''
213
+ */
214
+ function type_class($type) {
215
+ foreach (array(
216
+ 'char' => 'text',
217
+ 'date' => 'time|year',
218
+ 'binary' => 'blob',
219
+ 'enum' => 'set',
220
+ ) as $key => $val) {
221
+ if (preg_match("~$key|$val~", $type)) {
222
+ return " class='$key'";
223
+ }
224
+ }
225
+ }
226
+
227
+ /** Print table interior for fields editing
228
+ * @param array
229
+ * @param array
230
+ * @param string TABLE or PROCEDURE
231
+ * @param array returned by referencable_primary()
232
+ * @param bool display comments column
233
+ * @return null
234
+ */
235
+ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array(), $comments = false) {
236
+ global $connection, $inout;
237
+ $fields = array_values($fields);
238
+ ?>
239
+ <thead><tr class="wrap">
240
+ <?php if ($type == "PROCEDURE") { ?><td>&nbsp;<?php } ?>
241
+ <th><?php echo ($type == "TABLE" ? lang('Column name') : lang('Parameter name')); ?>
242
+ <td><?php echo lang('Type'); ?><textarea id="enum-edit" rows="4" cols="12" wrap="off" style="display: none;" onblur="editingLengthBlur(this);"></textarea>
243
+ <td><?php echo lang('Length'); ?>
244
+ <td><?php echo lang('Options'); ?>
245
+ <?php if ($type == "TABLE") { ?>
246
+ <td>NULL
247
+ <td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">AI</acronym><?php echo doc_link(array(
248
+ 'sql' => "example-auto-increment.html",
249
+ 'sqlite' => "autoinc.html",
250
+ 'pgsql' => "datatype.html#DATATYPE-SERIAL",
251
+ 'mssql' => "ms186775.aspx",
252
+ )); ?>
253
+ <td><?php echo lang('Default value'); ?>
254
+ <?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
255
+ <?php } ?>
256
+ <td><?php echo "<input type='image' class='icon' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?><script type="text/javascript">row_count = <?php echo count($fields); ?>;</script>
257
+ </thead>
258
+ <tbody onkeydown="return editingKeydown(event);">
259
+ <?php
260
+ foreach ($fields as $i => $field) {
261
+ $i++;
262
+ $orig = $field[($_POST ? "orig" : "field")];
263
+ $display = (isset($_POST["add"][$i-1]) || (isset($field["field"]) && !$_POST["drop_col"][$i])) && (support("drop_col") || $orig == "");
264
+ ?>
265
+ <tr<?php echo ($display ? "" : " style='display: none;'"); ?>>
266
+ <?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", explode("|", $inout), $field["inout"]) : ""); ?>
267
+ <th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" onchange="editingNameChange(this);<?php echo ($field["field"] != "" || count($fields) > 1 ? '' : ' editingAddRow(this);" onkeyup="if (this.value) editingAddRow(this);'); ?>" maxlength="64" autocapitalize="off"><?php } ?>
268
+ <input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($orig); ?>">
269
+ <?php edit_type("fields[$i]", $field, $collations, $foreign_keys); ?>
270
+ <?php if ($type == "TABLE") { ?>
271
+ <td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block"); ?>
272
+ <td><label class="block"><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> onclick="var field = this.form['fields[' + this.value + '][field]']; if (!field.value) { field.value = 'id'; field.onchange(); }"></label><td><?php
273
+ echo checkbox("fields[$i][has_default]", 1, $field["has_default"]); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" onkeyup="keyupChange.call(this);" onchange="this.previousSibling.checked = true;">
274
+ <?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='" . ($connection->server_info >= 5.5 ? 1024 : 255) . "'>" : ""); ?>
275
+ <?php } ?>
276
+ <?php
277
+ echo "<td>";
278
+ echo (support("move_col") ?
279
+ "<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, 1);'>&nbsp;"
280
+ . "<input type='image' class='icon' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "'>&nbsp;"
281
+ . "<input type='image' class='icon' name='down[$i]' src='../adminer/static/down.gif' alt='v' title='" . lang('Move down') . "'>&nbsp;"
282
+ : "");
283
+ echo ($orig == "" || support("drop_col") ? "<input type='image' class='icon' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick=\"return !editingRemoveRow(this, 'fields\$1[field]');\">" : "");
284
+ echo "\n";
285
+ }
286
+ }
287
+
288
+ /** Move fields up and down or add field
289
+ * @param array
290
+ * @return bool
291
+ */
292
+ function process_fields(&$fields) {
293
+ ksort($fields);
294
+ $offset = 0;
295
+ if ($_POST["up"]) {
296
+ $last = 0;
297
+ foreach ($fields as $key => $field) {
298
+ if (key($_POST["up"]) == $key) {
299
+ unset($fields[$key]);
300
+ array_splice($fields, $last, 0, array($field));
301
+ break;
302
+ }
303
+ if (isset($field["field"])) {
304
+ $last = $offset;
305
+ }
306
+ $offset++;
307
+ }
308
+ } elseif ($_POST["down"]) {
309
+ $found = false;
310
+ foreach ($fields as $key => $field) {
311
+ if (isset($field["field"]) && $found) {
312
+ unset($fields[key($_POST["down"])]);
313
+ array_splice($fields, $offset, 0, array($found));
314
+ break;
315
+ }
316
+ if (key($_POST["down"]) == $key) {
317
+ $found = $field;
318
+ }
319
+ $offset++;
320
+ }
321
+ } elseif ($_POST["add"]) {
322
+ $fields = array_values($fields);
323
+ array_splice($fields, key($_POST["add"]), 0, array(array()));
324
+ } elseif (!$_POST["drop_col"]) {
325
+ return false;
326
+ }
327
+ return true;
328
+ }
329
+
330
+ /** Callback used in routine()
331
+ * @param array
332
+ * @return string
333
+ */
334
+ function normalize_enum($match) {
335
+ return "'" . str_replace("'", "''", addcslashes(stripcslashes(str_replace($match[0][0] . $match[0][0], $match[0][0], substr($match[0], 1, -1))), '\\')) . "'";
336
+ }
337
+
338
+ /** Issue grant or revoke commands
339
+ * @param string GRANT or REVOKE
340
+ * @param array
341
+ * @param string
342
+ * @param string
343
+ * @return bool
344
+ */
345
+ function grant($grant, $privileges, $columns, $on) {
346
+ if (!$privileges) {
347
+ return true;
348
+ }
349
+ if ($privileges == array("ALL PRIVILEGES", "GRANT OPTION")) {
350
+ // can't be granted or revoked together
351
+ return ($grant == "GRANT"
352
+ ? queries("$grant ALL PRIVILEGES$on WITH GRANT OPTION")
353
+ : queries("$grant ALL PRIVILEGES$on") && queries("$grant GRANT OPTION$on")
354
+ );
355
+ }
356
+ return queries("$grant " . preg_replace('~(GRANT OPTION)\\([^)]*\\)~', '\\1', implode("$columns, ", $privileges) . $columns) . $on);
357
+ }
358
+
359
+ /** Drop old object and create a new one
360
+ * @param string drop old object query
361
+ * @param string create new object query
362
+ * @param string drop new object query
363
+ * @param string create test object query
364
+ * @param string drop test object query
365
+ * @param string
366
+ * @param string
367
+ * @param string
368
+ * @param string
369
+ * @param string
370
+ * @param string
371
+ * @return null redirect in success
372
+ */
373
+ function drop_create($drop, $create, $drop_created, $test, $drop_test, $location, $message_drop, $message_alter, $message_create, $old_name, $new_name) {
374
+ if ($_POST["drop"]) {
375
+ query_redirect($drop, $location, $message_drop);
376
+ } elseif ($old_name == "") {
377
+ query_redirect($create, $location, $message_create);
378
+ } elseif ($old_name != $new_name) {
379
+ $created = queries($create);
380
+ queries_redirect($location, $message_alter, $created && queries($drop));
381
+ if ($created) {
382
+ queries($drop_created);
383
+ }
384
+ } else {
385
+ queries_redirect(
386
+ $location,
387
+ $message_alter,
388
+ queries($test) && queries($drop_test) && queries($drop) && queries($create)
389
+ );
390
+ }
391
+ }
392
+
393
+ /** Generate SQL query for creating trigger
394
+ * @param string
395
+ * @param array result of trigger()
396
+ * @return string
397
+ */
398
+ function create_trigger($on, $row) {
399
+ global $jush;
400
+ $timing_event = " $row[Timing] $row[Event]" . ($row["Event"] == "UPDATE OF" ? " " . idf_escape($row["Of"]) : "");
401
+ return "CREATE TRIGGER "
402
+ . idf_escape($row["Trigger"])
403
+ . ($jush == "mssql" ? $on . $timing_event : $timing_event . $on)
404
+ . rtrim(" $row[Type]\n$row[Statement]", ";")
405
+ . ";"
406
+ ;
407
+ }
408
+
409
+ /** Generate SQL query for creating routine
410
+ * @param string "PROCEDURE" or "FUNCTION"
411
+ * @param array result of routine()
412
+ * @return string
413
+ */
414
+ function create_routine($routine, $row) {
415
+ global $inout;
416
+ $set = array();
417
+ $fields = (array) $row["fields"];
418
+ ksort($fields); // enforce fields order
419
+ foreach ($fields as $field) {
420
+ if ($field["field"] != "") {
421
+ $set[] = (preg_match("~^($inout)\$~", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET");
422
+ }
423
+ }
424
+ return "CREATE $routine "
425
+ . idf_escape(trim($row["name"]))
426
+ . " (" . implode(", ", $set) . ")"
427
+ . (isset($_GET["function"]) ? " RETURNS" . process_type($row["returns"], "CHARACTER SET") : "")
428
+ . ($row["language"] ? " LANGUAGE $row[language]" : "")
429
+ . rtrim("\n$row[definition]", ";")
430
+ . ";"
431
+ ;
432
+ }
433
+
434
+ /** Remove current user definer from SQL command
435
+ * @param string
436
+ * @return string
437
+ */
438
+ function remove_definer($query) {
439
+ return preg_replace('~^([A-Z =]+) DEFINER=`' . preg_replace('~@(.*)~', '`@`(%|\\1)', logged_user()) . '`~', '\\1', $query); //! proper escaping of user
440
+ }
441
+
442
+ /** Format foreign key to use in SQL query
443
+ * @param array ("table" => string, "source" => array, "target" => array, "on_delete" => one of $on_actions, "on_update" => one of $on_actions)
444
+ * @return string
445
+ */
446
+ function format_foreign_key($foreign_key) {
447
+ global $on_actions;
448
+ return " FOREIGN KEY (" . implode(", ", array_map('idf_escape', $foreign_key["source"])) . ") REFERENCES " . table($foreign_key["table"])
449
+ . " (" . implode(", ", array_map('idf_escape', $foreign_key["target"])) . ")" //! reuse $name - check in older MySQL versions
450
+ . (preg_match("~^($on_actions)\$~", $foreign_key["on_delete"]) ? " ON DELETE $foreign_key[on_delete]" : "")
451
+ . (preg_match("~^($on_actions)\$~", $foreign_key["on_update"]) ? " ON UPDATE $foreign_key[on_update]" : "")
452
+ ;
453
+ }
454
+
455
+ /** Add a file to TAR
456
+ * @param string
457
+ * @param TmpFile
458
+ * @return null prints the output
459
+ */
460
+ function tar_file($filename, $tmp_file) {
461
+ $return = pack("a100a8a8a8a12a12", $filename, 644, 0, 0, decoct($tmp_file->size), decoct(time()));
462
+ $checksum = 8*32; // space for checksum itself
463
+ for ($i=0; $i < strlen($return); $i++) {
464
+ $checksum += ord($return[$i]);
465
+ }
466
+ $return .= sprintf("%06o", $checksum) . "\0 ";
467
+ echo $return;
468
+ echo str_repeat("\0", 512 - strlen($return));
469
+ $tmp_file->send();
470
+ echo str_repeat("\0", 511 - ($tmp_file->size + 511) % 512);
471
+ }
472
+
473
+ /** Get INI bytes value
474
+ * @param string
475
+ * @return int
476
+ */
477
+ function ini_bytes($ini) {
478
+ $val = ini_get($ini);
479
+ switch (strtolower(substr($val, -1))) {
480
+ case 'g': $val *= 1024; // no break
481
+ case 'm': $val *= 1024; // no break
482
+ case 'k': $val *= 1024;
483
+ }
484
+ return $val;
485
+ }
486
+
487
+ /** Create link to database documentation
488
+ * @param array $jush => $path
489
+ * @return string HTML code
490
+ */
491
+ function doc_link($paths) {
492
+ global $jush, $connection;
493
+ $urls = array(
494
+ 'sql' => "http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/",
495
+ 'sqlite' => "http://www.sqlite.org/",
496
+ 'pgsql' => "http://www.postgresql.org/docs/" . substr($connection->server_info, 0, 3) . "/static/",
497
+ 'mssql' => "http://msdn.microsoft.com/library/",
498
+ 'oracle' => "http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/",
499
+ );
500
+ return ($paths[$jush] ? "<a href='$urls[$jush]$paths[$jush]' target='_blank' rel='noreferrer'><sup>?</sup></a>" : "");
501
+ }
502
+
503
+ /** Wrap gzencode() for usage in ob_start()
504
+ * @param string
505
+ * @return string
506
+ */
507
+ function ob_gzencode($string) {
508
+ // ob_start() callback recieves an optional parameter $phase but gzencode() accepts optional parameter $level
509
+ return gzencode($string);
510
+ }
511
+
512
+ /** Compute size of database
513
+ * @param string
514
+ * @return string formatted
515
+ */
516
+ function db_size($db) {
517
+ global $connection;
518
+ if (!$connection->select_db($db)) {
519
+ return "?";
520
+ }
521
+ $return = 0;
522
+ foreach (table_status() as $table_status) {
523
+ $return += $table_status["Data_length"] + $table_status["Index_length"];
524
+ }
525
+ return format_number($return);
526
+ }
527
+
528
+ /** Print SET NAMES if utf8mb4 might be needed
529
+ * @param string
530
+ * @return null
531
+ */
532
+ function set_utf8mb4($create) {
533
+ global $connection;
534
+ static $set = false;
535
+ if (!$set && preg_match('~\butf8mb4~i', $create)) { // possible false positive
536
+ $set = true;
537
+ echo "SET NAMES " . charset($connection) . ";\n\n";
538
+ }
539
+ }
adminer/adminer/adminer/include/functions.inc.php ADDED
@@ -0,0 +1,1393 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** Get database connection
3
+ * @return Min_DB
4
+ */
5
+ function connection() {
6
+ // can be used in customization, $connection is minified
7
+ global $connection;
8
+ return $connection;
9
+ }
10
+
11
+ /** Get Adminer object
12
+ * @return Adminer
13
+ */
14
+ function adminer() {
15
+ global $adminer;
16
+ return $adminer;
17
+ }
18
+
19
+ /** Unescape database identifier
20
+ * @param string text inside ``
21
+ * @return string
22
+ */
23
+ function idf_unescape($idf) {
24
+ $last = substr($idf, -1);
25
+ return str_replace($last . $last, $last, substr($idf, 1, -1));
26
+ }
27
+
28
+ /** Escape string to use inside ''
29
+ * @param string
30
+ * @return string
31
+ */
32
+ function escape_string($val) {
33
+ return substr(q($val), 1, -1);
34
+ }
35
+
36
+ /** Remove non-digits from a string
37
+ * @param string
38
+ * @return string
39
+ */
40
+ function number($val) {
41
+ return preg_replace('~[^0-9]+~', '', $val);
42
+ }
43
+
44
+ /** Disable magic_quotes_gpc
45
+ * @param array e.g. (&$_GET, &$_POST, &$_COOKIE)
46
+ * @param bool whether to leave values as is
47
+ * @return null modified in place
48
+ */
49
+ function remove_slashes($process, $filter = false) {
50
+ if (get_magic_quotes_gpc()) {
51
+ while (list($key, $val) = each($process)) {
52
+ foreach ($val as $k => $v) {
53
+ unset($process[$key][$k]);
54
+ if (is_array($v)) {
55
+ $process[$key][stripslashes($k)] = $v;
56
+ $process[] = &$process[$key][stripslashes($k)];
57
+ } else {
58
+ $process[$key][stripslashes($k)] = ($filter ? $v : stripslashes($v));
59
+ }
60
+ }
61
+ }
62
+ }
63
+ }
64
+
65
+ /** Escape or unescape string to use inside form []
66
+ * @param string
67
+ * @param bool
68
+ * @return string
69
+ */
70
+ function bracket_escape($idf, $back = false) {
71
+ // escape brackets inside name="x[]"
72
+ static $trans = array(':' => ':1', ']' => ':2', '[' => ':3');
73
+ return strtr($idf, ($back ? array_flip($trans) : $trans));
74
+ }
75
+
76
+ /** Get connection charset
77
+ * @param Min_DB
78
+ * @return string
79
+ */
80
+ function charset($connection) {
81
+ return (version_compare($connection->server_info, "5.5.3") >= 0 ? "utf8mb4" : "utf8"); // SHOW CHARSET would require an extra query
82
+ }
83
+
84
+ /** Escape for HTML
85
+ * @param string
86
+ * @return string
87
+ */
88
+ function h($string) {
89
+ return str_replace("\0", "&#0;", htmlspecialchars($string, ENT_QUOTES, 'utf-8'));
90
+ }
91
+
92
+ /** Escape for TD
93
+ * @param string
94
+ * @return string
95
+ */
96
+ function nbsp($string) {
97
+ return (trim($string) != "" ? h($string) : "&nbsp;");
98
+ }
99
+
100
+ /** Convert \n to <br>
101
+ * @param string
102
+ * @return string
103
+ */
104
+ function nl_br($string) {
105
+ return str_replace("\n", "<br>", $string); // nl2br() uses XHTML before PHP 5.3
106
+ }
107
+
108
+ /** Generate HTML checkbox
109
+ * @param string
110
+ * @param string
111
+ * @param bool
112
+ * @param string
113
+ * @param string
114
+ * @param string
115
+ * @return string
116
+ */
117
+ function checkbox($name, $value, $checked, $label = "", $onclick = "", $class = "") {
118
+ $return = "<input type='checkbox' name='$name' value='" . h($value) . "'"
119
+ . ($checked ? " checked" : "")
120
+ . ($onclick ? ' onclick="' . h($onclick) . '"' : '')
121
+ . ">"
122
+ ;
123
+ return ($label != "" || $class ? "<label" . ($class ? " class='$class'" : "") . ">$return" . h($label) . "</label>" : $return);
124
+ }
125
+
126
+ /** Generate list of HTML options
127
+ * @param array array of strings or arrays (creates optgroup)
128
+ * @param mixed
129
+ * @param bool always use array keys for value="", otherwise only string keys are used
130
+ * @return string
131
+ */
132
+ function optionlist($options, $selected = null, $use_keys = false) {
133
+ $return = "";
134
+ foreach ($options as $k => $v) {
135
+ $opts = array($k => $v);
136
+ if (is_array($v)) {
137
+ $return .= '<optgroup label="' . h($k) . '">';
138
+ $opts = $v;
139
+ }
140
+ foreach ($opts as $key => $val) {
141
+ $return .= '<option' . ($use_keys || is_string($key) ? ' value="' . h($key) . '"' : '') . (($use_keys || is_string($key) ? (string) $key : $val) === $selected ? ' selected' : '') . '>' . h($val);
142
+ }
143
+ if (is_array($v)) {
144
+ $return .= '</optgroup>';
145
+ }
146
+ }
147
+ return $return;
148
+ }
149
+
150
+ /** Generate HTML radio list
151
+ * @param string
152
+ * @param array
153
+ * @param string
154
+ * @param string true for no onchange, false for radio
155
+ * @return string
156
+ */
157
+ function html_select($name, $options, $value = "", $onchange = true) {
158
+ if ($onchange) {
159
+ return "<select name='" . h($name) . "'" . (is_string($onchange) ? ' onchange="' . h($onchange) . '"' : "") . ">" . optionlist($options, $value) . "</select>";
160
+ }
161
+ $return = "";
162
+ foreach ($options as $key => $val) {
163
+ $return .= "<label><input type='radio' name='" . h($name) . "' value='" . h($key) . "'" . ($key == $value ? " checked" : "") . ">" . h($val) . "</label>";
164
+ }
165
+ return $return;
166
+ }
167
+
168
+ /** Generate HTML <select> or <input> if $options are empty
169
+ * @param string
170
+ * @param array
171
+ * @param string
172
+ * @param string
173
+ * @return string
174
+ */
175
+ function select_input($attrs, $options, $value = "", $placeholder = "") {
176
+ return ($options
177
+ ? "<select$attrs><option value=''>$placeholder" . optionlist($options, $value, true) . "</select>"
178
+ : "<input$attrs size='10' value='" . h($value) . "' placeholder='$placeholder'>"
179
+ );
180
+ }
181
+
182
+ /** Get onclick confirmation
183
+ * @return string
184
+ */
185
+ function confirm() {
186
+ return " onclick=\"return confirm('" . lang('Are you sure?') . "');\"";
187
+ }
188
+
189
+ /** Print header for hidden fieldset (close by </div></fieldset>)
190
+ * @param string
191
+ * @param string
192
+ * @param bool
193
+ * @param string
194
+ * @return null
195
+ */
196
+ function print_fieldset($id, $legend, $visible = false, $onclick = "") {
197
+ echo "<fieldset><legend><a href='#fieldset-$id' onclick=\"" . h($onclick) . "return !toggle('fieldset-$id');\">$legend</a></legend><div id='fieldset-$id'" . ($visible ? "" : " class='hidden'") . ">\n";
198
+ }
199
+
200
+ /** Return class='active' if $bold is true
201
+ * @param bool
202
+ * @param string
203
+ * @return string
204
+ */
205
+ function bold($bold, $class = "") {
206
+ return ($bold ? " class='active $class'" : ($class ? " class='$class'" : ""));
207
+ }
208
+
209
+ /** Generate class for odd rows
210
+ * @param string return this for odd rows, empty to reset counter
211
+ * @return string
212
+ */
213
+ function odd($return = ' class="odd"') {
214
+ static $i = 0;
215
+ if (!$return) { // reset counter
216
+ $i = -1;
217
+ }
218
+ return ($i++ % 2 ? $return : '');
219
+ }
220
+
221
+ /** Escape string for JavaScript apostrophes
222
+ * @param string
223
+ * @return string
224
+ */
225
+ function js_escape($string) {
226
+ return addcslashes($string, "\r\n'\\/"); // slash for <script>
227
+ }
228
+
229
+ /** Print one row in JSON object
230
+ * @param string or "" to close the object
231
+ * @param string
232
+ * @return null
233
+ */
234
+ function json_row($key, $val = null) {
235
+ static $first = true;
236
+ if ($first) {
237
+ echo "{";
238
+ }
239
+ if ($key != "") {
240
+ echo ($first ? "" : ",") . "\n\t\"" . addcslashes($key, "\r\n\"\\/") . '": ' . ($val !== null ? '"' . addcslashes($val, "\r\n\"\\/") . '"' : 'undefined');
241
+ $first = false;
242
+ } else {
243
+ echo "\n}\n";
244
+ $first = true;
245
+ }
246
+ }
247
+
248
+ /** Get INI boolean value
249
+ * @param string
250
+ * @return bool
251
+ */
252
+ function ini_bool($ini) {
253
+ $val = ini_get($ini);
254
+ return (preg_match('~^(on|true|yes)$~i', $val) || (int) $val); // boolean values set by php_value are strings
255
+ }
256
+
257
+ /** Check if SID is neccessary
258
+ * @return bool
259
+ */
260
+ function sid() {
261
+ static $return;
262
+ if ($return === null) { // restart_session() defines SID
263
+ $return = (SID && !($_COOKIE && ini_bool("session.use_cookies"))); // $_COOKIE - don't pass SID with permanent login
264
+ }
265
+ return $return;
266
+ }
267
+
268
+ /** Set password to session
269
+ * @param string
270
+ * @param string
271
+ * @param string
272
+ * @param string
273
+ * @return null
274
+ */
275
+ function set_password($vendor, $server, $username, $password) {
276
+ $_SESSION["pwds"][$vendor][$server][$username] = ($_COOKIE["adminer_key"] && is_string($password)
277
+ ? array(encrypt_string($password, $_COOKIE["adminer_key"]))
278
+ : $password
279
+ );
280
+ }
281
+
282
+ /** Get password from session
283
+ * @return string
284
+ */
285
+ function get_password() {
286
+ $return = get_session("pwds");
287
+ if (is_array($return)) {
288
+ $return = ($_COOKIE["adminer_key"]
289
+ ? decrypt_string($return[0], $_COOKIE["adminer_key"])
290
+ : false
291
+ );
292
+ }
293
+ return $return;
294
+ }
295
+
296
+ /** Shortcut for $connection->quote($string)
297
+ * @param string
298
+ * @return string
299
+ */
300
+ function q($string) {
301
+ global $connection;
302
+ return $connection->quote($string);
303
+ }
304
+
305
+ /** Get list of values from database
306
+ * @param string
307
+ * @param mixed
308
+ * @return array
309
+ */
310
+ function get_vals($query, $column = 0) {
311
+ global $connection;
312
+ $return = array();
313
+ $result = $connection->query($query);
314
+ if (is_object($result)) {
315
+ while ($row = $result->fetch_row()) {
316
+ $return[] = $row[$column];
317
+ }
318
+ }
319
+ return $return;
320
+ }
321
+
322
+ /** Get keys from first column and values from second
323
+ * @param string
324
+ * @param Min_DB
325
+ * @param float
326
+ * @return array
327
+ */
328
+ function get_key_vals($query, $connection2 = null, $timeout = 0) {
329
+ global $connection;
330
+ if (!is_object($connection2)) {
331
+ $connection2 = $connection;
332
+ }
333
+ $return = array();
334
+ $connection2->timeout = $timeout;
335
+ $result = $connection2->query($query);
336
+ $connection2->timeout = 0;
337
+ if (is_object($result)) {
338
+ while ($row = $result->fetch_row()) {
339
+ $return[$row[0]] = $row[1];
340
+ }
341
+ }
342
+ return $return;
343
+ }
344
+
345
+ /** Get all rows of result
346
+ * @param string
347
+ * @param Min_DB
348
+ * @param string
349
+ * @return array associative
350
+ */
351
+ function get_rows($query, $connection2 = null, $error = "<p class='error'>") {
352
+ global $connection;
353
+ $conn = (is_object($connection2) ? $connection2 : $connection);
354
+ $return = array();
355
+ $result = $conn->query($query);
356
+ if (is_object($result)) { // can return true
357
+ while ($row = $result->fetch_assoc()) {
358
+ $return[] = $row;
359
+ }
360
+ } elseif (!$result && !is_object($connection2) && $error && defined("PAGE_HEADER")) {
361
+ echo $error . error() . "\n";
362
+ }
363
+ return $return;
364
+ }
365
+
366
+ /** Find unique identifier of a row
367
+ * @param array
368
+ * @param array result of indexes()
369
+ * @return array or null if there is no unique identifier
370
+ */
371
+ function unique_array($row, $indexes) {
372
+ foreach ($indexes as $index) {
373
+ if (preg_match("~PRIMARY|UNIQUE~", $index["type"])) {
374
+ $return = array();
375
+ foreach ($index["columns"] as $key) {
376
+ if (!isset($row[$key])) { // NULL is ambiguous
377
+ continue 2;
378
+ }
379
+ $return[$key] = $row[$key];
380
+ }
381
+ return $return;
382
+ }
383
+ }
384
+ }
385
+
386
+ /** Escape column key used in where()
387
+ * @param string
388
+ * @return string
389
+ */
390
+ function escape_key($key) {
391
+ if (preg_match('(^([\w(]+)(' . str_replace("_", ".*", preg_quote(idf_escape("_"))) . ')([ \w)]+)$)', $key, $match)) { //! columns looking like functions
392
+ return $match[1] . idf_escape(idf_unescape($match[2])) . $match[3]; //! SQL injection
393
+ }
394
+ return idf_escape($key);
395
+ }
396
+
397
+ /** Create SQL condition from parsed query string
398
+ * @param array parsed query string
399
+ * @param array
400
+ * @return string
401
+ */
402
+ function where($where, $fields = array()) {
403
+ global $connection, $jush;
404
+ $return = array();
405
+ foreach ((array) $where["where"] as $key => $val) {
406
+ $key = bracket_escape($key, 1); // 1 - back
407
+ $column = escape_key($key);
408
+ $return[] = $column
409
+ . (($jush == "sql" && preg_match('~^[0-9]*\\.[0-9]*$~', $val)) || $jush == "mssql"
410
+ ? " LIKE " . q(addcslashes($val, "%_\\"))
411
+ : " = " . unconvert_field($fields[$key], q($val))
412
+ ) // LIKE because of floats but slow with ints, in MS SQL because of text
413
+ ; //! enum and set
414
+ if ($jush == "sql" && preg_match('~char|text~', $fields[$key]["type"]) && preg_match("~[^ -@]~", $val)) { // not just [a-z] to catch non-ASCII characters
415
+ $return[] = "$column = " . q($val) . " COLLATE " . charset($connection) . "_bin";
416
+ }
417
+ }
418
+ foreach ((array) $where["null"] as $key) {
419
+ $return[] = escape_key($key) . " IS NULL";
420
+ }
421
+ return implode(" AND ", $return);
422
+ }
423
+
424
+ /** Create SQL condition from query string
425
+ * @param string
426
+ * @param array
427
+ * @return string
428
+ */
429
+ function where_check($val, $fields = array()) {
430
+ parse_str($val, $check);
431
+ remove_slashes(array(&$check));
432
+ return where($check, $fields);
433
+ }
434
+
435
+ /** Create query string where condition from value
436
+ * @param int condition order
437
+ * @param string column identifier
438
+ * @param string
439
+ * @param string
440
+ * @return string
441
+ */
442
+ function where_link($i, $column, $value, $operator = "=") {
443
+ return "&where%5B$i%5D%5Bcol%5D=" . urlencode($column) . "&where%5B$i%5D%5Bop%5D=" . urlencode(($value !== null ? $operator : "IS NULL")) . "&where%5B$i%5D%5Bval%5D=" . urlencode($value);
444
+ }
445
+
446
+ /** Get select clause for convertible fields
447
+ * @param array
448
+ * @param array
449
+ * @param array
450
+ * @return string
451
+ */
452
+ function convert_fields($columns, $fields, $select = array()) {
453
+ $return = "";
454
+ foreach ($columns as $key => $val) {
455
+ if ($select && !in_array(idf_escape($key), $select)) {
456
+ continue;
457
+ }
458
+ $as = convert_field($fields[$key]);
459
+ if ($as) {
460
+ $return .= ", $as AS " . idf_escape($key);
461
+ }
462
+ }
463
+ return $return;
464
+ }
465
+
466
+ /** Set cookie valid on current path
467
+ * @param string
468
+ * @param string
469
+ * @param int number of seconds, 0 for session cookie
470
+ * @return bool
471
+ */
472
+ function cookie($name, $value, $lifetime = 2592000) { // 2592000 - 30 days
473
+ global $HTTPS;
474
+ $params = array(
475
+ $name,
476
+ (preg_match("~\n~", $value) ? "" : $value), // HTTP Response Splitting protection in PHP < 5.1.2
477
+ ($lifetime ? time() + $lifetime : 0),
478
+ preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]),
479
+ "",
480
+ $HTTPS
481
+ );
482
+ if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
483
+ $params[] = true; // HttpOnly
484
+ }
485
+ return call_user_func_array('setcookie', $params);
486
+ }
487
+
488
+ /** Restart stopped session
489
+ * @return null
490
+ */
491
+ function restart_session() {
492
+ if (!ini_bool("session.use_cookies")) {
493
+ session_start();
494
+ }
495
+ }
496
+
497
+ /** Stop session if it would be possible to restart it later
498
+ * @return null
499
+ */
500
+ function stop_session() {
501
+ if (!ini_bool("session.use_cookies")) {
502
+ session_write_close();
503
+ }
504
+ }
505
+
506
+ /** Get session variable for current server
507
+ * @param string
508
+ * @return mixed
509
+ */
510
+ function &get_session($key) {
511
+ return $_SESSION[$key][DRIVER][SERVER][$_GET["username"]];
512
+ }
513
+
514
+ /** Set session variable for current server
515
+ * @param string
516
+ * @param mixed
517
+ * @return mixed
518
+ */
519
+ function set_session($key, $val) {
520
+ $_SESSION[$key][DRIVER][SERVER][$_GET["username"]] = $val; // used also in auth.inc.php
521
+ }
522
+
523
+ /** Get authenticated URL
524
+ * @param string
525
+ * @param string
526
+ * @param string
527
+ * @param string
528
+ * @return string
529
+ */
530
+ function auth_url($vendor, $server, $username, $db = null) {
531
+ global $drivers;
532
+ preg_match('~([^?]*)\\??(.*)~', remove_from_uri(implode("|", array_keys($drivers)) . "|username|" . ($db !== null ? "db|" : "") . session_name()), $match);
533
+ return "$match[1]?"
534
+ . (sid() ? SID . "&" : "")
535
+ . ($vendor != "server" || $server != "" ? urlencode($vendor) . "=" . urlencode($server) . "&" : "")
536
+ . "username=" . urlencode($username)
537
+ . ($db != "" ? "&db=" . urlencode($db) : "")
538
+ . ($match[2] ? "&$match[2]" : "")
539
+ ;
540
+ }
541
+
542
+ /** Find whether it is an AJAX request
543
+ * @return bool
544
+ */
545
+ function is_ajax() {
546
+ return ($_SERVER["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest");
547
+ }
548
+
549
+ /** Send Location header and exit
550
+ * @param string null to only set a message
551
+ * @param string
552
+ * @return null
553
+ */
554
+ function redirect($location, $message = null) {
555
+ if ($message !== null) {
556
+ restart_session();
557
+ $_SESSION["messages"][preg_replace('~^[^?]*~', '', ($location !== null ? $location : $_SERVER["REQUEST_URI"]))][] = $message;
558
+ }
559
+ if ($location !== null) {
560
+ if ($location == "") {
561
+ $location = ".";
562
+ }
563
+ header("Location: $location");
564
+ exit;
565
+ }
566
+ }
567
+
568
+ /** Execute query and redirect if successful
569
+ * @param string
570
+ * @param string
571
+ * @param string
572
+ * @param bool
573
+ * @param bool
574
+ * @param bool
575
+ * @param string
576
+ * @return bool
577
+ */
578
+ function query_redirect($query, $location, $message, $redirect = true, $execute = true, $failed = false, $time = "") {
579
+ global $connection, $error, $adminer;
580
+ if ($execute) {
581
+ $start = microtime(true);
582
+ $failed = !$connection->query($query);
583
+ $time = format_time($start);
584
+ }
585
+ $sql = "";
586
+ if ($query) {
587
+ $sql = $adminer->messageQuery($query, $time);
588
+ }
589
+ if ($failed) {
590
+ $error = error() . $sql;
591
+ return false;
592
+ }
593
+ if ($redirect) {
594
+ redirect($location, $message . $sql);
595
+ }
596
+ return true;
597
+ }
598
+
599
+ /** Execute and remember query
600
+ * @param string or null to return remembered queries, end with ';' to use DELIMITER
601
+ * @return Min_Result or array($queries, $time) if $query = null
602
+ */
603
+ function queries($query) {
604
+ global $connection;
605
+ static $queries = array();
606
+ static $start;
607
+ if (!$start) {
608
+ $start = microtime(true);
609
+ }
610
+ if ($query === null) {
611
+ // return executed queries
612
+ return array(implode("\n", $queries), format_time($start));
613
+ }
614
+ $queries[] = (preg_match('~;$~', $query) ? "DELIMITER ;;\n$query;\nDELIMITER " : $query) . ";";
615
+ return $connection->query($query);
616
+ }
617
+
618
+ /** Apply command to all array items
619
+ * @param string
620
+ * @param array
621
+ * @param callback
622
+ * @return bool
623
+ */
624
+ function apply_queries($query, $tables, $escape = 'table') {
625
+ foreach ($tables as $table) {
626
+ if (!queries("$query " . $escape($table))) {
627
+ return false;
628
+ }
629
+ }
630
+ return true;
631
+ }
632
+
633
+ /** Redirect by remembered queries
634
+ * @param string
635
+ * @param string
636
+ * @param bool
637
+ * @return bool
638
+ */
639
+ function queries_redirect($location, $message, $redirect) {
640
+ list($queries, $time) = queries(null);
641
+ return query_redirect($queries, $location, $message, $redirect, false, !$redirect, $time);
642
+ }
643
+
644
+ /** Format elapsed time
645
+ * @param float output of microtime(true)
646
+ * @return string HTML code
647
+ */
648
+ function format_time($start) {
649
+ return lang('%.3f s', max(0, microtime(true) - $start));
650
+ }
651
+
652
+ /** Remove parameter from query string
653
+ * @param string
654
+ * @return string
655
+ */
656
+ function remove_from_uri($param = "") {
657
+ return substr(preg_replace("~(?<=[?&])($param" . (SID ? "" : "|" . session_name()) . ")=[^&]*&~", '', "$_SERVER[REQUEST_URI]&"), 0, -1);
658
+ }
659
+
660
+ /** Generate page number for pagination
661
+ * @param int
662
+ * @param int
663
+ * @return string
664
+ */
665
+ function pagination($page, $current) {
666
+ return " " . ($page == $current
667
+ ? $page + 1
668
+ : '<a href="' . h(remove_from_uri("page") . ($page ? "&page=$page" . ($_GET["next"] ? "&next=" . urlencode($_GET["next"]) : "") : "")) . '">' . ($page + 1) . "</a>"
669
+ );
670
+ }
671
+
672
+ /** Get file contents from $_FILES
673
+ * @param string
674
+ * @param bool
675
+ * @return mixed int for error, string otherwise
676
+ */
677
+ function get_file($key, $decompress = false) {
678
+ $file = $_FILES[$key];
679
+ if (!$file) {
680
+ return null;
681
+ }
682
+ foreach ($file as $key => $val) {
683
+ $file[$key] = (array) $val;
684
+ }
685
+ $return = '';
686
+ foreach ($file["error"] as $key => $error) {
687
+ if ($error) {
688
+ return $error;
689
+ }
690
+ $name = $file["name"][$key];
691
+ $tmp_name = $file["tmp_name"][$key];
692
+ $content = file_get_contents($decompress && preg_match('~\\.gz$~', $name)
693
+ ? "compress.zlib://$tmp_name"
694
+ : $tmp_name
695
+ ); //! may not be reachable because of open_basedir
696
+ if ($decompress) {
697
+ $start = substr($content, 0, 3);
698
+ if (function_exists("iconv") && preg_match("~^\xFE\xFF|^\xFF\xFE~", $start, $regs)) { // not ternary operator to save memory
699
+ $content = iconv("utf-16", "utf-8", $content);
700
+ } elseif ($start == "\xEF\xBB\xBF") { // UTF-8 BOM
701
+ $content = substr($content, 3);
702
+ }
703
+ $return .= $content . "\n\n";
704
+ } else {
705
+ $return .= $content;
706
+ }
707
+ }
708
+ //! support SQL files not ending with semicolon
709
+ return $return;
710
+ }
711
+
712
+ /** Determine upload error
713
+ * @param int
714
+ * @return string
715
+ */
716
+ function upload_error($error) {
717
+ $max_size = ($error == UPLOAD_ERR_INI_SIZE ? ini_get("upload_max_filesize") : 0); // post_max_size is checked in index.php
718
+ return ($error ? lang('Unable to upload a file.') . ($max_size ? " " . lang('Maximum allowed file size is %sB.', $max_size) : "") : lang('File does not exist.'));
719
+ }
720
+
721
+ /** Create repeat pattern for preg
722
+ * @param string
723
+ * @param int
724
+ * @return string
725
+ */
726
+ function repeat_pattern($pattern, $length) {
727
+ // fix for Compilation failed: number too big in {} quantifier
728
+ return str_repeat("$pattern{0,65535}", $length / 65535) . "$pattern{0," . ($length % 65535) . "}"; // can create {0,0} which is OK
729
+ }
730
+
731
+ /** Check whether the string is in UTF-8
732
+ * @param string
733
+ * @return bool
734
+ */
735
+ function is_utf8($val) {
736
+ // don't print control chars except \t\r\n
737
+ return (preg_match('~~u', $val) && !preg_match('~[\\0-\\x8\\xB\\xC\\xE-\\x1F]~', $val));
738
+ }
739
+
740
+ /** Shorten UTF-8 string
741
+ * @param string
742
+ * @param int
743
+ * @param string
744
+ * @return string escaped string with appended ...
745
+ */
746
+ function shorten_utf8($string, $length = 80, $suffix = "") {
747
+ if (!preg_match("(^(" . repeat_pattern("[\t\r\n -\x{FFFF}]", $length) . ")($)?)u", $string, $match)) { // ~s causes trash in $match[2] under some PHP versions, (.|\n) is slow
748
+ preg_match("(^(" . repeat_pattern("[\t\r\n -~]", $length) . ")($)?)", $string, $match);
749
+ }
750
+ return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i>...</i>");
751
+ }
752
+
753
+ /** Format decimal number
754
+ * @param int
755
+ * @return string
756
+ */
757
+ function format_number($val) {
758
+ return strtr(number_format($val, 0, ".", lang(',')), preg_split('~~u', lang('0123456789'), -1, PREG_SPLIT_NO_EMPTY));
759
+ }
760
+
761
+ /** Generate friendly URL
762
+ * @param string
763
+ * @return string
764
+ */
765
+ function friendly_url($val) {
766
+ // used for blobs and export
767
+ return preg_replace('~[^a-z0-9_]~i', '-', $val);
768
+ }
769
+
770
+ /** Print hidden fields
771
+ * @param array
772
+ * @param array
773
+ * @return null
774
+ */
775
+ function hidden_fields($process, $ignore = array()) {
776
+ while (list($key, $val) = each($process)) {
777
+ if (!in_array($key, $ignore)) {
778
+ if (is_array($val)) {
779
+ foreach ($val as $k => $v) {
780
+ $process[$key . "[$k]"] = $v;
781
+ }
782
+ } else {
783
+ echo '<input type="hidden" name="' . h($key) . '" value="' . h($val) . '">';
784
+ }
785
+ }
786
+ }
787
+ }
788
+
789
+ /** Print hidden fields for GET forms
790
+ * @return null
791
+ */
792
+ function hidden_fields_get() {
793
+ echo (sid() ? '<input type="hidden" name="' . session_name() . '" value="' . h(session_id()) . '">' : '');
794
+ echo (SERVER !== null ? '<input type="hidden" name="' . DRIVER . '" value="' . h(SERVER) . '">' : "");
795
+ echo '<input type="hidden" name="username" value="' . h($_GET["username"]) . '">';
796
+ }
797
+
798
+ /** Get status of a single table and fall back to name on error
799
+ * @param string
800
+ * @param bool
801
+ * @return array
802
+ */
803
+ function table_status1($table, $fast = false) {
804
+ $return = table_status($table, $fast);
805
+ return ($return ? $return : array("Name" => $table));
806
+ }
807
+
808
+ /** Find out foreign keys for each column
809
+ * @param string
810
+ * @return array array($col => array())
811
+ */
812
+ function column_foreign_keys($table) {
813
+ global $adminer;
814
+ $return = array();
815
+ foreach ($adminer->foreignKeys($table) as $foreign_key) {
816
+ foreach ($foreign_key["source"] as $val) {
817
+ $return[$val][] = $foreign_key;
818
+ }
819
+ }
820
+ return $return;
821
+ }
822
+
823
+ /** Print enum input field
824
+ * @param string "radio"|"checkbox"
825
+ * @param string
826
+ * @param array
827
+ * @param mixed int|string|array
828
+ * @param string
829
+ * @return null
830
+ */
831
+ function enum_input($type, $attrs, $field, $value, $empty = null) {
832
+ global $adminer;
833
+ preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
834
+ $return = ($empty !== null ? "<label><input type='$type'$attrs value='$empty'" . ((is_array($value) ? in_array($empty, $value) : $value === 0) ? " checked" : "") . "><i>" . lang('empty') . "</i></label>" : "");
835
+ foreach ($matches[1] as $i => $val) {
836
+ $val = stripcslashes(str_replace("''", "'", $val));
837
+ $checked = (is_int($value) ? $value == $i+1 : (is_array($value) ? in_array($i+1, $value) : $value === $val));
838
+ $return .= " <label><input type='$type'$attrs value='" . ($i+1) . "'" . ($checked ? ' checked' : '') . '>' . h($adminer->editVal($val, $field)) . '</label>';
839
+ }
840
+ return $return;
841
+ }
842
+
843
+ /** Print edit input field
844
+ * @param array one field from fields()
845
+ * @param mixed
846
+ * @param string
847
+ * @return null
848
+ */
849
+ function input($field, $value, $function) {
850
+ global $connection, $types, $adminer, $jush;
851
+ $name = h(bracket_escape($field["field"]));
852
+ echo "<td class='function'>";
853
+ if (is_array($value) && !$function) {
854
+ $args = array($value);
855
+ if (version_compare(PHP_VERSION, 5.4) >= 0) {
856
+ $args[] = JSON_PRETTY_PRINT;
857
+ }
858
+ $value = call_user_func_array('json_encode', $args); //! requires PHP 5.2
859
+ $function = "json";
860
+ }
861
+ $reset = ($jush == "mssql" && $field["auto_increment"]);
862
+ if ($reset && !$_POST["save"]) {
863
+ $function = null;
864
+ }
865
+ $functions = (isset($_GET["select"]) || $reset ? array("orig" => lang('original')) : array()) + $adminer->editFunctions($field);
866
+ $attrs = " name='fields[$name]'";
867
+ if ($field["type"] == "enum") {
868
+ echo nbsp($functions[""]) . "<td>" . $adminer->editInput($_GET["edit"], $field, $attrs, $value);
869
+ } else {
870
+ $first = 0;
871
+ foreach ($functions as $key => $val) {
872
+ if ($key === "" || !$val) {
873
+ break;
874
+ }
875
+ $first++;
876
+ }
877
+ $onchange = ($first ? " onchange=\"var f = this.form['function[" . h(js_escape(bracket_escape($field["field"]))) . "]']; if ($first > f.selectedIndex) f.selectedIndex = $first;\" onkeyup='keyupChange.call(this);'" : "");
878
+ $attrs .= $onchange;
879
+ $has_function = (in_array($function, $functions) || isset($functions[$function]));
880
+ echo (count($functions) > 1
881
+ ? "<select name='function[$name]' onchange='functionChange(this);'" . on_help("getTarget(event).value.replace(/^SQL\$/, '')", 1) . ">" . optionlist($functions, $function === null || $has_function ? $function : "") . "</select>"
882
+ : nbsp(reset($functions))
883
+ ) . '<td>';
884
+ $input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table
885
+ if ($input != "") {
886
+ echo $input;
887
+ } elseif ($field["type"] == "set") { //! 64 bits
888
+ preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
889
+ foreach ($matches[1] as $i => $val) {
890
+ $val = stripcslashes(str_replace("''", "'", $val));
891
+ $checked = (is_int($value) ? ($value >> $i) & 1 : in_array($val, explode(",", $value), true));
892
+ echo " <label><input type='checkbox' name='fields[$name][$i]' value='" . (1 << $i) . "'" . ($checked ? ' checked' : '') . "$onchange>" . h($adminer->editVal($val, $field)) . '</label>';
893
+ }
894
+ } elseif (preg_match('~blob|bytea|raw|file~', $field["type"]) && ini_bool("file_uploads")) {
895
+ echo "<input type='file' name='fields-$name'$onchange>";
896
+ } elseif (($text = preg_match('~text|lob~', $field["type"])) || preg_match("~\n~", $value)) {
897
+ if ($text && $jush != "sqlite") {
898
+ $attrs .= " cols='50' rows='12'";
899
+ } else {
900
+ $rows = min(12, substr_count($value, "\n") + 1);
901
+ $attrs .= " cols='30' rows='$rows'" . ($rows == 1 ? " style='height: 1.2em;'" : ""); // 1.2em - line-height
902
+ }
903
+ echo "<textarea$attrs>" . h($value) . '</textarea>';
904
+ } elseif ($function == "json") {
905
+ echo "<textarea$attrs cols='50' rows='12' class='jush-js'>" . h($value) . '</textarea>';
906
+ } else {
907
+ // int(3) is only a display hint
908
+ $maxlength = (!preg_match('~int~', $field["type"]) && preg_match('~^(\\d+)(,(\\d+))?$~', $field["length"], $match) ? ((preg_match("~binary~", $field["type"]) ? 2 : 1) * $match[1] + ($match[3] ? 1 : 0) + ($match[2] && !$field["unsigned"] ? 1 : 0)) : ($types[$field["type"]] ? $types[$field["type"]] + ($field["unsigned"] ? 0 : 1) : 0));
909
+ if ($jush == 'sql' && $connection->server_info >= 5.6 && preg_match('~time~', $field["type"])) {
910
+ $maxlength += 7; // microtime
911
+ }
912
+ // type='date' and type='time' display localized value which may be confusing, type='datetime' uses 'T' as date and time separator
913
+ echo "<input"
914
+ . ((!$has_function || $function === "") && preg_match('~(?<!o)int~', $field["type"]) ? " type='number'" : "")
915
+ . " value='" . h($value) . "'" . ($maxlength ? " maxlength='$maxlength'" : "")
916
+ . (preg_match('~char|binary~', $field["type"]) && $maxlength > 20 ? " size='40'" : "")
917
+ . "$attrs>"
918
+ ;
919
+ }
920
+ }
921
+ }
922
+
923
+ /** Process edit input field
924
+ * @param one field from fields()
925
+ * @return string or false to leave the original value
926
+ */
927
+ function process_input($field) {
928
+ global $adminer;
929
+ $idf = bracket_escape($field["field"]);
930
+ $function = $_POST["function"][$idf];
931
+ $value = $_POST["fields"][$idf];
932
+ if ($field["type"] == "enum") {
933
+ if ($value == -1) {
934
+ return false;
935
+ }
936
+ if ($value == "") {
937
+ return "NULL";
938
+ }
939
+ return +$value;
940
+ }
941
+ if ($field["auto_increment"] && $value == "") {
942
+ return null;
943
+ }
944
+ if ($function == "orig") {
945
+ return ($field["on_update"] == "CURRENT_TIMESTAMP" ? idf_escape($field["field"]) : false);
946
+ }
947
+ if ($function == "NULL") {
948
+ return "NULL";
949
+ }
950
+ if ($field["type"] == "set") {
951
+ return array_sum((array) $value);
952
+ }
953
+ if ($function == "json") {
954
+ $function = "";
955
+ $value = json_decode($value, true);
956
+ if (!is_array($value)) {
957
+ return false; //! report errors
958
+ }
959
+ return $value;
960
+ }
961
+ if (preg_match('~blob|bytea|raw|file~', $field["type"]) && ini_bool("file_uploads")) {
962
+ $file = get_file("fields-$idf");
963
+ if (!is_string($file)) {
964
+ return false; //! report errors
965
+ }
966
+ return q($file);
967
+ }
968
+ return $adminer->processInput($field, $value, $function);
969
+ }
970
+
971
+ /** Compute fields() from $_POST edit data
972
+ * @return array
973
+ */
974
+ function fields_from_edit() {
975
+ global $driver;
976
+ $return = array();
977
+ foreach ((array) $_POST["field_keys"] as $key => $val) {
978
+ if ($val != "") {
979
+ $val = bracket_escape($val);
980
+ $_POST["function"][$val] = $_POST["field_funs"][$key];
981
+ $_POST["fields"][$val] = $_POST["field_vals"][$key];
982
+ }
983
+ }
984
+ foreach ((array) $_POST["fields"] as $key => $val) {
985
+ $name = bracket_escape($key, 1); // 1 - back
986
+ $return[$name] = array(
987
+ "field" => $name,
988
+ "privileges" => array("insert" => 1, "update" => 1),
989
+ "null" => 1,
990
+ "auto_increment" => ($key == $driver->primary),
991
+ );
992
+ }
993
+ return $return;
994
+ }
995
+
996
+ /** Print results of search in all tables
997
+ * @uses $_GET["where"][0]
998
+ * @uses $_POST["tables"]
999
+ * @return null
1000
+ */
1001
+ function search_tables() {
1002
+ global $adminer, $connection;
1003
+ $_GET["where"][0]["op"] = "LIKE %%";
1004
+ $_GET["where"][0]["val"] = $_POST["query"];
1005
+ $found = false;
1006
+ foreach (table_status('', true) as $table => $table_status) {
1007
+ $name = $adminer->tableName($table_status);
1008
+ if (isset($table_status["Engine"]) && $name != "" && (!$_POST["tables"] || in_array($table, $_POST["tables"]))) {
1009
+ $result = $connection->query("SELECT" . limit("1 FROM " . table($table), " WHERE " . implode(" AND ", $adminer->selectSearchProcess(fields($table), array())), 1));
1010
+ if (!$result || $result->fetch_row()) {
1011
+ if (!$found) {
1012
+ echo "<ul>\n";
1013
+ $found = true;
1014
+ }
1015
+ echo "<li>" . ($result
1016
+ ? "<a href='" . h(ME . "select=" . urlencode($table) . "&where[0][op]=" . urlencode($_GET["where"][0]["op"]) . "&where[0][val]=" . urlencode($_GET["where"][0]["val"])) . "'>$name</a>\n"
1017
+ : "$name: <span class='error'>" . error() . "</span>\n");
1018
+ }
1019
+ }
1020
+ }
1021
+ echo ($found ? "</ul>" : "<p class='message'>" . lang('No tables.')) . "\n";
1022
+ }
1023
+
1024
+ /** Send headers for export
1025
+ * @param string
1026
+ * @param bool
1027
+ * @return string extension
1028
+ */
1029
+ function dump_headers($identifier, $multi_table = false) {
1030
+ global $adminer;
1031
+ $return = $adminer->dumpHeaders($identifier, $multi_table);
1032
+ $output = $_POST["output"];
1033
+ if ($output != "text") {
1034
+ header("Content-Disposition: attachment; filename=" . $adminer->dumpFilename($identifier) . ".$return" . ($output != "file" && !preg_match('~[^0-9a-z]~', $output) ? ".$output" : ""));
1035
+ }
1036
+ session_write_close();
1037
+ ob_flush();
1038
+ flush();
1039
+ return $return;
1040
+ }
1041
+
1042
+ /** Print CSV row
1043
+ * @param array
1044
+ * @return null
1045
+ */
1046
+ function dump_csv($row) {
1047
+ foreach ($row as $key => $val) {
1048
+ if (preg_match("~[\"\n,;\t]~", $val) || $val === "") {
1049
+ $row[$key] = '"' . str_replace('"', '""', $val) . '"';
1050
+ }
1051
+ }
1052
+ echo implode(($_POST["format"] == "csv" ? "," : ($_POST["format"] == "tsv" ? "\t" : ";")), $row) . "\r\n";
1053
+ }
1054
+
1055
+ /** Apply SQL function
1056
+ * @param string
1057
+ * @param string escaped column identifier
1058
+ * @return string
1059
+ */
1060
+ function apply_sql_function($function, $column) {
1061
+ return ($function ? ($function == "unixepoch" ? "DATETIME($column, '$function')" : ($function == "count distinct" ? "COUNT(DISTINCT " : strtoupper("$function(")) . "$column)") : $column);
1062
+ }
1063
+
1064
+ /** Get path of the temporary directory
1065
+ * @return string
1066
+ */
1067
+ function get_temp_dir() {
1068
+ $return = ini_get("upload_tmp_dir"); // session_save_path() may contain other storage path
1069
+ if (!$return) {
1070
+ if (function_exists('sys_get_temp_dir')) {
1071
+ $return = sys_get_temp_dir();
1072
+ } else {
1073
+ $filename = @tempnam("", ""); // @ - temp directory can be disabled by open_basedir
1074
+ if (!$filename) {
1075
+ return false;
1076
+ }
1077
+ $return = dirname($filename);
1078
+ unlink($filename);
1079
+ }
1080
+ }
1081
+ return $return;
1082
+ }
1083
+
1084
+ /** Read password from file adminer.key in temporary directory or create one
1085
+ * @param bool
1086
+ * @return string or false if the file can not be created
1087
+ */
1088
+ function password_file($create) {
1089
+ $filename = get_temp_dir() . "/adminer.key";
1090
+ $return = @file_get_contents($filename); // @ - may not exist
1091
+ if ($return || !$create) {
1092
+ return $return;
1093
+ }
1094
+ $fp = @fopen($filename, "w"); // @ - can have insufficient rights //! is not atomic
1095
+ if ($fp) {
1096
+ chmod($filename, 0660);
1097
+ $return = rand_string();
1098
+ fwrite($fp, $return);
1099
+ fclose($fp);
1100
+ }
1101
+ return $return;
1102
+ }
1103
+
1104
+ /** Get a random string
1105
+ * @return string 32 hexadecimal characters
1106
+ */
1107
+ function rand_string() {
1108
+ return md5(uniqid(mt_rand(), true));
1109
+ }
1110
+
1111
+ /** Format value to use in select
1112
+ * @param string
1113
+ * @param string
1114
+ * @param array
1115
+ * @param int
1116
+ * @return string HTML
1117
+ */
1118
+ function select_value($val, $link, $field, $text_length) {
1119
+ global $adminer, $HTTPS;
1120
+ if (is_array($val)) {
1121
+ $return = "";
1122
+ foreach ($val as $k => $v) {
1123
+ $return .= "<tr>"
1124
+ . ($val != array_values($val) ? "<th>" . h($k) : "")
1125
+ . "<td>" . select_value($v, $link, $field, $text_length)
1126
+ ;
1127
+ }
1128
+ return "<table cellspacing='0'>$return</table>";
1129
+ }
1130
+ if (!$link) {
1131
+ $link = $adminer->selectLink($val, $field);
1132
+ }
1133
+ if ($link === null) {
1134
+ if (is_mail($val)) {
1135
+ $link = "mailto:$val";
1136
+ }
1137
+ if ($protocol = is_url($val)) {
1138
+ $link = (($protocol == "http" && $HTTPS) || preg_match('~WebKit~i', $_SERVER["HTTP_USER_AGENT"]) // WebKit supports noreferrer since 2009
1139
+ ? $val // HTTP links from HTTPS pages don't receive Referer automatically
1140
+ : "https://www.adminer.org/redirect/?url=" . urlencode($val) // intermediate page to hide Referer
1141
+ );
1142
+ }
1143
+ }
1144
+ $return = $adminer->editVal($val, $field);
1145
+ if ($return !== null) {
1146
+ if ($return === "") { // === - may be int
1147
+ $return = "&nbsp;";
1148
+ } elseif (!is_utf8($return)) {
1149
+ $return = "\0"; // htmlspecialchars of binary data returns an empty string
1150
+ } elseif ($text_length != "" && is_shortable($field)) {
1151
+ $return = shorten_utf8($return, max(0, +$text_length)); // usage of LEFT() would reduce traffic but complicate query - expected average speedup: .001 s VS .01 s on local network
1152
+ } else {
1153
+ $return = h($return);
1154
+ }
1155
+ }
1156
+ return $adminer->selectVal($return, $link, $field, $val);
1157
+ }
1158
+
1159
+ /** Check whether the string is e-mail address
1160
+ * @param string
1161
+ * @return bool
1162
+ */
1163
+ function is_mail($email) {
1164
+ $atom = '[-a-z0-9!#$%&\'*+/=?^_`{|}~]'; // characters of local-name
1165
+ $domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component
1166
+ $pattern = "$atom+(\\.$atom+)*@($domain?\\.)+$domain";
1167
+ return is_string($email) && preg_match("(^$pattern(,\\s*$pattern)*\$)i", $email);
1168
+ }
1169
+
1170
+ /** Check whether the string is URL address
1171
+ * @param string
1172
+ * @return string "http", "https" or ""
1173
+ */
1174
+ function is_url($string) {
1175
+ $domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component //! IDN
1176
+ return (preg_match("~^(https?)://($domain?\\.)+$domain(:\\d+)?(/.*)?(\\?.*)?(#.*)?\$~i", $string, $match) ? strtolower($match[1]) : ""); //! restrict path, query and fragment characters
1177
+ }
1178
+
1179
+ /** Check if field should be shortened
1180
+ * @param array
1181
+ * @return bool
1182
+ */
1183
+ function is_shortable($field) {
1184
+ return preg_match('~char|text|lob|geometry|point|linestring|polygon|string~', $field["type"]);
1185
+ }
1186
+
1187
+ /** Get query to compute number of found rows
1188
+ * @param string
1189
+ * @param array
1190
+ * @param bool
1191
+ * @param array
1192
+ * @return string
1193
+ */
1194
+ function count_rows($table, $where, $is_group, $group) {
1195
+ global $jush;
1196
+ $query = " FROM " . table($table) . ($where ? " WHERE " . implode(" AND ", $where) : "");
1197
+ return ($is_group && ($jush == "sql" || count($group) == 1)
1198
+ ? "SELECT COUNT(DISTINCT " . implode(", ", $group) . ")$query"
1199
+ : "SELECT COUNT(*)" . ($is_group ? " FROM (SELECT 1$query$group_by) x" : $query)
1200
+ );
1201
+ }
1202
+
1203
+ /** Run query which can be killed by AJAX call after timing out
1204
+ * @param string
1205
+ * @return array of strings
1206
+ */
1207
+ function slow_query($query) {
1208
+ global $adminer, $token;
1209
+ $db = $adminer->database();
1210
+ $timeout = $adminer->queryTimeout();
1211
+ if (support("kill") && is_object($connection2 = connect()) && ($db == "" || $connection2->select_db($db))) {
1212
+ $kill = $connection2->result("SELECT CONNECTION_ID()"); // MySQL and MySQLi can use thread_id but it's not in PDO_MySQL
1213
+ ?>
1214
+ <script type="text/javascript">
1215
+ var timeout = setTimeout(function () {
1216
+ ajax('<?php echo js_escape(ME); ?>script=kill', function () {
1217
+ }, 'token=<?php echo $token; ?>&kill=<?php echo $kill; ?>');
1218
+ }, <?php echo 1000 * $timeout; ?>);
1219
+ </script>
1220
+ <?php
1221
+ } else {
1222
+ $connection2 = null;
1223
+ }
1224
+ ob_flush();
1225
+ flush();
1226
+ $return = @get_key_vals($query, $connection2, $timeout); // @ - may be killed
1227
+ if ($connection2) {
1228
+ echo "<script type='text/javascript'>clearTimeout(timeout);</script>\n";
1229
+ ob_flush();
1230
+ flush();
1231
+ }
1232
+ return array_keys($return);
1233
+ }
1234
+
1235
+ /** Generate BREACH resistant CSRF token
1236
+ * @return string
1237
+ */
1238
+ function get_token() {
1239
+ $rand = rand(1, 1e6);
1240
+ return ($rand ^ $_SESSION["token"]) . ":$rand";
1241
+ }
1242
+
1243
+ /** Verify if supplied CSRF token is valid
1244
+ * @return bool
1245
+ */
1246
+ function verify_token() {
1247
+ list($token, $rand) = explode(":", $_POST["token"]);
1248
+ return ($rand ^ $_SESSION["token"]) == $token;
1249
+ }
1250
+
1251
+ // used in compiled version
1252
+ function lzw_decompress($binary) {
1253
+ // convert binary string to codes
1254
+ $dictionary_count = 256;
1255
+ $bits = 8; // ceil(log($dictionary_count, 2))
1256
+ $codes = array();
1257
+ $rest = 0;
1258
+ $rest_length = 0;
1259
+ for ($i=0; $i < strlen($binary); $i++) {
1260
+ $rest = ($rest << 8) + ord($binary[$i]);
1261
+ $rest_length += 8;
1262
+ if ($rest_length >= $bits) {
1263
+ $rest_length -= $bits;
1264
+ $codes[] = $rest >> $rest_length;
1265
+ $rest &= (1 << $rest_length) - 1;
1266
+ $dictionary_count++;
1267
+ if ($dictionary_count >> $bits) {
1268
+ $bits++;
1269
+ }
1270
+ }
1271
+ }
1272
+ // decompression
1273
+ $dictionary = range("\0", "\xFF");
1274
+ $return = "";
1275
+ foreach ($codes as $i => $code) {
1276
+ $element = $dictionary[$code];
1277
+ if (!isset($element)) {
1278
+ $element = $word . $word[0];
1279
+ }
1280
+ $return .= $element;
1281
+ if ($i) {
1282
+ $dictionary[] = $word . $element[0];
1283
+ }
1284
+ $word = $element;
1285
+ }
1286
+ return $return;
1287
+ }
1288
+
1289
+ /** Return events to display help on mouse over
1290
+ * @param string JS expression
1291
+ * @param bool JS expression
1292
+ * @return string
1293
+ */
1294
+ function on_help($command, $side = 0) {
1295
+ return " onmouseover='helpMouseover(this, event, " . h($command) . ", $side);' onmouseout='helpMouseout(this, event);'";
1296
+ }
1297
+
1298
+ /** Print edit data form
1299
+ * @param string
1300
+ * @param array
1301
+ * @param mixed
1302
+ * @param bool
1303
+ * @return null
1304
+ */
1305
+ function edit_form($TABLE, $fields, $row, $update) {
1306
+ global $adminer, $jush, $token, $error;
1307
+ $table_name = $adminer->tableName(table_status1($TABLE, true));
1308
+ page_header(
1309
+ ($update ? lang('Edit') : lang('Insert')),
1310
+ $error,
1311
+ array("select" => array($TABLE, $table_name)),
1312
+ $table_name
1313
+ );
1314
+ if ($row === false) {
1315
+ echo "<p class='error'>" . lang('No rows.') . "\n";
1316
+ }
1317
+ ?>
1318
+ <form action="" method="post" enctype="multipart/form-data" id="form">
1319
+ <?php
1320
+ if (!$fields) {
1321
+ echo "<p class='error'>" . lang('You have no privileges to update this table.') . "\n";
1322
+ } else {
1323
+ echo "<table cellspacing='0' onkeydown='return editingKeydown(event);'>\n";
1324
+
1325
+ foreach ($fields as $name => $field) {
1326
+ echo "<tr><th>" . $adminer->fieldName($field);
1327
+ $default = $_GET["set"][bracket_escape($name)];
1328
+ if ($default === null) {
1329
+ $default = $field["default"];
1330
+ if ($field["type"] == "bit" && preg_match("~^b'([01]*)'\$~", $default, $regs)) {
1331
+ $default = $regs[1];
1332
+ }
1333
+ }
1334
+ $value = ($row !== null
1335
+ ? ($row[$name] != "" && $jush == "sql" && preg_match("~enum|set~", $field["type"])
1336
+ ? (is_array($row[$name]) ? array_sum($row[$name]) : +$row[$name])
1337
+ : $row[$name]
1338
+ )
1339
+ : (!$update && $field["auto_increment"]
1340
+ ? ""
1341
+ : (isset($_GET["select"]) ? false : $default)
1342
+ )
1343
+ );
1344
+ if (!$_POST["save"] && is_string($value)) {
1345
+ $value = $adminer->editVal($value, $field);
1346
+ }
1347
+ $function = ($_POST["save"]
1348
+ ? (string) $_POST["function"][$name]
1349
+ : ($update && $field["on_update"] == "CURRENT_TIMESTAMP"
1350
+ ? "now"
1351
+ : ($value === false ? null : ($value !== null ? '' : 'NULL'))
1352
+ )
1353
+ );
1354
+ if (preg_match("~time~", $field["type"]) && $value == "CURRENT_TIMESTAMP") {
1355
+ $value = "";
1356
+ $function = "now";
1357
+ }
1358
+ input($field, $value, $function);
1359
+ echo "\n";
1360
+ }
1361
+ if (!support("table")) {
1362
+ echo "<tr>"
1363
+ . "<th><input name='field_keys[]' onkeyup='keyupChange.call(this);' onchange='fieldChange(this);' value=''>" // needs empty value for keyupChange()
1364
+ . "<td class='function'>" . html_select("field_funs[]", $adminer->editFunctions(array("null" => isset($_GET["select"]))))
1365
+ . "<td><input name='field_vals[]'>"
1366
+ . "\n"
1367
+ ;
1368
+ }
1369
+ echo "</table>\n";
1370
+ }
1371
+ echo "<p>\n";
1372
+ if ($fields) {
1373
+ echo "<input type='submit' value='" . lang('Save') . "'>\n";
1374
+ if (!isset($_GET["select"])) {
1375
+ echo "<input type='submit' name='insert' value='" . ($update
1376
+ ? lang('Save and continue edit') . "' onclick='return !ajaxForm(this.form, \"" . lang('Saving') . '...", this)'
1377
+ : lang('Save and insert next')
1378
+ ) . "' title='Ctrl+Shift+Enter'>\n";
1379
+ }
1380
+ }
1381
+ echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'" . confirm() . ">\n"
1382
+ : ($_POST || !$fields ? "" : "<script type='text/javascript'>focus(document.getElementById('form').getElementsByTagName('td')[1].firstChild);</script>\n")
1383
+ );
1384
+ if (isset($_GET["select"])) {
1385
+ hidden_fields(array("check" => (array) $_POST["check"], "clone" => $_POST["clone"], "all" => $_POST["all"]));
1386
+ }
1387
+ ?>
1388
+ <input type="hidden" name="referer" value="<?php echo h(isset($_POST["referer"]) ? $_POST["referer"] : $_SERVER["HTTP_REFERER"]); ?>">
1389
+ <input type="hidden" name="save" value="1">
1390
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
1391
+ </form>
1392
+ <?php
1393
+ }
adminer/adminer/adminer/include/lang.inc.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // not used in a single language version
3
+
4
+ $langs = array(
5
+ 'en' => 'English', // Jakub Vrána - http://www.vrana.cz
6
+ 'ar' => 'العربية', // Y.M Amine - Algeria - nbr7@live.fr
7
+ 'bg' => 'Български', // Deyan Delchev
8
+ 'bn' => 'বাংলা', // Dipak Kumar - dipak.ndc@gmail.com
9
+ 'bs' => 'Bosanski', // Emir Kurtovic
10
+ 'ca' => 'Català', // Joan Llosas
11
+ 'cs' => 'Čeština', // Jakub Vrána - http://www.vrana.cz
12
+ 'da' => 'Dansk', // Jarne W. Beutnagel - jarne@beutnagel.dk
13
+ 'de' => 'Deutsch', // Klemens Häckel - http://clickdimension.wordpress.com
14
+ 'el' => 'Ελληνικά', // Dimitrios T. Tanis - jtanis@tanisfood.gr
15
+ 'es' => 'Español', // Klemens Häckel - http://clickdimension.wordpress.com
16
+ 'et' => 'Eesti', // Priit Kallas
17
+ 'fa' => 'فارسی', // mojtaba barghbani - Iran - mbarghbani@gmail.com, Nima Amini - http://nimlog.com
18
+ 'fi' => 'Suomi', // Finnish - Kari Eveli - http://www.lexitec.fi/
19
+ 'fr' => 'Français', // Francis Gagné, Aurélien Royer
20
+ 'gl' => 'Galego', // Eduardo Penabad Ramos
21
+ 'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu
22
+ 'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
23
+ 'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti
24
+ 'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/
25
+ 'ko' => '한국어', // dalli - skcha67@gmail.com
26
+ 'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
27
+ 'nl' => 'Nederlands', // Maarten Balliauw - http://blog.maartenballiauw.be
28
+ 'no' => 'Norsk', // Iver Odin Kvello, mupublishing.com
29
+ 'pl' => 'Polski', // Radosław Kowalewski - http://srsbiz.pl/
30
+ 'pt' => 'Português', // André Dias
31
+ 'pt-br' => 'Português (Brazil)', // Gian Live - gian@live.com, Davi Alexandre davi@davialexandre.com.br, RobertoPC - http://www.robertopc.com.br
32
+ 'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com
33
+ 'ru' => 'Русский язык', // Maksim Izmaylov
34
+ 'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz
35
+ 'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com
36
+ 'sr' => 'Српски', // Nikola Radovanović - cobisimo@gmail.com
37
+ 'ta' => 'த‌மிழ்', // G. Sampath Kumar, Chennai, India, sampathkumar11@gmail.com
38
+ 'th' => 'ภาษาไทย', // Panya Saraphi, elect.tu@gmail.com - http://www.opencart2u.com/
39
+ 'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com
40
+ 'uk' => 'Українська', // Valerii Kryzhov
41
+ 'vi' => 'Tiếng Việt', // Giang Manh @ manhgd google mail
42
+ 'zh' => '简体中文', // Mr. Lodar, vea - urn2.net - vea.urn2@gmail.com
43
+ 'zh-tw' => '繁體中文', // http://tzangms.com
44
+ );
45
+
46
+ /** Get current language
47
+ * @return string
48
+ */
49
+ function get_lang() {
50
+ global $LANG;
51
+ return $LANG;
52
+ }
53
+
54
+ /** Translate string
55
+ * @param string
56
+ * @param int
57
+ * @return string
58
+ */
59
+ function lang($idf, $number = null) {
60
+ global $LANG, $translations;
61
+ $translation = ($translations[$idf] ? $translations[$idf] : $idf);
62
+ if (is_array($translation)) {
63
+ $pos = ($number == 1 ? 0
64
+ : ($LANG == 'cs' || $LANG == 'sk' ? ($number && $number < 5 ? 1 : 2) // different forms for 1, 2-4, other
65
+ : ($LANG == 'fr' ? (!$number ? 0 : 1) // different forms for 0-1, other
66
+ : ($LANG == 'pl' ? ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2) // different forms for 1, 2-4 except 12-14, other
67
+ : ($LANG == 'sl' ? ($number % 100 == 1 ? 0 : ($number % 100 == 2 ? 1 : ($number % 100 == 3 || $number % 100 == 4 ? 2 : 3))) // different forms for 1, 2, 3-4, other
68
+ : ($LANG == 'lt' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 12-19, other
69
+ : ($LANG == 'bs' || $LANG == 'ru' || $LANG == 'sr' || $LANG == 'uk' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1 except 11, 2-4 except 12-14, other
70
+ : 1 // different forms for 1, other
71
+ ))))))); // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
72
+ $translation = $translation[$pos];
73
+ }
74
+ $args = func_get_args();
75
+ array_shift($args);
76
+ $format = str_replace("%d", "%s", $translation);
77
+ if ($format != $translation) {
78
+ $args[0] = format_number($number);
79
+ }
80
+ return vsprintf($format, $args);
81
+ }
82
+
83
+ function switch_lang() {
84
+ global $LANG, $langs;
85
+ echo "<form action='' method='post'>\n<div id='lang'>";
86
+ echo lang('Language') . ": " . html_select("lang", $langs, $LANG, "this.form.submit();");
87
+ echo " <input type='submit' value='" . lang('Use') . "' class='hidden'>\n";
88
+ echo "<input type='hidden' name='token' value='" . get_token() . "'>\n"; // $token may be empty in auth.inc.php
89
+ echo "</div>\n</form>\n";
90
+ }
91
+
92
+ if (isset($_POST["lang"]) && verify_token()) { // $error not yet available
93
+ cookie("adminer_lang", $_POST["lang"]);
94
+ $_SESSION["lang"] = $_POST["lang"]; // cookies may be disabled
95
+ $_SESSION["translations"] = array(); // used in compiled version
96
+ redirect(remove_from_uri());
97
+ }
98
+
99
+ $LANG = "en";
100
+ if (isset($langs[$_COOKIE["adminer_lang"]])) {
101
+ cookie("adminer_lang", $_COOKIE["adminer_lang"]);
102
+ $LANG = $_COOKIE["adminer_lang"];
103
+ } elseif (isset($langs[$_SESSION["lang"]])) {
104
+ $LANG = $_SESSION["lang"];
105
+ } else {
106
+ $accept_language = array();
107
+ preg_match_all('~([-a-z]+)(;q=([0-9.]+))?~', str_replace("_", "-", strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"])), $matches, PREG_SET_ORDER);
108
+ foreach ($matches as $match) {
109
+ $accept_language[$match[1]] = (isset($match[3]) ? $match[3] : 1);
110
+ }
111
+ arsort($accept_language);
112
+ foreach ($accept_language as $key => $q) {
113
+ if (isset($langs[$key])) {
114
+ $LANG = $key;
115
+ break;
116
+ }
117
+ $key = preg_replace('~-.*~', '', $key);
118
+ if (!isset($accept_language[$key]) && isset($langs[$key])) {
119
+ $LANG = $key;
120
+ break;
121
+ }
122
+ }
123
+ }
adminer/adminer/adminer/include/pdo.inc.php ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // PDO can be used in several database drivers
3
+ if (extension_loaded('pdo')) {
4
+ /*abstract*/ class Min_PDO extends PDO {
5
+ var $_result, $server_info, $affected_rows, $errno, $error;
6
+
7
+ function __construct() {
8
+ global $adminer;
9
+ $pos = array_search("SQL", $adminer->operators);
10
+ if ($pos !== false) {
11
+ unset($adminer->operators[$pos]);
12
+ }
13
+ }
14
+
15
+ function dsn($dsn, $username, $password) {
16
+ try {
17
+ parent::__construct($dsn, $username, $password);
18
+ } catch (Exception $ex) {
19
+ auth_error($ex->getMessage());
20
+ }
21
+ $this->setAttribute(13, array('Min_PDOStatement')); // 13 - PDO::ATTR_STATEMENT_CLASS
22
+ $this->server_info = $this->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION
23
+ }
24
+
25
+ /*abstract function select_db($database);*/
26
+
27
+ function query($query, $unbuffered = false) {
28
+ $result = parent::query($query);
29
+ $this->error = "";
30
+ if (!$result) {
31
+ list(, $this->errno, $this->error) = $this->errorInfo();
32
+ return false;
33
+ }
34
+ $this->store_result($result);
35
+ return $result;
36
+ }
37
+
38
+ function multi_query($query) {
39
+ return $this->_result = $this->query($query);
40
+ }
41
+
42
+ function store_result($result = null) {
43
+ if (!$result) {
44
+ $result = $this->_result;
45
+ if (!$result) {
46
+ return false;
47
+ }
48
+ }
49
+ if ($result->columnCount()) {
50
+ $result->num_rows = $result->rowCount(); // is not guaranteed to work with all drivers
51
+ return $result;
52
+ }
53
+ $this->affected_rows = $result->rowCount();
54
+ return true;
55
+ }
56
+
57
+ function next_result() {
58
+ if (!$this->_result) {
59
+ return false;
60
+ }
61
+ $this->_result->_offset = 0;
62
+ return @$this->_result->nextRowset(); // @ - PDO_PgSQL doesn't support it
63
+ }
64
+
65
+ function result($query, $field = 0) {
66
+ $result = $this->query($query);
67
+ if (!$result) {
68
+ return false;
69
+ }
70
+ $row = $result->fetch();
71
+ return $row[$field];
72
+ }
73
+ }
74
+
75
+ class Min_PDOStatement extends PDOStatement {
76
+ var $_offset = 0, $num_rows;
77
+
78
+ function fetch_assoc() {
79
+ return $this->fetch(2); // PDO::FETCH_ASSOC
80
+ }
81
+
82
+ function fetch_row() {
83
+ return $this->fetch(3); // PDO::FETCH_NUM
84
+ }
85
+
86
+ function fetch_field() {
87
+ $row = (object) $this->getColumnMeta($this->_offset++);
88
+ $row->orgtable = $row->table;
89
+ $row->orgname = $row->name;
90
+ $row->charsetnr = (in_array("blob", (array) $row->flags) ? 63 : 0);
91
+ return $row;
92
+ }
93
+ }
94
+ }
95
+
96
+ $drivers = array();
adminer/adminer/adminer/include/tmpfile.inc.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class TmpFile {
4
+ var $handler;
5
+ var $size;
6
+
7
+ function __construct() {
8
+ $this->handler = tmpfile();
9
+ }
10
+
11
+ function write($contents) {
12
+ $this->size += strlen($contents);
13
+ fwrite($this->handler, $contents);
14
+ }
15
+
16
+ function send() {
17
+ fseek($this->handler, 0);
18
+ fpassthru($this->handler);
19
+ fclose($this->handler);
20
+ }
21
+
22
+ }
adminer/adminer/adminer/include/version.inc.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <?php
2
+ $VERSION = "4.2.5";
adminer/adminer/adminer/include/xxtea.inc.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** PHP implementation of XXTEA encryption algorithm
3
+ * @author Ma Bingyao <andot@ujn.edu.cn>
4
+ * @link http://www.coolcode.cn/?action=show&id=128
5
+ */
6
+
7
+ function int32($n) {
8
+ while ($n >= 2147483648) {
9
+ $n -= 4294967296;
10
+ }
11
+ while ($n <= -2147483649) {
12
+ $n += 4294967296;
13
+ }
14
+ return (int) $n;
15
+ }
16
+
17
+ function long2str($v, $w) {
18
+ $s = '';
19
+ foreach ($v as $val) {
20
+ $s .= pack('V', $val);
21
+ }
22
+ if ($w) {
23
+ return substr($s, 0, end($v));
24
+ }
25
+ return $s;
26
+ }
27
+
28
+ function str2long($s, $w) {
29
+ $v = array_values(unpack('V*', str_pad($s, 4 * ceil(strlen($s) / 4), "\0")));
30
+ if ($w) {
31
+ $v[] = strlen($s);
32
+ }
33
+ return $v;
34
+ }
35
+
36
+ function xxtea_mx($z, $y, $sum, $k) {
37
+ return int32((($z >> 5 & 0x7FFFFFF) ^ $y << 2) + (($y >> 3 & 0x1FFFFFFF) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k ^ $z));
38
+ }
39
+
40
+ /** Cipher
41
+ * @param string plain-text password
42
+ * @param string
43
+ * @return string binary cipher
44
+ */
45
+ function encrypt_string($str, $key) {
46
+ if ($str == "") {
47
+ return "";
48
+ }
49
+ $key = array_values(unpack("V*", pack("H*", md5($key))));
50
+ $v = str2long($str, true);
51
+ $n = count($v) - 1;
52
+ $z = $v[$n];
53
+ $y = $v[0];
54
+ $q = floor(6 + 52 / ($n + 1));
55
+ $sum = 0;
56
+ while ($q-- > 0) {
57
+ $sum = int32($sum + 0x9E3779B9);
58
+ $e = $sum >> 2 & 3;
59
+ for ($p=0; $p < $n; $p++) {
60
+ $y = $v[$p + 1];
61
+ $mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]);
62
+ $z = int32($v[$p] + $mx);
63
+ $v[$p] = $z;
64
+ }
65
+ $y = $v[0];
66
+ $mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]);
67
+ $z = int32($v[$n] + $mx);
68
+ $v[$n] = $z;
69
+ }
70
+ return long2str($v, false);
71
+ }
72
+
73
+ /** Decipher
74
+ * @param string binary cipher
75
+ * @param string
76
+ * @return string plain-text password
77
+ */
78
+ function decrypt_string($str, $key) {
79
+ if ($str == "") {
80
+ return "";
81
+ }
82
+ if (!$key) {
83
+ return false;
84
+ }
85
+ $key = array_values(unpack("V*", pack("H*", md5($key))));
86
+ $v = str2long($str, false);
87
+ $n = count($v) - 1;
88
+ $z = $v[$n];
89
+ $y = $v[0];
90
+ $q = floor(6 + 52 / ($n + 1));
91
+ $sum = int32($q * 0x9E3779B9);
92
+ while ($sum) {
93
+ $e = $sum >> 2 & 3;
94
+ for ($p=$n; $p > 0; $p--) {
95
+ $z = $v[$p - 1];
96
+ $mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]);
97
+ $y = int32($v[$p] - $mx);
98
+ $v[$p] = $y;
99
+ }
100
+ $z = $v[$n];
101
+ $mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]);
102
+ $y = int32($v[0] - $mx);
103
+ $v[0] = $y;
104
+ $sum = int32($sum - 0x9E3779B9);
105
+ }
106
+ return long2str($v, true);
107
+ }
adminer/adminer/adminer/index.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** Adminer - Compact database management
3
+ * @link https://www.adminer.org/
4
+ * @author Jakub Vrana, http://www.vrana.cz/
5
+ * @copyright 2007 Jakub Vrana
6
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
7
+ * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
8
+ */
9
+
10
+ include "./include/bootstrap.inc.php";
11
+ include "./include/tmpfile.inc.php";
12
+
13
+ $enum_length = "'(?:''|[^'\\\\]|\\\\.)*'";
14
+ $inout = "IN|OUT|INOUT";
15
+
16
+ if (isset($_GET["select"]) && ($_POST["edit"] || $_POST["clone"]) && !$_POST["save"]) {
17
+ $_GET["edit"] = $_GET["select"];
18
+ }
19
+ if (isset($_GET["callf"])) {
20
+ $_GET["call"] = $_GET["callf"];
21
+ }
22
+ if (isset($_GET["function"])) {
23
+ $_GET["procedure"] = $_GET["function"];
24
+ }
25
+
26
+ if (isset($_GET["download"])) {
27
+ include "./download.inc.php";
28
+ } elseif (isset($_GET["table"])) {
29
+ include "./table.inc.php";
30
+ } elseif (isset($_GET["schema"])) {
31
+ include "./schema.inc.php";
32
+ } elseif (isset($_GET["dump"])) {
33
+ include "./dump.inc.php";
34
+ } elseif (isset($_GET["privileges"])) {
35
+ include "./privileges.inc.php";
36
+ } elseif (isset($_GET["sql"])) {
37
+ include "./sql.inc.php";
38
+ } elseif (isset($_GET["edit"])) {
39
+ include "./edit.inc.php";
40
+ } elseif (isset($_GET["create"])) {
41
+ include "./create.inc.php";
42
+ } elseif (isset($_GET["indexes"])) {
43
+ include "./indexes.inc.php";
44
+ } elseif (isset($_GET["database"])) {
45
+ include "./database.inc.php";
46
+ } elseif (isset($_GET["scheme"])) {
47
+ include "./scheme.inc.php";
48
+ } elseif (isset($_GET["call"])) {
49
+ include "./call.inc.php";
50
+ } elseif (isset($_GET["foreign"])) {
51
+ include "./foreign.inc.php";
52
+ } elseif (isset($_GET["view"])) {
53
+ include "./view.inc.php";
54
+ } elseif (isset($_GET["event"])) {
55
+ include "./event.inc.php";
56
+ } elseif (isset($_GET["procedure"])) {
57
+ include "./procedure.inc.php";
58
+ } elseif (isset($_GET["sequence"])) {
59
+ include "./sequence.inc.php";
60
+ } elseif (isset($_GET["type"])) {
61
+ include "./type.inc.php";
62
+ } elseif (isset($_GET["trigger"])) {
63
+ include "./trigger.inc.php";
64
+ } elseif (isset($_GET["user"])) {
65
+ include "./user.inc.php";
66
+ } elseif (isset($_GET["processlist"])) {
67
+ include "./processlist.inc.php";
68
+ } elseif (isset($_GET["select"])) {
69
+ include "./select.inc.php";
70
+ } elseif (isset($_GET["variables"])) {
71
+ include "./variables.inc.php";
72
+ } elseif (isset($_GET["script"])) {
73
+ include "./script.inc.php";
74
+ } else {
75
+ include "./db.inc.php";
76
+ }
77
+
78
+ // each page calls its own page_header(), if the footer should not be called then the page exits
79
+ page_footer();
adminer/adminer/adminer/indexes.inc.php ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $TABLE = $_GET["indexes"];
3
+ $index_types = array("PRIMARY", "UNIQUE", "INDEX");
4
+ $table_status = table_status($TABLE, true);
5
+ if (preg_match('~MyISAM|M?aria' . ($connection->server_info >= 5.6 ? '|InnoDB' : '') . '~i', $table_status["Engine"])) {
6
+ $index_types[] = "FULLTEXT";
7
+ }
8
+ $indexes = indexes($TABLE);
9
+ $primary = array();
10
+ if ($jush == "mongo") { // doesn't support primary key
11
+ $primary = $indexes["_id_"];
12
+ unset($index_types[0]);
13
+ unset($indexes["_id_"]);
14
+ }
15
+ $row = $_POST;
16
+
17
+ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"]) {
18
+ $alter = array();
19
+ foreach ($row["indexes"] as $index) {
20
+ $name = $index["name"];
21
+ if (in_array($index["type"], $index_types)) {
22
+ $columns = array();
23
+ $lengths = array();
24
+ $descs = array();
25
+ $set = array();
26
+ ksort($index["columns"]);
27
+ foreach ($index["columns"] as $key => $column) {
28
+ if ($column != "") {
29
+ $length = $index["lengths"][$key];
30
+ $desc = $index["descs"][$key];
31
+ $set[] = idf_escape($column) . ($length ? "(" . (+$length) . ")" : "") . ($desc ? " DESC" : "");
32
+ $columns[] = $column;
33
+ $lengths[] = ($length ? $length : null);
34
+ $descs[] = $desc;
35
+ }
36
+ }
37
+
38
+ if ($columns) {
39
+ $existing = $indexes[$name];
40
+ if ($existing) {
41
+ ksort($existing["columns"]);
42
+ ksort($existing["lengths"]);
43
+ ksort($existing["descs"]);
44
+ if ($index["type"] == $existing["type"]
45
+ && array_values($existing["columns"]) === $columns
46
+ && (!$existing["lengths"] || array_values($existing["lengths"]) === $lengths)
47
+ && array_values($existing["descs"]) === $descs
48
+ ) {
49
+ // skip existing index
50
+ unset($indexes[$name]);
51
+ continue;
52
+ }
53
+ }
54
+ $alter[] = array($index["type"], $name, $set);
55
+ }
56
+ }
57
+ }
58
+
59
+ // drop removed indexes
60
+ foreach ($indexes as $name => $existing) {
61
+ $alter[] = array($existing["type"], $name, "DROP");
62
+ }
63
+ if (!$alter) {
64
+ redirect(ME . "table=" . urlencode($TABLE));
65
+ }
66
+ queries_redirect(ME . "table=" . urlencode($TABLE), lang('Indexes have been altered.'), alter_indexes($TABLE, $alter));
67
+ }
68
+
69
+ page_header(lang('Indexes'), $error, array("table" => $TABLE), h($TABLE));
70
+
71
+ $fields = array_keys(fields($TABLE));
72
+ if ($_POST["add"]) {
73
+ foreach ($row["indexes"] as $key => $index) {
74
+ if ($index["columns"][count($index["columns"])] != "") {
75
+ $row["indexes"][$key]["columns"][] = "";
76
+ }
77
+ }
78
+ $index = end($row["indexes"]);
79
+ if ($index["type"] || array_filter($index["columns"], 'strlen')) {
80
+ $row["indexes"][] = array("columns" => array(1 => ""));
81
+ }
82
+ }
83
+ if (!$row) {
84
+ foreach ($indexes as $key => $index) {
85
+ $indexes[$key]["name"] = $key;
86
+ $indexes[$key]["columns"][] = "";
87
+ }
88
+ $indexes[] = array("columns" => array(1 => ""));
89
+ $row["indexes"] = $indexes;
90
+ }
91
+ ?>
92
+
93
+ <form action="" method="post">
94
+ <table cellspacing="0" class="nowrap">
95
+ <thead><tr>
96
+ <th><?php echo lang('Index Type'); ?>
97
+ <th><input type="submit" style="left: -1000px; position: absolute;"><?php echo lang('Column (length)'); ?>
98
+ <th><?php echo lang('Name'); ?>
99
+ <th><noscript><input type='image' class='icon' name='add[0]' src='../adminer/static/plus.gif' alt='+' title='<?php echo lang('Add next'); ?>'></noscript>&nbsp;
100
+ </thead>
101
+ <?php
102
+ if ($primary) {
103
+ echo "<tr><td>PRIMARY<td>";
104
+ foreach ($primary["columns"] as $key => $column) {
105
+ echo select_input(" disabled", $fields, $column);
106
+ echo "<label><input disabled type='checkbox'>" . lang('descending') . "</label> ";
107
+ }
108
+ echo "<td><td>\n";
109
+ }
110
+ $j = 1;
111
+ foreach ($row["indexes"] as $index) {
112
+ if (!$_POST["drop_col"] || $j != key($_POST["drop_col"])) {
113
+ echo "<tr><td>" . html_select("indexes[$j][type]", array(-1 => "") + $index_types, $index["type"], ($j == count($row["indexes"]) ? "indexesAddRow(this);" : 1));
114
+
115
+ echo "<td>";
116
+ ksort($index["columns"]);
117
+ $i = 1;
118
+ foreach ($index["columns"] as $key => $column) {
119
+ echo "<span>" . select_input(
120
+ " name='indexes[$j][columns][$i]' onchange=\"" . ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . "(this, '" . h(js_escape($jush == "sql" ? "" : $_GET["indexes"] . "_")) . "');\"",
121
+ ($fields ? array_combine($fields, $fields) : $fields),
122
+ $column
123
+ );
124
+ echo ($jush == "sql" || $jush == "mssql" ? "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "'>" : "");
125
+ echo ($jush != "sql" ? checkbox("indexes[$j][descs][$i]", 1, $index["descs"][$key], lang('descending')) : "");
126
+ echo " </span>";
127
+ $i++;
128
+ }
129
+
130
+ echo "<td><input name='indexes[$j][name]' value='" . h($index["name"]) . "' autocapitalize='off'>\n";
131
+ echo "<td><input type='image' class='icon' name='drop_col[$j]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick=\"return !editingRemoveRow(this, 'indexes\$1[type]');\">\n";
132
+ }
133
+ $j++;
134
+ }
135
+ ?>
136
+ </table>
137
+ <p>
138
+ <input type="submit" value="<?php echo lang('Save'); ?>">
139
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
140
+ </form>
adminer/adminer/adminer/lang/ar.inc.php ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ 'Create new database' => 'أنشئ فاعدة بيانات جديدة',
12
+ 'Table has been dropped.' => 'تم حذف الجدول.',
13
+ 'Table has been altered.' => 'تم تعديل الجدول.',
14
+ 'Table has been created.' => 'تم إنشاء الجدول.',
15
+ 'Alter table' => 'تعديل الجدول',
16
+ 'Create table' => 'إنشاء جدول',
17
+ 'Table name' => 'اسم الجدول',
18
+ 'engine' => 'المحرك',
19
+ 'collation' => 'الترتيب',
20
+ 'Column name' => 'اسم العمود',
21
+ 'Type' => 'النوع',
22
+ 'Length' => 'الطول',
23
+ 'Auto Increment' => 'تزايد تلقائي',
24
+ 'Options' => 'خيارات',
25
+ 'Save' => 'حفظ',
26
+ 'Drop' => 'حذف',
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
+ 'Edit' => 'تعديل',
41
+ 'Insert' => 'إنشاء',
42
+ 'Save and insert next' => 'جفظ و إنشاء التالي',
43
+ 'Delete' => 'مسح',
44
+ 'Database' => 'قاعدة بيانات',
45
+ 'Routines' => 'الروتينات',
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.' => 'إمتدادات php المدعومة غير موجودة.',
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
+ 'Target table' => 'الجدول المستهدف',
89
+ 'Change' => 'تعديل',
90
+ 'Source' => 'المصدر',
91
+ 'Target' => 'الهدف',
92
+ 'Add column' => 'إضافة عمودا',
93
+ 'Alter' => 'تعديل',
94
+ 'Add foreign key' => 'إضافة مفتاح أجنبي',
95
+ 'ON DELETE' => 'ON DELETE',
96
+ 'ON UPDATE' => 'ON UPDATE',
97
+ 'Index Type' => 'نوع المؤشر',
98
+ 'Column (length)' => 'العمود (الطول)',
99
+ 'View has been dropped.' => 'تم مسح العرض.',
100
+ 'View has been altered.' => 'تم تعديل العرض.',
101
+ 'View has been created.' => 'تم إنشاء العرض.',
102
+ 'Alter view' => 'تعديل عرض',
103
+ 'Create view' => 'إنشاء عرض',
104
+ 'Name' => 'الاسم',
105
+ 'Process list' => 'قائمة الإجراءات',
106
+ '%d process(es) have been killed.' => 'عدد الإجراءات التي تم إيقافها %d.',
107
+ 'Kill' => 'إيقاف',
108
+ 'Parameter name' => 'اسم المتغير',
109
+ 'Database schema' => 'مخطط فاعدة البيانات',
110
+ 'Create procedure' => 'إنشاء إجراء',
111
+ 'Create function' => 'إنشاء دالة',
112
+ 'Routine has been dropped.' => 'تم حذف الروتين.',
113
+ 'Routine has been altered.' => 'تم تعديل الروتين.',
114
+ 'Routine has been created.' => 'تم إنشاء الروتين.',
115
+ 'Alter function' => 'تعديل الدالة',
116
+ 'Alter procedure' => 'تعديل الإجراء',
117
+ 'Return type' => 'نوع العودة',
118
+ 'Add trigger' => 'إضافة زناد',
119
+ 'Trigger has been dropped.' => 'تم حذف الزناد.',
120
+ 'Trigger has been altered.' => 'تم تعديل الزناد.',
121
+ 'Trigger has been created.' => 'تم إنشاء الزناد.',
122
+ 'Alter trigger' => 'تعديل زناد',
123
+ 'Create trigger' => 'إنشاء زناد',
124
+ 'Time' => 'الوقت',
125
+ 'Event' => 'الحدث',
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
+ '%s version: %s through PHP extension %s' => 'النسخة %s : %s عن طريق إمتداد ال PHP %s',
140
+ 'Logged as: %s' => 'تم تسجيل الدخول باسم %s',
141
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'معلومات POST كبيرة جدا. قم بتقليص حجم المعلومات أو قم بزيادة قيمة %s في خيارات ال PHP.',
142
+ 'Move up' => 'نقل للأعلى',
143
+ 'Move down' => 'نقل للأسفل',
144
+ 'Export' => 'تصدير',
145
+ 'Tables' => 'جداول',
146
+ 'Data' => 'معلومات',
147
+ 'Output' => 'إخراج',
148
+ 'open' => 'فتح',
149
+ 'save' => 'حفظ',
150
+ 'Format' => 'الصيغة',
151
+ 'Functions' => 'الدوال',
152
+ 'Aggregation' => 'تجميع',
153
+ 'Event has been dropped.' => 'تم مسح الحدث.',
154
+ 'Event has been altered.' => 'تم تعديل الحدث.',
155
+ 'Event has been created.' => 'تم إنشاء الحدث.',
156
+ 'Alter event' => 'تعديل حدث',
157
+ 'Create event' => 'إنشاء حدث',
158
+ 'Start' => 'إبدأ',
159
+ 'End' => 'إنهاء',
160
+ 'Every' => 'كل',
161
+ 'Status' => 'حالة',
162
+ 'On completion preserve' => 'حفظ عند الإنتهاء',
163
+ 'Events' => 'الأحداث',
164
+ 'Schedule' => 'مواعيد',
165
+ 'At given time' => 'في وقت محدد',
166
+ 'Save and continue edit' => 'إحفظ و واصل التعديل',
167
+ 'original' => 'الأصلي',
168
+ 'Tables have been truncated.' => 'تم قطع الجداول.',
169
+ 'Tables have been moved.' => 'تم نقل الجداول.',
170
+ 'Tables have been dropped.' => 'تم حذف الجداول.',
171
+ 'Tables and views' => 'الجداول و العروض',
172
+ 'Engine' => 'المحرك',
173
+ 'Collation' => 'ترتيب',
174
+ 'Data Length' => 'طول المعطيات.',
175
+ 'Index Length' => 'طول المؤشر.',
176
+ 'Data Free' => 'المساحة الحرة',
177
+ 'Rows' => 'الأسطر',
178
+ ',' => ',',
179
+ '0123456789' => '0123456789',
180
+ 'Analyze' => 'تحليل',
181
+ 'Optimize' => 'تحسين',
182
+ 'Check' => 'فحص',
183
+ 'Repair' => 'إصلاح',
184
+ 'Truncate' => 'قطع',
185
+ 'Move to other database' => 'نقل إلى قاعدة بيانات أخرى',
186
+ 'Move' => 'نقل',
187
+ '%d item(s) have been affected.' => 'عدد العناصر المعدلة هو %d.',
188
+ 'whole result' => 'نتيجة كاملة',
189
+ 'Clone' => 'نسخ',
190
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'لقد تجاوزت العدد الأقصى للحقول. يرجى الرفع من %s.',
191
+ 'Partition by' => 'مقسم بواسطة',
192
+ 'Partitions' => 'التقسيمات',
193
+ 'Partition name' => 'اسم التقسيم',
194
+ 'Values' => 'القيم',
195
+ '%d row(s) have been imported.' => 'تم استيراد %d سطرا',
196
+ 'anywhere' => 'في اي مكان',
197
+ 'Import' => 'استيراد',
198
+ 'Stop on error' => 'أوقف في حالة حدوث خطأ',
199
+ '%.3f s' => '%.3f s',
200
+ '$1-$3-$5' => '$5/$3/$1',
201
+ '[yyyy]-mm-dd' => 'jj/mm/[aaaa]',
202
+ 'History' => 'تاريخ',
203
+ 'Variables' => 'متغيرات',
204
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'أعمدة المصدر و الهدف يجب أن تكون بنفس النوع, يجب أن يكون هناك مؤشر في أعمدة الهدف و البيانات المرجعية يجب ان تكون موجودة.',
205
+ 'Relations' => 'علاقات',
206
+ 'Run file' => 'نفذ الملف',
207
+ 'Clear' => 'مسح',
208
+ 'Maximum allowed file size is %sB.' => 'حجم الملف الأقصى هو %sB.',
209
+ 'Numbers' => 'أعداد',
210
+ 'Date and time' => 'التاريخ و الوقت',
211
+ 'Strings' => 'سلاسل',
212
+ 'Binary' => 'ثنائية',
213
+ 'Lists' => 'قوائم',
214
+ 'Editor' => 'المحرر',
215
+ 'E-mail' => 'البريد الإلكتروني',
216
+ 'From' => 'من',
217
+ 'Subject' => 'الموضوع',
218
+ 'Send' => 'إرسال',
219
+ '%d e-mail(s) have been sent.' => 'تم إرسال %d رسالة.',
220
+ 'Webserver file %s' => 'ملف %s من خادم الويب',
221
+ 'File does not exist.' => 'الملف غير موجود.',
222
+ '%d in total' => '%d في المجموع',
223
+ 'Permanent login' => 'تسجيل دخول دائم',
224
+ 'Databases have been dropped.' => 'تم حذف قواعد البيانات.',
225
+ 'Database has been dropped.' => 'تم حذف قاعدة البيانات.',
226
+ 'Search data in tables' => 'بحث في الجداول',
227
+ 'Schema' => 'المخطط',
228
+ 'Alter schema' => 'تعديل المخطط',
229
+ 'Create schema' => 'إنشاء مخطط',
230
+ 'Schema has been dropped.' => 'تم حذف المخطط.',
231
+ 'Schema has been created.' => 'تم إنشاء المخطط.',
232
+ 'Schema has been altered.' => 'تم تعديل المخطط.',
233
+ 'Sequences' => 'السلاسل',
234
+ 'Create sequence' => 'إنشاء سلسلة',
235
+ 'Alter sequence' => 'تعديل سلسلة',
236
+ 'Sequence has been dropped.' => 'تم حذف السلسلة.',
237
+ 'Sequence has been created.' => 'تم إنشاء السلسلة.',
238
+ 'Sequence has been altered.' => 'تم تعديل السلسلة.',
239
+ 'User types' => 'نوع المستخدم',
240
+ 'Create type' => 'إنشاء نوع',
241
+ 'Alter type' => 'تعديل نوع',
242
+ 'Type has been dropped.' => 'تم حذف النوع.',
243
+ 'Type has been created.' => 'تم إنشاء النوع.',
244
+ 'Use edit link to modify this value.' => 'استعمل الرابط "تعديل" لتعديل هذه القيمة.',
245
+ 'last' => 'الأخيرة',
246
+ 'From server' => 'من الخادم',
247
+ 'System' => 'النظام',
248
+ 'Select data' => 'عرض البيانات',
249
+ 'Show structure' => 'عرض التركيبة',
250
+ 'empty' => 'فارغ',
251
+ 'Network' => 'شبكة',
252
+ 'Geometry' => 'هندسة',
253
+ 'File exists.' => 'الملف موجود.',
254
+ 'Attachments' => 'ملفات مرفقة.',
255
+ 'Item%s has been inserted.' => 'تم إدراج العنصر.',
256
+ 'now' => 'الآن',
257
+ '%d query(s) executed OK.' => array('تم تنفيذ الاستعلام %d بنجاح.', 'تم تنفيذ الاستعلامات %d بنجاح.'),
258
+ 'Show only errors' => 'إظهار الأخطاء فقط',
259
+ 'Refresh' => 'تحديث',
260
+ 'Invalid schema.' => 'مخطط غير صالح.',
261
+ 'Please use one of the extensions %s.' => 'المرجو استخدام إحدى الامتدادات %s.',
262
+ 'ltr' => 'rtl',
263
+ 'Tables have been copied.' => 'تم نسخ الجداول.',
264
+ 'Copy' => 'نسخ',
265
+ 'Permanent link' => 'رابط دائم',
266
+ 'Edit all' => 'تعديل الكل',
267
+ 'HH:MM:SS' => 'HH:MM:SS',
268
+ );
adminer/adminer/adminer/lang/bg.inc.php ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Система',
5
+ 'Server' => 'Сървър',
6
+ 'Username' => 'Потребител',
7
+ 'Password' => 'Парола',
8
+ 'Permanent login' => 'Запаметяване',
9
+ 'Login' => 'Вход',
10
+ 'Logout' => 'Изход',
11
+ 'Logged as: %s' => 'Текущ потребител: %s',
12
+ 'Logout successful.' => 'Излизането е успешно.',
13
+ 'Invalid credentials.' => 'Невалидни потребителски данни.',
14
+ 'Too many unsuccessful logins, try again in %d minute(s).' => array('Прекалено много неуспешни опити за вход, опитайте пак след %d минута.', 'Прекалено много неуспешни опити за вход, опитайте пак след %d минути.'),
15
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Главната парола вече е невалидна. <a href="https://www.adminer.org/en/extension/" target="_blank">Изберете</a> %s метод, за да я направите постоянна.',
16
+ 'Language' => 'Език',
17
+ 'Invalid CSRF token. Send the form again.' => 'Невалиден шифроващ ключ. Попълнете и изпратете формуляра отново.',
18
+ 'If you did not send this request from Adminer then close this page.' => 'Ако не сте изпратили тази заявка през Adminer, затворете тази страница.',
19
+ 'No extension' => 'Няма разширение',
20
+ 'None of the supported PHP extensions (%s) are available.' => 'Никое от поддържаните PHP разширения (%s) не е налично.',
21
+ 'Session support must be enabled.' => 'Поддръжката на сесии трябва да е разрешена.',
22
+ 'Session expired, please login again.' => 'Сесията е изтекла; моля, влезте отново.',
23
+ '%s version: %s through PHP extension %s' => '%s версия: %s през PHP разширение %s',
24
+ 'Refresh' => 'Обновяване',
25
+
26
+ // text direction - 'ltr' or 'rtl'
27
+ 'ltr' => 'ltr',
28
+
29
+ 'Privileges' => 'Права',
30
+ 'Create user' => 'Създаване на потребител',
31
+ 'User has been dropped.' => 'Потребителя беше премахнат.',
32
+ 'User has been altered.' => 'Потребителя беше променен.',
33
+ 'User has been created.' => 'Потребителя беше създаден.',
34
+ 'Hashed' => 'Хеширан',
35
+ 'Column' => 'Колона',
36
+ 'Routine' => 'Процедура',
37
+ 'Grant' => 'Осигуряване',
38
+ 'Revoke' => 'Отнемане',
39
+
40
+ 'Process list' => 'Списък с процеси',
41
+ '%d process(es) have been killed.' => array('%d процес беше прекъснат.', '%d процеса бяха прекъснати.'),
42
+ 'Kill' => 'Прекъсване',
43
+
44
+ 'Variables' => 'Променливи',
45
+ 'Status' => 'Състояние',
46
+
47
+ 'SQL command' => 'SQL команда',
48
+ '%d query(s) executed OK.' => array('%d заявка е изпълнена.', '%d заявки са изпълнени.'),
49
+ 'Query executed OK, %d row(s) affected.' => array('Заявката е изпълнена, %d ред е засегнат.', 'Заявката е изпълнена, %d редове са засегнати.'),
50
+ 'No commands to execute.' => 'Няма команди за изпълнение.',
51
+ 'Error in query' => 'Грешка в заявката',
52
+ 'Execute' => 'Изпълнение',
53
+ 'Stop on error' => 'Спиране при грешка',
54
+ 'Show only errors' => 'Показване само на грешките',
55
+ // sprintf() format for time of the command
56
+ '%.3f s' => '%.3f s',
57
+ 'History' => 'Хронология',
58
+ 'Clear' => 'Изчистване',
59
+ 'Edit all' => 'Редактиране на всички',
60
+
61
+ 'File upload' => 'Прикачване на файл',
62
+ 'From server' => 'От сървър',
63
+ 'Webserver file %s' => 'Сървърен файл %s',
64
+ 'Run file' => 'Изпълнение на файл',
65
+ 'File does not exist.' => 'Файлът не съществува.',
66
+ 'File uploads are disabled.' => 'Прикачването на файлове е забранено.',
67
+ 'Unable to upload a file.' => 'Неуспешно прикачване на файл.',
68
+ 'Maximum allowed file size is %sB.' => 'Максимално разрешената големина на файл е %sB.',
69
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Изпратени са прекалено много данни. Намалете обема на данните или увеличете %s управляващата директива.',
70
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Можете да прикачите голям SQL файл чрез FTP и да го импортирате от сървъра.',
71
+ 'You are offline.' => 'Вие сте офлайн.',
72
+
73
+ 'Export' => 'Експорт',
74
+ 'Output' => 'Резултат',
75
+ 'open' => 'показване',
76
+ 'save' => 'запис',
77
+ 'Format' => 'Формат',
78
+ 'Data' => 'Данни',
79
+
80
+ 'Database' => 'База данни',
81
+ 'database' => 'база данни',
82
+ 'Use' => 'Избор',
83
+ 'Select database' => 'Избор на база данни',
84
+ 'Invalid database.' => 'Невалидна база данни.',
85
+ 'Create new database' => 'Нова база данни',
86
+ 'Database has been dropped.' => 'Базата данни беше премахната.',
87
+ 'Databases have been dropped.' => 'Базите данни бяха премехнати.',
88
+ 'Database has been created.' => 'Базата данни беше създадена.',
89
+ 'Database has been renamed.' => 'Базата данни беше преименувана.',
90
+ 'Database has been altered.' => 'Базата данни беше променена.',
91
+ 'Alter database' => 'Промяна на база данни',
92
+ 'Create database' => 'Създаване на база данни',
93
+ 'Database schema' => 'Схема на базата данни',
94
+
95
+ // link to current database schema layout
96
+ 'Permanent link' => 'Постоянна препратка',
97
+
98
+ // thousands separator - must contain single byte
99
+ ',' => ',',
100
+ '0123456789' => '0123456789',
101
+ 'Engine' => 'Система',
102
+ 'Collation' => 'Кодировка',
103
+ 'Data Length' => 'Големина на данните',
104
+ 'Index Length' => 'Големина на индекса',
105
+ 'Data Free' => 'Свободно място',
106
+ 'Rows' => 'Редове',
107
+ '%d in total' => '%d всичко',
108
+ 'Analyze' => 'Анализиране',
109
+ 'Optimize' => 'Оптимизиране',
110
+ 'Vacuum' => 'Консолидиране',
111
+ 'Check' => 'Проверка',
112
+ 'Repair' => 'Поправка',
113
+ 'Truncate' => 'Изрязване',
114
+ 'Tables have been truncated.' => 'Таблиците бяха изрязани.',
115
+ 'Move to other database' => 'Преместване в друга база данни',
116
+ 'Move' => 'Преместване',
117
+ 'Tables have been moved.' => 'Таблиците бяха преместени.',
118
+ 'Copy' => 'Копиране',
119
+ 'Tables have been copied.' => 'Таблиците бяха копирани.',
120
+
121
+ 'Routines' => 'Процедури',
122
+ 'Routine has been called, %d row(s) affected.' => array('Беше приложена процедура, %d ред е засегнат.', 'Беше приложена процедура, %d редове са засегнати.'),
123
+ 'Call' => 'Прилагане',
124
+ 'Parameter name' => 'Име на параметъра',
125
+ 'Create procedure' => 'Създаване на процедура',
126
+ 'Create function' => 'Създаване на функция',
127
+ 'Routine has been dropped.' => 'Процедурата беше премахната.',
128
+ 'Routine has been altered.' => 'Процедурата беше променена.',
129
+ 'Routine has been created.' => 'Процедурата беше създадена.',
130
+ 'Alter function' => 'Промяна на функция',
131
+ 'Alter procedure' => 'Промяна на процедура',
132
+ 'Return type' => 'Резултат',
133
+
134
+ 'Events' => 'Събития',
135
+ 'Event has been dropped.' => 'Събитието беше премахнато.',
136
+ 'Event has been altered.' => 'Събитието беше променено.',
137
+ 'Event has been created.' => 'Събитието беше създадено.',
138
+ 'Alter event' => 'Промяна на събитие',
139
+ 'Create event' => 'Създаване на събитие',
140
+ 'At given time' => 'В зададено време',
141
+ 'Every' => 'Всеки',
142
+ 'Schedule' => 'Насрочване',
143
+ 'Start' => 'Начало',
144
+ 'End' => 'Край',
145
+ 'On completion preserve' => 'Запазване след завършване',
146
+
147
+ 'Tables' => 'Таблици',
148
+ 'Tables and views' => 'Таблици и изгледи',
149
+ 'Table' => 'Таблица',
150
+ 'No tables.' => 'Няма таблици.',
151
+ 'Alter table' => 'Промяна на таблица',
152
+ 'Create table' => 'Създаване на таблица',
153
+ 'Table has been dropped.' => 'Таблицата беше премахната.',
154
+ 'Tables have been dropped.' => 'Таблиците бяха премахнати.',
155
+ 'Tables have been optimized.' => 'Таблиците бяха оптимизирани.',
156
+ 'Table has been altered.' => 'Таблицата беше променена.',
157
+ 'Table has been created.' => 'Таблицата беше създадена.',
158
+ 'Table name' => 'Име на таблица',
159
+ 'Show structure' => 'Структура',
160
+ 'engine' => 'система',
161
+ 'collation' => 'кодировка',
162
+ 'Column name' => 'Име на колоната',
163
+ 'Type' => 'Вид',
164
+ 'Length' => 'Големина',
165
+ 'Auto Increment' => 'Автоматично увеличаване',
166
+ 'Options' => 'Опции',
167
+ 'Comment' => 'Коментар',
168
+ 'Default value' => 'Стойност по подразбиране',
169
+ 'Default values' => 'Стойности по подразбиране',
170
+ 'Drop' => 'Премахване',
171
+ 'Are you sure?' => 'Сигурни ли сте?',
172
+ 'Size' => 'Големина',
173
+ 'Compute' => 'Изчисляване',
174
+ 'Move up' => 'Преместване нагоре',
175
+ 'Move down' => 'Преместване надолу',
176
+ 'Remove' => 'Премахване',
177
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Максималния брой полета е превишен. Моля, увеличете %s.',
178
+
179
+ 'Partition by' => 'Разделяне на',
180
+ 'Partitions' => 'Раздели',
181
+ 'Partition name' => 'Име на раздела',
182
+ 'Values' => 'Стойности',
183
+
184
+ 'View' => 'Изглед',
185
+ 'Materialized View' => 'Запаметен изглед',
186
+ 'View has been dropped.' => 'Изгледа беше премахнат.',
187
+ 'View has been altered.' => 'Изгледа беше променен.',
188
+ 'View has been created.' => 'Изгледа беше създаден.',
189
+ 'Alter view' => 'Промяна на изглед',
190
+ 'Create view' => 'Създаване на изглед',
191
+ 'Create materialized view' => 'Създаване на запаметен изглед',
192
+
193
+ 'Indexes' => 'Индекси',
194
+ 'Indexes have been altered.' => 'Индексите бяха променени.',
195
+ 'Alter indexes' => 'Промяна на индекси',
196
+ 'Add next' => 'Добавяне на следващ',
197
+ 'Index Type' => 'Вид на индекса',
198
+ 'Column (length)' => 'Колона (дължина)',
199
+
200
+ 'Foreign keys' => 'Препратки',
201
+ 'Foreign key' => 'Препратка',
202
+ 'Foreign key has been dropped.' => 'Препратката беше премахната.',
203
+ 'Foreign key has been altered.' => 'Препратката беше променена.',
204
+ 'Foreign key has been created.' => 'Препратката беше създадена.',
205
+ 'Target table' => 'Таблица приемник',
206
+ 'Change' => 'Промяна',
207
+ 'Source' => 'Източник',
208
+ 'Target' => 'Цел',
209
+ 'Add column' => 'Добавяне на колона',
210
+ 'Alter' => 'Промяна',
211
+ 'Add foreign key' => 'Добавяне на препратка',
212
+ 'ON DELETE' => 'При изтриване',
213
+ 'ON UPDATE' => 'При промяна',
214
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Колоните източник и цел трябва да са от еднакъв вид, трябва да има индекс на колоните приемник и да има въведени данни.',
215
+
216
+ 'Triggers' => 'Тригери',
217
+ 'Add trigger' => 'Добавяне на тригер',
218
+ 'Trigger has been dropped.' => 'Тригера беше премахнат.',
219
+ 'Trigger has been altered.' => 'Тригера беше променен.',
220
+ 'Trigger has been created.' => 'Тригера беше създаден.',
221
+ 'Alter trigger' => 'Промяна на тригер',
222
+ 'Create trigger' => 'Създаване на тригер',
223
+ 'Time' => 'Време',
224
+ 'Event' => 'Събитие',
225
+ 'Name' => 'Име',
226
+
227
+ 'select' => 'показване',
228
+ 'Select' => 'Показване',
229
+ 'Select data' => 'Показване на данни',
230
+ 'Functions' => 'Функции',
231
+ 'Aggregation' => 'Съвкупност',
232
+ 'Search' => 'Търсене',
233
+ 'anywhere' => 'навсякъде',
234
+ 'Search data in tables' => 'Търсене на данни в таблиците',
235
+ 'Sort' => 'Сортиране',
236
+ 'descending' => 'низходящо',
237
+ 'Limit' => 'Редове',
238
+ 'Limit rows' => 'Лимит на редовете',
239
+ 'Text length' => 'Текст',
240
+ 'Action' => 'Действие',
241
+ 'Full table scan' => 'Пълно сканиране на таблицата',
242
+ 'Unable to select the table' => 'Неуспешно показване на таблицата',
243
+ 'No rows.' => 'Няма редове.',
244
+ '%d / ' => '%d / ',
245
+ '%d row(s)' => array('%d ред', '%d реда'),
246
+ 'Page' => 'Страница',
247
+ 'last' => 'последен',
248
+ 'Load more data' => 'Зареждане на повече данни',
249
+ 'Loading' => 'Зареждане',
250
+ 'whole result' => 'пълен резултат',
251
+ '%d byte(s)' => array('%d байт', '%d байта'),
252
+
253
+ 'Import' => 'Импорт',
254
+ '%d row(s) have been imported.' => array('%d ред беше импортиран.', '%d реда бяха импортирани.'),
255
+ 'File must be in UTF-8 encoding.' => 'Файла трябва да е с UTF-8 кодировка.',
256
+
257
+ // in-place editing in select
258
+ 'Modify' => 'Промяна',
259
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+щракване в стойността, за да я промените.',
260
+ 'Use edit link to modify this value.' => 'Използвайте "редакция" за промяна на данните.',
261
+
262
+ // %s can contain auto-increment value
263
+ 'Item%s has been inserted.' => 'Елементи%s бяха вмъкнати.',
264
+ 'Item has been deleted.' => 'Елемента беше изтрит.',
265
+ 'Item has been updated.' => 'Елемента беше обновен.',
266
+ '%d item(s) have been affected.' => array('%d елемент беше засегнат.', '%d елемента бяха засегнати.'),
267
+ 'New item' => 'Нов елемент',
268
+ 'original' => 'оригинал',
269
+ // label for value '' in enum data type
270
+ 'empty' => 'празно',
271
+ 'edit' => 'редакция',
272
+ 'Edit' => 'Редактиране',
273
+ 'Insert' => 'Вмъкване',
274
+ 'Save' => 'Запис',
275
+ 'Saving' => 'Записване',
276
+ 'Save and continue edit' => 'Запис и редакция',
277
+ 'Save and insert next' => 'Запис и нов',
278
+ 'Selected' => 'Избран',
279
+ 'Clone' => 'Клониране',
280
+ 'Delete' => 'Изтриване',
281
+ 'You have no privileges to update this table.' => 'Нямате праве за обновяване на таблицата.',
282
+
283
+ 'E-mail' => 'E-mail',
284
+ 'From' => 'От',
285
+ 'Subject' => 'Тема',
286
+ 'Attachments' => 'Прикачени',
287
+ 'Send' => 'Изпращане',
288
+ '%d e-mail(s) have been sent.' => array('%d писмо беше изпратено.', '%d писма бяха изпратени.'),
289
+
290
+ // data type descriptions
291
+ 'Numbers' => 'Числа',
292
+ 'Date and time' => 'Дата и час',
293
+ 'Strings' => 'Низове',
294
+ 'Binary' => 'Двоични',
295
+ 'Lists' => 'Списъци',
296
+ 'Network' => 'Мрежа',
297
+ 'Geometry' => 'Геометрия',
298
+ 'Relations' => 'Зависимости',
299
+
300
+ 'Editor' => 'Редактор',
301
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
302
+ '$1-$3-$5' => '$1-$3-$5',
303
+ // hint for date format - use language equivalents for day, month and year shortcuts
304
+ '[yyyy]-mm-dd' => '[гггг]-мм-дд',
305
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
306
+ 'HH:MM:SS' => 'ЧЧ:ММ:СС',
307
+ 'now' => 'сега',
308
+ 'yes' => 'да',
309
+ 'no' => 'не',
310
+
311
+ // general SQLite error in create, drop or rename database
312
+ 'File exists.' => 'Файла вече съществува.',
313
+ 'Please use one of the extensions %s.' => 'Моля, използвайте някое от разширенията %s.',
314
+
315
+ // PostgreSQL and MS SQL schema support
316
+ 'Alter schema' => 'Промяна на схемата',
317
+ 'Create schema' => 'Създаване на схема',
318
+ 'Schema has been dropped.' => 'Схемата беше премахната.',
319
+ 'Schema has been created.' => 'Схемата беше създадена.',
320
+ 'Schema has been altered.' => 'Схемата беше променена.',
321
+ 'Schema' => 'Схема',
322
+ 'Invalid schema.' => 'Невалидна схема.',
323
+
324
+ // PostgreSQL sequences support
325
+ 'Sequences' => 'Последователности',
326
+ 'Create sequence' => 'Създаване на последователност',
327
+ 'Sequence has been dropped.' => 'Последователността беше премахната.',
328
+ 'Sequence has been created.' => 'Последователността беше създадена.',
329
+ 'Sequence has been altered.' => 'Последователността беше променена.',
330
+ 'Alter sequence' => 'Промяна на последователност',
331
+
332
+ // PostgreSQL user types support
333
+ 'User types' => 'Видове потребители',
334
+ 'Create type' => 'Създаване на вид',
335
+ 'Type has been dropped.' => 'Вида беше пермахнат.',
336
+ 'Type has been created.' => 'Вида беше създаден.',
337
+ 'Alter type' => 'Промяна на вид',
338
+ );
adminer/adminer/adminer/lang/bn.inc.php ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ 'Create new database' => 'নতুন ডাটাবেজ তৈরী করো',
12
+ 'Table has been dropped.' => 'টেবিল মুছে ফেলা হয়েছে।',
13
+ 'Table has been altered.' => 'টেবিল সম্পাদনা করা হয়েছে।',
14
+ 'Table has been created.' => 'টেবিল তৈরী করা হয়েছে।',
15
+ 'Alter table' => 'টেবিল সম্পাদনা',
16
+ 'Create table' => 'টেবিল তৈরী করো',
17
+ 'Table name' => 'টেবিলের নাম',
18
+ 'engine' => 'ইন্জিন',
19
+ 'collation' => 'কলোকেশন',
20
+ 'Column name' => 'কলামের নাম',
21
+ 'Type' => 'টাইপ',
22
+ 'Length' => 'দৈর্ঘ্য',
23
+ 'Auto Increment' => 'স্বয়ংক্রিয় বৃদ্ধি',
24
+ 'Options' => 'অপশন',
25
+ 'Save' => 'সংরক্ষণ',
26
+ 'Drop' => 'মুছে ফেলো',
27
+ 'Database has been dropped.' => 'ডাটাবেজ মুছে ফেলা হয়েছে।',
28
+ 'Database has been created.' => 'ডাটাবেজ তৈরী করা হয়েছে।',
29
+ 'Database has been renamed.' => 'ডাটাবেজের নতুন নামকরণ করা হয়েছে।',
30
+ 'Database has been altered.' => 'ডাটাবেজ সম্পাদনা করা হয়েছে।',
31
+ 'Alter database' => 'ডাটাবেজ সম্পাদনা',
32
+ 'Create database' => 'ডাটাবেজ তৈরী',
33
+ 'SQL command' => 'SQL-কোয়্যারী',
34
+ 'Logout' => 'লগআউট',
35
+ 'database' => 'ডাটাবেজ',
36
+ 'Use' => 'ব্যবহার',
37
+ 'No tables.' => 'কোন টেবিল নাই।',
38
+ 'select' => 'নির্বাচন',
39
+ 'Item has been deleted.' => 'বিষয়বস্তু মুছে ফেলা হয়েছে।',
40
+ 'Item has been updated.' => 'বিষয়বস্তু আপডেট করা হয়েছে।',
41
+ 'Item%s has been inserted.' => 'বিষয়বস্তুসমূহ সংযোজন করা হয়েছে।',
42
+ 'Edit' => 'সম্পাদনা',
43
+ 'Insert' => 'সংযোজন',
44
+ 'Save and insert next' => 'সংরক্ষন ও পরবর্তী সংযোজন',
45
+ 'Delete' => 'মুছে ফেলো',
46
+ 'Database' => 'ডাটাবেজ',
47
+ 'Routines' => 'রুটিনসমূহ',
48
+ 'Indexes have been altered.' => 'সূচীসমূহ সম্পাদনা করা হয়েছে।',
49
+ 'Indexes' => 'সূচীসমূহ',
50
+ 'Alter indexes' => 'সূচীসমূহ সম্পাদনা',
51
+ 'Add next' => 'সংযোজন',
52
+ 'Language' => 'ভাষা',
53
+ 'Select' => 'নির্বাচন',
54
+ 'New item' => 'নতুন বিষয়বস্তু',
55
+ 'Search' => 'খোঁজ',
56
+ 'Sort' => 'সাজানো',
57
+ 'descending' => 'ক্রমহ্রাস',
58
+ 'Limit' => 'সীমা',
59
+ 'No rows.' => 'কোন সারি নাই।',
60
+ 'Action' => 'ক্রিয়া',
61
+ 'edit' => 'সম্পাদনা',
62
+ 'Page' => 'পৃষ্ঠা',
63
+ 'Query executed OK, %d row(s) affected.' => array('কোয়্যারী সম্পাদন হয়েছে, %d সারি প্রভাবিত হয়েছে।', 'কোয়্যারী সম্পাদন হয়েছে, %d সারি প্রভাবিত হয়েছে।'),
64
+ 'Error in query' => 'কোয়্যারীতে ভুল আছে।',
65
+ 'Execute' => 'সম্পাদন করো',
66
+ 'Table' => 'টেবিল',
67
+ 'Foreign keys' => 'ফরেন কী',
68
+ 'Triggers' => 'ট্রিগার',
69
+ 'View' => 'ভিউ',
70
+ 'Unable to select the table' => 'টেবিল নির্বাচন করতে অক্ষম',
71
+ 'Invalid CSRF token. Send the form again.' => 'অবৈধ CSRF টোকেন। ফর্ম আবার পাঠাও।',
72
+ 'Comment' => 'মন্তব্য',
73
+ 'Default values' => 'ডিফল্ট মান',
74
+ '%d byte(s)' => array('%d বাইট', '%d বাইটসমূহ'),
75
+ 'No commands to execute.' => 'সম্পাদন করার মত কোন নির্দেশ নাই।',
76
+ 'Unable to upload a file.' => 'ফাইল আপলোড করা সম্ভব হচ্ছে না।',
77
+ 'File upload' => 'ফাইল আপলোড',
78
+ 'File uploads are disabled.' => 'ফাইল আপলোড নিষ্ক্রিয় করা আছে।',
79
+ 'Routine has been called, %d row(s) affected.' => array('রুটিন কল করা হয়েছে, %d টি সারি (সমূহ) প্রভাবিত হয়েছে।', 'রুটিন কল করা হয়েছে, %d টি সারি (সমূহ) প্রভাবিত হয়েছে।'),
80
+ 'Call' => 'কল',
81
+ 'No extension' => 'কোন এক্সটেনশান নাই',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'কোন PHP সমর্থিত এক্সটেনশন (%s) পাওয়া যায় নাই।',
83
+ 'Session support must be enabled.' => 'সেশন সমর্থন সক্রিয় করা আবশ্যক।',
84
+ 'Session expired, please login again.' => 'সেশানের মেয়াদ শেষ হয়েছে, আবার লগইন করুন।',
85
+ 'Text length' => 'টেক্সট দৈর্ঘ্য',
86
+ 'Foreign key has been dropped.' => 'ফরেন কী মুছে ফেলা হয়েছে।',
87
+ 'Foreign key has been altered.' => 'ফরেন কী সম্পাদনা করা হয়েছে।',
88
+ 'Foreign key has been created.' => 'ফরেন কী তৈরী করা হয়েছে।',
89
+ 'Foreign key' => 'ফরেন কী ',
90
+ 'Target table' => 'টার্গেট টেবিল',
91
+ 'Change' => 'পরিবর্তন',
92
+ 'Source' => 'উৎস',
93
+ 'Target' => 'লক্ষ্য',
94
+ 'Add column' => 'কলাম সংযোজন',
95
+ 'Alter' => 'সম্পাদনা',
96
+ 'Add foreign key' => 'ফরেন কী সংযোজন করো',
97
+ 'ON DELETE' => 'অন ডিলিট',
98
+ 'ON UPDATE' => 'অন আপডেট',
99
+ 'Index Type' => 'সূচী-ধরণ',
100
+ 'Column (length)' => 'কলাম (দৈর্ঘ্য)',
101
+ 'View has been dropped.' => 'ভিউ মুছে ফেলা হয়েছে।',
102
+ 'View has been altered.' => 'ভিউ সম্পাদনা করা হয়েছে।',
103
+ 'View has been created.' => 'ভিউ তৈরী করা হয়েছে।',
104
+ 'Alter view' => 'ভিউ সম্পাদনা করো',
105
+ 'Create view' => 'ভিউ তৈরী করো',
106
+ 'Name' => 'নাম',
107
+ 'Process list' => 'প্রসেস তালিকা',
108
+ '%d process(es) have been killed.' => array('%d টি প্রসেস (সমূহ) বিনষ্ট করা হয়েছে।', '%d টি প্রসেস (সমূহ) বিনষ্ট করা হয়েছে।'),
109
+ 'Kill' => 'বিনষ্ট করো',
110
+ 'Parameter name' => 'প্যারামিটারের নাম',
111
+ 'Database schema' => 'ডাটাবেজ স্কিমা',
112
+ 'Create procedure' => 'প্রসিডিওর তৈরী করো',
113
+ 'Create function' => 'ফাংশন তৈরী করো',
114
+ 'Routine has been dropped.' => 'রুটিন মুছে ফেলা হয়েছে।',
115
+ 'Routine has been altered.' => 'রুটিন সম্পাদনা করা হয়েছে।',
116
+ 'Routine has been created.' => 'রুটিন তৈরী করা হয়েছে।',
117
+ 'Alter function' => 'ফাংশন সম্পাদনা করো',
118
+ 'Alter procedure' => 'প্রসিডিওর সম্পাদনা করো',
119
+ 'Return type' => 'রিটার্ন টাইপ',
120
+ 'Add trigger' => 'ট্রিগার সংযোজন করো',
121
+ 'Trigger has been dropped.' => 'ট্রিগার মুছে ফেলা হয়েছে।',
122
+ 'Trigger has been altered.' => 'ট্রিগার সম্পাদনা করা হয়েছে।',
123
+ 'Trigger has been created.' => 'ট্রিগার তৈরী করা হয়েছে।',
124
+ 'Alter trigger' => 'ট্রিগার সম্পাদনা করো',
125
+ 'Create trigger' => 'ট্রিগার তৈরী করো',
126
+ 'Time' => 'সময়',
127
+ 'Event' => 'ইভেন্ট',
128
+ '%s version: %s through PHP extension %s' => 'ভার্সন %s: %s, %s PHP এক্সটেনশনের মধ্য দিয়ে',
129
+ '%d row(s)' => array('%d সারি', '%d সারি সমূহ'),
130
+ 'Remove' => 'অপসারণ',
131
+ 'Are you sure?' => 'তুমি কি নিশ্চিত?',
132
+ 'Privileges' => 'প্রিভিলেজেস',
133
+ 'Create user' => 'ইউজার তৈরী করো',
134
+ 'User has been dropped.' => 'ইউজার মুছে ফেলা হয়েছে।',
135
+ 'User has been altered.' => 'ইউজার সম্পাদনা করা হয়েছে।',
136
+ 'User has been created.' => 'ইউজার তৈরী করা হয়েছে।',
137
+ 'Hashed' => 'হ্যাসড',
138
+ 'Column' => 'কলাম',
139
+ 'Routine' => 'রুটিন',
140
+ 'Grant' => 'গ্র্যান্ট',
141
+ 'Revoke' => 'রিভোক',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'খুব বড় POST ডাটা। ডাটা সংক্ষিপ্ত করো অথবা %s কনফিগারেশন নির্দেশ বৃদ্ধি করো',
143
+ 'Logged as: %s' => '%s হিসাবে লগড',
144
+ 'Move up' => 'উপরে স্থানান্তর',
145
+ 'Move down' => 'নীচে স্থানান্তর',
146
+ 'Functions' => 'ফাংশন সমূহ',
147
+ 'Aggregation' => 'মোট পরিমাণ',
148
+ 'Export' => 'এক্সপোর্ট',
149
+ 'Output' => 'আউটপুট',
150
+ 'open' => 'খোলা',
151
+ 'save' => 'সংরক্ষণ',
152
+ 'Format' => 'বিন্যাস',
153
+ 'Tables' => 'টেবিলসমূহ',
154
+ 'Data' => 'ডাটা',
155
+ 'Event has been dropped.' => 'ইভেন্ট মুছে ফেলা হয়েছে।',
156
+ 'Event has been altered.' => 'ইভেন্ট সম্পাদনা করা হয়েছে।',
157
+ 'Event has been created.' => 'ইভেন্ট তৈরী করা হয়েছে।',
158
+ 'Alter event' => 'ইভেন্ট সম্পাদনা করো',
159
+ 'Create event' => 'ইভেন্ট তৈরী করো',
160
+ 'At given time' => 'প্রদত্ত সময়ে',
161
+ 'Every' => 'প্রত্যেক',
162
+ 'Events' => 'ইভেন্টসমূহ',
163
+ 'Schedule' => 'সময়সূচি',
164
+ 'Start' => 'শুরু',
165
+ 'End' => 'সমাপ্তি',
166
+ 'Status' => 'স্ট্যাটাস',
167
+ 'On completion preserve' => 'সমাপ্ত হওয়ার পর সংরক্ষন করো',
168
+ 'Tables and views' => 'টেবিল এবং ভিউ সমূহ',
169
+ 'Data Length' => 'ডাটার দৈর্ঘ্য',
170
+ 'Index Length' => 'ইনডেক্স এর দৈর্ঘ্য',
171
+ 'Data Free' => 'তথ্য মুক্ত',
172
+ 'Collation' => 'কলোকেশন',
173
+ 'Analyze' => 'বিশ্লেষণ',
174
+ 'Optimize' => 'অপটিমাইজ',
175
+ 'Check' => 'পরীক্ষা',
176
+ 'Repair' => 'মেরামত',
177
+ 'Truncate' => 'ছাঁটাই',
178
+ 'Tables have been truncated.' => 'টেবিল ছাঁটাই করা হয়েছে',
179
+ 'Rows' => 'সারি',
180
+ ',' => ',',
181
+ '0123456789' => '০১২৩৪৫৬৭৮৯',
182
+ 'Tables have been moved.' => 'টেবিল স্থানান্তর করা হয়েছে।',
183
+ 'Move to other database' => 'অন্য ডাটাবেজে স্থানান্তর করো',
184
+ 'Move' => 'স্থানান্তর করো',
185
+ 'Engine' => 'ইঞ্জিন',
186
+ 'Save and continue edit' => 'সংরক্ষণ করো এবং সম্পাদনা চালিয়ে যাও',
187
+ 'original' => 'প্রকৃত',
188
+ 'Tables have been dropped.' => 'টেবিলসমূহ মুছে ফেলা হয়েছে।',
189
+ '%d item(s) have been affected.' => '%d টি বিষয়বস্তু প্রভাবিত হয়েছে',
190
+ 'whole result' => 'সম্পূর্ণ ফলাফল',
191
+ 'Clone' => 'ক্লোন',
192
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'অনুমোদিত ফিল্ড এর সর্বাধিক সংখ্যা অতিক্রম করে গেছে। অনুগ্রহপূর্বক %s বৃদ্ধি করুন।',
193
+ 'Partition by' => 'পার্টিশন যার মাধ্যমে',
194
+ 'Partitions' => 'পার্টিশন',
195
+ 'Partition name' => 'পার্টিশনের নাম',
196
+ 'Values' => 'মানসমূহ',
197
+ '%d row(s) have been imported.' => array('%d টি সারি (সমূহ) ইমপোর্ট করা হয়েছে।', '%d টি সারি (সমূহ) ইমপোর্ট করা হয়েছে।'),
198
+ 'anywhere' => 'যে কোন স্থানে',
199
+ 'Import' => 'ইমপোর্ট',
200
+ 'Stop on error' => 'ত্রুটি পেলে থেমে যাও',
201
+ '%.3f s' => '%.3f s',
202
+ '$1-$3-$5' => '$6.$4.$1',
203
+ '[yyyy]-mm-dd' => 't.m.[jjjj]',
204
+ 'History' => 'ইতিহাস',
205
+ 'Variables' => 'চলকসমূহ',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'সোর্স এবং টার্গেট কলামে একই ডাটা টাইপ থাকতে হবে, টার্গেট কলামসমূহে একটি সূচী এবং রেফারেন্সড ডেটার উপস্থিতি থাকা আবশ্যক।',
207
+ 'Relations' => 'সম্পর্ক',
208
+ 'Run file' => 'ফাইল চালাও',
209
+ 'Clear' => 'সাফ করো',
210
+ 'Maximum allowed file size is %sB.' => 'সর্বাধিক অনুমোদিত ফাইল সাইজ %sB.',
211
+ 'Numbers' => 'সংখ্যা',
212
+ 'Date and time' => 'তারিখ এবং সময়',
213
+ 'Strings' => 'স্ট্রিং',
214
+ 'Binary' => 'বাইনারি',
215
+ 'Lists' => 'তালিকা',
216
+ 'Editor' => 'সম্পাদক',
217
+ 'E-mail' => '​​ই-মেইল',
218
+ 'From' => 'থেকে',
219
+ 'Subject' => 'বিষয়',
220
+ 'Send' => 'পাঠাও',
221
+ '%d e-mail(s) have been sent.' => array('%d ইমেইল (গুলি) পাঠানো হয়েছে।', '%d ইমেইল (গুলি) পাঠানো হয়েছে।'),
222
+ 'Webserver file %s' => 'ওয়েবসার্ভার ফাইল %s',
223
+ 'File does not exist.' => 'ফাইলের কোন অস্তিত্ব নেই।',
224
+ '%d in total' => 'সর্বমোটঃ %d টি',
225
+ 'Permanent login' => 'স্থায়ী লগইন',
226
+ 'Databases have been dropped.' => 'ডাটাবেজসমূহ মুছে ফেলা হয়েছে।',
227
+ 'Search data in tables' => 'টেবিলে খোঁজ করো',
228
+ 'Schema' => 'স্কিমা',
229
+ 'Alter schema' => 'স্কিমা পরিবর্তন করো',
230
+ 'Create schema' => 'স্কিমা তৈরী করো',
231
+ 'Schema has been dropped.' => 'স্কিমা মুছে ফেলা হয়েছে।',
232
+ 'Schema has been created.' => 'স্কিমা তৈরি করা হয়েছে।',
233
+ 'Schema has been altered.' => 'স্কিমা সম্পাদনা করা হয়েছে।',
234
+ 'Sequences' => 'অনুক্রম',
235
+ 'Create sequence' => 'অনুক্রম তৈরি করো',
236
+ 'Alter sequence' => 'অনুক্রম সম্পাদনা করো',
237
+ 'Sequence has been dropped.' => 'অনুক্রম মুছে ফেলা হয়েছে।',
238
+ 'Sequence has been created.' => 'অনুক্রম তৈরি করা হয়েছে।',
239
+ 'Sequence has been altered.' => 'অনুক্রম সম্পাদনা করা হয়েছে।',
240
+ 'User types' => 'ইউজারের টাইপ',
241
+ 'Create type' => 'টাইপ তৈরী করো',
242
+ 'Alter type' => 'টাইপ পরিবর্তন করো',
243
+ 'Type has been dropped.' => 'টাইপ মুছে ফেলা হয়েছে।',
244
+ 'Type has been created.' => 'টাইপ তৈরি করা হয়েছে।',
245
+ 'Use edit link to modify this value.' => 'এই মান পরিবর্তনের জন্য সম্পাদনা লিঙ্ক ব্যবহার করো।',
246
+ 'last' => 'সর্বশেষ',
247
+ 'From server' => 'সার্ভার থেকে',
248
+ 'System' => 'সিস্টেম',
249
+ 'Select data' => 'তথ্য নির্বাচন করো',
250
+ 'Show structure' => 'গঠন দেখাও',
251
+ 'empty' => 'খালি',
252
+ 'Network' => 'নেটওয়ার্ক',
253
+ 'Geometry' => 'জ্যামিতি',
254
+ 'File exists.' => 'ফাইল রয়েছে।',
255
+ 'Attachments' => 'সংযুক্তি',
256
+ '%d query(s) executed OK.' => array('SQL-কোয়্যারী সফলভাবে সম্পন্ন হয়েছে', '%d SQL-কোয়্যারীসমূহ সফলভাবে সম্পন্ন হয়েছে'),
257
+ 'Show only errors' => 'শুধুমাত্র ত্রুটি দেখাও',
258
+ 'Refresh' => 'রিফ্রেশ',
259
+ 'Invalid schema.' => 'অবৈধ স্কিমা।',
260
+ 'Please use one of the extensions %s.' => 'কোন একটা এক্সটেনশন %s ব্যবহার করো।',
261
+ 'now' => 'এখন',
262
+ 'ltr' => 'ltr',
263
+ 'Tables have been copied.' => 'টেবিল কপি করা হয়েছে।',
264
+ 'Copy' => 'কপি',
265
+ 'Permanent link' => 'স্থায়ী লিংক',
266
+ 'Edit all' => 'সকল সম্পাদনা করো',
267
+ 'HH:MM:SS' => 'HH:MM:SS',
268
+ );
adminer/adminer/adminer/lang/bs.inc.php ADDED
@@ -0,0 +1,322 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Sistem',
5
+ 'Server' => 'Server',
6
+ 'Username' => 'Korisničko ime',
7
+ 'Password' => 'Lozinka',
8
+ 'Permanent login' => 'Trajna prijava',
9
+ 'Login' => 'Prijava',
10
+ 'Logout' => 'Odjava',
11
+ 'Logged as: %s' => 'Prijavi se kao: %s',
12
+ 'Logout successful.' => 'Uspešna odjava.',
13
+ 'Invalid credentials.' => 'Nevažeće dozvole.',
14
+ 'Language' => 'Jezik',
15
+ 'Invalid CSRF token. Send the form again.' => 'Nevažeći CSRF kod. Proslijedite ponovo formu.',
16
+ 'No extension' => 'Bez dodataka',
17
+ 'None of the supported PHP extensions (%s) are available.' => 'Nijedan od podržanih PHP dodataka nije dostupan.',
18
+ 'Session support must be enabled.' => 'Morate omogućiti podršku za sesije.',
19
+ 'Session expired, please login again.' => 'Vaša sesija je istekla, prijavite se ponovo.',
20
+ '%s version: %s through PHP extension %s' => '%s verzija: %s pomoću PHP dodatka je %s',
21
+ 'Refresh' => 'Osveži',
22
+
23
+ // text direction - 'ltr' or 'rtl'
24
+ 'ltr' => 'ltr',
25
+
26
+ 'Privileges' => 'Dozvole',
27
+ 'Create user' => 'Novi korisnik',
28
+ 'User has been dropped.' => 'Korisnik je izbrisan.',
29
+ 'User has been altered.' => 'Korisnik je izmijenjen.',
30
+ 'User has been created.' => 'korisnik je spašen.',
31
+ 'Hashed' => 'Heširano',
32
+ 'Column' => 'kolumna',
33
+ 'Routine' => 'Rutina',
34
+ 'Grant' => 'Dozvoli',
35
+ 'Revoke' => 'Opozovi',
36
+
37
+ 'Process list' => 'Spisak procesa',
38
+ '%d process(es) have been killed.' => array('%d proces je ukinut.', '%d procesa su ukinuta.', '%d procesa je ukinuto.'),
39
+ 'Kill' => 'Ubij',
40
+
41
+ 'Variables' => 'Promijenljive',
42
+ 'Status' => 'Status',
43
+
44
+ 'SQL command' => 'SQL komanda',
45
+ '%d query(s) executed OK.' => array('%d upit je uspiješno izvršen.', '%d upita su uspiješno izvršena.', '%d upita je uspiješno izvršeno.'),
46
+ 'Query executed OK, %d row(s) affected.' => array('Upit je uspiješno izvršen, %d red je ažuriran.', 'Upit je uspiješno izvršen, %d reda su ažurirana.', 'Upit je uspiješno izvršen, %d redova je ažurirano.'),
47
+ 'No commands to execute.' => 'Bez komandi za izvršavanje.',
48
+ 'Error in query' => 'Greška u upitu',
49
+ 'Execute' => 'Izvrši',
50
+ 'Stop on error' => 'Zaustavi prilikom greške',
51
+ 'Show only errors' => 'Prikazuj samo greške',
52
+ // sprintf() format for time of the command
53
+ '%.3f s' => '%.3f s',
54
+ 'History' => 'Historijat',
55
+ 'Clear' => 'Očisti',
56
+ 'Edit all' => 'Izmijeni sve',
57
+
58
+ 'File upload' => 'Slanje datoteka',
59
+ 'From server' => 'Sa servera',
60
+ 'Webserver file %s' => 'Datoteka %s sa veb servera',
61
+ 'Run file' => 'Pokreni datoteku',
62
+ 'File does not exist.' => 'Datoteka ne postoji.',
63
+ 'File uploads are disabled.' => 'Onemogućeno je slanje datoteka.',
64
+ 'Unable to upload a file.' => 'Slanje datoteke nije uspelo.',
65
+ 'Maximum allowed file size is %sB.' => 'Najveća dozvoljena veličina datoteke je %sB.',
66
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Preveliki POST podatak. Morate da smanjite podatak ili povećajte vrijednost konfiguracione direktive %s.',
67
+
68
+ 'Export' => 'Izvoz',
69
+ 'Output' => 'Ispis',
70
+ 'open' => 'otvori',
71
+ 'save' => 'spasi',
72
+ 'Format' => 'Format',
73
+ 'Data' => 'Podaci',
74
+
75
+ 'Database' => 'Baza podataka',
76
+ 'database' => 'baza podataka',
77
+ 'Use' => 'Koristi',
78
+ 'Select database' => 'Izaberite bazu',
79
+ 'Invalid database.' => 'Neispravna baza podataka.',
80
+ 'Create new database' => 'Napravi novu bazu podataka',
81
+ 'Database has been dropped.' => 'Baza podataka je izbrisana.',
82
+ 'Databases have been dropped.' => 'Baze podataka su izbrisane.',
83
+ 'Database has been created.' => 'Baza podataka je spašena.',
84
+ 'Database has been renamed.' => 'Baza podataka je preimenovana.',
85
+ 'Database has been altered.' => 'Baza podataka je izmijenjena.',
86
+ 'Alter database' => 'Ažuriraj bazu podataka',
87
+ 'Create database' => 'Formiraj bazu podataka',
88
+ 'Database schema' => 'Šema baze podataka',
89
+
90
+ // link to current database schema layout
91
+ 'Permanent link' => 'Trajna veza',
92
+
93
+ // thousands separator - must contain single byte
94
+ ',' => ',',
95
+ '0123456789' => '0123456789',
96
+ 'Engine' => 'Stroj',
97
+ 'Collation' => 'Sravnjivanje',
98
+ 'Data Length' => 'Dužina podataka',
99
+ 'Index Length' => 'Dužina indeksa',
100
+ 'Data Free' => 'Slobodno podataka',
101
+ 'Rows' => 'Redova',
102
+ '%d in total' => 'ukupno %d',
103
+ 'Analyze' => 'Analiziraj',
104
+ 'Optimize' => 'Optimizuj',
105
+ 'Check' => 'Provjeri',
106
+ 'Repair' => 'Popravi',
107
+ 'Truncate' => 'Isprazni',
108
+ 'Tables have been truncated.' => 'Tabele su ispražnjene.',
109
+ 'Move to other database' => 'Premijesti u drugu bazu podataka',
110
+ 'Move' => 'Premijesti',
111
+ 'Tables have been moved.' => 'Tabele su premješćene.',
112
+ 'Copy' => 'Umnoži',
113
+ 'Tables have been copied.' => 'Tabele su umnožene.',
114
+
115
+ 'Routines' => 'Rutine',
116
+ 'Routine has been called, %d row(s) affected.' => array('Pozvana je rutina, %d red je ažuriran.', 'Pozvana je rutina, %d reda su ažurirani.', 'Pozvana je rutina, %d redova je ažurirano.'),
117
+ 'Call' => 'Pozovi',
118
+ 'Parameter name' => 'Naziv parametra',
119
+ 'Create procedure' => 'Formiraj proceduru',
120
+ 'Create function' => 'Formiraj funkciju',
121
+ 'Routine has been dropped.' => 'Rutina je izbrisana.',
122
+ 'Routine has been altered.' => 'Rutina je izmijenjena.',
123
+ 'Routine has been created.' => 'Rutina je spašena.',
124
+ 'Alter function' => 'Ažuriraj funkciju',
125
+ 'Alter procedure' => 'Ažuriraj proceduru',
126
+ 'Return type' => 'Povratni tip',
127
+
128
+ 'Events' => 'Događaji',
129
+ 'Event has been dropped.' => 'Događaj je izbrisan.',
130
+ 'Event has been altered.' => 'Događaj je izmijenjen.',
131
+ 'Event has been created.' => 'Događaj je spašen.',
132
+ 'Alter event' => 'Ažuriraj događaj',
133
+ 'Create event' => 'Napravi događaj',
134
+ 'At given time' => 'U zadato vrijeme',
135
+ 'Every' => 'Svaki',
136
+ 'Schedule' => 'Raspored',
137
+ 'Start' => 'Početak',
138
+ 'End' => 'Kraj',
139
+ 'On completion preserve' => 'Zadrži po završetku',
140
+
141
+ 'Tables' => 'Tabele',
142
+ 'Tables and views' => 'Tabele i pogledi',
143
+ 'Table' => 'Tabela',
144
+ 'No tables.' => 'Bez tabela.',
145
+ 'Alter table' => 'Ažuriraj tabelu',
146
+ 'Create table' => 'Napravi tabelu',
147
+ 'Table has been dropped.' => 'Tabela je izbrisana.',
148
+ 'Tables have been dropped.' => 'Tabele su izbrisane.',
149
+ 'Tables have been optimized.' => 'Tabele su optimizovane.',
150
+ 'Table has been altered.' => 'Tabela je izmijenjena.',
151
+ 'Table has been created.' => 'Tabela je spašena.',
152
+ 'Table name' => 'Naziv tabele',
153
+ 'Show structure' => 'Prikaži strukturu',
154
+ 'engine' => 'stroj',
155
+ 'collation' => 'Sravnjivanje',
156
+ 'Column name' => 'Naziv kolumne',
157
+ 'Type' => 'Tip',
158
+ 'Length' => 'Dužina',
159
+ 'Auto Increment' => 'Auto-priraštaj',
160
+ 'Options' => 'Opcije',
161
+ 'Comment' => 'Komentar',
162
+ 'Default values' => 'Podrazumijevane vrijednosti',
163
+ 'Drop' => 'Izbriši',
164
+ 'Are you sure?' => 'Da li ste sigurni?',
165
+ 'Move up' => 'Pomijeri na gore',
166
+ 'Move down' => 'Pomijeri na dole',
167
+ 'Remove' => 'Ukloni',
168
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Premašen je maksimalni broj dozvoljenih polja. Molim uvećajte %s.',
169
+
170
+ 'Partition by' => 'Podijeli po',
171
+ 'Partitions' => 'Podijele',
172
+ 'Partition name' => 'Ime podijele',
173
+ 'Values' => 'Vrijednosti',
174
+
175
+ 'View' => 'Pogled',
176
+ 'View has been dropped.' => 'Pogled je izbrisan.',
177
+ 'View has been altered.' => 'Pogled je izmijenjen.',
178
+ 'View has been created.' => 'Pogled je spašen.',
179
+ 'Alter view' => 'Ažuriraj pogled',
180
+ 'Create view' => 'Napravi pogled',
181
+
182
+ 'Indexes' => 'Indeksi',
183
+ 'Indexes have been altered.' => 'Indeksi su izmijenjeni.',
184
+ 'Alter indexes' => 'Ažuriraj indekse',
185
+ 'Add next' => 'Dodaj slijedeći',
186
+ 'Index Type' => 'Tip indeksa',
187
+ 'Column (length)' => 'kolumna (dužina)',
188
+
189
+ 'Foreign keys' => 'Strani ključevi',
190
+ 'Foreign key' => 'Strani ključ',
191
+ 'Foreign key has been dropped.' => 'Strani ključ je izbrisan.',
192
+ 'Foreign key has been altered.' => 'Strani ključ je izmijenjen.',
193
+ 'Foreign key has been created.' => 'Strani ključ je spašen.',
194
+ 'Target table' => 'Ciljna tabela',
195
+ 'Change' => 'izmijeni',
196
+ 'Source' => 'Izvor',
197
+ 'Target' => 'Cilj',
198
+ 'Add column' => 'Dodaj kolumnu',
199
+ 'Alter' => 'Ažuriraj',
200
+ 'Add foreign key' => 'Dodaj strani ključ',
201
+ 'ON DELETE' => 'ON DELETE (prilikom brisanja)',
202
+ 'ON UPDATE' => 'ON UPDATE (prilikom osvežavanja)',
203
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Izvorne i ciljne kolumne moraju biti istog tipa, ciljna kolumna mora biti indeksirana i izvorna tabela mora sadržati podatke iz ciljne.',
204
+
205
+ 'Triggers' => 'Okidači',
206
+ 'Add trigger' => 'Dodaj okidač',
207
+ 'Trigger has been dropped.' => 'Okidač je izbrisan.',
208
+ 'Trigger has been altered.' => 'Okidač je izmijenjen.',
209
+ 'Trigger has been created.' => 'Okidač je spašen.',
210
+ 'Alter trigger' => 'Ažuriraj okidač',
211
+ 'Create trigger' => 'Formiraj okidač',
212
+ 'Time' => 'Vrijeme',
213
+ 'Event' => 'Događaj',
214
+ 'Name' => 'Ime',
215
+
216
+ 'select' => 'izaberi',
217
+ 'Select' => 'Izaberi',
218
+ 'Selected' => 'Izabrano',
219
+ 'Select data' => 'Izaberi podatke',
220
+ 'Functions' => 'Funkcije',
221
+ 'Aggregation' => 'Sakupljanje',
222
+ 'Search' => 'Pretraga',
223
+ 'anywhere' => 'bilo gdje',
224
+ 'Search data in tables' => 'Pretraži podatke u tabelama',
225
+ 'Sort' => 'Poređaj',
226
+ 'descending' => 'opadajuće',
227
+ 'Limit' => 'Granica',
228
+ 'Text length' => 'Dužina teksta',
229
+ 'Action' => 'Akcija',
230
+ 'Full table scan' => 'Skreniranje kompletne tabele',
231
+ 'Unable to select the table' => 'Ne mogu da izaberem tabelu',
232
+ 'No rows.' => 'Bez redova.',
233
+ '%d row(s)' => array('%d red', '%d reda', '%d redova'),
234
+ 'Page' => 'Strana',
235
+ 'last' => 'poslijednja',
236
+ 'Loading' => 'Učitavam',
237
+ 'Load more data' => 'Učitavam još podataka',
238
+ 'whole result' => 'ceo rezultat',
239
+ '%d byte(s)' => array('%d bajt', '%d bajta', '%d bajtova'),
240
+
241
+ 'Import' => 'Uvoz',
242
+ '%d row(s) have been imported.' => array('%d red je uvežen.', '%d reda su uvežena.', '%d redova je uveženo.'),
243
+
244
+ // in-place editing in select
245
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+klik na vrijednost za izmijenu.',
246
+ 'Use edit link to modify this value.' => 'Koristi vezu za izmijenu ove vrijednosti.',
247
+
248
+ // %s can contain auto-increment value
249
+ 'Item%s has been inserted.' => 'Stavka %s je spašena.',
250
+ 'Item has been deleted.' => 'Stavka je izbrisana.',
251
+ 'Item has been updated.' => 'Stavka je izmijenjena.',
252
+ '%d item(s) have been affected.' => array('%d stavka je ažurirana.', '%d stavke su ažurirane.', '%d stavki je ažurirano.'),
253
+ 'New item' => 'Nova stavka',
254
+ 'original' => 'original',
255
+ // label for value '' in enum data type
256
+ 'empty' => 'prazno',
257
+ 'edit' => 'izmijeni',
258
+ 'Edit' => 'Izmijeni',
259
+ 'Insert' => 'Umetni',
260
+ 'Save' => 'Sačuvaj',
261
+ 'Save and continue edit' => 'Sačuvaj i nastavi uređenje',
262
+ 'Save and insert next' => 'Sačuvaj i umijetni slijedeće',
263
+ 'Clone' => 'Dupliraj',
264
+ 'Delete' => 'Izbriši',
265
+ 'Modify' => 'Izmjene',
266
+
267
+ 'E-mail' => 'El. pošta',
268
+ 'From' => 'Od',
269
+ 'Subject' => 'Naslov',
270
+ 'Attachments' => 'Prilozi',
271
+ 'Send' => 'Pošalji',
272
+ '%d e-mail(s) have been sent.' => array('%d poruka el. pošte je poslata.', '%d poruke el. pošte su poslate.', '%d poruka el. pošte je poslato.'),
273
+
274
+ // data type descriptions
275
+ 'Numbers' => 'Broj',
276
+ 'Date and time' => 'Datum i vrijeme',
277
+ 'Strings' => 'Tekst',
278
+ 'Binary' => 'Binarno',
279
+ 'Lists' => 'Liste',
280
+ 'Network' => 'Mreža',
281
+ 'Geometry' => 'Geometrija',
282
+ 'Relations' => 'Odnosi',
283
+
284
+ 'Editor' => 'Uređivač',
285
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
286
+ '$1-$3-$5' => '$5.$3.$1.',
287
+ // hint for date format - use language equivalents for day, month and year shortcuts
288
+ '[yyyy]-mm-dd' => 'dd.mm.[yyyy].',
289
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
290
+ 'HH:MM:SS' => 'HH:MM:SS',
291
+ 'now' => 'sad',
292
+ 'yes' => 'da',
293
+ 'no' => 'ne',
294
+
295
+ // general SQLite error in create, drop or rename database
296
+ 'File exists.' => 'Datoteka već postoji.',
297
+ 'Please use one of the extensions %s.' => 'Molim koristite jedan od nastavaka %s.',
298
+
299
+ // PostgreSQL and MS SQL schema support
300
+ 'Alter schema' => 'Ažuriraj šemu',
301
+ 'Create schema' => 'Formiraj šemu',
302
+ 'Schema has been dropped.' => 'Šema je izbrisana.',
303
+ 'Schema has been created.' => 'Šema je spašena.',
304
+ 'Schema has been altered.' => 'Šema je izmijenjena.',
305
+ 'Schema' => 'Šema',
306
+ 'Invalid schema.' => 'Šema nije ispravna.',
307
+
308
+ // PostgreSQL sequences support
309
+ 'Sequences' => 'Nizovi',
310
+ 'Create sequence' => 'Napravi niz',
311
+ 'Sequence has been dropped.' => 'Niz je izbrisan.',
312
+ 'Sequence has been created.' => 'Niz je formiran.',
313
+ 'Sequence has been altered.' => 'Niz je izmijenjen.',
314
+ 'Alter sequence' => 'Ažuriraj niz',
315
+
316
+ // PostgreSQL user types support
317
+ 'User types' => 'Korisnički tipovi',
318
+ 'Create type' => 'Definiši tip',
319
+ 'Type has been dropped.' => 'Tip je izbrisan.',
320
+ 'Type has been created.' => 'tip je spašen.',
321
+ 'Alter type' => 'Ažuriraj tip',
322
+ );
adminer/adminer/adminer/lang/ca.inc.php ADDED
@@ -0,0 +1,269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Inicia la sessió',
4
+ 'Logout successful.' => 'Desconnexió correcta.',
5
+ 'Invalid credentials.' => 'Credencials invàlids.',
6
+ 'Server' => 'Servidor',
7
+ 'Username' => 'Nom d\'usuari',
8
+ 'Password' => 'Contrasenya',
9
+ 'Select database' => 'Selecciona base de dades',
10
+ 'Invalid database.' => 'Base de dades invàlida.',
11
+ 'Create new database' => 'Crea una nova base de dades',
12
+ 'Table has been dropped.' => 'S\'ha suprimit la taula.',
13
+ 'Table has been altered.' => 'S\'ha modificat la taula.',
14
+ 'Table has been created.' => 'S\'ha creat la taula.',
15
+ 'Alter table' => 'Modifica la taula',
16
+ 'Create table' => 'Crea una taula',
17
+ 'Table name' => 'Nom de la taula',
18
+ 'engine' => 'motor',
19
+ 'collation' => 'compaginació',
20
+ 'Column name' => 'Nom de la columna',
21
+ 'Type' => 'Tipus',
22
+ 'Length' => 'Llargada',
23
+ 'Auto Increment' => 'Increment automàtic',
24
+ 'Options' => 'Opcions',
25
+ 'Save' => 'Desa',
26
+ 'Drop' => 'Suprimeix',
27
+ 'Database has been dropped.' => 'S\'ha suprimit la base de dades.',
28
+ 'Database has been created.' => 'S\'ha creat la base de dades.',
29
+ 'Database has been renamed.' => 'S\'ha canviat el nom de la base de dades.',
30
+ 'Database has been altered.' => 'S\'ha modificat la base de dades.',
31
+ 'Alter database' => 'Modifica la base de dades',
32
+ 'Create database' => 'Crea una base de dades',
33
+ 'SQL command' => 'Ordre SQL',
34
+ 'Logout' => 'Desconnecta',
35
+ 'database' => 'base de dades',
36
+ 'Use' => 'Utilitza',
37
+ 'No tables.' => 'No hi ha cap taula.',
38
+ 'select' => 'registres',
39
+ 'Item has been deleted.' => 'S\'ha suprmit l\'element.',
40
+ 'Item has been updated.' => 'S\'ha actualitzat l\'element.',
41
+ 'Item%s has been inserted.' => 'S\'ha insertat l\'element%s.',
42
+ 'Edit' => 'Edita',
43
+ 'Insert' => 'Insereix',
44
+ 'Save and insert next' => 'Desa i insereix el següent',
45
+ 'Delete' => 'Suprimeix',
46
+ 'Database' => 'Base de dades',
47
+ 'Routines' => 'Rutines',
48
+ 'Indexes have been altered.' => 'S\'han modificat els índexs.',
49
+ 'Indexes' => 'Índexs',
50
+ 'Alter indexes' => 'Modifica els índexs',
51
+ 'Add next' => 'Afegeix el següent',
52
+ 'Language' => 'Idioma',
53
+ 'Select' => 'Selecciona',
54
+ 'New item' => 'Nou element',
55
+ 'Search' => 'Cerca',
56
+ 'Sort' => 'Ordena',
57
+ 'descending' => 'descendent',
58
+ 'Limit' => 'Límit',
59
+ 'No rows.' => 'No hi ha cap registre.',
60
+ 'Action' => 'Acció',
61
+ 'edit' => 'edita',
62
+ 'Page' => 'Plana',
63
+ 'Query executed OK, %d row(s) affected.' => array('Consulta executada correctament, %d registre modificat.', 'Consulta executada correctament, %d registres modificats.'),
64
+ 'Error in query' => 'Error en la consulta',
65
+ 'Execute' => 'Executa',
66
+ 'Table' => 'Taula',
67
+ 'Foreign keys' => 'Claus foranes',
68
+ 'Triggers' => 'Activadors',
69
+ 'View' => 'Vista',
70
+ 'Unable to select the table' => 'Impossible seleccionar la taula',
71
+ 'Invalid CSRF token. Send the form again.' => 'Token CSRF invàlid. Torna a enviar el formulari.',
72
+ 'Comment' => 'Comentari',
73
+ 'Default values' => 'Valors per defecte',
74
+ '%d byte(s)' => array('%d byte', '%d bytes'),
75
+ 'No commands to execute.' => 'Cap comanda per executar.',
76
+ 'Unable to upload a file.' => 'Impossible adjuntar el fitxer.',
77
+ 'File upload' => 'Adjunta un fitxer',
78
+ 'File uploads are disabled.' => 'L\'ddjunció de fitxers està desactivada.',
79
+ 'Routine has been called, %d row(s) affected.' => array('S\'ha cridat la rutina, %d registre modificat.', 'S\'ha cridat la rutina, %d registres modificats.'),
80
+ 'Call' => 'Crida',
81
+ 'No extension' => 'Cap extensió',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'No hi ha cap de les extensions PHP soporatades (%s) disponible.',
83
+ 'Session support must be enabled.' => 'Cal que estigui permès l\'us de sessions.',
84
+ 'Session expired, please login again.' => 'La sessió ha expirat, torna a iniciar-ne una.',
85
+ 'Text length' => 'Longitud del text',
86
+ 'Foreign key has been dropped.' => 'S\'ha suprimit la clau forana.',
87
+ 'Foreign key has been altered.' => 'S\'ha modificat la clau forana.',
88
+ 'Foreign key has been created.' => 'S\'ha creat la clau forana.',
89
+ 'Foreign key' => 'Clau forana',
90
+ 'Target table' => 'Taula de destí',
91
+ 'Change' => 'Canvi',
92
+ 'Source' => 'Font',
93
+ 'Target' => 'Destí',
94
+ 'Add column' => 'Afegeix una columna',
95
+ 'Alter' => 'Modifica',
96
+ 'Add foreign key' => 'Afegeix una clau forana',
97
+ 'ON DELETE' => 'ON DELETE',
98
+ 'ON UPDATE' => 'ON UPDATE',
99
+ 'Index Type' => 'Tipus d\'índex',
100
+ 'Column (length)' => 'Columna (longitud)',
101
+ 'View has been dropped.' => 'S\'ha suprimit la vista.',
102
+ 'View has been altered.' => 'S\'ha modificat la vista.',
103
+ 'View has been created.' => 'S\'ha creat la vista.',
104
+ 'Alter view' => 'Modifica la vista',
105
+ 'Create view' => 'Crea una vista',
106
+ 'Name' => 'Nom',
107
+ 'Process list' => 'Llista de processos',
108
+ '%d process(es) have been killed.' => array('S\'ha aturat %d procés.', 'S\'han aturat %d processos.'),
109
+ 'Kill' => 'Atura',
110
+ 'Parameter name' => 'Nom del paràmetre',
111
+ 'Database schema' => 'Esquema de la base de dades',
112
+ 'Create procedure' => 'Crea un procediment',
113
+ 'Create function' => 'Crea una funció',
114
+ 'Routine has been dropped.' => 'S\'ha suprimit la rutina.',
115
+ 'Routine has been altered.' => 'S\'ha modificat la rutina.',
116
+ 'Routine has been created.' => 'S\'ha creat la rutina.',
117
+ 'Alter function' => 'Modifica la funció',
118
+ 'Alter procedure' => 'Modifica el procediment',
119
+ 'Return type' => 'Tipus retornat',
120
+ 'Add trigger' => 'Afegeix un activador',
121
+ 'Trigger has been dropped.' => 'S\'ha suprimit l\'activador.',
122
+ 'Trigger has been altered.' => 'S\'ha modificat l\'activador.',
123
+ 'Trigger has been created.' => 'S\'ha creat l\'activador.',
124
+ 'Alter trigger' => 'Modifica l\'activador',
125
+ 'Create trigger' => 'Crea un activador',
126
+ 'Time' => 'Temps',
127
+ 'Event' => 'Event',
128
+ '%s version: %s through PHP extension %s' => 'Versió %s: %s amb l\'extensió de PHP %s',
129
+ '%d row(s)' => array('%d registre', '%d registres'),
130
+ 'Remove' => 'Suprimeix',
131
+ 'Are you sure?' => 'Estàs segur?',
132
+ 'Privileges' => 'Privilegis',
133
+ 'Create user' => 'Crea un usuari',
134
+ 'User has been dropped.' => 'S\'ha suprimit l\'usuari.',
135
+ 'User has been altered.' => 'S\'ha modificat l\'usuari.',
136
+ 'User has been created.' => 'S\'ha creat l\'usuari.',
137
+ 'Hashed' => 'Hashed',
138
+ 'Column' => 'Columna',
139
+ 'Routine' => 'Rutina',
140
+ 'Grant' => 'Grant',
141
+ 'Revoke' => 'Revoke',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Les dades POST són massa grans. Redueix les dades o incrementa la directiva de configuració %s.',
143
+ 'Logged as: %s' => 'Connectat com: %s',
144
+ 'Move up' => 'Mou a dalt',
145
+ 'Move down' => 'Mou a baix',
146
+ 'Functions' => 'Funcions',
147
+ 'Aggregation' => 'Agregació',
148
+ 'Export' => 'Exporta',
149
+ 'Output' => 'Sortida',
150
+ 'open' => 'obre',
151
+ 'save' => 'desa',
152
+ 'Format' => 'Format',
153
+ 'Tables' => 'Taules',
154
+ 'Data' => 'Dades',
155
+ 'Event has been dropped.' => 'S\'ha suprimit l\'event.',
156
+ 'Event has been altered.' => 'S\'ha modificat l\'event.',
157
+ 'Event has been created.' => 'S\'ha creat l\'event.',
158
+ 'Alter event' => 'Modifica l\'event',
159
+ 'Create event' => 'Crea un event',
160
+ 'At given time' => 'A un moment donat',
161
+ 'Every' => 'Cada',
162
+ 'Events' => 'Events',
163
+ 'Schedule' => 'Horari',
164
+ 'Start' => 'Comença',
165
+ 'End' => 'Acaba',
166
+ 'Status' => 'Estat',
167
+ 'On completion preserve' => 'Conservar en completar',
168
+ 'Tables and views' => 'Taules i vistes',
169
+ 'Data Length' => 'Longitud de les dades',
170
+ 'Index Length' => 'Longitud de l\'índex',
171
+ 'Data Free' => 'Espai lliure',
172
+ 'Collation' => 'Compaginació',
173
+ 'Analyze' => 'Analitza',
174
+ 'Optimize' => 'Optimitza',
175
+ 'Check' => 'Verifica',
176
+ 'Repair' => 'Repara',
177
+ 'Truncate' => 'Escapça',
178
+ 'Tables have been truncated.' => 'S\'han escapçat les taules.',
179
+ 'Rows' => 'Files',
180
+ ',' => ',',
181
+ '0123456789' => '0123456789',
182
+ 'Tables have been moved.' => 'S\'han desplaçat les taules.',
183
+ 'Move to other database' => 'Desplaça a una altra base de dades',
184
+ 'Move' => 'Desplaça',
185
+ 'Engine' => 'Motor',
186
+ 'Save and continue edit' => 'Desa i segueix editant',
187
+ 'original' => 'original',
188
+ '%d item(s) have been affected.' => array('S\'ha modificat %d element.', 'S\'han modificat %d elements.'),
189
+ 'whole result' => 'tots els resultats',
190
+ 'Tables have been dropped.' => 'S\'han suprimit les taules.',
191
+ 'Clone' => 'Clona',
192
+ 'Partition by' => 'Fes particions segons',
193
+ 'Partitions' => 'Particions',
194
+ 'Partition name' => 'Nom de la partició',
195
+ 'Values' => 'Valors',
196
+ '%d row(s) have been imported.' => array('S\'ha importat %d registre.', 'S\'han importat %d registres.'),
197
+ 'Import' => 'Importa',
198
+ 'Show structure' => 'Mostra l\'estructura',
199
+ 'Select data' => 'Selecciona dades',
200
+ 'Stop on error' => 'Atura en trobar un error',
201
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'S\'ha assolit el nombre màxim de camps. Incrementa %s.',
202
+ 'anywhere' => 'a qualsevol lloc',
203
+ '%.3f s' => '%.3f s',
204
+ '$1-$3-$5' => '$5/$3/$1',
205
+ '[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
206
+ 'History' => 'Història',
207
+ 'Variables' => 'Variables',
208
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Les columnes origen i destí han de ser del mateix tipus, la columna destí ha d\'estar indexada i les dades referenciades han d\'existir.',
209
+ 'E-mail' => 'Correu electrònic',
210
+ 'From' => 'De',
211
+ 'Subject' => 'Assumpte',
212
+ 'Send' => 'Envia',
213
+ '%d e-mail(s) have been sent.' => array('S\'ha enviat %d correu electrònic.', 'S\'han enviat %d correus electrònics.'),
214
+ 'Run file' => 'Executa el fitxer',
215
+ 'Numbers' => 'Nombres',
216
+ 'Date and time' => 'Data i hora',
217
+ 'Strings' => 'Cadenes',
218
+ 'Binary' => 'Binari',
219
+ 'Lists' => 'Llistes',
220
+ 'Relations' => 'Relacions',
221
+ 'Maximum allowed file size is %sB.' => 'La mida màxima permesa del fitxer és de %sB.',
222
+ 'Clear' => 'Suprimeix',
223
+ 'Editor' => 'Editor',
224
+ 'Webserver file %s' => 'Fitxer %s del servidor web',
225
+ 'File does not exist.' => 'El fitxer no existeix.',
226
+ 'Permanent login' => 'Sessió permanent',
227
+ '%d in total' => '%d en total',
228
+ 'Attachments' => 'Adjuncions',
229
+ 'System' => 'Sistema',
230
+ 'last' => 'darrera',
231
+ 'Network' => 'Xarxa',
232
+ 'Geometry' => 'Geometria',
233
+ 'Databases have been dropped.' => 'S\'han suprimit les bases de dades.',
234
+ 'File exists.' => 'El fitxer ja existeix.',
235
+ 'Ctrl+click on a value to modify it.' => 'Fes un Ctrl+clic a un valor per modificar-lo.',
236
+ 'Use edit link to modify this value.' => 'Utilitza l\'enllaç d\'edició per modificar aquest valor.',
237
+ 'Alter schema' => 'Modifica l\'esquema',
238
+ 'Create schema' => 'Crea un esquema',
239
+ 'Schema has been dropped.' => 'S\'ha suprimit l\'esquema.',
240
+ 'Schema has been created.' => 'S\'ha creat l\'esquema.',
241
+ 'Schema has been altered.' => 'S\'ha modificat l\'esquema.',
242
+ 'Schema' => 'Esquema',
243
+ 'Sequences' => 'Seqüències',
244
+ 'Create sequence' => 'Crea una seqüència',
245
+ 'Sequence has been dropped.' => 'S\'ha suprimit la seqüència.',
246
+ 'Sequence has been created.' => 'S\'ha creat la seqüència.',
247
+ 'Sequence has been altered.' => 'S\'ha modificat la seqüència.',
248
+ 'Alter sequence' => 'Modifica la seqüència',
249
+ 'User types' => 'Tipus de l\'usuari',
250
+ 'Create type' => 'Crea un tipus',
251
+ 'Type has been dropped.' => 'S\'ha suprimit el tipus.',
252
+ 'Type has been created.' => 'S\'ha creat el tipus.',
253
+ 'Alter type' => 'Modifica el tipus',
254
+ 'Search data in tables' => 'Cerca dades en les taules',
255
+ 'From server' => 'En el servidor',
256
+ 'empty' => 'buit',
257
+ 'now' => 'ara',
258
+ '%d query(s) executed OK.' => array('%d consulta executada correctament.', '%d consultes executades correctament.'),
259
+ 'Show only errors' => 'Mostra només els errors',
260
+ 'Refresh' => 'Refresca',
261
+ 'Invalid schema.' => 'Esquema invàlid.',
262
+ 'Please use one of the extensions %s.' => 'Si us plau, utilitza una de les extensions %s.',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'S\'han copiat les taules.',
265
+ 'Copy' => 'Còpia',
266
+ 'Permanent link' => 'Enllaç permanent',
267
+ 'Edit all' => 'Edita-ho tot',
268
+ 'HH:MM:SS' => 'HH:MM:SS',
269
+ );
adminer/adminer/adminer/lang/cs.inc.php ADDED
@@ -0,0 +1,340 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Systém',
5
+ 'Server' => 'Server',
6
+ 'Username' => 'Uživatel',
7
+ 'Password' => 'Heslo',
8
+ 'Permanent login' => 'Trvalé přihlášení',
9
+ 'Login' => 'Přihlásit se',
10
+ 'Logout' => 'Odhlásit',
11
+ 'Logged as: %s' => 'Přihlášen jako: %s',
12
+ 'Logout successful.' => 'Odhlášení proběhlo v pořádku.',
13
+ 'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
14
+ 'Implement %s method to use SQLite.' => 'Pro přihlášení k SQLite implementujte metodu %s.',
15
+ '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.'),
16
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Platnost hlavního hesla vypršela. <a href="https://www.adminer.org/cs/extension/" target="_blank">Implementujte</a> metodu %s, aby platilo stále.',
17
+ 'Language' => 'Jazyk',
18
+ 'Invalid CSRF token. Send the form again.' => 'Neplatný token CSRF. Odešlete formulář znovu.',
19
+ 'If you did not send this request from Adminer then close this page.' => 'Pokud jste tento požadavek neposlali z Adminera, tak tuto stránku zavřete.',
20
+ 'No extension' => 'Žádné rozšíření',
21
+ 'None of the supported PHP extensions (%s) are available.' => 'Není dostupné žádné z podporovaných PHP rozšíření (%s).',
22
+ 'Session support must be enabled.' => 'Session proměnné musí být povolené.',
23
+ 'Session expired, please login again.' => 'Session vypršela, přihlašte se prosím znovu.',
24
+ '%s version: %s through PHP extension %s' => 'Verze %s: %s přes PHP rozšíření %s',
25
+ 'Refresh' => 'Obnovit',
26
+
27
+ // text direction - 'ltr' or 'rtl'
28
+ 'ltr' => 'ltr',
29
+
30
+ 'Privileges' => 'Oprávnění',
31
+ 'Create user' => 'Vytvořit uživatele',
32
+ 'User has been dropped.' => 'Uživatel byl odstraněn.',
33
+ 'User has been altered.' => 'Uživatel byl změněn.',
34
+ 'User has been created.' => 'Uživatel byl vytvořen.',
35
+ 'Hashed' => 'Zahašované',
36
+ 'Column' => 'Sloupec',
37
+ 'Routine' => 'Procedura',
38
+ 'Grant' => 'Povolit',
39
+ 'Revoke' => 'Zakázat',
40
+
41
+ 'Process list' => 'Seznam procesů',
42
+ '%d process(es) have been killed.' => array('Byl ukončen %d proces.', 'Byly ukončeny %d procesy.', 'Bylo ukončeno %d procesů.'),
43
+ 'Kill' => 'Ukončit',
44
+
45
+ 'Variables' => 'Proměnné',
46
+ 'Status' => 'Stav',
47
+
48
+ 'SQL command' => 'SQL příkaz',
49
+ '%d query(s) executed OK.' => array('%d příkaz proběhl v pořádku.', '%d příkazy proběhly v pořádku.', '%d příkazů proběhlo v pořádku.'),
50
+ 'Query executed OK, %d row(s) affected.' => array('Příkaz proběhl v pořádku, byl změněn %d záznam.', 'Příkaz proběhl v pořádku, byly změněny %d záznamy.', 'Příkaz proběhl v pořádku, bylo změněno %d záznamů.'),
51
+ 'No commands to execute.' => 'Žádné příkazy k vykonání.',
52
+ 'Error in query' => 'Chyba v dotazu',
53
+ 'ATTACH queries are not supported.' => 'Dotazy ATTACH nejsou podporované.',
54
+ 'Execute' => 'Provést',
55
+ 'Stop on error' => 'Zastavit při chybě',
56
+ 'Show only errors' => 'Zobrazit pouze chyby',
57
+ // sprintf() format for time of the command
58
+ '%.3f s' => '%.3f s',
59
+ 'History' => 'Historie',
60
+ 'Clear' => 'Vyčistit',
61
+ 'Edit all' => 'Upravit vše',
62
+
63
+ 'File upload' => 'Nahrání souboru',
64
+ 'From server' => 'Ze serveru',
65
+ 'Webserver file %s' => 'Soubor %s na webovém serveru',
66
+ 'Run file' => 'Spustit soubor',
67
+ 'File does not exist.' => 'Soubor neexistuje.',
68
+ 'File uploads are disabled.' => 'Nahrávání souborů není povoleno.',
69
+ 'Unable to upload a file.' => 'Nepodařilo se nahrát soubor.',
70
+ 'Maximum allowed file size is %sB.' => 'Maximální povolená velikost souboru je %sB.',
71
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Příliš velká POST data. Zmenšete data nebo zvyšte hodnotu konfigurační direktivy %s.',
72
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Velký SQL soubor můžete nahrát pomocí FTP a importovat ho ze serveru.',
73
+ 'You are offline.' => 'Jste offline.',
74
+
75
+ 'Export' => 'Export',
76
+ 'Output' => 'Výstup',
77
+ 'open' => 'otevřít',
78
+ 'save' => 'uložit',
79
+ 'Format' => 'Formát',
80
+ 'Data' => 'Data',
81
+
82
+ 'Database' => 'Databáze',
83
+ 'database' => 'databáze',
84
+ 'Use' => 'Vybrat',
85
+ 'Select database' => 'Vybrat databázi',
86
+ 'Invalid database.' => 'Nesprávná databáze.',
87
+ 'Create new database' => 'Vytvořit novou databázi',
88
+ 'Database has been dropped.' => 'Databáze byla odstraněna.',
89
+ 'Databases have been dropped.' => 'Databáze byly odstraněny.',
90
+ 'Database has been created.' => 'Databáze byla vytvořena.',
91
+ 'Database has been renamed.' => 'Databáze byla přejmenována.',
92
+ 'Database has been altered.' => 'Databáze byla změněna.',
93
+ 'Alter database' => 'Pozměnit databázi',
94
+ 'Create database' => 'Vytvořit databázi',
95
+ 'Database schema' => 'Schéma databáze',
96
+
97
+ // link to current database schema layout
98
+ 'Permanent link' => 'Trvalý odkaz',
99
+
100
+ // thousands separator - must contain single byte
101
+ ',' => ' ',
102
+ '0123456789' => '0123456789',
103
+ 'Engine' => 'Úložiště',
104
+ 'Collation' => 'Porovnávání',
105
+ 'Data Length' => 'Velikost dat',
106
+ 'Index Length' => 'Velikost indexů',
107
+ 'Data Free' => 'Volné místo',
108
+ 'Rows' => 'Řádků',
109
+ '%d in total' => '%d celkem',
110
+ 'Analyze' => 'Analyzovat',
111
+ 'Optimize' => 'Optimalizovat',
112
+ 'Vacuum' => 'Vyčistit',
113
+ 'Check' => 'Zkontrolovat',
114
+ 'Repair' => 'Opravit',
115
+ 'Truncate' => 'Vyprázdnit',
116
+ 'Tables have been truncated.' => 'Tabulky byly vyprázdněny.',
117
+ 'Move to other database' => 'Přesunout do jiné databáze',
118
+ 'Move' => 'Přesunout',
119
+ 'Tables have been moved.' => 'Tabulky byly přesunuty.',
120
+ 'Copy' => 'Zkopírovat',
121
+ 'Tables have been copied.' => 'Tabulky byly zkopírovány.',
122
+
123
+ 'Routines' => 'Procedury a funkce',
124
+ 'Routine has been called, %d row(s) affected.' => array('Procedura byla zavolána, byl změněn %d záznam.', 'Procedura byla zavolána, byly změněny %d záznamy.', 'Procedura byla zavolána, bylo změněno %d záznamů.'),
125
+ 'Call' => 'Zavolat',
126
+ 'Parameter name' => 'Název parametru',
127
+ 'Create procedure' => 'Vytvořit proceduru',
128
+ 'Create function' => 'Vytvořit funkci',
129
+ 'Routine has been dropped.' => 'Procedura byla odstraněna.',
130
+ 'Routine has been altered.' => 'Procedura byla změněna.',
131
+ 'Routine has been created.' => 'Procedura byla vytvořena.',
132
+ 'Alter function' => 'Změnit funkci',
133
+ 'Alter procedure' => 'Změnit proceduru',
134
+ 'Return type' => 'Návratový typ',
135
+
136
+ 'Events' => 'Události',
137
+ 'Event has been dropped.' => 'Událost byla odstraněna.',
138
+ 'Event has been altered.' => 'Událost byla změněna.',
139
+ 'Event has been created.' => 'Událost byla vytvořena.',
140
+ 'Alter event' => 'Pozměnit událost',
141
+ 'Create event' => 'Vytvořit událost',
142
+ 'At given time' => 'V daný čas',
143
+ 'Every' => 'Každých',
144
+ 'Schedule' => 'Plán',
145
+ 'Start' => 'Začátek',
146
+ 'End' => 'Konec',
147
+ 'On completion preserve' => 'Po dokončení zachovat',
148
+
149
+ 'Tables' => 'Tabulky',
150
+ 'Tables and views' => 'Tabulky a pohledy',
151
+ 'Table' => 'Tabulka',
152
+ 'No tables.' => 'Žádné tabulky.',
153
+ 'Alter table' => 'Pozměnit tabulku',
154
+ 'Create table' => 'Vytvořit tabulku',
155
+ 'Table has been dropped.' => 'Tabulka byla odstraněna.',
156
+ 'Tables have been dropped.' => 'Tabulky byly odstraněny.',
157
+ 'Tables have been optimized.' => 'Tabulky byly optimalizovány.',
158
+ 'Table has been altered.' => 'Tabulka byla změněna.',
159
+ 'Table has been created.' => 'Tabulka byla vytvořena.',
160
+ 'Table name' => 'Název tabulky',
161
+ 'Show structure' => 'Zobrazit strukturu',
162
+ 'engine' => 'úložiště',
163
+ 'collation' => 'porovnávání',
164
+ 'Column name' => 'Název sloupce',
165
+ 'Type' => 'Typ',
166
+ 'Length' => 'Délka',
167
+ 'Auto Increment' => 'Auto Increment',
168
+ 'Options' => 'Volby',
169
+ 'Comment' => 'Komentář',
170
+ 'Default value' => 'Výchozí hodnota',
171
+ 'Default values' => 'Výchozí hodnoty',
172
+ 'Drop' => 'Odstranit',
173
+ 'Are you sure?' => 'Opravdu?',
174
+ 'Size' => 'Velikost',
175
+ 'Compute' => 'Spočítat',
176
+ 'Move up' => 'Přesunout nahoru',
177
+ 'Move down' => 'Přesunout dolů',
178
+ 'Remove' => 'Odebrat',
179
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Byl překročen maximální povolený počet polí. Zvyšte prosím %s.',
180
+
181
+ 'Partition by' => 'Rozdělit podle',
182
+ 'Partitions' => 'Oddíly',
183
+ 'Partition name' => 'Název oddílu',
184
+ 'Values' => 'Hodnoty',
185
+
186
+ 'View' => 'Pohled',
187
+ 'Materialized View' => 'Materializovaný pohled',
188
+ 'View has been dropped.' => 'Pohled byl odstraněn.',
189
+ 'View has been altered.' => 'Pohled byl změněn.',
190
+ 'View has been created.' => 'Pohled byl vytvořen.',
191
+ 'Alter view' => 'Pozměnit pohled',
192
+ 'Create view' => 'Vytvořit pohled',
193
+ 'Create materialized view' => 'Vytvořit materializovaný pohled',
194
+
195
+ 'Indexes' => 'Indexy',
196
+ 'Indexes have been altered.' => 'Indexy byly změněny.',
197
+ 'Alter indexes' => 'Pozměnit indexy',
198
+ 'Add next' => 'Přidat další',
199
+ 'Index Type' => 'Typ indexu',
200
+ 'Column (length)' => 'Sloupec (délka)',
201
+
202
+ 'Foreign keys' => 'Cizí klíče',
203
+ 'Foreign key' => 'Cizí klíč',
204
+ 'Foreign key has been dropped.' => 'Cizí klíč byl odstraněn.',
205
+ 'Foreign key has been altered.' => 'Cizí klíč byl změněn.',
206
+ 'Foreign key has been created.' => 'Cizí klíč byl vytvořen.',
207
+ 'Target table' => 'Cílová tabulka',
208
+ 'Change' => 'Změnit',
209
+ 'Source' => 'Zdroj',
210
+ 'Target' => 'Cíl',
211
+ 'Add column' => 'Přidat sloupec',
212
+ 'Alter' => 'Změnit',
213
+ 'Add foreign key' => 'Přidat cizí klíč',
214
+ 'ON DELETE' => 'Při smazání',
215
+ 'ON UPDATE' => 'Při změně',
216
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Zdrojové a cílové sloupce musí mít stejný datový typ, nad cílovými sloupci musí být definován index a odkazovaná data musí existovat.',
217
+
218
+ 'Triggers' => 'Triggery',
219
+ 'Add trigger' => 'Přidat trigger',
220
+ 'Trigger has been dropped.' => 'Trigger byl odstraněn.',
221
+ 'Trigger has been altered.' => 'Trigger byl změněn.',
222
+ 'Trigger has been created.' => 'Trigger byl vytvořen.',
223
+ 'Alter trigger' => 'Změnit trigger',
224
+ 'Create trigger' => 'Vytvořit trigger',
225
+ 'Time' => 'Čas',
226
+ 'Event' => 'Událost',
227
+ 'Name' => 'Název',
228
+
229
+ 'select' => 'vypsat',
230
+ 'Select' => 'Vypsat',
231
+ 'Select data' => 'Vypsat data',
232
+ 'Functions' => 'Funkce',
233
+ 'Aggregation' => 'Agregace',
234
+ 'Search' => 'Vyhledat',
235
+ 'anywhere' => 'kdekoliv',
236
+ 'Search data in tables' => 'Vyhledat data v tabulkách',
237
+ 'Sort' => 'Seřadit',
238
+ 'descending' => 'sestupně',
239
+ 'Limit' => 'Limit',
240
+ 'Limit rows' => 'Limit řádek',
241
+ 'Text length' => 'Délka textů',
242
+ 'Action' => 'Akce',
243
+ 'Full table scan' => 'Průchod celé tabulky',
244
+ 'Unable to select the table' => 'Nepodařilo se vypsat tabulku',
245
+ 'No rows.' => 'Žádné řádky.',
246
+ '%d / ' => '%d / ',
247
+ '%d row(s)' => array('%d řádek', '%d řádky', '%d řádků'),
248
+ 'Page' => 'Stránka',
249
+ 'last' => 'poslední',
250
+ 'Load more data' => 'Nahrát další data',
251
+ 'Loading' => 'Nahrává se',
252
+ 'whole result' => 'celý výsledek',
253
+ '%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtů'),
254
+
255
+ 'Import' => 'Import',
256
+ '%d row(s) have been imported.' => array('Byl importován %d záznam.', 'Byly importovány %d záznamy.', 'Bylo importováno %d záznamů.'),
257
+ 'File must be in UTF-8 encoding.' => 'Soubor musí být v kódování UTF-8.',
258
+
259
+ // in-place editing in select
260
+ 'Modify' => 'Změnit',
261
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+klikněte na políčko, které chcete změnit.',
262
+ 'Use edit link to modify this value.' => 'Ke změně této hodnoty použijte odkaz upravit.',
263
+
264
+ // %s can contain auto-increment value
265
+ 'Item%s has been inserted.' => 'Položka%s byla vložena.',
266
+ 'Item has been deleted.' => 'Položka byla smazána.',
267
+ 'Item has been updated.' => 'Položka byla aktualizována.',
268
+ '%d item(s) have been affected.' => array('Byl ovlivněn %d záznam.', 'Byly ovlivněny %d záznamy.', 'Bylo ovlivněno %d záznamů.'),
269
+ 'New item' => 'Nová položka',
270
+ 'original' => 'původní',
271
+ // label for value '' in enum data type
272
+ 'empty' => 'prázdné',
273
+ 'edit' => 'upravit',
274
+ 'Edit' => 'Upravit',
275
+ 'Insert' => 'Vložit',
276
+ 'Save' => 'Uložit',
277
+ 'Saving' => 'Ukládá se',
278
+ 'Save and continue edit' => 'Uložit a pokračovat v editaci',
279
+ 'Save and insert next' => 'Uložit a vložit další',
280
+ 'Selected' => 'Označené',
281
+ 'Clone' => 'Klonovat',
282
+ 'Delete' => 'Smazat',
283
+ 'You have no privileges to update this table.' => 'Nemáte oprávnění editovat tuto tabulku.',
284
+
285
+ 'E-mail' => 'E-mail',
286
+ 'From' => 'Odesílatel',
287
+ 'Subject' => 'Předmět',
288
+ 'Attachments' => 'Přílohy',
289
+ 'Send' => 'Odeslat',
290
+ '%d e-mail(s) have been sent.' => array('Byl odeslán %d e-mail.', 'Byly odeslány %d e-maily.', 'Bylo odesláno %d e-mailů.'),
291
+
292
+ // data type descriptions
293
+ 'Numbers' => 'Čísla',
294
+ 'Date and time' => 'Datum a čas',
295
+ 'Strings' => 'Řetězce',
296
+ 'Binary' => 'Binární',
297
+ 'Lists' => 'Seznamy',
298
+ 'Network' => 'Síť',
299
+ 'Geometry' => 'Geometrie',
300
+ 'Relations' => 'Vztahy',
301
+
302
+ 'Editor' => 'Editor',
303
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
304
+ '$1-$3-$5' => '$6.$4.$1',
305
+ // hint for date format - use language equivalents for day, month and year shortcuts
306
+ '[yyyy]-mm-dd' => 'd.m.[rrrr]',
307
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
308
+ 'HH:MM:SS' => 'HH:MM:SS',
309
+ 'now' => 'teď',
310
+ 'yes' => 'ano',
311
+ 'no' => 'ne',
312
+
313
+ // general SQLite error in create, drop or rename database
314
+ 'File exists.' => 'Soubor existuje.',
315
+ 'Please use one of the extensions %s.' => 'Prosím použijte jednu z koncovek %s.',
316
+
317
+ // PostgreSQL and MS SQL schema support
318
+ 'Alter schema' => 'Pozměnit schéma',
319
+ 'Create schema' => 'Vytvořit schéma',
320
+ 'Schema has been dropped.' => 'Schéma bylo odstraněno.',
321
+ 'Schema has been created.' => 'Schéma bylo vytvořeno.',
322
+ 'Schema has been altered.' => 'Schéma bylo změněno.',
323
+ 'Schema' => 'Schéma',
324
+ 'Invalid schema.' => 'Nesprávné schéma.',
325
+
326
+ // PostgreSQL sequences support
327
+ 'Sequences' => 'Sekvence',
328
+ 'Create sequence' => 'Vytvořit sekvenci',
329
+ 'Sequence has been dropped.' => 'Sekvence byla odstraněna.',
330
+ 'Sequence has been created.' => 'Sekvence byla vytvořena.',
331
+ 'Sequence has been altered.' => 'Sekvence byla změněna.',
332
+ 'Alter sequence' => 'Pozměnit sekvenci',
333
+
334
+ // PostgreSQL user types support
335
+ 'User types' => 'Uživatelské typy',
336
+ 'Create type' => 'Vytvořit typ',
337
+ 'Type has been dropped.' => 'Typ byl odstraněn.',
338
+ 'Type has been created.' => 'Typ byl vytvořen.',
339
+ 'Alter type' => 'Pozměnit typ',
340
+ );
adminer/adminer/adminer/lang/da.inc.php ADDED
@@ -0,0 +1,283 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'System' => 'System',
4
+ 'Server' => 'Server',
5
+ 'Username' => 'Brugernavn',
6
+ 'Password' => 'Kodeord',
7
+ 'Permanent login' => 'Permanent login',
8
+ 'Login' => 'Log ind',
9
+ 'Logout' => 'Log ud',
10
+ 'Logged as: %s' => 'Logget ind som: %s',
11
+ 'Logout successful.' => 'Log af vellykket.',
12
+ 'Invalid credentials.' => 'Ugyldige log ind oplysninger.',
13
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Master-kodeordet er udløbet. <a href="https://www.adminer.org/en/extension/" target="_blank">Implementer</a> en metode for %s for at gøre det permanent.',
14
+ 'Language' => 'Sprog',
15
+ 'Invalid CSRF token. Send the form again.' => 'Ugyldigt CSRF-token - Genindsend formen.',
16
+ 'No extension' => 'Ingen udvidelse',
17
+ 'None of the supported PHP extensions (%s) are available.' => 'Ingen af de understøttede PHP-udvidelser (%s) er tilgængelige.',
18
+ 'Session support must be enabled.' => 'Session support skal være slået til.',
19
+ 'Session expired, please login again.' => 'Sessionen er udløbet - Log venligst ind igen.',
20
+ '%s version: %s through PHP extension %s' => '%s version: %s via PHP-udvidelse %s',
21
+ 'Refresh' => 'Genindlæs',
22
+ 'ltr' => 'ltr',
23
+ 'Privileges' => 'Privilegier',
24
+ 'Create user' => 'Opret bruger',
25
+ 'User has been dropped.' => 'Brugeren slettet.',
26
+ 'User has been altered.' => 'Brugeren ændret.',
27
+ 'User has been created.' => 'Brugeren oprettet.',
28
+ 'Hashed' => 'Hashet',
29
+ 'Column' => 'Kolonne',
30
+ 'Routine' => 'Rutine',
31
+ 'Grant' => 'Giv privilegier',
32
+ 'Revoke' => 'Træk tilbage',
33
+ 'Process list' => 'Procesliste',
34
+ '%d process(es) have been killed.' => array('%d proces afsluttet.', '%d processer afsluttet.'),
35
+ 'Kill' => 'Afslut',
36
+ 'Variables' => 'Variabler',
37
+ 'Status' => 'Status',
38
+ 'SQL command' => 'SQL-kommando',
39
+ '%d query(s) executed OK.' => array('%d kald udført OK.', '%d kald udført OK.'),
40
+ 'Query executed OK, %d row(s) affected.' => array('Kald udført OK, %d række påvirket.', 'Kald udført OK, %d rækker påvirket.'),
41
+ 'No commands to execute.' => 'Ingen kommandoer at udføre.',
42
+ 'Error in query' => 'Fejl i forespørgelse',
43
+ 'Execute' => 'Kør',
44
+ 'Stop on error' => 'Stop ved fejl',
45
+ 'Show only errors' => 'Vis kun fejl',
46
+ '%.3f s' => '%.3f s',
47
+ 'History' => 'Historik',
48
+ 'Clear' => 'Tøm',
49
+ 'Edit all' => 'Rediger alle',
50
+ 'File upload' => 'Fil upload',
51
+ 'From server' => 'Fra server',
52
+ 'Webserver file %s' => 'Webserver-fil %s',
53
+ 'Run file' => 'Kør fil',
54
+ 'File does not exist.' => 'Filen eksisterer ikke.',
55
+ 'File uploads are disabled.' => 'Fil upload er slået fra.',
56
+ 'Unable to upload a file.' => 'Kunne ikke uploade fil.',
57
+ 'Maximum allowed file size is %sB.' => 'Maksimum tilladte filstørrelse er %sB.',
58
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Maks POST data er overskredet. Reducer mængden af data eller øg størrelsen i %s-konfigurationen.',
59
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Du kan uploade en stor SQL-fil via FTP og importere den fra serveren.',
60
+ 'Export' => 'Eksport',
61
+ 'Output' => 'Resultat',
62
+ 'open' => 'Åben',
63
+ 'save' => 'Gem',
64
+ 'Format' => 'Format',
65
+ 'Data' => 'Data',
66
+ 'Database' => 'Database',
67
+ 'database' => 'database',
68
+ 'Use' => 'Brug',
69
+ 'Select database' => 'Vælg database',
70
+ 'Invalid database.' => 'Ugyldig database.',
71
+ 'Create new database' => 'Opret ny database',
72
+ 'Database has been dropped.' => 'Databasen er blevet slettet.',
73
+ 'Databases have been dropped.' => 'Databasene er blevet slettet.',
74
+ 'Database has been created.' => 'Databasen er oprettet.',
75
+ 'Database has been renamed.' => 'Databasen har fået nyt navn.',
76
+ 'Database has been altered.' => 'Databasen er ændret.',
77
+ 'Alter database' => 'Ændre database',
78
+ 'Create database' => 'Opret database',
79
+ 'Database schema' => 'Databaseskema',
80
+ 'Permanent link' => 'Permanent link',
81
+ ',' => ' ',
82
+ '0123456789' => '0123456789',
83
+ 'Engine' => 'Motor',
84
+ 'Collation' => 'Tekstsortering',
85
+ 'Data Length' => 'Datalængde',
86
+ 'Index Length' => 'Indekslængde',
87
+ 'Data Free' => 'Fri data',
88
+ 'Rows' => 'Rader',
89
+ '%d in total' => '%d total',
90
+ 'Analyze' => 'Analyser',
91
+ 'Optimize' => 'Optimaliser',
92
+ 'Vacuum' => 'Støvsug',
93
+ 'Check' => 'Tjek',
94
+ 'Repair' => 'Reparer',
95
+ 'Truncate' => 'Afkort',
96
+ 'Tables have been truncated.' => 'Tabellerne er blevet afkortet.',
97
+ 'Move to other database' => 'Flyt til anden database',
98
+ 'Move' => 'Flyt',
99
+ 'Tables have been moved.' => 'Tabellerne er blevet flyttet.',
100
+ 'Copy' => 'Kopier',
101
+ 'Tables have been copied.' => 'Tabellerne er blevet kopiert.',
102
+ 'Routines' => 'Rutiner',
103
+ 'Routine has been called, %d row(s) affected.' => array('Rutinen er udført, %d række påvirket.', 'Rutinen er udført, %d rækker påvirket.'),
104
+ 'Call' => 'Kald',
105
+ 'Parameter name' => 'Parameternavn',
106
+ 'Create procedure' => 'Opret procedure',
107
+ 'Create function' => 'Opret funktion',
108
+ 'Routine has been dropped.' => 'Rutinen er slettet.',
109
+ 'Routine has been altered.' => 'Rutinen er ændret.',
110
+ 'Routine has been created.' => 'Rutinen er oprettet.',
111
+ 'Alter function' => 'Ændre funktion',
112
+ 'Alter procedure' => 'Ændre procedure',
113
+ 'Return type' => 'Returtype',
114
+ 'Events' => 'Hændelser',
115
+ 'Event has been dropped.' => 'Hændelsen er slettet.',
116
+ 'Event has been altered.' => 'Hændelsen er ændret.',
117
+ 'Event has been created.' => 'Hændelsen er oprettet.',
118
+ 'Alter event' => 'Ændre hændelse',
119
+ 'Create event' => 'Opret hændelse',
120
+ 'At given time' => 'På givne tid',
121
+ 'Every' => 'Hver',
122
+ 'Schedule' => 'Tidsplan',
123
+ 'Start' => 'Start',
124
+ 'End' => 'Slut',
125
+ 'On completion preserve' => 'Ved fuldførelse bevar',
126
+ 'Tables' => 'Tabeller',
127
+ 'Tables and views' => 'Tabeller og views',
128
+ 'Table' => 'Tabel',
129
+ 'No tables.' => 'Ingen tabeller.',
130
+ 'Alter table' => 'Ændre tabel',
131
+ 'Create table' => 'Opret tabel',
132
+ 'Table has been dropped.' => 'Tabellen er slettet.',
133
+ 'Tables have been dropped.' => 'Tabellerne er slettet.',
134
+ 'Tables have been optimized.' => 'Tabellerne er blevet optimaliseret.',
135
+ 'Table has been altered.' => 'Tabellen er ændret.',
136
+ 'Table has been created.' => 'Tabellen er oprettet.',
137
+ 'Table name' => 'Tabelnavn',
138
+ 'Show structure' => 'Vis struktur',
139
+ 'engine' => 'motor',
140
+ 'collation' => 'sortering',
141
+ 'Column name' => 'Kolonnenavn',
142
+ 'Type' => 'Type',
143
+ 'Length' => 'Længde',
144
+ 'Auto Increment' => 'Auto Increment',
145
+ 'Options' => 'Valg',
146
+ 'Comment' => 'Kommentarer',
147
+ 'Default values' => 'Standardværdier',
148
+ 'Drop' => 'Drop',
149
+ 'Are you sure?' => 'Er du sikker?',
150
+ 'Move up' => 'Flyt op',
151
+ 'Move down' => 'Flyt ned',
152
+ 'Remove' => 'Fjern',
153
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maksimum antal feltnavne overskredet - øg venligst %s.',
154
+ 'Partition by' => 'Partition ved',
155
+ 'Partitions' => 'Partitioner',
156
+ 'Partition name' => 'Partitionsnavn',
157
+ 'Values' => 'Værdier',
158
+ 'View' => 'View',
159
+ 'View has been dropped.' => 'Viewet er slettet.',
160
+ 'View has been altered.' => 'Viewet er ændret.',
161
+ 'View has been created.' => 'Viewet er oprettet.',
162
+ 'Alter view' => 'Ændre view',
163
+ 'Create view' => 'Nyt view',
164
+ 'Indexes' => 'Indekser',
165
+ 'Indexes have been altered.' => 'Indekserne er ændret.',
166
+ 'Alter indexes' => 'Ændre indekser',
167
+ 'Add next' => 'Læg til næste',
168
+ 'Index Type' => 'Indekstype',
169
+ 'Column (length)' => 'Kolonne (længde)',
170
+ 'Foreign keys' => 'Fremmednøgler',
171
+ 'Foreign key' => 'Fremmednøgle',
172
+ 'Foreign key has been dropped.' => 'Fremmednøglen er slettet.',
173
+ 'Foreign key has been altered.' => 'Fremmednøglen er ændret.',
174
+ 'Foreign key has been created.' => 'Fremmednøglen er oprettet.',
175
+ 'Target table' => 'Måltabel',
176
+ 'Change' => 'Ændre',
177
+ 'Source' => 'Kilde',
178
+ 'Target' => 'Mål',
179
+ 'Add column' => 'Tilføj kolonne',
180
+ 'Alter' => 'Ændre',
181
+ 'Add foreign key' => 'Tilføj fremmednøgle',
182
+ 'ON DELETE' => 'ON DELETE',
183
+ 'ON UPDATE' => 'ON UPDATE',
184
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kilde- og målkolonner skal have samme datatype, der skal være en indeks på mål-kolonnen, og data som refereres til skal eksistere.',
185
+ 'Triggers' => 'Triggere',
186
+ 'Add trigger' => 'Tilføj trigger',
187
+ 'Trigger has been dropped.' => 'Triggeren er slettet.',
188
+ 'Trigger has been altered.' => 'Triggeren er ændret.',
189
+ 'Trigger has been created.' => 'Triggeren er oprettet.',
190
+ 'Alter trigger' => 'Ændre trigger',
191
+ 'Create trigger' => 'Opret trigger',
192
+ 'Time' => 'Tid',
193
+ 'Event' => 'Hændelse',
194
+ 'Name' => 'Navn',
195
+ 'select' => 'Vis',
196
+ 'Select' => 'Vælg',
197
+ 'Select data' => 'Vælg data',
198
+ 'Functions' => 'Funktioner',
199
+ 'Aggregation' => 'Sammenfatning',
200
+ 'Search' => 'Søg',
201
+ 'anywhere' => 'hvorsomhelst',
202
+ 'Search data in tables' => 'Søg data i tabeller',
203
+ 'Sort' => 'Sorter',
204
+ 'descending' => 'faldende',
205
+ 'Limit' => 'Limit',
206
+ 'Text length' => 'Tekstlængde',
207
+ 'Action' => 'Handling',
208
+ 'Full table scan' => 'Fuld tabel-scan',
209
+ 'Unable to select the table' => 'Kan ikke vælge tabellen',
210
+ 'No rows.' => 'Ingen rækker.',
211
+ '%d row(s)' => array('%d række', '%d rækker'),
212
+ 'Page' => 'Side',
213
+ 'last' => 'sidste',
214
+ 'Load more data' => 'Indlæs mere data',
215
+ 'Loading' => 'Indlæser',
216
+ 'whole result' => 'hele resultatet',
217
+ '%d byte(s)' => array('%d byte', '%d bytes'),
218
+ 'Import' => 'Importer',
219
+ '%d row(s) have been imported.' => array('%d række er importeret.', '%d rækker er importeret.'),
220
+ 'File must be in UTF-8 encoding.' => 'Filen skal være i UTF8-tegnkoding.',
221
+ 'Modify' => 'Ændre',
222
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+klik på en værdi for at ændre den.',
223
+ 'Use edit link to modify this value.' => 'Brug rediger-link for at ændre dennne værdi.',
224
+ 'Item%s has been inserted.' => 'Emne%s er sat ind.',
225
+ 'Item has been deleted.' => 'Emnet er slettet.',
226
+ 'Item has been updated.' => 'Emnet er opdateret.',
227
+ '%d item(s) have been affected.' => array('%d emne påvirket.', '%d emner påvirket.'),
228
+ 'New item' => 'Nyt emne',
229
+ 'original' => 'original',
230
+ 'empty' => 'tom',
231
+ 'edit' => 'rediger',
232
+ 'Edit' => 'Rediger',
233
+ 'Insert' => 'Indsæt',
234
+ 'Save' => 'Gem',
235
+ 'Save and continue edit' => 'Gem og fortsæt redigering',
236
+ 'Save and insert next' => 'Gem og indsæt næste',
237
+ 'Selected' => 'Valgt',
238
+ 'Clone' => 'Klon',
239
+ 'Delete' => 'Slet',
240
+ 'You have no privileges to update this table.' => 'Du mangler rettigheder til at ændre denne tabellen.',
241
+ 'E-mail' => 'E-mail',
242
+ 'From' => 'Fra',
243
+ 'Subject' => 'Titel',
244
+ 'Attachments' => 'Vedhæft',
245
+ 'Send' => 'Send',
246
+ '%d e-mail(s) have been sent.' => array('%d email sendt.', '%d emails sendt.'),
247
+ 'Numbers' => 'Nummer',
248
+ 'Date and time' => 'Dato og tid',
249
+ 'Strings' => 'Strenge',
250
+ 'Binary' => 'Binær',
251
+ 'Lists' => 'Lister',
252
+ 'Network' => 'Netværk',
253
+ 'Geometry' => 'Geometri',
254
+ 'Relations' => 'Relationer',
255
+ 'Editor' => 'Redigering',
256
+ '$1-$3-$5' => '$6/$4 $1',
257
+ '[yyyy]-mm-dd' => 'd/m [åååå]',
258
+ 'HH:MM:SS' => 'HH:MM:SS',
259
+ 'now' => 'nu',
260
+ 'yes' => 'ja',
261
+ 'no' => 'nej',
262
+ 'File exists.' => 'Filen findes.',
263
+ 'Please use one of the extensions %s.' => 'Brug venligst en af filendelserne %s.',
264
+ 'Alter schema' => 'Ændre skema',
265
+ 'Create schema' => 'Opret skema',
266
+ 'Schema has been dropped.' => 'Skemaet er slettet.',
267
+ 'Schema has been created.' => 'Skemaet er oprettet.',
268
+ 'Schema has been altered.' => 'Skemaet er ændret.',
269
+ 'Schema' => 'Skema',
270
+ 'Invalid schema.' => 'Ugyldigt skema.',
271
+ 'Sequences' => 'Sekvenser',
272
+ 'Create sequence' => 'Opret sekvens',
273
+ 'Sequence has been dropped.' => 'Sekvensen er slettet.',
274
+ 'Sequence has been created.' => 'Sekvensen er oprettet.',
275
+ 'Sequence has been altered.' => 'Sekvensen er ændret.',
276
+ 'Alter sequence' => 'Ændre sekvens',
277
+ 'User types' => 'Brugertyper',
278
+ 'Create type' => 'Opret type',
279
+ 'Type has been dropped.' => 'Typen er slettet.',
280
+ 'Type has been created.' => 'Typen er oprettet.',
281
+ 'Alter type' => 'Ændre type',
282
+ 'Saving' => 'Gemmer',
283
+ );
adminer/adminer/adminer/lang/de.inc.php ADDED
@@ -0,0 +1,289 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Login',
4
+ 'Logout successful.' => 'Abmeldung erfolgreich.',
5
+ 'Invalid credentials.' => 'Ungültige Anmelde-Informationen.',
6
+ 'Server' => 'Server',
7
+ 'Username' => 'Benutzer',
8
+ 'Password' => 'Passwort',
9
+ 'Select database' => 'Datenbank auswählen',
10
+ 'Invalid database.' => 'Datenbank ungültig.',
11
+ 'Create new database' => 'Datenbank erstellen',
12
+ 'Table has been dropped.' => 'Tabelle wurde entfernt.',
13
+ 'Table has been altered.' => 'Tabelle wurde geändert.',
14
+ 'Table has been created.' => 'Tabelle wurde erstellt.',
15
+ 'Alter table' => 'Tabelle ändern',
16
+ 'Create table' => 'Tabelle erstellen',
17
+ 'Table name' => 'Name der Tabelle',
18
+ 'engine' => 'Speicher-Engine',
19
+ 'collation' => 'Kollation',
20
+ 'Column name' => 'Spaltenname',
21
+ 'Type' => 'Typ',
22
+ 'Length' => 'Länge',
23
+ 'Auto Increment' => 'Auto-Inkrement',
24
+ 'Options' => 'Optionen',
25
+ 'Save' => 'Speichern',
26
+ 'Drop' => 'Entfernen',
27
+ 'Database has been dropped.' => 'Datenbank wurde entfernt.',
28
+ 'Database has been created.' => 'Datenbank wurde erstellt.',
29
+ 'Database has been renamed.' => 'Datenbank wurde umbenannt.',
30
+ 'Database has been altered.' => 'Datenbank wurde geändert.',
31
+ 'Alter database' => 'Datenbank ändern',
32
+ 'Create database' => 'Datenbank erstellen',
33
+ 'SQL command' => 'SQL-Kommando',
34
+ 'Logout' => 'Abmelden',
35
+ 'database' => 'Datenbank',
36
+ 'Use' => 'Benutzung',
37
+ 'No tables.' => 'Keine Tabellen.',
38
+ 'select' => 'zeigen',
39
+ 'Item has been deleted.' => 'Datensatz wurde gelöscht.',
40
+ 'Item has been updated.' => 'Datensatz wurde geändert.',
41
+ 'Item%s has been inserted.' => 'Datensatz%s wurde eingefügt.',
42
+ 'Edit' => 'Bearbeiten',
43
+ 'Insert' => 'Einfügen',
44
+ 'Save and insert next' => 'Speichern und nächsten einfügen',
45
+ 'Delete' => 'Entfernen',
46
+ 'Database' => 'Datenbank',
47
+ 'Routines' => 'Routinen',
48
+ 'Indexes have been altered.' => 'Indizes geändert.',
49
+ 'Indexes' => 'Indizes',
50
+ 'Alter indexes' => 'Indizes ändern',
51
+ 'Add next' => 'Hinzufügen',
52
+ 'Language' => 'Sprache',
53
+ 'Select' => 'Daten zeigen von',
54
+ 'New item' => 'Neuer Datensatz',
55
+ 'Search' => 'Suchen',
56
+ 'Sort' => 'Ordnen',
57
+ 'descending' => 'absteigend',
58
+ 'Limit' => 'Begrenzung',
59
+ 'No rows.' => 'Keine Datensätze.',
60
+ 'Action' => 'Aktion',
61
+ 'edit' => 'bearbeiten',
62
+ 'Page' => 'Seite',
63
+ 'Query executed OK, %d row(s) affected.' => array('Abfrage ausgeführt, %d Datensatz betroffen.', 'Abfrage ausgeführt, %d Datensätze betroffen.'),
64
+ 'Error in query' => 'Fehler in der SQL-Abfrage',
65
+ 'Execute' => 'Ausführen',
66
+ 'Table' => 'Tabelle',
67
+ 'Foreign keys' => 'Fremdschlüssel',
68
+ 'Triggers' => 'Trigger',
69
+ 'View' => 'View',
70
+ 'Unable to select the table' => 'Auswahl der Tabelle fehlgeschlagen',
71
+ 'Invalid CSRF token. Send the form again.' => 'CSRF Token ungültig. Bitte die Formulardaten erneut abschicken.',
72
+ 'Comment' => 'Kommentar',
73
+ 'Default values' => 'Vorgabewerte festlegen',
74
+ '%d byte(s)' => array('%d Byte', '%d Bytes'),
75
+ 'No commands to execute.' => 'Kein Kommando vorhanden.',
76
+ 'Unable to upload a file.' => 'Hochladen von Datei fehlgeschlagen.',
77
+ 'File upload' => 'Datei importieren',
78
+ 'File uploads are disabled.' => 'Importieren von Dateien abgeschaltet.',
79
+ 'Routine has been called, %d row(s) affected.' => array('Routine wurde ausgeführt, %d Datensatz betroffen.', 'Routine wurde ausgeführt, %d Datensätze betroffen.'),
80
+ 'Call' => 'Aufrufen',
81
+ 'No extension' => 'Keine Erweiterungen installiert',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'Keine der unterstützten PHP-Erweiterungen (%s) ist vorhanden.',
83
+ 'Session support must be enabled.' => 'Unterstüzung für PHP-Sessions muss aktiviert sein.',
84
+ 'Session expired, please login again.' => 'Sitzungsdauer abgelaufen, bitte erneut anmelden.',
85
+ 'Text length' => 'Textlänge',
86
+ 'Foreign key has been dropped.' => 'Fremdschlüssel wurde entfernt.',
87
+ 'Foreign key has been altered.' => 'Fremdschlüssel wurde geändert.',
88
+ 'Foreign key has been created.' => 'Fremdschlüssel wurde erstellt.',
89
+ 'Foreign key' => 'Fremdschlüssel',
90
+ 'Target table' => 'Zieltabelle',
91
+ 'Change' => 'Ändern',
92
+ 'Source' => 'Ursprung',
93
+ 'Target' => 'Ziel',
94
+ 'Add column' => 'Spalte hinzufügen',
95
+ 'Alter' => 'Ändern',
96
+ 'Add foreign key' => 'Fremdschlüssel hinzufügen',
97
+ 'ON DELETE' => 'ON DELETE',
98
+ 'ON UPDATE' => 'ON UPDATE',
99
+ 'Index Type' => 'Index-Typ',
100
+ 'Column (length)' => 'Spalte (Länge)',
101
+ 'View has been dropped.' => 'View wurde entfernt.',
102
+ 'View has been altered.' => 'View wurde geändert.',
103
+ 'View has been created.' => 'View wurde erstellt.',
104
+ 'Alter view' => 'View ändern',
105
+ 'Create view' => 'View erstellen',
106
+ 'Name' => 'Name',
107
+ 'Process list' => 'Prozessliste',
108
+ '%d process(es) have been killed.' => array('%d Prozess gestoppt.', '%d Prozesse gestoppt.'),
109
+ 'Kill' => 'Anhalten',
110
+ 'Parameter name' => 'Name des Parameters',
111
+ 'Database schema' => 'Datenbankschema',
112
+ 'Create procedure' => 'Prozedur erstellen',
113
+ 'Create function' => 'Funktion erstellen',
114
+ 'Routine has been dropped.' => 'Routine wurde entfernt.',
115
+ 'Routine has been altered.' => 'Routine wurde geändert.',
116
+ 'Routine has been created.' => 'Routine wurde erstellt.',
117
+ 'Alter function' => 'Funktion ändern',
118
+ 'Alter procedure' => 'Prozedur ändern',
119
+ 'Return type' => 'Typ des Rückgabewertes',
120
+ 'Add trigger' => 'Trigger hinzufügen',
121
+ 'Trigger has been dropped.' => 'Trigger wurde entfernt.',
122
+ 'Trigger has been altered.' => 'Trigger wurde geändert.',
123
+ 'Trigger has been created.' => 'Trigger wurde erstellt.',
124
+ 'Alter trigger' => 'Trigger ändern',
125
+ 'Create trigger' => 'Trigger erstellen',
126
+ 'Time' => 'Zeitpunkt',
127
+ 'Event' => 'Ereignis',
128
+ '%s version: %s through PHP extension %s' => 'Version %s: %s mit PHP-Erweiterung %s',
129
+ '%d row(s)' => array('%d Datensatz', '%d Datensätze'),
130
+ 'Remove' => 'Entfernen',
131
+ 'Are you sure?' => 'Sind Sie sicher?',
132
+ 'Privileges' => 'Rechte',
133
+ 'Create user' => 'Benutzer erstellen',
134
+ 'User has been dropped.' => 'Benutzer wurde entfernt.',
135
+ 'User has been altered.' => 'Benutzer wurde geändert.',
136
+ 'User has been created.' => 'Benutzer wurde erstellt.',
137
+ 'Hashed' => 'Hashed',
138
+ 'Column' => 'Spalte',
139
+ 'Routine' => 'Routine',
140
+ 'Grant' => 'Erlauben',
141
+ 'Revoke' => 'Widerrufen',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST-Daten sind zu groß. Reduzieren Sie die Größe oder vergrößern Sie den Wert %s in der Konfiguration.',
143
+ 'Logged as: %s' => 'Angemeldet als: %s',
144
+ 'Move up' => 'Nach oben',
145
+ 'Move down' => 'Nach unten',
146
+ 'Functions' => 'Funktionen',
147
+ 'Aggregation' => 'Aggregationen',
148
+ 'Export' => 'Exportieren',
149
+ 'Output' => 'Ergebnis',
150
+ 'open' => 'anzeigen',
151
+ 'save' => 'Datei',
152
+ 'Format' => 'Format',
153
+ 'Tables' => 'Tabellen',
154
+ 'Data' => 'Daten',
155
+ 'Event has been dropped.' => 'Ereignis wurde entfernt.',
156
+ 'Event has been altered.' => 'Ereignis wurde geändert.',
157
+ 'Event has been created.' => 'Ereignis wurde erstellt.',
158
+ 'Alter event' => 'Ereignis ändern',
159
+ 'Create event' => 'Ereignis erstellen',
160
+ 'At given time' => 'Zur angegebenen Zeit',
161
+ 'Every' => 'Jede',
162
+ 'Events' => 'Ereignisse',
163
+ 'Schedule' => 'Zeitplan',
164
+ 'Start' => 'Start',
165
+ 'End' => 'Ende',
166
+ 'Status' => 'Status',
167
+ 'On completion preserve' => 'Nach der Ausführung erhalten',
168
+ 'Tables and views' => 'Tabellen und Views',
169
+ 'Data Length' => 'Datengröße',
170
+ 'Index Length' => 'Indexgröße',
171
+ 'Data Free' => 'Freier Bereich',
172
+ 'Collation' => 'Kollation',
173
+ 'Analyze' => 'Analysieren',
174
+ 'Optimize' => 'Optimieren',
175
+ 'Check' => 'Prüfen',
176
+ 'Repair' => 'Reparieren',
177
+ 'Truncate' => 'Leeren (truncate)',
178
+ 'Tables have been truncated.' => 'Tabellen wurden geleert (truncate).',
179
+ 'Rows' => 'Datensätze',
180
+ ',' => ' ',
181
+ '0123456789' => '0123456789',
182
+ 'Tables have been moved.' => 'Tabellen verschoben.',
183
+ 'Move to other database' => 'In andere Datenbank verschieben',
184
+ 'Move' => 'Verschieben',
185
+ 'Engine' => 'Speicher-Engine',
186
+ 'Save and continue edit' => 'Speichern und weiter bearbeiten',
187
+ 'original' => 'Original',
188
+ 'Tables have been dropped.' => 'Tabellen wurden entfernt (drop).',
189
+ '%d item(s) have been affected.' => '%d Artikel betroffen.',
190
+ 'whole result' => 'Gesamtergebnis',
191
+ 'Clone' => 'Klonen',
192
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Die maximal erlaubte Anzahl der Felder ist überschritten. Bitte %s erhöhen.',
193
+ 'Partition by' => 'Partitionieren um',
194
+ 'Partitions' => 'Partitionen',
195
+ 'Partition name' => 'Name der Partition',
196
+ 'Values' => 'Werte',
197
+ '%d row(s) have been imported.' => array('%d Datensatz wurde importiert.', '%d Datensätze wurden importiert.'),
198
+ 'anywhere' => 'beliebig',
199
+ 'Import' => 'Importieren',
200
+ 'Stop on error' => 'Bei Fehler anhalten',
201
+ '%.3f s' => '%.3f s',
202
+ '$1-$3-$5' => '$6.$4.$1',
203
+ '[yyyy]-mm-dd' => 't.m.[jjjj]',
204
+ 'History' => 'History',
205
+ 'Variables' => 'Variablen',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Quell- und Zielspalten müssen vom gleichen Datentyp sein, es muss unter den Zielspalten ein Index existieren und die referenzierten Daten müssen existieren.',
207
+ 'Relations' => 'Relationen',
208
+ 'Run file' => 'Datei ausführen',
209
+ 'Clear' => 'Löschen',
210
+ 'Maximum allowed file size is %sB.' => 'Maximal erlaubte Dateigröße ist %sB.',
211
+ 'Numbers' => 'Zahlen',
212
+ 'Date and time' => 'Datum und Zeit',
213
+ 'Strings' => 'Zeichenketten',
214
+ 'Binary' => 'Binär',
215
+ 'Lists' => 'Listen',
216
+ 'Editor' => 'Editor',
217
+ 'E-mail' => 'E-Mail',
218
+ 'From' => 'Von',
219
+ 'Subject' => 'Betreff',
220
+ 'Send' => 'Abschicken',
221
+ '%d e-mail(s) have been sent.' => array('%d E-Mail abgeschickt.', '%d E-Mails abgeschickt.'),
222
+ 'Webserver file %s' => 'Webserver Datei %s',
223
+ 'File does not exist.' => 'Datei existiert nicht.',
224
+ '%d in total' => '%d insgesamt',
225
+ 'Permanent login' => 'Passwort speichern',
226
+ 'Databases have been dropped.' => 'Datenbanken wurden entfernt.',
227
+ 'Search data in tables' => 'Suche in Tabellen',
228
+ 'Schema' => 'Schema',
229
+ 'Alter schema' => 'Schema ändern',
230
+ 'Create schema' => 'Schema erstellen',
231
+ 'Schema has been dropped.' => 'Schema wurde gelöscht.',
232
+ 'Schema has been created.' => 'Schema wurde erstellt.',
233
+ 'Schema has been altered.' => 'Schema wurde geändert.',
234
+ 'Sequences' => 'Sequenzen',
235
+ 'Create sequence' => 'Sequenz erstellen',
236
+ 'Alter sequence' => 'Sequenz ändern',
237
+ 'Sequence has been dropped.' => 'Sequenz wurde gelöscht.',
238
+ 'Sequence has been created.' => 'Sequenz wurde erstellt.',
239
+ 'Sequence has been altered.' => 'Sequenz wurde geändert.',
240
+ 'User types' => 'Benutzerdefinierte Typen',
241
+ 'Create type' => 'Typ erstellen',
242
+ 'Alter type' => 'Typ ändern',
243
+ 'Type has been dropped.' => 'Typ wurde gelöscht.',
244
+ 'Type has been created.' => 'Typ wurde erstellt.',
245
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+Klick zum Bearbeiten des Wertes.',
246
+ 'Use edit link to modify this value.' => 'Benutzen Sie den Link zum Bearbeiten dieses Wertes.',
247
+ 'last' => 'letzte',
248
+ 'From server' => 'Vom Server',
249
+ 'System' => 'Datenbank System',
250
+ 'Select data' => 'Daten auswählen',
251
+ 'Show structure' => 'Struktur anzeigen',
252
+ 'empty' => 'leer',
253
+ 'Network' => 'Netzwerk',
254
+ 'Geometry' => 'Geometrie',
255
+ 'File exists.' => 'Datei existiert schon.',
256
+ 'Attachments' => 'Anhänge',
257
+ '%d query(s) executed OK.' => array('SQL-Abfrage erfolgreich ausgeführt.', '%d SQL-Abfragen erfolgreich ausgeführt.'),
258
+ 'Show only errors' => 'Nur Fehler anzeigen',
259
+ 'Refresh' => 'Aktualisieren',
260
+ 'Invalid schema.' => 'Schema nicht gültig.',
261
+ 'Please use one of the extensions %s.' => 'Bitte einen der Dateitypen %s benutzen.',
262
+ 'now' => 'jetzt',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'Tabellen wurden kopiert.',
265
+ 'Copy' => 'Kopieren',
266
+ 'Permanent link' => 'Dauerhafter Link',
267
+ 'Edit all' => 'Alle bearbeiten',
268
+ 'HH:MM:SS' => 'HH:MM:SS',
269
+ 'Compute' => 'kalkulieren',
270
+ 'Size' => 'Größe',
271
+ 'Modify' => 'Ändern',
272
+ 'Selected' => 'Ausgewählte',
273
+ 'Default value' => 'Vorgabewert festlegen',
274
+ 'Limit rows' => 'Datensätze begrenzen',
275
+ 'Tables have been optimized.' => 'Tabellen wurden optimiert.',
276
+ 'File must be in UTF-8 encoding.' => 'Die Datei muss UTF-8 kodiert sein.',
277
+ 'Loading' => 'Lade',
278
+ 'Load more data' => 'Mehr Daten laden',
279
+ 'Too many unsuccessful logins, try again in %d minute(s).' => array('Zu viele erfolglose Login-Versuche. Bitte probieren Sie es in %d Minute noch einmal.', 'Zu viele erfolglose Login-Versuche. Bitte probieren Sie es in %d Minuten noch einmal.'),
280
+ 'If you did not send this request from Adminer then close this page.' => 'Wenn Sie diese Anfrage nicht von Adminer gesendet haben, schließen Sie diese Seite.',
281
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Sie können eine große SQL-Datei per FTP hochladen und dann vom Server importieren.',
282
+ 'You are offline.' => 'Sie sind offline.',
283
+ 'You have no privileges to update this table.' => 'Sie haben keine Rechte, um diese Tabelle zu aktualisieren.' ,
284
+ 'Saving' => 'Speichere',
285
+ 'yes' => 'ja',
286
+ 'no' => 'nein',
287
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Das Master-Passwort ist abgelaufen. <a href="https://www.adminer.org/de/extension/" target="_blank">Implementieren</a> Sie die %s Methode, um es permanent zu machen.',
288
+ '%d / ' => '%d / ',
289
+ );
adminer/adminer/adminer/lang/el.inc.php ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Σύστημα',
5
+ 'Server' => 'Διακομιστής',
6
+ 'Username' => 'Όνομα Χρήστη',
7
+ 'Password' => 'Κωδικός',
8
+ 'Permanent login' => 'Μόνιμη Σύνδεση',
9
+ 'Login' => 'Σύνδεση',
10
+ 'Logout' => 'Αποσύνδεση',
11
+ 'Logged as: %s' => 'Συνδεθήκατε ως %s',
12
+ 'Logout successful.' => 'Αποσυνδεθήκατε με επιτυχία.',
13
+ 'Invalid credentials.' => 'Εσφαλμένα Διαπιστευτήρια.',
14
+ 'Too many unsuccessful logins, try again in %d minute(s).' => array('Επανηλημμένες ανεπιτυχείς προσπάθειες σύνδεσης, δοκιμάστε ξανά σε %s λεπτό.', 'Επανηλημμένες ανεπιτυχείς προσπάθειες σύνδεσης, δοκιμάστε ξανά σε %s λεπτά.'),
15
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Έλειξε ο Κύριος Κωδικός. <a href="https://www.adminer.org/en/extension/" target="_blank">Ενεργοποιήστε</a> τη μέθοδο %s για να τον κάνετε μόνιμο.',
16
+ 'Language' => 'Γλώσσα',
17
+ 'Invalid CSRF token. Send the form again.' => 'Άκυρο κουπόνι CSRF. Στείλτε τη φόρμα ξανά.',
18
+ 'If you did not send this request from Adminer then close this page.' => 'Αν δε στείλατε αυτό το αίτημα από το Adminer, τότε κλείστε αυτή τη σελίδα.',
19
+ 'No extension' => 'Χωρίς Επεκτάσεις',
20
+ 'None of the supported PHP extensions (%s) are available.' => 'Καμία από τις υποστηριζόμενες επεκτάσεις PHP (%s) δεν είναι διαθέσιμη.',
21
+ 'Session support must be enabled.' => 'Πρέπει να είναι ενεργοποιημένη η υποστήριξη συνεδριών.',
22
+ 'Session expired, please login again.' => 'Η συνεδρία έληξε, παρακαλώ συνδεθείτε ξανά.',
23
+ '%s version: %s through PHP extension %s' => '%s έκδοση: %s μέσω επέκτασης PHP %s',
24
+ 'Refresh' => 'Ανανέωση',
25
+
26
+ // text direction - 'ltr' or 'rtl'
27
+ 'ltr' => 'ltr',
28
+
29
+ 'Privileges' => 'Προνόμια',
30
+ 'Create user' => 'Δημιουργία Χρήστη',
31
+ 'User has been dropped.' => 'Ο Χρήστης διαγράφηκε.',
32
+ 'User has been altered.' => 'Ο Χρήστης τροποποιήθηκε.',
33
+ 'User has been created.' => 'Ο Χρήστης δημιουργήθηκε.',
34
+ 'Hashed' => 'Κωδικοποιήθηκε',
35
+ 'Column' => 'Στήλη',
36
+ 'Routine' => 'Ρουτίνα',
37
+ 'Grant' => 'Παραχώρηση',
38
+ 'Revoke' => 'Ανάκληση',
39
+
40
+ 'Process list' => 'Λίστα διεργασιών',
41
+ '%d process(es) have been killed.' => array('Τερματίστηκαν %d διεργασία.', 'Τερματίστηκαν %d διεργασίες.'),
42
+ 'Kill' => 'Τερματισμός',
43
+
44
+ 'Variables' => 'Μεταβλητές',
45
+ 'Status' => 'Κατάσταση',
46
+
47
+ 'SQL command' => 'Εντολή SQL',
48
+ '%d query(s) executed OK.' => array('Το ερώτημα %d εκτελέστηκε ΟΚ.', 'Τα ερώτηματα %d εκτελέστηκαν ΟΚ.'),
49
+ 'Query executed OK, %d row(s) affected.' => array('Το ερώτημα εκτελέστηκε ΟΚ, επιρρεάστηκε %d σειρά.', 'Το ερώτημα εκτελέστηκε ΟΚ, επιρρεάστηκαν %d σειρές.'),
50
+ 'No commands to execute.' => 'Δεν υπάρχει εντολή να εκτελεστεί.',
51
+ 'Error in query' => 'Σφάλμα στο ερώτημα',
52
+ 'Execute' => 'Εκτέλεση',
53
+ 'Stop on error' => 'Διακοπή όταν υπάρχει σφάλμα',
54
+ 'Show only errors' => 'Να εμφανίζονται μόνο τα σφάλματα',
55
+ // sprintf() format for time of the command
56
+ '%.3f s' => '%.3f s',
57
+ 'History' => 'Ιστορικό',
58
+ 'Clear' => 'Καθαρισμός',
59
+ 'Edit all' => 'Επεξεργασία όλων',
60
+
61
+ 'File upload' => 'Ανέβασμα αρχείου',
62
+ 'From server' => 'Από διακομιστή',
63
+ 'Webserver file %s' => 'Αρχείο %s από διακομιστή web',
64
+ 'Run file' => 'Εκτέλεση αρχείου',
65
+ 'File does not exist.' => 'Το αρχείο δεν υπάρχει.',
66
+ 'File uploads are disabled.' => 'Έχει απενεργοποιηθεί το ανέβασμα αρχείων.',
67
+ 'Unable to upload a file.' => 'Δεν είναι δυνατόν να ανεβεί το αρχείο.',
68
+ 'Maximum allowed file size is %sB.' => 'Το μέγιστο επιτρεπόμενο μέγεθος αρχείο για ανέβασμα είναι %sB.',
69
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Πολλά δεδομένα POST. Μείωστε τα περιεχόμενα ή αυξήστε την σχετική ρύθμιση %s.',
70
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Μπορείτε να ανεβάσετε ένα μεγάλο αρχείο SQL μέσω FTP και να το εισάγετε από το διακομιστή.',
71
+ 'You are offline.' => 'Βρίσκεστε εκτός σύνδεσης.',
72
+
73
+ 'Export' => 'Εξαγωγή',
74
+ 'Output' => 'Αποτέλεσμα',
75
+ 'open' => 'άνοιγμα',
76
+ 'save' => 'αποθήκευση',
77
+ 'Saving' => 'Γίνεται Αποθήκευση',
78
+ 'Format' => 'Μορφή',
79
+ 'Data' => 'Δεδομένα',
80
+
81
+ 'Database' => 'Β. Δεδομένων',
82
+ 'database' => 'β. δεδομένων',
83
+ 'Use' => 'χρήση',
84
+ 'Select database' => 'Επιλέξτε Β.Δ.',
85
+ 'Invalid database.' => 'Άκυρη Β.Δ.',
86
+ 'Create new database' => 'Δημιουργία νέας Β.Δ.',
87
+ 'Database has been dropped.' => 'Η Β.Δ. διαγράφηκε.',
88
+ 'Databases have been dropped.' => 'Οι Β.Δ. διαγράφηκαν.',
89
+ 'Database has been created.' => 'Η Β.Δ. δημιουργήθηκε.',
90
+ 'Database has been renamed.' => 'Η. Β.Δ. μετονομάστηκε.',
91
+ 'Database has been altered.' => 'Η Β.Δ. τροποποιήθηκε.',
92
+ 'Alter database' => 'Τροποποίηση Β.Δ.',
93
+ 'Create database' => 'Δημιουργία Β.Δ.',
94
+ 'Database schema' => 'Σχήμα Β.Δ.',
95
+
96
+ // link to current database schema layout
97
+ 'Permanent link' => 'Μόνιμος Σύνδεσμος',
98
+
99
+ // thousands separator - must contain single byte
100
+ ',' => '.',
101
+ '0123456789' => '0123456789',
102
+ 'Engine' => 'Μηχανή',
103
+ 'Collation' => 'Collation',
104
+ 'Data Length' => 'Μήκος Δεδομένων',
105
+ 'Index Length' => 'Μήκος Δείκτη',
106
+ 'Data Free' => 'Δεδομένα Ελεύθερα',
107
+ 'Rows' => 'Σειρές',
108
+ '%d in total' => '%d συνολικά',
109
+ 'Analyze' => 'Ανάλυση',
110
+ 'Optimize' => 'Βελτιστοποίηση',
111
+ 'Vacuum' => 'Καθαρισμός',
112
+ 'Check' => 'Έλεγχος',
113
+ 'Repair' => 'Επιδιόρθωση',
114
+ 'Truncate' => 'Περικοπή',
115
+ 'Tables have been truncated.' => 'Οι πίνακες περικόπτηκαν.',
116
+ 'Move to other database' => 'Μεταφορά σε άλλη Β.Δ.',
117
+ 'Move' => 'Μεταφορά',
118
+ 'Tables have been moved.' => 'Οι πίνακες μεταφέρθηκαν.',
119
+ 'Copy' => 'Αντιγραφή',
120
+ 'Tables have been copied.' => 'Οι πίνακες αντιγράφηκαν.',
121
+
122
+ 'Routines' => 'Ρουτίνες',
123
+ 'Routine has been called, %d row(s) affected.' => array('Η ρουτίνα εκτελέστηκε, επιρρεάστηκε %d σειρά.', 'Η ρουτίνα εκτελέστηκε, επιρρεάστηκαν %d σειρές.'),
124
+ 'Call' => 'Εκτέλεση',
125
+ 'Parameter name' => 'Όνομα παραμέτρου',
126
+ 'Create procedure' => 'Δημιουργία διαδικασίας',
127
+ 'Create function' => 'Δημιουργία Λειτουργίας',
128
+ 'Routine has been dropped.' => 'Η ρουτίνα διαγράφηκε.',
129
+ 'Routine has been altered.' => 'Η ρουτίνα τροποποιήθηκε.',
130
+ 'Routine has been created.' => 'Η ρουτίνα δημιουργήθηκε.',
131
+ 'Alter function' => 'Τροποποίηση λειτουργίας',
132
+ 'Alter procedure' => 'Τροποποίηση διαδικασίας',
133
+ 'Return type' => 'Επιστρεφόμενος τύπος',
134
+
135
+ 'Events' => 'Γεγονός',
136
+ 'Event has been dropped.' => 'Το γεγονός διαγράφηκε.',
137
+ 'Event has been altered.' => 'Το γεγονός τροποποιήθηκε.',
138
+ 'Event has been created.' => 'Το γεγονός δημιουργήθηκε.',
139
+ 'Alter event' => 'Τροποποίηση γεγονότος',
140
+ 'Create event' => 'Δημιουργία γεγονότος',
141
+ 'At given time' => 'Σε προκαθορισμένο χρόνο',
142
+ 'Every' => 'Κάθε',
143
+ 'Schedule' => 'Προγραμματισμός',
144
+ 'Start' => 'Έναρξη',
145
+ 'End' => 'Λήξη',
146
+ 'On completion preserve' => 'Κατά την ολοκλήρωση διατήρησε',
147
+
148
+ 'Tables' => 'Πίνακες',
149
+ 'Tables and views' => 'Πίνακες και Προβολές',
150
+ 'Table' => 'Πίνακας',
151
+ 'No tables.' => 'Χωρίς πίνακες.',
152
+ 'Alter table' => 'Τροποποίηση πίνακα',
153
+ 'Create table' => 'Δημιουργία πίνακα',
154
+ 'Table has been dropped.' => 'Ο πίνακας διαγράφηκε.',
155
+ 'Tables have been dropped.' => 'Οι πινακες διαγράφηκαν.',
156
+ 'Tables have been optimized.' => 'Οι πίνακες βελτιστοποιήθηκαν.',
157
+ 'Table has been altered.' => 'Ο πίνακας τροποποιήθηκε.',
158
+ 'Table has been created.' => 'Ο πίνακας δημιουργήθηκε.',
159
+ 'Table name' => 'Όνομα πίνακα',
160
+ 'Show structure' => 'Προβολή δομής',
161
+ 'engine' => 'μηχανή',
162
+ 'collation' => 'collation',
163
+ 'Column name' => 'Όνομα στήλης',
164
+ 'Type' => 'Τύπος',
165
+ 'Length' => 'Μήκος',
166
+ 'Auto Increment' => 'Αυτόματη αρίθμηση',
167
+ 'Options' => 'Επιλογές',
168
+ 'Comment' => 'Σχόλιο',
169
+ 'Default value' => 'Προεπιλεγμένη τιμή',
170
+ 'Default values' => 'Προεπιλεγμένες τιμές',
171
+ 'Drop' => 'Διαγραφή',
172
+ 'Are you sure?' => 'Είστε σίγουρος;',
173
+ 'Size' => 'Μέγεθος',
174
+ 'Compute' => 'Υπολογισμός',
175
+ 'Move up' => 'Μετακίνηση προς τα επάνω',
176
+ 'Move down' => 'Μετακίνηση προς τα κάτω',
177
+ 'Remove' => 'Αφαίρεση',
178
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Υπέρβαση μέγιστου επιτρεπόμενου αριθμού πεδίων. Παρακαλώ αυξήστε %s.',
179
+
180
+ 'Partition by' => 'Τμηματοποίηση ανά',
181
+ 'Partitions' => 'Τμήματα',
182
+ 'Partition name' => 'Όνομα Τμήματος',
183
+ 'Values' => 'Τιμές',
184
+
185
+ 'View' => 'Προβολή',
186
+ 'Materialized View' => 'Υλοποιημένη Προβολή',
187
+ 'View has been dropped.' => 'Η προβολή διαγράφηκε.',
188
+ 'View has been altered.' => 'Η προβολή τροποποιήθηκε.',
189
+ 'View has been created.' => 'Η προβολή δημιουργήθηκε.',
190
+ 'Alter view' => 'Τροποποίηση προβολής',
191
+ 'Create view' => 'Δημιουργία προβολής',
192
+ 'Create materialized view' => 'Δημιουργία Υλοποιημένης προβολής',
193
+
194
+ 'Indexes' => 'Δείκτες',
195
+ 'Indexes have been altered.' => 'Οι δείκτες τροποποιήθηκαν.',
196
+ 'Alter indexes' => 'Τροποποίηση δεικτών',
197
+ 'Add next' => 'Προσθήκη επόμενου',
198
+ 'Index Type' => 'Τύπος δείκτη',
199
+ 'Column (length)' => 'Στήλη (μήκος)',
200
+
201
+ 'Foreign keys' => 'Εξαρτημένα κλειδιά',
202
+ 'Foreign key' => 'Εξαρτημένο κλειδί',
203
+ 'Foreign key has been dropped.' => 'Το εξαρτημένο κλειδί διαγράφηκε.',
204
+ 'Foreign key has been altered.' => 'Το εξαρτημένο κλειδί τροποποιήθηκε.',
205
+ 'Foreign key has been created.' => 'Το εξαρτημένο κλειδί δημιουργήθηκε.',
206
+ 'Target table' => 'Πίνακας Στόχος',
207
+ 'Change' => 'Αλλαγή',
208
+ 'Source' => 'Πηγή',
209
+ 'Target' => 'Στόχος',
210
+ 'Add column' => 'Προσθήκη στήλης',
211
+ 'Alter' => 'Τροποποίηση',
212
+ 'Add foreign key' => 'Προσθήκη εξαρτημένου κλειδιού',
213
+ 'ON DELETE' => 'ΚΑΤΑ ΤΗ ΔΙΑΓΡΑΦΗ',
214
+ 'ON UPDATE' => 'ΚΑΤΑ ΤΗΝ ΑΛΛΑΓΗ',
215
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Οι στήλες στη πηγή και το στόχο πρέπει να έχουν τον ίδιο τύπο, πρέπει να υπάρχει δείκτης στη στήλη στόχο και να υπάρχουν εξαρτημένα δεδομένα.',
216
+
217
+ 'Triggers' => 'Εναύσματα',
218
+ 'Add trigger' => 'Προσθήκη εναύσματος',
219
+ 'Trigger has been dropped.' => 'Το έναυσμα διαγράφηκε.',
220
+ 'Trigger has been altered.' => 'Το έναυσμα τροποποιήθηκε.',
221
+ 'Trigger has been created.' => 'Το έναυσμα δημιουργήθηκε.',
222
+ 'Alter trigger' => 'Τροποποίηση εναύσματος',
223
+ 'Create trigger' => 'Δημιουργία εναύσματος',
224
+ 'Time' => 'Ώρα',
225
+ 'Event' => 'Γεγονός',
226
+ 'Name' => 'Όνομα',
227
+
228
+ 'select' => 'επιλογή',
229
+ 'Select' => 'Επιλογή',
230
+ 'Select data' => 'Επιλέξτε δεδομένα',
231
+ 'Functions' => 'Λειτουργίες',
232
+ 'Aggregation' => 'Άθροισμα',
233
+ 'Search' => 'Αναζήτηση',
234
+ 'anywhere' => 'παντού',
235
+ 'Search data in tables' => 'Αναζήτηση δεδομένων στους πίνακες',
236
+ 'Sort' => 'Ταξινόμηση',
237
+ 'descending' => 'Φθίνουσα',
238
+ 'Limit' => 'Όριο',
239
+ 'Limit rows' => 'Περιοριμός σειρών',
240
+ 'Text length' => 'Μήκος κειμένου',
241
+ 'Action' => 'Ενέργεια',
242
+ 'Full table scan' => 'Πλήρης σάρωση πινάκων',
243
+ 'Unable to select the table' => 'Δεν είναι δυνατή η επιλογή πίνακα',
244
+ 'No rows.' => 'Χωρίς σειρές.',
245
+ '%d / ' => '%d / ',
246
+ '%d row(s)' => array('%d σειρά', '%d σειρές'),
247
+ 'Page' => 'Σελίδα',
248
+ 'last' => 'τελευταία',
249
+ 'Load more data' => 'Φόρτωση κι άλλων δεδομένων',
250
+ 'Loading' => 'Φορτώνει',
251
+ 'whole result' => 'όλο το αποτέλεσμα',
252
+ '%d byte(s)' => array('%d byte', '%d bytes'),
253
+
254
+ 'Import' => 'Εισαγωγή',
255
+ '%d row(s) have been imported.' => array('$d σειρά εισήχθη.', '%d σειρές εισήχθησαν.'),
256
+ 'File must be in UTF-8 encoding.' => 'Το αρχείο πρέπει να έχει κωδικοποίηση UTF-8.',
257
+
258
+ // in-place editing in select
259
+ 'Modify' => 'Τροποποίηση',
260
+ 'Ctrl+click on a value to modify it.' => 'Πιέστε Ctrl+click σε μια τιμή για να την τροποποιήσετε.',
261
+ 'Use edit link to modify this value.' => 'Χρησιμοποιήστε το σύνδεσμο επεξεργασία για να τροποποιήσετε την τιμή.',
262
+
263
+ // %s can contain auto-increment value
264
+ 'Item%s has been inserted.' => 'Η εγγραφή%s εισήχθη.',
265
+ 'Item has been deleted.' => 'Η εγγραφή διαγράφηκε.',
266
+ 'Item has been updated.' => 'Η εγγραφή ενημερώθηκε.',
267
+ '%d item(s) have been affected.' => array('Επιρρεάστηκε %d εγγραφή.', 'Επιρρεάστηκαν %d εγγραφές.'),
268
+ 'New item' => 'Νέα εγγραφή',
269
+ 'original' => 'πρωτότυπο',
270
+ // label for value '' in enum data type
271
+ 'empty' => 'κενό',
272
+ 'edit' => 'επεξεργασία',
273
+ 'Edit' => 'Επεξεργασία',
274
+ 'Insert' => 'Εισαγωγή',
275
+ 'Save' => 'Αποθήκευση',
276
+ 'Save and continue edit' => 'Αποθήκευση και συνέχεια επεξεργασίας',
277
+ 'Save and insert next' => 'Αποθήκευση και εισαγωγή επόμενου',
278
+ 'Selected' => 'Επιλεγμένα',
279
+ 'Clone' => 'Κλονοποίηση',
280
+ 'Delete' => 'Διαγραφή',
281
+ 'You have no privileges to update this table.' => 'Δεν έχετε δικαίωμα να τροποποιήσετε αυτό τον πίνακα.',
282
+
283
+ 'E-mail' => 'E-mail',
284
+ 'From' => 'Από',
285
+ 'Subject' => 'Θέμα',
286
+ 'Attachments' => 'Συνημμένα',
287
+ 'Send' => 'Αποστολή',
288
+ '%d e-mail(s) have been sent.' => array('%d e-mail απεστάλλει.', '%d e-mail απεστάλλησαν.'),
289
+
290
+ // data type descriptions
291
+ 'Numbers' => 'Αριθμοί',
292
+ 'Date and time' => 'Ημερομηνία και ώρα',
293
+ 'Strings' => 'Κείμενο',
294
+ 'Binary' => 'Δυαδικό',
295
+ 'Lists' => 'Λίστες',
296
+ 'Network' => 'Δίκτυο',
297
+ 'Geometry' => 'Γεωμετρία',
298
+ 'Relations' => 'Συσχετήσεις',
299
+
300
+ 'Editor' => 'Επεξεργαστής',
301
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
302
+ '$1-$3-$5' => '$5/$3/$1',
303
+ // hint for date format - use language equivalents for day, month and year shortcuts
304
+ '[yyyy]-mm-dd' => 'ηη/μμ/[εεεε]',
305
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
306
+ 'HH:MM:SS' => 'ΩΩ:ΛΛ:ΔΔ',
307
+ 'now' => 'τώρα',
308
+ 'yes' => 'ναι',
309
+ 'no' => 'όχι',
310
+
311
+ // general SQLite error in create, drop or rename database
312
+ 'File exists.' => 'Το αρχείο υπάρχει.',
313
+ 'Please use one of the extensions %s.' => 'Παρακαλώ χρησιμοποιείστε μια από τις επεκτάσεις %s.',
314
+
315
+ // PostgreSQL and MS SQL schema support
316
+ 'Alter schema' => 'Τροποποίηση σχήματος',
317
+ 'Create schema' => 'Δημιουργία σχήματος',
318
+ 'Schema has been dropped.' => 'Το σχήμα διαγράφηκε.',
319
+ 'Schema has been created.' => 'Το σχήμα δημιουργήθηκε.',
320
+ 'Schema has been altered.' => 'Το σχήμα τροποποιήθηκε.',
321
+ 'Schema' => 'Σχήμα',
322
+ 'Invalid schema.' => 'Άκυρο σχήμα.',
323
+
324
+ // PostgreSQL sequences support
325
+ 'Sequences' => 'Αλληλουχία',
326
+ 'Create sequence' => 'Δημιουργία αλληλουχίας',
327
+ 'Sequence has been dropped.' => 'Η αλληλουχία διαγράφηκε.',
328
+ 'Sequence has been created.' => 'Η αλληλουχία δημιουργήθηκε.',
329
+ 'Sequence has been altered.' => 'Η αλληλουχία τροποποιήθηκε.',
330
+ 'Alter sequence' => 'Τροποποίηση αλληλουχίας',
331
+
332
+ // PostgreSQL user types support
333
+ 'User types' => 'Τύποι χρήστη',
334
+ 'Create type' => 'Δημιουργία τύπου',
335
+ 'Type has been dropped.' => 'Ο τύπος διαγράφηκε.',
336
+ 'Type has been created.' => 'Ο τύπος δημιουργήθηκε.',
337
+ 'Alter type' => 'Τροποποίηση τύπου',
338
+ );
adminer/adminer/adminer/lang/en.inc.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Too many unsuccessful logins, try again in %d minute(s).' => array('Too many unsuccessful logins, try again in %d minute.', 'Too many unsuccessful logins, try again in %d minutes.'),
4
+ 'Query executed OK, %d row(s) affected.' => array('Query executed OK, %d row affected.', 'Query executed OK, %d rows affected.'),
5
+ '%d byte(s)' => array('%d byte', '%d bytes'),
6
+ 'Routine has been called, %d row(s) affected.' => array('Routine has been called, %d row affected.', 'Routine has been called, %d rows affected.'),
7
+ '%d process(es) have been killed.' => array('%d process has been killed.', '%d processes have been killed.'),
8
+ '%d / ' => '%d / ',
9
+ '%d row(s)' => array('%d row', '%d rows'),
10
+ '%d item(s) have been affected.' => array('%d item has been affected.', '%d items have been affected.'),
11
+ '%d row(s) have been imported.' => array('%d row has been imported.', '%d rows have been imported.'),
12
+ '%d e-mail(s) have been sent.' => array('%d e-mail has been sent.', '%d e-mails have been sent.'),
13
+ '%d in total' => '%d in total',
14
+ '%d query(s) executed OK.' => array('%d query executed OK.', '%d queries executed OK.'),
15
+ );
adminer/adminer/adminer/lang/es.inc.php ADDED
@@ -0,0 +1,269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Login',
4
+ 'Logout successful.' => 'Sesión finalizada con éxito.',
5
+ 'Invalid credentials.' => 'Usuario y/o clave de acceso incorrecta.',
6
+ 'Server' => 'Servidor',
7
+ 'Username' => 'Usuario',
8
+ 'Password' => 'Contraseña',
9
+ 'Select database' => 'Seleccionar Base de datos',
10
+ 'Invalid database.' => 'Base de datos incorrecta.',
11
+ 'Create new database' => 'Crear nueva base de datos',
12
+ 'Table has been dropped.' => 'Tabla eliminada.',
13
+ 'Table has been altered.' => 'Tabla modificada.',
14
+ 'Table has been created.' => 'Tabla creada.',
15
+ 'Alter table' => 'Modificar tabla',
16
+ 'Create table' => 'Crear tabla',
17
+ 'Table name' => 'Nombre de la tabla',
18
+ 'engine' => 'motor',
19
+ 'collation' => 'colación',
20
+ 'Column name' => 'Nombre de columna',
21
+ 'Type' => 'Tipo',
22
+ 'Length' => 'Longitud',
23
+ 'Auto Increment' => 'Incremento automático',
24
+ 'Options' => 'Opciones',
25
+ 'Save' => 'Guardar',
26
+ 'Drop' => 'Eliminar',
27
+ 'Database has been dropped.' => 'Base de datos eliminada.',
28
+ 'Database has been created.' => 'Base de datos creada.',
29
+ 'Database has been renamed.' => 'Base de datos renombrada.',
30
+ 'Database has been altered.' => 'Base de datos modificada.',
31
+ 'Alter database' => 'Modificar Base de datos',
32
+ 'Create database' => 'Crear Base de datos',
33
+ 'SQL command' => 'Comando SQL',
34
+ 'Logout' => 'Cerrar sesión',
35
+ 'database' => 'base de datos',
36
+ 'Use' => 'Usar',
37
+ 'No tables.' => 'No existen tablas.',
38
+ 'select' => 'registros',
39
+ 'Item has been deleted.' => 'Registro eliminado.',
40
+ 'Item has been updated.' => 'Registro modificado.',
41
+ 'Item%s has been inserted.' => 'Registro%s insertado.',
42
+ 'Edit' => 'Modificar',
43
+ 'Insert' => 'Agregar',
44
+ 'Save and insert next' => 'Guardar e insertar siguiente',
45
+ 'Delete' => 'Eliminar',
46
+ 'Database' => 'Base de datos',
47
+ 'Routines' => 'Procedimientos',
48
+ 'Indexes have been altered.' => 'Indices actualizados.',
49
+ 'Indexes' => 'Indices',
50
+ 'Alter indexes' => 'Modificar indices',
51
+ 'Add next' => 'Agregar',
52
+ 'Language' => 'Idioma',
53
+ 'Select' => 'Mostrar',
54
+ 'New item' => 'Nuevo Registro',
55
+ 'Search' => 'Condición',
56
+ 'Sort' => 'Ordenar',
57
+ 'descending' => 'descendiente',
58
+ 'Limit' => 'Limite',
59
+ 'No rows.' => 'No existen registros.',
60
+ 'Action' => 'Acción',
61
+ 'edit' => 'modificar',
62
+ 'Page' => 'Página',
63
+ 'Query executed OK, %d row(s) affected.' => array('Consulta ejecutada, %d registro afectado.', 'Consulta ejecutada, %d registros afectados.'),
64
+ 'Error in query' => 'Error al ejecutar consulta',
65
+ 'Execute' => 'Ejecutar',
66
+ 'Table' => 'Tabla',
67
+ 'Foreign keys' => 'Claves externas',
68
+ 'Triggers' => 'Disparadores',
69
+ 'View' => 'Vista',
70
+ 'Unable to select the table' => 'No es posible seleccionar la tabla',
71
+ 'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Vuelva a enviar los datos del formulario.',
72
+ 'Comment' => 'Comentario',
73
+ 'Default values' => 'Valores predeterminados',
74
+ '%d byte(s)' => array('%d byte', '%d bytes'),
75
+ 'No commands to execute.' => 'No es posible ejecutar ningún comando.',
76
+ 'Unable to upload a file.' => 'No es posible importar el archivo.',
77
+ 'File upload' => 'Importar archivo',
78
+ 'File uploads are disabled.' => 'Importación de archivos deshablilitada.',
79
+ 'Routine has been called, %d row(s) affected.' => array('Consulta ejecutada, %d registro afectado.', 'Consulta ejecutada, %d registros afectados.'),
80
+ 'Call' => 'Llamar',
81
+ 'No extension' => 'No hay extension',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'Ninguna de las extensiones PHP soportadas (%s) está disponible.',
83
+ 'Session support must be enabled.' => 'Deben estar habilitadas las sesiones.',
84
+ 'Session expired, please login again.' => 'Sesión caducada, por favor escriba su clave de nuevo.',
85
+ 'Text length' => 'Longitud de texto',
86
+ 'Foreign key has been dropped.' => 'Clave externa eliminada.',
87
+ 'Foreign key has been altered.' => 'Clave externa modificada.',
88
+ 'Foreign key has been created.' => 'Clave externa creada.',
89
+ 'Foreign key' => 'Clave externa',
90
+ 'Target table' => 'Tabla de destino',
91
+ 'Change' => 'Modificar',
92
+ 'Source' => 'Origen',
93
+ 'Target' => 'Destino',
94
+ 'Add column' => 'Agregar columna',
95
+ 'Alter' => 'Modificar',
96
+ 'Add foreign key' => 'Agregar clave externa',
97
+ 'ON DELETE' => 'AL BORRAR',
98
+ 'ON UPDATE' => 'AL ACTUALIZAR',
99
+ 'Index Type' => 'Tipo de índice',
100
+ 'Column (length)' => 'Columna (longitud)',
101
+ 'View has been dropped.' => 'Vista eliminada.',
102
+ 'View has been altered.' => 'Vista modificada.',
103
+ 'View has been created.' => 'Vista creada.',
104
+ 'Alter view' => 'Modificar vista',
105
+ 'Create view' => 'Crear vista',
106
+ 'Name' => 'Nombre',
107
+ 'Process list' => 'Lista de procesos',
108
+ '%d process(es) have been killed.' => array('%d proceso detenido.', '%d procesos detenidos.'),
109
+ 'Kill' => 'Detener',
110
+ 'Parameter name' => 'Nombre de Parámetro',
111
+ 'Database schema' => 'Esquema de base de datos',
112
+ 'Create procedure' => 'Crear procedimiento',
113
+ 'Create function' => 'Crear función',
114
+ 'Routine has been dropped.' => 'Procedimiento eliminado.',
115
+ 'Routine has been altered.' => 'Procedimiento modificado.',
116
+ 'Routine has been created.' => 'Procedimiento creado.',
117
+ 'Alter function' => 'Modificar Función',
118
+ 'Alter procedure' => 'Modificar procedimiento',
119
+ 'Return type' => 'Tipo de valor de vuelta',
120
+ 'Add trigger' => 'Agregar disparador',
121
+ 'Trigger has been dropped.' => 'Disparador eliminado.',
122
+ 'Trigger has been altered.' => 'Disparador modificado.',
123
+ 'Trigger has been created.' => 'Disparador creado.',
124
+ 'Alter trigger' => 'Modificar Disparador',
125
+ 'Create trigger' => 'Agregar Disparador',
126
+ 'Time' => 'Tiempo',
127
+ 'Event' => 'Evento',
128
+ '%s version: %s through PHP extension %s' => 'Versión %s: %s a través de la extensión de PHP %s',
129
+ '%d row(s)' => array('%d registro', '%d registros'),
130
+ 'Remove' => 'Eliminar',
131
+ 'Are you sure?' => 'Está seguro?',
132
+ 'Privileges' => 'Privilegios',
133
+ 'Create user' => 'Crear Usuario',
134
+ 'User has been dropped.' => 'Usuario eliminado.',
135
+ 'User has been altered.' => 'Usuario modificado.',
136
+ 'User has been created.' => 'Usuario creado.',
137
+ 'Hashed' => 'Hash',
138
+ 'Column' => 'Columna',
139
+ 'Routine' => 'Rutina',
140
+ 'Grant' => 'Conceder',
141
+ 'Revoke' => 'Impedir',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST data demasiado grande. Reduzca el tamaño o aumente la directiva de configuración %s.',
143
+ 'Logged as: %s' => 'Logeado como: %s',
144
+ 'Move up' => 'Mover arriba',
145
+ 'Move down' => 'Mover abajo',
146
+ 'Functions' => 'Funciones',
147
+ 'Aggregation' => 'Agregados',
148
+ 'Export' => 'Exportar',
149
+ 'Output' => 'Salida',
150
+ 'open' => 'mostrar',
151
+ 'save' => 'archivo',
152
+ 'Format' => 'Formato',
153
+ 'Tables' => 'Tablas',
154
+ 'Data' => 'Datos',
155
+ 'Event has been dropped.' => 'Evento eliminado.',
156
+ 'Event has been altered.' => 'Evento modificado.',
157
+ 'Event has been created.' => 'Evento creado.',
158
+ 'Alter event' => 'Modificar Evento',
159
+ 'Create event' => 'Crear Evento',
160
+ 'At given time' => 'En el momento indicado',
161
+ 'Every' => 'Cada',
162
+ 'Events' => 'Eventos',
163
+ 'Schedule' => 'Agenda',
164
+ 'Start' => 'Inicio',
165
+ 'End' => 'Fin',
166
+ 'Status' => 'Estado',
167
+ 'On completion preserve' => 'Al completar mantener',
168
+ 'Tables and views' => 'Tablas y vistas',
169
+ 'Data Length' => 'Longitud de datos',
170
+ 'Index Length' => 'Longitud de índice',
171
+ 'Data Free' => 'Espacio libre',
172
+ 'Collation' => 'Colación',
173
+ 'Analyze' => 'Analizar',
174
+ 'Optimize' => 'Optimizar',
175
+ 'Check' => 'Comprobar',
176
+ 'Repair' => 'Reparar',
177
+ 'Truncate' => 'Vaciar',
178
+ 'Tables have been truncated.' => 'Las tablas han sido vaciadas.',
179
+ 'Rows' => 'Registros',
180
+ ',' => ' ',
181
+ '0123456789' => '0123456789',
182
+ 'Tables have been moved.' => 'Se movieron las tablas.',
183
+ 'Move to other database' => 'Mover a otra base de datos',
184
+ 'Move' => 'Mover',
185
+ 'Engine' => 'Motor',
186
+ 'Save and continue edit' => 'Guardar y continuar editando',
187
+ 'original' => 'original',
188
+ 'Tables have been dropped.' => 'Tablas eliminadas.',
189
+ '%d item(s) have been affected.' => array('%d elemento afectado.', '%d elementos afectados.'),
190
+ 'whole result' => 'resultado completo',
191
+ 'Clone' => 'Clonar',
192
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Excedida la cantidad máxima de campos permitidos. Por favor aumente %s.',
193
+ 'Partition by' => 'Particionar por',
194
+ 'Partitions' => 'Particiones',
195
+ 'Partition name' => 'Nombre de Partición',
196
+ 'Values' => 'Valores',
197
+ '%d row(s) have been imported.' => array('%d registro importado.', '%d registros importados.'),
198
+ 'anywhere' => 'donde sea',
199
+ 'Import' => 'Importar',
200
+ 'Stop on error' => 'Parar en caso de error',
201
+ '%.3f s' => '%.3f s',
202
+ '$1-$3-$5' => '$5/$3/$1',
203
+ '[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
204
+ 'History' => 'Histórico',
205
+ 'Variables' => 'Variables',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Las columnas de origen y destino deben ser del mismo tipo, debe existir un índice entre las columnas del destino y el registro referenciado debe existir también.',
207
+ 'Relations' => 'Relaciones',
208
+ 'Run file' => 'Ejecutar Archivo',
209
+ 'Clear' => 'Vaciar',
210
+ 'Maximum allowed file size is %sB.' => 'El tamaño máximo de archivo es %sB.',
211
+ 'Numbers' => 'Números',
212
+ 'Date and time' => 'Fecha y hora',
213
+ 'Strings' => 'Cadena',
214
+ 'Binary' => 'Binario',
215
+ 'Lists' => 'Listas',
216
+ 'Editor' => 'Editor',
217
+ 'E-mail' => 'Email',
218
+ 'From' => 'De',
219
+ 'Subject' => 'Asunto',
220
+ 'Send' => 'Enviar',
221
+ '%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
222
+ 'Webserver file %s' => 'Archivo de servidor web %s',
223
+ 'File does not exist.' => 'Ese archivo no existe.',
224
+ '%d in total' => '%d en total',
225
+ 'Permanent login' => 'Guardar contraseña',
226
+ 'Databases have been dropped.' => 'Bases de datos eliminadas.',
227
+ 'Search data in tables' => 'Buscar datos en tablas',
228
+ 'Schema' => 'Esquema',
229
+ 'Alter schema' => 'Modificar esquema',
230
+ 'Create schema' => 'Crear esquema',
231
+ 'Schema has been dropped.' => 'Esquema eliminado.',
232
+ 'Schema has been created.' => 'Esquema creado.',
233
+ 'Schema has been altered.' => 'Esquema modificado.',
234
+ 'Sequences' => 'Secuencias',
235
+ 'Create sequence' => 'Crear secuencias',
236
+ 'Alter sequence' => 'Modificar secuencia',
237
+ 'Sequence has been dropped.' => 'Secuencia eliminada.',
238
+ 'Sequence has been created.' => 'Secuencia creada.',
239
+ 'Sequence has been altered.' => 'Secuencia modificada.',
240
+ 'User types' => 'Tipos definidos por el usuario',
241
+ 'Create type' => 'Crear tipo',
242
+ 'Alter type' => 'Modificar tipo',
243
+ 'Type has been dropped.' => 'Tipo eliminado.',
244
+ 'Type has been created.' => 'Tipo creado.',
245
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+clic sobre el valor para editarlo.',
246
+ 'Use edit link to modify this value.' => 'Utilice el enlace de edición para realizar cambios.',
247
+ 'last' => 'último',
248
+ 'From server' => 'Desde servidor',
249
+ 'System' => 'Motor de base de datos',
250
+ 'Select data' => 'Visualizar contenido',
251
+ 'Show structure' => 'Mostrar estructura',
252
+ 'empty' => 'ningúno',
253
+ 'Network' => 'Red',
254
+ 'Geometry' => 'Geometría',
255
+ 'File exists.' => 'Ese archivo ya existe.',
256
+ 'Attachments' => 'Adjuntos',
257
+ '%d query(s) executed OK.' => array('%d sentencia sql ejecutada correctamente.', '%d sentencias sql ejecutadas correctamente.'),
258
+ 'Show only errors' => 'Mostrar solamente errores',
259
+ 'Refresh' => 'Refrescar',
260
+ 'Invalid schema.' => 'Esquema inválido.',
261
+ 'Please use one of the extensions %s.' => 'Por favor use una de las extensiones %s.',
262
+ 'now' => 'ahora',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'Tablas copiadas.',
265
+ 'Copy' => 'Copiar',
266
+ 'Permanent link' => 'Enlace permanente',
267
+ 'Edit all' => 'Editar todos',
268
+ 'HH:MM:SS' => 'HH:MM:SS',
269
+ );
adminer/adminer/adminer/lang/et.inc.php ADDED
@@ -0,0 +1,269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Logi sisse',
4
+ 'Logout successful.' => 'Väljalogimine õnnestus.',
5
+ 'Invalid credentials.' => 'Ebakorrektsed andmed.',
6
+ 'Server' => 'Server',
7
+ 'Username' => 'Kasutajanimi',
8
+ 'Password' => 'Parool',
9
+ 'Select database' => 'Vali andmebaas',
10
+ 'Invalid database.' => 'Tundmatu andmebaas.',
11
+ 'Create new database' => 'Loo uus andmebaas',
12
+ 'Table has been dropped.' => 'Tabel on edukalt kustutatud.',
13
+ 'Table has been altered.' => 'Tabeli andmed on edukalt muudetud.',
14
+ 'Table has been created.' => 'Tabel on edukalt loodud.',
15
+ 'Alter table' => 'Muuda tabeli struktuuri',
16
+ 'Create table' => 'Loo uus tabel',
17
+ 'Table name' => 'Tabeli nimi',
18
+ 'engine' => 'andmebaasimootor',
19
+ 'collation' => 'tähetabel',
20
+ 'Column name' => 'Veeru nimi',
21
+ 'Type' => 'Tüüp',
22
+ 'Length' => 'Pikkus',
23
+ 'Auto Increment' => 'Automaatselt suurenev',
24
+ 'Options' => 'Valikud',
25
+ 'Save' => 'Salvesta',
26
+ 'Drop' => 'Kustuta',
27
+ 'Database has been dropped.' => 'Andmebaas on edukalt kustutatud.',
28
+ 'Database has been created.' => 'Andmebaas on edukalt loodud.',
29
+ 'Database has been renamed.' => 'Andmebaas on edukalt ümber nimetatud.',
30
+ 'Database has been altered.' => 'Andmebaasi struktuuri uuendamine õnnestus.',
31
+ 'Alter database' => 'Muuda andmebaasi',
32
+ 'Create database' => 'Loo uus andmebaas',
33
+ 'SQL command' => 'SQL-Päring',
34
+ 'Logout' => 'Logi välja',
35
+ 'database' => 'andmebaas',
36
+ 'Use' => 'Kasuta',
37
+ 'No tables.' => 'Tabeleid ei leitud.',
38
+ 'select' => 'kuva',
39
+ 'Item has been deleted.' => 'Kustutamine õnnestus.',
40
+ 'Item has been updated.' => 'Uuendamine õnnestus.',
41
+ 'Item%s has been inserted.' => 'Kirje%s on edukalt lisatud.',
42
+ 'Edit' => 'Muuda',
43
+ 'Insert' => 'Sisesta',
44
+ 'Save and insert next' => 'Salvesta ja lisa järgmine',
45
+ 'Delete' => 'Kustuta',
46
+ 'Database' => 'Andmebaas',
47
+ 'Routines' => 'Protseduurid',
48
+ 'Indexes have been altered.' => 'Indeksite andmed on edukalt uuendatud.',
49
+ 'Indexes' => 'Indeksid',
50
+ 'Alter indexes' => 'Muuda indekseid',
51
+ 'Add next' => 'Lisa järgmine',
52
+ 'Language' => 'Keel',
53
+ 'Select' => 'Kuva',
54
+ 'New item' => 'Lisa kirje',
55
+ 'Search' => 'Otsi',
56
+ 'Sort' => 'Sorteeri',
57
+ 'descending' => 'kahanevalt',
58
+ 'Limit' => 'Piira',
59
+ 'No rows.' => 'Sissekanded puuduvad.',
60
+ 'Action' => 'Tegevus',
61
+ 'edit' => 'muuda',
62
+ 'Page' => 'Lehekülg',
63
+ 'Query executed OK, %d row(s) affected.' => 'Päring õnnestus, mõjutatatud ridu: %d.',
64
+ 'Error in query' => 'Päringus esines viga',
65
+ 'Execute' => 'Käivita',
66
+ 'Table' => 'Tabel',
67
+ 'Foreign keys' => 'Võõrvõtmed (foreign key)',
68
+ 'Triggers' => 'Päästikud (trigger)',
69
+ 'View' => 'Vaata',
70
+ 'Unable to select the table' => 'Tabeli valimine ebaõnnestus',
71
+ 'Invalid CSRF token. Send the form again.' => 'Sobimatu CSRF, palun postitage vorm uuesti.',
72
+ 'Comment' => 'Kommentaar',
73
+ 'Default values' => 'Vaikimisi väärtused',
74
+ '%d byte(s)' => array('%d bait', '%d baiti'),
75
+ 'No commands to execute.' => 'Käsk puudub.',
76
+ 'Unable to upload a file.' => 'Faili üleslaadimine pole võimalik.',
77
+ 'File upload' => 'Faili üleslaadimine',
78
+ 'File uploads are disabled.' => 'Failide üleslaadimine on keelatud.',
79
+ 'Routine has been called, %d row(s) affected.' => 'Protseduur täideti edukalt, mõjutatud ridu: %d.',
80
+ 'Call' => 'Käivita',
81
+ 'No extension' => 'Ei leitud laiendust',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'Serveris pole ühtegi toetatud PHP laiendustest (%s).',
83
+ 'Session support must be enabled.' => 'Sessioonid peavad olema lubatud.',
84
+ 'Session expired, please login again.' => 'Sessioon on aegunud, palun logige uuesti sisse.',
85
+ 'Text length' => 'Teksti pikkus',
86
+ 'Foreign key has been dropped.' => 'Võõrvõti on edukalt kustutatud.',
87
+ 'Foreign key has been altered.' => 'Võõrvõtme andmed on edukalt muudetud.',
88
+ 'Foreign key has been created.' => 'Võõrvõri on edukalt loodud.',
89
+ 'Foreign key' => 'Võõrvõti',
90
+ 'Target table' => 'Siht-tabel',
91
+ 'Change' => 'Muuda',
92
+ 'Source' => 'Allikas',
93
+ 'Target' => 'Sihtkoht',
94
+ 'Add column' => 'Lisa veerg',
95
+ 'Alter' => 'Muuda',
96
+ 'Add foreign key' => 'Lisa võõrvõti',
97
+ 'ON DELETE' => 'ON DELETE',
98
+ 'ON UPDATE' => 'ON UPDATE',
99
+ 'Index Type' => 'Indeksi tüüp',
100
+ 'Column (length)' => 'Veerg (pikkus)',
101
+ 'View has been dropped.' => 'Vaade (VIEW) on edukalt kustutatud.',
102
+ 'View has been altered.' => 'Vaade (VIEW) on edukalt muudetud.',
103
+ 'View has been created.' => 'Vaade (VIEW) on edukalt loodud.',
104
+ 'Alter view' => 'Muuda vaadet (VIEW)',
105
+ 'Create view' => 'Loo uus vaade (VIEW)',
106
+ 'Name' => 'Nimi',
107
+ 'Process list' => 'Protsesside nimekiri',
108
+ '%d process(es) have been killed.' => array('Protsess on edukalt peatatud (%d).', 'Valitud protsessid (%d) on edukalt peatatud.'),
109
+ 'Kill' => 'Peata',
110
+ 'Parameter name' => 'Parameetri nimi',
111
+ 'Database schema' => 'Andmebaasi skeem',
112
+ 'Create procedure' => 'Loo uus protseduur',
113
+ 'Create function' => 'Loo uus funktsioon',
114
+ 'Routine has been dropped.' => 'Protseduur on edukalt kustutatud.',
115
+ 'Routine has been altered.' => 'Protseduuri andmed on edukalt muudetud.',
116
+ 'Routine has been created.' => 'Protseduur on edukalt loodud.',
117
+ 'Alter function' => 'Muuda funktsiooni',
118
+ 'Alter procedure' => 'Muuda protseduuri',
119
+ 'Return type' => 'Tagastustüüp',
120
+ 'Add trigger' => 'Lisa päästik (TRIGGER)',
121
+ 'Trigger has been dropped.' => 'Päästik on edukalt kustutatud.',
122
+ 'Trigger has been altered.' => 'Päästiku andmed on edukalt uuendatud.',
123
+ 'Trigger has been created.' => 'Uus päästik on edukalt loodud.',
124
+ 'Alter trigger' => 'Muuda päästiku andmeid',
125
+ 'Create trigger' => 'Loo uus päästik (TRIGGER)',
126
+ 'Time' => 'Aeg',
127
+ 'Event' => 'Sündmus',
128
+ '%d row(s)' => '%d rida',
129
+ 'Remove' => 'Eemalda',
130
+ 'Are you sure?' => 'Kas oled kindel?',
131
+ 'Privileges' => 'Õigused',
132
+ 'Create user' => 'Loo uus kasutaja',
133
+ 'User has been dropped.' => 'Kasutaja on edukalt kustutatud.',
134
+ 'User has been altered.' => 'Kasutaja andmed on edukalt muudetud.',
135
+ 'User has been created.' => 'Kasutaja on edukalt lisatud.',
136
+ 'Hashed' => 'Häshitud (Hashed)',
137
+ 'Column' => 'Veerg',
138
+ 'Routine' => 'Protseduur',
139
+ 'Grant' => 'Anna',
140
+ 'Revoke' => 'Eemalda',
141
+ '%s version: %s through PHP extension %s' => '%s versioon: %s, kasutatud PHP moodul: %s',
142
+ 'Logged as: %s' => 'Sisse logitud: %s',
143
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST-andmete maht on liialt suur. Palun vähendage andmeid või suurendage %s php-seadet.',
144
+ 'Move up' => 'Liiguta ülespoole',
145
+ 'Move down' => 'Liiguta allapoole',
146
+ 'Export' => 'Ekspordi',
147
+ 'Tables' => 'Tabelid',
148
+ 'Data' => 'Andmed',
149
+ 'Output' => 'Väljund',
150
+ 'open' => 'näita brauseris',
151
+ 'save' => 'salvesta failina',
152
+ 'Format' => 'Formaat',
153
+ 'Functions' => 'Funktsioonid',
154
+ 'Aggregation' => 'Liitmine',
155
+ 'Event has been dropped.' => 'Sündmus on edukalt kustutatud.',
156
+ 'Event has been altered.' => 'Sündmuse andmed on edukalt uuendatud.',
157
+ 'Event has been created.' => 'Sündmus on edukalt loodud.',
158
+ 'Alter event' => 'Muuda sündmuse andmeid',
159
+ 'Create event' => 'Loo uus sündmus (EVENT)',
160
+ 'Start' => 'Alusta',
161
+ 'End' => 'Lõpeta',
162
+ 'Every' => 'Iga',
163
+ 'Status' => 'Staatus',
164
+ 'On completion preserve' => 'Lõpetamisel jäta sündmus alles',
165
+ 'Events' => 'Sündmused (EVENTS)',
166
+ 'Schedule' => 'Ajakava',
167
+ 'At given time' => 'Antud ajahetkel',
168
+ 'Save and continue edit' => 'Salvesta ja jätka muutmist',
169
+ 'original' => 'originaal',
170
+ 'Tables have been truncated.' => 'Validud tabelid on edukalt tühjendatud.',
171
+ 'Tables have been moved.' => 'Valitud tabelid on edukalt liigutatud.',
172
+ 'Tables have been dropped.' => 'Valitud tabelid on edukalt kustutatud.',
173
+ 'Tables and views' => 'Tabelid ja vaated',
174
+ 'Engine' => 'Implementatsioon',
175
+ 'Collation' => 'Tähetabel',
176
+ 'Data Length' => 'Andmete pikkus',
177
+ 'Index Length' => 'Indeksi pikkus',
178
+ 'Data Free' => 'Vaba ruumi',
179
+ 'Rows' => 'Ridu',
180
+ ',' => ',',
181
+ '0123456789' => '0123456789',
182
+ 'Analyze' => 'Analüüsi',
183
+ 'Optimize' => 'Optimeeri',
184
+ 'Check' => 'Kontrolli',
185
+ 'Repair' => 'Paranda',
186
+ 'Truncate' => 'Tühjenda',
187
+ 'Move to other database' => 'Liiguta teise andmebaasi',
188
+ 'Move' => 'Liiguta',
189
+ '%d item(s) have been affected.' => 'Mõjutatud kirjeid: %d.',
190
+ 'whole result' => 'Täielikud tulemused',
191
+ 'Clone' => 'Kloon',
192
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maksimaalne väljade arv ületatud. Palun suurendage %s.',
193
+ 'Partition by' => 'Partitsiooni',
194
+ 'Partitions' => 'Partitsioonid',
195
+ 'Partition name' => 'Partitsiooni nimi',
196
+ 'Values' => 'Väärtused',
197
+ '%d row(s) have been imported.' => 'Imporditi %d rida.',
198
+ 'anywhere' => 'vahet pole',
199
+ 'Import' => 'Impordi',
200
+ 'Stop on error' => 'Peatuda vea esinemisel',
201
+ '%.3f s' => '%.3f s',
202
+ '$1-$3-$5' => '$6.$4.$1',
203
+ '[yyyy]-mm-dd' => 'd.m.[yyyy]',
204
+ 'History' => 'Ajalugu',
205
+ 'Variables' => 'Muutujad',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Lähte- ja sihtveerud peavad eksisteerima ja omama sama andmetüüpi, sihtveergudel peab olema määratud indeks ning viidatud andmed peavad eksisteerima.',
207
+ 'Relations' => 'Seosed',
208
+ 'Run file' => 'Käivita fail',
209
+ 'Clear' => 'Puhasta',
210
+ 'Maximum allowed file size is %sB.' => 'Maksimaalne failisuurus %sB.',
211
+ 'Numbers' => 'Numbrilised',
212
+ 'Date and time' => 'Kuupäev ja kellaaeg',
213
+ 'Strings' => 'Tekstid',
214
+ 'Binary' => 'Binaar',
215
+ 'Lists' => 'Listid',
216
+ 'Editor' => 'Redaktor',
217
+ 'E-mail' => 'E-post',
218
+ 'From' => 'Kellelt',
219
+ 'Subject' => 'Pealkiri',
220
+ 'Send' => 'Saada',
221
+ '%d e-mail(s) have been sent.' => 'Saadetud kirju: %d.',
222
+ 'Webserver file %s' => 'Fail serveris: %s',
223
+ 'File does not exist.' => 'Faili ei leitud.',
224
+ '%d in total' => 'Kokku: %d',
225
+ 'Permanent login' => 'Jäta mind meelde',
226
+ 'Databases have been dropped.' => 'Andmebaasid on edukalt kustutatud.',
227
+ 'Search data in tables' => 'Otsi kogu andmebaasist',
228
+ 'Schema' => 'Struktuur',
229
+ 'Alter schema' => 'Muuda struktuuri',
230
+ 'Create schema' => 'Loo struktuur',
231
+ 'Schema has been dropped.' => 'Struktuur on edukalt kustutatud.',
232
+ 'Schema has been created.' => 'Struktuur on edukalt loodud.',
233
+ 'Schema has been altered.' => 'Struktuur on edukalt muudetud.',
234
+ 'Sequences' => 'Jadad (sequences)',
235
+ 'Create sequence' => 'Loo jada',
236
+ 'Alter sequence' => 'Muuda jada',
237
+ 'Sequence has been dropped.' => 'Jada on edukalt kustutatud.',
238
+ 'Sequence has been created.' => 'Jada on edukalt loodud.',
239
+ 'Sequence has been altered.' => 'Jada on edukalt muudetud.',
240
+ 'User types' => 'Kasutajatüübid',
241
+ 'Create type' => 'Loo tüüp',
242
+ 'Alter type' => 'Muuda tüüpi',
243
+ 'Type has been dropped.' => 'Tüüp on edukalt kustutatud.',
244
+ 'Type has been created.' => 'Tüüp on edukalt loodud.',
245
+ 'Ctrl+click on a value to modify it.' => 'Väärtuse muutmiseks Ctrl+kliki sellel.',
246
+ 'Use edit link to modify this value.' => 'Väärtuse muutmiseks kasuta muutmislinki.',
247
+ 'last' => 'viimane',
248
+ 'From server' => 'Serverist',
249
+ 'System' => 'Andmebaasimootor',
250
+ 'Select data' => 'Vaata andmeid',
251
+ 'Show structure' => 'Näita struktuuri',
252
+ 'empty' => 'tühi',
253
+ 'Network' => 'Võrk (network)',
254
+ 'Geometry' => 'Geomeetria',
255
+ 'File exists.' => 'Fail juba eksisteerib.',
256
+ 'Attachments' => 'Manused',
257
+ '%d query(s) executed OK.' => array('%d päring edukalt käivitatud.', '%d päringut edukalt käivitatud.'),
258
+ 'Show only errors' => 'Kuva vaid veateateid',
259
+ 'Refresh' => 'Uuenda',
260
+ 'Invalid schema.' => 'Sobimatu skeema.',
261
+ 'Please use one of the extensions %s.' => 'Palun kasuta üht laiendustest %s.',
262
+ 'now' => 'nüüd',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'Tabelid on edukalt kopeeritud.',
265
+ 'Copy' => 'Kopeeri',
266
+ 'Permanent link' => 'Püsilink',
267
+ 'Edit all' => 'Muuda kõiki',
268
+ 'HH:MM:SS' => 'HH:MM:SS',
269
+ );
adminer/adminer/adminer/lang/fa.inc.php ADDED
@@ -0,0 +1,336 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'سیستم',
5
+ 'Server' => 'سرور',
6
+ 'Username' => 'نام کاربری',
7
+ 'Password' => 'کلمه عبور',
8
+ 'Permanent login' => 'ورود دائم',
9
+ 'Login' => 'ورود',
10
+ 'Logout' => 'خروج',
11
+ 'Logged as: %s' => 'ورود به عنوان: %s',
12
+ 'Logout successful.' => 'با موفقیت خارج شدید.',
13
+ 'Invalid credentials.' => 'اعتبار سنجی نامعتبر.',
14
+ 'Too many unsuccessful logins, try again in %d minute(s).' => array('ورودهای ناموفق بیش از حد، %d دقیقه دیگر تلاش نمایید.', 'ورودهای ناموفق بیش از حد، %d دقیقه دیگر تلاش نمایید.'),
15
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'رمز اصلی باطل شده است. روش %s را <a href="https://www.adminer.org/en/extension/" target="_blank">پیاده سازی</a> کرده تا آن را دائمی سازید.',
16
+ 'Language' => 'زبان',
17
+ 'Invalid CSRF token. Send the form again.' => 'CSRF token نامعتبر است. دوباره سعی کنید.',
18
+ 'No extension' => 'پسوند نامعتبر',
19
+ 'None of the supported PHP extensions (%s) are available.' => 'هیچ کدام از افزونه های PHP پشتیبانی شده (%s) موجود نمی باشند.',
20
+ 'Session support must be enabled.' => 'پشتیبانی از نشست بایستی فعال گردد.',
21
+ 'Session expired, please login again.' => 'نشست پایان یافته، لطفا دوباره وارد شوید.',
22
+ '%s version: %s through PHP extension %s' => 'نسخه %s : %s توسعه پی اچ پی %s',
23
+ 'Refresh' => 'بازیابی',
24
+
25
+ // text direction - 'ltr' or 'rtl'
26
+ 'ltr' => 'rtl',
27
+
28
+ 'Privileges' => 'امتیازات',
29
+ 'Create user' => 'ایجاد کاربر',
30
+ 'User has been dropped.' => 'کاربر حذف شد.',
31
+ 'User has been altered.' => 'کاربر ویرایش گردید.',
32
+ 'User has been created.' => 'کاربر ایجاد شد.',
33
+ 'Hashed' => 'به هم ریخته',
34
+ 'Column' => 'ستون',
35
+ 'Routine' => 'روتین',
36
+ 'Grant' => 'اعطا',
37
+ 'Revoke' => 'لغو کردن',
38
+
39
+ 'Process list' => 'لیست فرآیند',
40
+ '%d process(es) have been killed.' => '%d فرآیند متوقف شد.',
41
+ 'Kill' => 'حذف فرآیند',
42
+
43
+ 'Variables' => 'متغیرها',
44
+ 'Status' => 'وضعیت',
45
+
46
+ 'SQL command' => 'دستور SQL',
47
+ '%d query(s) executed OK.' => '%d کوئری اجرا شد.',
48
+ 'Query executed OK, %d row(s) affected.' => 'کوئری اجرا شد. %d سطر تغیر کرد.',
49
+ 'No commands to execute.' => 'دستوری برای اجرا وجود ندارد.',
50
+ 'Error in query' => 'خطا در کوئری',
51
+ 'Execute' => 'اجرا',
52
+ 'Stop on error' => 'توقف بر روی خطا',
53
+ 'Show only errors' => 'فقط نمایش خطاها',
54
+ // sprintf() format for time of the command
55
+ '%.3f s' => '%.3f s',
56
+ 'History' => 'تاریخ',
57
+ 'Clear' => 'پاک کردن',
58
+ 'Edit all' => 'ویرایش همه',
59
+
60
+ 'File upload' => 'بارگذاری فایل',
61
+ 'From server' => 'از سرور',
62
+ 'Webserver file %s' => '%s فایل وب سرور',
63
+ 'Run file' => 'اجرای فایل',
64
+ 'File does not exist.' => 'فایل وجود ندارد.',
65
+ 'File uploads are disabled.' => 'بارگذاری غیر فعال است.',
66
+ 'Unable to upload a file.' => 'قادر به بارگذاری فایل نیستید.',
67
+ 'Maximum allowed file size is %sB.' => ' %sB حداکثر اندازه فایل.',
68
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'حجم داده ارسالی برزگ است. حجم داده کاهش دهید و یا مقدار %s را در پیکربندی افزایش دهید.',
69
+ 'You can upload a big SQL file via FTP and import it from server.' => 'شما می توانید فایل SQL حجیم را از طریق FTP بارگزاری و از روی سرور وارد نمایید.',
70
+ 'You are offline.' => 'شما آفلاین می باشید.',
71
+
72
+ 'Export' => 'استخراج',
73
+ 'Output' => 'خروجی',
74
+ 'open' => 'بازکردن',
75
+ 'save' => 'ذخیره',
76
+ 'Format' => 'حذف',
77
+ 'Data' => 'داده',
78
+
79
+ 'Database' => 'پایگاه داده',
80
+ 'database' => 'پایگاه داده',
81
+ 'Use' => 'استفاده',
82
+ 'Select database' => 'انتخاب پایگاه داده',
83
+ 'Invalid database.' => 'پایگاه داده نامعتبر.',
84
+ 'Create new database' => 'ایجاد پایگاه داده جدید',
85
+ 'Database has been dropped.' => 'پایگاه داده حذف شد.',
86
+ 'Databases have been dropped.' => 'پایگاه های داده حذف شدند.',
87
+ 'Database has been created.' => 'پایگاه داده ایجاد شد.',
88
+ 'Database has been renamed.' => 'نام پایگاه داده تغیر کرد.',
89
+ 'Database has been altered.' => 'پایگاه داده ویرایش شد.',
90
+ 'Alter database' => 'ویرایش پایگاه داده',
91
+ 'Create database' => 'ایجاد پایگاه داده',
92
+ 'Database schema' => 'ساختار پایگاه داده',
93
+
94
+ // link to current database schema layout
95
+ 'Permanent link' => 'ارتباط دائم',
96
+
97
+ // thousands separator - must contain single byte
98
+ ',' => ' ',
99
+ '0123456789' => '۰۱۲۳۴۵۶۷۸۹',
100
+ 'Engine' => 'موتور',
101
+ 'Collation' => 'تطبیق',
102
+ 'Data Length' => 'طول داده',
103
+ 'Index Length' => 'طول ایندکس',
104
+ 'Data Free' => 'داده اختیاری',
105
+ 'Rows' => 'سطرها',
106
+ '%d in total' => ' به طور کل %d ',
107
+ 'Analyze' => 'تحلیل',
108
+ 'Optimize' => 'بهینه سازی',
109
+ 'Vacuum' => 'پاک سازی',
110
+ 'Check' => 'بررسی',
111
+ 'Repair' => 'تعمیر',
112
+ 'Truncate' => 'کوتاه کردن',
113
+ 'Tables have been truncated.' => 'جدولها بریده شدند.',
114
+ 'Move to other database' => 'انتقال به یک پایگاه داده دیگر',
115
+ 'Move' => 'انتقال',
116
+ 'Tables have been moved.' => 'جدولها انتقال داده شدند.',
117
+ 'Copy' => 'کپی کردن',
118
+ 'Tables have been copied.' => 'جدولها کپی شدند.',
119
+
120
+ 'Routines' => 'روالها',
121
+ 'Routine has been called, %d row(s) affected.' => array('روال فراخوانی شد %d سطر متاثر شد.', 'روال فراخوانی شد %d سطر متاثر شد.'),
122
+ 'Call' => 'صدا زدن',
123
+ 'Parameter name' => 'نام پارامتر',
124
+ 'Create procedure' => 'ایجاد زیربرنامه',
125
+ 'Create function' => 'ایجاد تابع',
126
+ 'Routine has been dropped.' => 'روال حذف شد.',
127
+ 'Routine has been altered.' => 'روال ویرایش شد.',
128
+ 'Routine has been created.' => 'روال ایجاد شد.',
129
+ 'Alter function' => 'ویرایش تابع',
130
+ 'Alter procedure' => 'ویرایش زیربرنامه',
131
+ 'Return type' => 'برگرداندن نوع',
132
+
133
+ 'Events' => 'رویدادها',
134
+ 'Event has been dropped.' => 'رویداد حذف شد.',
135
+ 'Event has been altered.' => 'رویداد ویرایش شد.',
136
+ 'Event has been created.' => 'رویداد ایجاد شد.',
137
+ 'Alter event' => 'ویرایش رویداد',
138
+ 'Create event' => 'ایجاد رویداد',
139
+ 'At given time' => 'زمان معین',
140
+ 'Every' => 'همه',
141
+ 'Schedule' => 'زمانبندی',
142
+ 'Start' => 'آغاز',
143
+ 'End' => 'پایان',
144
+ 'On completion preserve' => 'تکمیل حفاظت فعال است',
145
+
146
+ 'Tables' => 'جدولها',
147
+ 'Tables and views' => 'جدولها و نمایه ها',
148
+ 'Table' => 'جدول',
149
+ 'No tables.' => 'جدولی وجود ندارد',
150
+ 'Alter table' => 'ویرایش جدول',
151
+ 'Create table' => 'ایجاد جدول',
152
+ 'Table has been dropped.' => 'جدول حذف شد.',
153
+ 'Tables have been dropped.' => 'جدولها حذف شدند.',
154
+ 'Tables have been optimized.' => 'جدولها بهینه شدند.',
155
+ 'Table has been altered.' => 'جدول ویرایش شد.',
156
+ 'Table has been created.' => 'جدول ایجاد شد.',
157
+ 'Table name' => 'نام جدول',
158
+ 'Show structure' => 'نمایش ساختار',
159
+ 'engine' => 'موتور',
160
+ 'collation' => 'تطبیق',
161
+ 'Column name' => 'نام ستون',
162
+ 'Type' => 'نوع',
163
+ 'Length' => 'طول',
164
+ 'Auto Increment' => 'افزایش خودکار',
165
+ 'Options' => 'اختیارات',
166
+ 'Comment' => 'توضیح',
167
+ 'Default value' => 'مقدار پیش فرض',
168
+ 'Default values' => 'مقادیر پیش فرض',
169
+ 'Drop' => 'حذف',
170
+ 'Are you sure?' => 'مطمئن هستید؟',
171
+ 'Size' => 'حجم',
172
+ 'Compute' => 'محاسبه',
173
+ 'Move up' => 'انتقال به بالا',
174
+ 'Move down' => 'انتقال به پایین',
175
+ 'Remove' => 'حذف',
176
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'حداکثر تعداد فیلدهای مجاز اشباع شد. لطفا %s را افزایش دهید.',
177
+
178
+ 'Partition by' => 'بخشبندی توسط',
179
+ 'Partitions' => 'بخشبندیها',
180
+ 'Partition name' => 'نام بخش',
181
+ 'Values' => 'مقادیر',
182
+
183
+ 'View' => 'نمایش',
184
+ 'Materialized View' => 'نمایه مادی',
185
+ 'View has been dropped.' => 'نمایش حذف شد.',
186
+ 'View has been altered.' => 'نمایش ویرایش شد.',
187
+ 'View has been created.' => 'نمایش ایجاد شد.',
188
+ 'Alter view' => 'حذف نمایش',
189
+ 'Create view' => 'ایجاد نمایش',
190
+ 'Create materialized view' => 'ایجاد نمایه مادی',
191
+
192
+ 'Indexes' => 'ایندکسها',
193
+ 'Indexes have been altered.' => 'ایندکسها ویرایش شدند.',
194
+ 'Alter indexes' => 'ویرایش ایندکسها',
195
+ 'Add next' => 'افرودن بعدی',
196
+ 'Index Type' => 'نوع ایندکس',
197
+ 'Column (length)' => 'ستون (طول)',
198
+
199
+ 'Foreign keys' => 'کلیدهای خارجی',
200
+ 'Foreign key' => 'کلید خارجی',
201
+ 'Foreign key has been dropped.' => 'کلید خارجی حذف شد.',
202
+ 'Foreign key has been altered.' => 'کلید خارجی ویرایش شد.',
203
+ 'Foreign key has been created.' => 'کلید خارجی ایجاد شد.',
204
+ 'Target table' => 'جدول هدف',
205
+ 'Change' => 'تغییر',
206
+ 'Source' => 'منبع',
207
+ 'Target' => 'هدف',
208
+ 'Add column' => 'افزودن ستون',
209
+ 'Alter' => 'ویرایش',
210
+ 'Add foreign key' => 'افزودن کلید خارجی',
211
+ 'ON DELETE' => 'ON DELETE',
212
+ 'ON UPDATE' => 'ON UPDATE',
213
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'داده مبدا و مقصد ستونها بایستی شبیه هم باشند.',
214
+
215
+ 'Triggers' => 'تریگرها',
216
+ 'Add trigger' => 'افزودن تریگر',
217
+ 'Trigger has been dropped.' => 'تریگر حذف شد.',
218
+ 'Trigger has been altered.' => 'تریگر ویرایش شد.',
219
+ 'Trigger has been created.' => 'تریگر ایجاد شد.',
220
+ 'Alter trigger' => 'ویرایش تریگر',
221
+ 'Create trigger' => 'ایجاد تریگر',
222
+ 'Time' => 'زمان',
223
+ 'Event' => 'رویداد',
224
+ 'Name' => 'نام',
225
+
226
+ 'select' => 'انتخاب',
227
+ 'Select' => 'انتخاب',
228
+ 'Select data' => 'انتخاب داده',
229
+ 'Functions' => 'توابع',
230
+ 'Aggregation' => 'تجمع',
231
+ 'Search' => 'جستجو',
232
+ 'anywhere' => 'هرکجا',
233
+ 'Search data in tables' => 'جستجوی داده در جدول',
234
+ 'Sort' => 'مرتب کردن',
235
+ 'descending' => 'نزولی',
236
+ 'Limit' => 'محدودیت',
237
+ 'Limit rows' => 'محدودیت سطرها',
238
+ 'Text length' => 'طول متن',
239
+ 'Action' => 'عملیات',
240
+ 'Full table scan' => 'اسکن کامل جدول',
241
+ 'Unable to select the table' => 'قادر به انتخاب جدول نیستید',
242
+ 'No rows.' => 'سطری وجود ندارد',
243
+ '%d / ' => '%d / ',
244
+ '%d row(s)' => array('%d سطر', '%d سطر'),
245
+ 'Page' => 'صفحه',
246
+ 'last' => 'آخری',
247
+ 'Load more data' => 'بارگزاری اطلاعات بیشتر',
248
+ 'Loading' => 'در حال بارگزاری',
249
+ 'whole result' => 'همه نتایج',
250
+ '%d byte(s)' => array('%d بایت', '%d بایت'),
251
+
252
+ 'Import' => 'وارد کردن',
253
+ '%d row(s) have been imported.' => array('%d سطر وارد شد.', '%d سطر وارد شد.'),
254
+ 'File must be in UTF-8 encoding.' => 'فرمت فایل باید UTF-8 باشید.',
255
+
256
+ // in-place editing in select
257
+ 'Modify' => 'ویرایش',
258
+ 'Ctrl+click on a value to modify it.' => 'برای ویرایش بر روی مقدار ctrl+click کنید.',
259
+ 'Use edit link to modify this value.' => 'از لینک ویرایش برای ویرایش این مقدار استفاده کنید.',
260
+
261
+ // %s can contain auto-increment value
262
+ 'Item%s has been inserted.' => '%s آیتم درج شد.',
263
+ 'Item has been deleted.' => 'آیتم حذف شد.',
264
+ 'Item has been updated.' => 'آیتم بروز رسانی شد.',
265
+ '%d item(s) have been affected.' => array('%d آیتم متاثر شد.', '%d آیتم متاثر شد.'),
266
+ 'New item' => 'آیتم جدید',
267
+ 'original' => 'اصلی',
268
+ // label for value '' in enum data type
269
+ 'empty' => 'خالی',
270
+ 'edit' => 'ویرایش',
271
+ 'Edit' => 'ویرایش',
272
+ 'Insert' => 'درج',
273
+ 'Save' => 'ذخیره',
274
+ 'Save and continue edit' => 'ذخیره و ادامه ویرایش',
275
+ 'Save and insert next' => 'ذخیره و درج بعدی',
276
+ 'Selected' => 'انتخاب شده',
277
+ 'Clone' => 'تکثیر',
278
+ 'Delete' => 'حذف',
279
+ 'You have no privileges to update this table.' => 'شما اختیار ویرایش این جدول را ندارید.',
280
+
281
+ 'E-mail' => 'پست الکترونیک',
282
+ 'From' => 'فرستنده',
283
+ 'Subject' => 'موضوع',
284
+ 'Attachments' => 'پیوست ها',
285
+ 'Send' => 'ارسال',
286
+ '%d e-mail(s) have been sent.' => array('%d ایمیل ارسال شد.', '%d ایمیل ارسال شد.'),
287
+
288
+ // data type descriptions
289
+ 'Numbers' => 'اعداد',
290
+ 'Date and time' => 'تاریخ و زمان',
291
+ 'Strings' => 'رشته ها',
292
+ 'Binary' => 'دودویی',
293
+ 'Lists' => 'لیستها',
294
+ 'Network' => 'شبکه',
295
+ 'Geometry' => 'هندسه',
296
+ 'Relations' => 'رابطه ها',
297
+
298
+ 'Editor' => 'ویرایشگر',
299
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
300
+ '$1-$3-$5' => '$1-$3-$5',
301
+ // hint for date format - use language equivalents for day, month and year shortcuts
302
+ '[yyyy]-mm-dd' => '[yyyy]-mm-dd',
303
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
304
+ 'HH:MM:SS' => 'HH:MM:SS',
305
+ 'now' => 'اکنون',
306
+ 'yes' => 'بله',
307
+ 'no' => 'خیر',
308
+
309
+ // general SQLite error in create, drop or rename database
310
+ 'File exists.' => 'فایل موجود است.',
311
+ 'Please use one of the extensions %s.' => 'لطفا یکی از پسوندها را انتخاب نمائید %s.',
312
+
313
+ // PostgreSQL and MS SQL schema support
314
+ 'Alter schema' => 'ویرایش ساختار',
315
+ 'Create schema' => 'ایجاد ساختار',
316
+ 'Schema has been dropped.' => 'ساختار حذف شد.',
317
+ 'Schema has been created.' => 'ساختار ایجاد شد.',
318
+ 'Schema has been altered.' => 'ساختار ویرایش شد.',
319
+ 'Schema' => 'ساختار',
320
+ 'Invalid schema.' => 'ساختار نامعتبر.',
321
+
322
+ // PostgreSQL sequences support
323
+ 'Sequences' => 'صف ها',
324
+ 'Create sequence' => 'ایجاد صف',
325
+ 'Sequence has been dropped.' => 'صف حذف شد.',
326
+ 'Sequence has been created.' => 'صف ایجاد شد.',
327
+ 'Sequence has been altered.' => 'صف ویرایش شد.',
328
+ 'Alter sequence' => 'ویرایش صف',
329
+
330
+ // PostgreSQL user types support
331
+ 'User types' => 'انواع کاربر',
332
+ 'Create type' => 'ایجاد نوع',
333
+ 'Type has been dropped.' => 'نوع حذف شد.',
334
+ 'Type has been created.' => 'نوع ایجاد شد.',
335
+ 'Alter type' => 'ویرایش نوع',
336
+ );
adminer/adminer/adminer/lang/fi.inc.php ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Järjestelmä',
5
+ 'Server' => 'Palvelin',
6
+ 'Username' => 'Käyttäjänimi',
7
+ 'Password' => 'Salasana',
8
+ 'Permanent login' => 'Haluan pysyä kirjautuneena',
9
+ 'Login' => 'Kirjaudu',
10
+ 'Logout' => 'Kirjaudu ulos',
11
+ 'Logged as: %s' => 'Olet kirjautunut käyttäjänä: %s',
12
+ 'Logout successful.' => 'Uloskirjautuminen onnistui.',
13
+ 'Invalid credentials.' => 'Virheelliset kirjautumistiedot.',
14
+ 'Too many unsuccessful logins, try again in %d minute(s).' => array('Liian monta epäonnistunutta sisäänkirjautumisyritystä, kokeile uudestaan %d minuutin kuluttua.', 'Liian monta epäonnistunutta sisäänkirjautumisyritystä, kokeile uudestaan %d minuutin kuluttua.'),
15
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Master-salasana ei ole enää voimassa. <a href="https://www.adminer.org/en/extension/" target="_blank">Toteuta</a> %s-metodi sen tekemiseksi pysyväksi.',
16
+ 'Language' => 'Kieli',
17
+ 'Invalid CSRF token. Send the form again.' => 'Virheellinen CSRF-vastamerkki. Lähetä lomake uudelleen.',
18
+ 'If you did not send this request from Adminer then close this page.' => 'Jollet lähettänyt tämä pyyntö Adminerista, sulje tämä sivu.',
19
+ 'No extension' => 'Ei laajennusta',
20
+ 'None of the supported PHP extensions (%s) are available.' => 'Mitään tuetuista PHP-laajennuksista (%s) ei ole käytettävissä.',
21
+ 'Session support must be enabled.' => 'Istuntotuki on oltava päällä.',
22
+ 'Session expired, please login again.' => 'Istunto vanhentunut, kirjaudu uudelleen.',
23
+ '%s version: %s through PHP extension %s' => '%s versio: %s PHP-laajennuksella %s',
24
+ 'Refresh' => 'Virkistä',
25
+
26
+ // text direction - 'ltr' or 'rtl'
27
+ 'ltr' => 'ltr',
28
+
29
+ 'Privileges' => 'Oikeudet',
30
+ 'Create user' => 'Luo käyttäjä',
31
+ 'User has been dropped.' => 'Käyttäjä poistettiin.',
32
+ 'User has been altered.' => 'Käyttäjää muutettiin.',
33
+ 'User has been created.' => 'Käyttäjä luotiin.',
34
+ 'Hashed' => 'Hashed',
35
+ 'Column' => 'Sarake',
36
+ 'Routine' => 'Rutiini',
37
+ 'Grant' => 'Myönnä',
38
+ 'Revoke' => 'Kiellä',
39
+
40
+ 'Process list' => 'Prosessilista',
41
+ '%d process(es) have been killed.' => array('%d prosessi lopetettu.', '%d prosessia lopetettu..'),
42
+ 'Kill' => 'Lopeta',
43
+
44
+ 'Variables' => 'Muuttujat',
45
+ 'Status' => 'Tila',
46
+
47
+ 'SQL command' => 'SQL-komento',
48
+ '%d query(s) executed OK.' => array('%d kysely onnistui.', '%d kyselyä onnistui.'),
49
+ 'Query executed OK, %d row(s) affected.' => array('Kysely onnistui, kohdistui %d riviin.', 'Kysely onnistui, kohdistui %d riviin.'),
50
+ 'No commands to execute.' => 'Ei komentoja suoritettavana.',
51
+ 'Error in query' => 'Virhe kyselyssä',
52
+ 'Execute' => 'Suorita',
53
+ 'Stop on error' => 'Pysähdy virheeseen',
54
+ 'Show only errors' => 'Näytä vain virheet',
55
+ // sprintf() format for time of the command
56
+ '%.3f s' => '%.3f s',
57
+ 'History' => 'Historia',
58
+ 'Clear' => 'Tyhjennä',
59
+ 'Edit all' => 'Muokkaa kaikkia',
60
+
61
+ 'File upload' => 'Tiedoston lataus palvelimelle',
62
+ 'From server' => 'Verkkopalvelimella Adminer-kansiossa oleva tiedosto',
63
+ 'Webserver file %s' => 'Verkkopalvelintiedosto %s',
64
+ 'Run file' => 'Suorita tämä',
65
+ 'File does not exist.' => 'Tiedostoa ei ole.',
66
+ 'File uploads are disabled.' => 'Tiedostojen lataaminen palvelimelle on estetty.',
67
+ 'Unable to upload a file.' => 'Tiedostoa ei voida ladata palvelimelle.',
68
+ 'Maximum allowed file size is %sB.' => 'Suurin sallittu tiedostokoko on %sB.',
69
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Liian suuri POST-datamäärä. Pienennä dataa tai kasvata arvoa %s konfigurointitiedostossa.',
70
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Voit ladata suuren SQL-tiedoston FTP:n kautta ja tuoda sen sitten palvelimelta.',
71
+ 'You are offline.' => 'Olet offline-tilassa.',
72
+
73
+ 'Export' => 'Vienti',
74
+ 'Output' => 'Tulos',
75
+ 'open' => 'avaa',
76
+ 'save' => 'tallenna',
77
+ 'Saving' => 'Tallennetaan',
78
+ 'Format' => 'Muoto',
79
+ 'Data' => 'Data',
80
+
81
+ 'Database' => 'Tietokanta',
82
+ 'database' => 'tietokanta',
83
+ 'Use' => 'Käytä',
84
+ 'Select database' => 'Valitse tietokanta',
85
+ 'Invalid database.' => 'Tietokanta ei kelpaa.',
86
+ 'Create new database' => 'Luo uusi tietokanta',
87
+ 'Database has been dropped.' => 'Tietokanta on poistettu.',
88
+ 'Databases have been dropped.' => 'Tietokannat on poistettu.',
89
+ 'Database has been created.' => 'Tietokanta on luotu.',
90
+ 'Database has been renamed.' => 'Tietokanta on nimetty uudelleen.',
91
+ 'Database has been altered.' => 'Tietokantaa on muutettu.',
92
+ 'Alter database' => 'Muuta tietokantaa',
93
+ 'Create database' => 'Luo tietokanta',
94
+ 'Database schema' => 'Tietokantakaava',
95
+
96
+ // link to current database schema layout
97
+ 'Permanent link' => 'Pysyvä linkki',
98
+
99
+ // thousands separator - must contain single byte
100
+ ',' => ',',
101
+ '0123456789' => '0123456789',
102
+ 'Engine' => 'Moottori',
103
+ 'Collation' => 'Kollaatio',
104
+ 'Data Length' => 'Datan pituus',
105
+ 'Index Length' => 'Indeksin pituus',
106
+ 'Data Free' => 'Vapaa tila',
107
+ 'Rows' => 'Riviä',
108
+ '%d in total' => '%d kaikkiaan',
109
+ 'Analyze' => 'Analysoi',
110
+ 'Optimize' => 'Optimoi',
111
+ 'Vacuum' => 'Siivoa',
112
+ 'Check' => 'Tarkista',
113
+ 'Repair' => 'Korjaa',
114
+ 'Truncate' => 'Tyhjennä',
115
+ 'Tables have been truncated.' => 'Taulujen sisältö on tyhjennetty.',
116
+ 'Move to other database' => 'Siirrä toiseen tietokantaan',
117
+ 'Move' => 'Siirrä',
118
+ 'Tables have been moved.' => 'Taulut on siirretty.',
119
+ 'Copy' => 'Kopioi',
120
+ 'Tables have been copied.' => 'Taulut on kopioitu.',
121
+
122
+ 'Routines' => 'Rutiinit',
123
+ 'Routine has been called, %d row(s) affected.' => array('Rutiini kutsuttu, kohdistui %d riviin.', 'Rutiini kutsuttu, kohdistui %d riviin.'),
124
+ 'Call' => 'Kutsua',
125
+ 'Parameter name' => 'Parametrin nimi',
126
+ 'Create procedure' => 'Luo proseduuri',
127
+ 'Create function' => 'Luo funktio',
128
+ 'Routine has been dropped.' => 'Rutiini on poistettu.',
129
+ 'Routine has been altered.' => 'Rutiinia on muutettu.',
130
+ 'Routine has been created.' => 'Rutiini on luotu.',
131
+ 'Alter function' => 'Muuta funktiota',
132
+ 'Alter procedure' => 'Muuta proseduuria',
133
+ 'Return type' => 'Palautustyyppi',
134
+
135
+ 'Events' => 'Tapahtumat',
136
+ 'Event has been dropped.' => 'Tapahtuma on poistettu.',
137
+ 'Event has been altered.' => 'Tapahtumaa on muutettu.',
138
+ 'Event has been created.' => 'Tapahtuma on luotu.',
139
+ 'Alter event' => 'Muuta tapahtumaa',
140
+ 'Create event' => 'Luo tapahtuma',
141
+ 'At given time' => 'Tiettynä aikana',
142
+ 'Every' => 'Joka',
143
+ 'Schedule' => 'Aikataulu',
144
+ 'Start' => 'Aloitus',
145
+ 'End' => 'Lopetus',
146
+ 'On completion preserve' => 'Säilytä, kun valmis',
147
+
148
+ 'Tables' => 'Taulut',
149
+ 'Tables and views' => 'Taulut ja näkymät',
150
+ 'Table' => 'Taulu',
151
+ 'No tables.' => 'Ei tauluja.',
152
+ 'Alter table' => 'Muuta taulua',
153
+ 'Create table' => 'Luo taulu',
154
+ 'Table has been dropped.' => 'Taulu on poistettu.',
155
+ 'Tables have been dropped.' => 'Tauluja on poistettu.',
156
+ 'Tables have been optimized.' => 'Taulut on optimoitu.',
157
+ 'Table has been altered.' => 'Taulua on muutettu.',
158
+ 'Table has been created.' => 'Taulu on luotu.',
159
+ 'Table name' => 'Taulun nimi',
160
+ 'Show structure' => 'Näytä rakenne',
161
+ 'engine' => 'moottori',
162
+ 'collation' => 'kollaatio',
163
+ 'Column name' => 'Sarakkeen nimi',
164
+ 'Type' => 'Tyyppi',
165
+ 'Length' => 'Pituus',
166
+ 'Auto Increment' => 'Automaattinen lisäys',
167
+ 'Options' => 'Asetukset',
168
+ 'Comment' => 'Kommentit',
169
+ 'Default value' => 'Oletusarvo',
170
+ 'Default values' => 'Oletusarvot',
171
+ 'Drop' => 'Poista',
172
+ 'Are you sure?' => 'Oletko varma?',
173
+ 'Size' => 'Koko',
174
+ 'Compute' => 'Laske',
175
+ 'Move up' => 'Siirrä ylös',
176
+ 'Move down' => 'Siirrä alas',
177
+ 'Remove' => 'Poista',
178
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Kenttien sallittu enimmäismäärä ylitetty. Kasvata arvoa %s.',
179
+
180
+ 'Partition by' => 'Osioi arvolla',
181
+ 'Partitions' => 'Osiot',
182
+ 'Partition name' => 'Osion nimi',
183
+ 'Values' => 'Arvot',
184
+
185
+ 'View' => 'Näkymä',
186
+ 'Materialized View' => 'Materialisoitunut näkymä',
187
+ 'View has been dropped.' => 'Näkymä on poistettu.',
188
+ 'View has been altered.' => 'Näkymää on muutettu.',
189
+ 'View has been created.' => 'Näkymä on luotu.',
190
+ 'Alter view' => 'Muuta näkymää',
191
+ 'Create view' => 'Luo näkymä',
192
+ 'Create materialized view' => 'Luo materialisoitunut näkymä',
193
+
194
+ 'Indexes' => 'Indeksit',
195
+ 'Indexes have been altered.' => 'Indeksejä on muutettu.',
196
+ 'Alter indexes' => 'Muuta indeksejä',
197
+ 'Add next' => 'Lisää seuraava',
198
+ 'Index Type' => 'Indeksityyppi',
199
+ 'Column (length)' => 'Sarake (pituus)',
200
+
201
+ 'Foreign keys' => 'Vieraat avaimet',
202
+ 'Foreign key' => 'Vieras avain',
203
+ 'Foreign key has been dropped.' => 'Vieras avain on poistettu.',
204
+ 'Foreign key has been altered.' => 'Vierasta avainta on muutettu.',
205
+ 'Foreign key has been created.' => 'Vieras avain on luotu.',
206
+ 'Target table' => 'Kohdetaulu',
207
+ 'Change' => 'Muuta',
208
+ 'Source' => 'Lähde',
209
+ 'Target' => 'Kohde',
210
+ 'Add column' => 'Lisää sarake',
211
+ 'Alter' => 'Muuta',
212
+ 'Add foreign key' => 'Lisää vieras avain',
213
+ 'ON DELETE' => 'ON DELETE',
214
+ 'ON UPDATE' => 'ON UPDATE',
215
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Lähde- ja kohdesarakkeiden tulee olla samaa tietotyyppiä, kohdesarakkeisiin tulee olla indeksi ja dataa, johon viitataan, täytyy olla.',
216
+
217
+ 'Triggers' => 'Liipaisimet',
218
+ 'Add trigger' => 'Lisää liipaisin',
219
+ 'Trigger has been dropped.' => 'Liipaisin on poistettu.',
220
+ 'Trigger has been altered.' => 'Liipaisinta on muutettu.',
221
+ 'Trigger has been created.' => 'Liipaisin on luotu.',
222
+ 'Alter trigger' => 'Muuta liipaisinta',
223
+ 'Create trigger' => 'Luo liipaisin',
224
+ 'Time' => 'Aika',
225
+ 'Event' => 'Tapahtuma',
226
+ 'Name' => 'Nimi',
227
+
228
+ 'select' => 'valitse',
229
+ 'Select' => 'Valitse',
230
+ 'Select data' => 'Valitse data',
231
+ 'Functions' => 'Funktiot',
232
+ 'Aggregation' => 'Aggregaatiot',
233
+ 'Search' => 'Hae',
234
+ 'anywhere' => 'kaikkialta',
235
+ 'Search data in tables' => 'Hae dataa tauluista',
236
+ 'Sort' => 'Lajittele',
237
+ 'descending' => 'alenevasti',
238
+ 'Limit' => 'Raja',
239
+ 'Limit rows' => 'Rajoita rivimäärää',
240
+ 'Text length' => 'Tekstin pituus',
241
+ 'Action' => 'Toimenpide',
242
+ 'Full table scan' => 'Koko taulun läpikäynti',
243
+ 'Unable to select the table' => 'Taulua ei voitu valita',
244
+ 'No rows.' => 'Ei rivejä.',
245
+ '%d / ' => '%d / ',
246
+ '%d row(s)' => array('%d rivi', '%d riviä'),
247
+ 'Page' => 'Sivu',
248
+ 'last' => 'viimeinen',
249
+ 'Load more data' => 'Lataa lisää dataa',
250
+ 'Loading' => 'Ladataan',
251
+ 'whole result' => 'koko tulos',
252
+ '%d byte(s)' => array('%d tavu', '%d tavua'),
253
+
254
+ 'Import' => 'Tuonti',
255
+ '%d row(s) have been imported.' => array('%d rivi tuotiin.', '%d riviä tuotiin.'),
256
+ 'File must be in UTF-8 encoding.' => 'Tiedoston täytyy olla UTF-8-muodossa.',
257
+
258
+ // in-place editing in select
259
+ 'Modify' => 'Muuta',
260
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+napsauta arvoa muuttaaksesi.',
261
+ 'Use edit link to modify this value.' => 'Käytä muokkaa-linkkiä muuttaaksesi tätä arvoa.',
262
+
263
+ // %s can contain auto-increment value
264
+ 'Item%s has been inserted.' => 'Tietue%s lisättiin.',
265
+ 'Item has been deleted.' => 'Tietue poistettiin.',
266
+ 'Item has been updated.' => 'Tietue päivitettiin.',
267
+ '%d item(s) have been affected.' => array('Kohdistui %d tietueeseen.', 'Kohdistui %d tietueeseen.'),
268
+ 'New item' => 'Uusi tietue',
269
+ 'original' => 'alkuperäinen',
270
+ // label for value '' in enum data type
271
+ 'empty' => 'tyhjä',
272
+ 'edit' => 'muokkaa',
273
+ 'Edit' => 'Muokkaa',
274
+ 'Insert' => 'Lisää',
275
+ 'Save' => 'Tallenna',
276
+ 'Save and continue edit' => 'Tallenna ja jatka muokkaamista',
277
+ 'Save and insert next' => 'Tallenna ja lisää seuraava',
278
+ 'Selected' => 'Valitut',
279
+ 'Clone' => 'Kloonaa',
280
+ 'Delete' => 'Poista',
281
+ 'You have no privileges to update this table.' => 'Sinulla ei ole oikeutta päivittää tätä taulua.',
282
+
283
+ 'E-mail' => 'S-posti',
284
+ 'From' => 'Lähettäjä',
285
+ 'Subject' => 'Aihe',
286
+ 'Attachments' => 'Liitteet',
287
+ 'Send' => 'Lähetä',
288
+ '%d e-mail(s) have been sent.' => array('% sähköpostiviestiä lähetetty.', '% sähköpostiviestiä lähetetty.'),
289
+
290
+ // data type descriptions
291
+ 'Numbers' => 'Numerot',
292
+ 'Date and time' => 'Päiväys ja aika',
293
+ 'Strings' => 'Merkkijonot',
294
+ 'Binary' => 'Binäärinen',
295
+ 'Lists' => 'Luettelot',
296
+ 'Network' => 'Verkko',
297
+ 'Geometry' => 'Geometria',
298
+ 'Relations' => 'Suhteet',
299
+
300
+ 'Editor' => 'Editori',
301
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
302
+ '$1-$3-$5' => '$5.$3.$1',
303
+ // hint for date format - use language equivalents for day, month and year shortcuts
304
+ '[yyyy]-mm-dd' => 'pp.kk.[vvvv]',
305
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
306
+ 'HH:MM:SS' => 'HH:MM:SS',
307
+ 'now' => 'nyt',
308
+ 'yes' => 'kyllä',
309
+ 'no' => 'ei',
310
+
311
+ // general SQLite error in create, drop or rename database
312
+ 'File exists.' => 'Tiedosto on olemassa.',
313
+ 'Please use one of the extensions %s.' => 'Käytä jotain %s-laajennuksista.',
314
+
315
+ // PostgreSQL and MS SQL schema support
316
+ 'Alter schema' => 'Muuta kaavaa',
317
+ 'Create schema' => 'Luo kaava',
318
+ 'Schema has been dropped.' => 'Kaava poistettiin.',
319
+ 'Schema has been created.' => 'Kaava luotiin.',
320
+ 'Schema has been altered.' => 'Kaavaa muutettiin.',
321
+ 'Schema' => 'Kaava',
322
+ 'Invalid schema.' => 'Kaava ei kelpaa.',
323
+
324
+ // PostgreSQL sequences support
325
+ 'Sequences' => 'Sekvenssit',
326
+ 'Create sequence' => 'Luo sekvenssi',
327
+ 'Sequence has been dropped.' => 'Sekvenssi on poistettu.',
328
+ 'Sequence has been created.' => 'Sekvenssi on luotu.',
329
+ 'Sequence has been altered.' => 'Sekvenssiä on muutettu.',
330
+ 'Alter sequence' => 'Muuta sekvenssiä',
331
+
332
+ // PostgreSQL user types support
333
+ 'User types' => 'Käyttäjän tyypit',
334
+ 'Create type' => 'Luo tyyppi',
335
+ 'Type has been dropped.' => 'Tyyppi poistettiin.',
336
+ 'Type has been created.' => 'Tyyppi luotiin.',
337
+ 'Alter type' => 'Muuta tyyppiä',
338
+ );
adminer/adminer/adminer/lang/fr.inc.php ADDED
@@ -0,0 +1,293 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Authentification',
4
+ 'Logout successful.' => 'Au revoir !',
5
+ 'Invalid credentials.' => 'Authentification échouée.',
6
+ 'Server' => 'Serveur',
7
+ 'Username' => 'Utilisateur',
8
+ 'Password' => 'Mot de passe',
9
+ 'Select database' => 'Sélectionner la base de données',
10
+ 'Invalid database.' => 'Base de données invalide.',
11
+ 'Create new database' => 'Créer une base de données',
12
+ 'Table has been dropped.' => 'La table a été effacée.',
13
+ 'Table has been altered.' => 'La table a été modifiée.',
14
+ 'Table has been created.' => 'La table a été créée.',
15
+ 'Alter table' => 'Modifier la table',
16
+ 'Create table' => 'Créer une table',
17
+ 'Table name' => 'Nom de la table',
18
+ 'engine' => 'moteur',
19
+ 'collation' => 'interclassement',
20
+ 'Column name' => 'Nom de la colonne',
21
+ 'Type' => 'Type',
22
+ 'Length' => 'Longueur',
23
+ 'Auto Increment' => 'Incrément automatique',
24
+ 'Options' => 'Options',
25
+ 'Save' => 'Enregistrer',
26
+ 'Drop' => 'Supprimer',
27
+ 'Database has been created.' => 'La base de données a été créée.',
28
+ 'Database has been renamed.' => 'La base de données a été renommée.',
29
+ 'Database has been altered.' => 'La base de données a été modifiée.',
30
+ 'Alter database' => 'Modifier la base de données',
31
+ 'Create database' => 'Créer une base de données',
32
+ 'SQL command' => 'Requête SQL',
33
+ 'Logout' => 'Déconnexion',
34
+ 'database' => 'base de données',
35
+ 'Use' => 'Utiliser',
36
+ 'No tables.' => 'Aucune table.',
37
+ 'select' => 'select',
38
+ 'Item has been deleted.' => 'L\'élément a été supprimé.',
39
+ 'Item has been updated.' => 'L\'élément a été modifié.',
40
+ 'Edit' => 'Modifier',
41
+ 'Insert' => 'Insérer',
42
+ 'Save and insert next' => 'Enr. et insérer prochain',
43
+ 'Delete' => 'Effacer',
44
+ 'Database' => 'Base de données',
45
+ 'Routines' => 'Routines',
46
+ 'Indexes have been altered.' => 'Index modifiés.',
47
+ 'Indexes' => 'Index',
48
+ 'Alter indexes' => 'Modifier les index',
49
+ 'Add next' => 'Ajouter le prochain',
50
+ 'Language' => 'Langue',
51
+ 'Select' => 'Sélectionner',
52
+ 'New item' => 'Nouvel élément',
53
+ 'Search' => 'Rechercher',
54
+ 'Sort' => 'Trier',
55
+ 'descending' => 'décroissant',
56
+ 'Limit' => 'Limite',
57
+ 'No rows.' => 'Aucun résultat.',
58
+ 'Action' => 'Action',
59
+ 'edit' => 'modifier',
60
+ 'Page' => 'Page',
61
+ 'Query executed OK, %d row(s) affected.' => array('Requête exécutée avec succès, %d ligne modifiée.', 'Requête exécutée avec succès, %d lignes modifiées.'),
62
+ 'Error in query' => 'Erreur dans la requête',
63
+ 'Execute' => 'Exécuter',
64
+ 'Table' => 'Table',
65
+ 'Foreign keys' => 'Clés étrangères',
66
+ 'Triggers' => 'Déclencheurs',
67
+ 'View' => 'Vue',
68
+ 'Unable to select the table' => 'Impossible de sélectionner la table',
69
+ 'Invalid CSRF token. Send the form again.' => 'Token CSRF invalide. Veuillez renvoyer le formulaire.',
70
+ 'Comment' => 'Commentaire',
71
+ 'Default values' => 'Valeurs par défaut',
72
+ '%d byte(s)' => array('%d octet', '%d octets'),
73
+ 'No commands to execute.' => 'Aucune commande à exécuter.',
74
+ 'Unable to upload a file.' => 'Impossible d\'importer le fichier.',
75
+ 'File upload' => 'Importer un fichier',
76
+ 'File uploads are disabled.' => 'L\'importation de fichier est désactivée.',
77
+ 'Routine has been called, %d row(s) affected.' => array('La routine a été exécutée, %d ligne modifiée.', 'La routine a été exécutée, %d lignes modifiées.'),
78
+ 'Call' => 'Appeler',
79
+ 'No extension' => 'Extension introuvable',
80
+ 'None of the supported PHP extensions (%s) are available.' => 'Aucune des extensions PHP supportées (%s) n\'est disponible.',
81
+ 'Session support must be enabled.' => 'Veuillez activer les sessions.',
82
+ 'Session expired, please login again.' => 'Session expirée, veuillez vous authentifier à nouveau.',
83
+ 'Text length' => 'Longueur du texte',
84
+ 'Foreign key has been dropped.' => 'La clé étrangère a été effacée.',
85
+ 'Foreign key has been altered.' => 'La clé étrangère a été modifiée.',
86
+ 'Foreign key has been created.' => 'La clé étrangère a été créée.',
87
+ 'Foreign key' => 'Clé étrangère',
88
+ 'Target table' => 'Table visée',
89
+ 'Change' => 'Modifier',
90
+ 'Source' => 'Source',
91
+ 'Target' => 'Cible',
92
+ 'Add column' => 'Ajouter une colonne',
93
+ 'Alter' => 'Modifier',
94
+ 'Add foreign key' => 'Ajouter une clé étrangère',
95
+ 'ON DELETE' => 'ON DELETE',
96
+ 'ON UPDATE' => 'ON UPDATE',
97
+ 'Index Type' => 'Type d\'index',
98
+ 'Column (length)' => 'Colonne (longueur)',
99
+ 'View has been dropped.' => 'La vue a été effacée.',
100
+ 'View has been altered.' => 'La vue a été modifiée.',
101
+ 'View has been created.' => 'La vue a été créée.',
102
+ 'Alter view' => 'Modifier une vue',
103
+ 'Create view' => 'Créer une vue',
104
+ 'Name' => 'Nom',
105
+ 'Process list' => 'Liste des processus',
106
+ '%d process(es) have been killed.' => array('%d processus a été arrêté.', '%d processus ont été arrêtés.'),
107
+ 'Kill' => 'Arrêter',
108
+ 'Parameter name' => 'Nom du paramètre',
109
+ 'Database schema' => 'Schéma de la base de données',
110
+ 'Create procedure' => 'Créer une procédure',
111
+ 'Create function' => 'Créer une fonction',
112
+ 'Routine has been dropped.' => 'La routine a été supprimée.',
113
+ 'Routine has been altered.' => 'La routine a été modifiée.',
114
+ 'Routine has been created.' => 'La routine a été créée.',
115
+ 'Alter function' => 'Modifier la fonction',
116
+ 'Alter procedure' => 'Modifier la procédure',
117
+ 'Return type' => 'Type de retour',
118
+ 'Add trigger' => 'Ajouter un déclencheur',
119
+ 'Trigger has been dropped.' => 'Le déclencheur a été supprimé.',
120
+ 'Trigger has been altered.' => 'Le déclencheur a été modifié.',
121
+ 'Trigger has been created.' => 'Le déclencheur a été créé.',
122
+ 'Alter trigger' => 'Modifier un déclencheur',
123
+ 'Create trigger' => 'Ajouter un déclencheur',
124
+ 'Time' => 'Temps',
125
+ 'Event' => 'Évènement',
126
+ '%d row(s)' => array('%d ligne', '%d lignes'),
127
+ 'Remove' => 'Effacer',
128
+ 'Are you sure?' => 'Êtes-vous certain(e) ?',
129
+ 'Privileges' => 'Privilèges',
130
+ 'Create user' => 'Créer un utilisateur',
131
+ 'User has been dropped.' => 'L\'utilisateur a été effacé.',
132
+ 'User has been altered.' => 'L\'utilisateur a été modifié.',
133
+ 'User has been created.' => 'L\'utilisateur a été créé.',
134
+ 'Hashed' => 'Haché',
135
+ 'Column' => 'Colonne',
136
+ 'Routine' => 'Routine',
137
+ 'Grant' => 'Grant',
138
+ 'Revoke' => 'Revoke',
139
+ '%s version: %s through PHP extension %s' => 'Version de %s : %s via l\'extension PHP %s',
140
+ 'Logged as: %s' => 'Authentifié en tant que : %s',
141
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Données POST trop grandes. Réduisez la taille des données ou augmentez la valeur de %s dans la configuration de PHP.',
142
+ 'Move up' => 'Déplacer vers le haut',
143
+ 'Move down' => 'Déplacer vers le bas',
144
+ 'Export' => 'Exporter',
145
+ 'Tables' => 'Tables',
146
+ 'Data' => 'Données',
147
+ 'Output' => 'Sortie',
148
+ 'open' => 'ouvrir',
149
+ 'save' => 'enregistrer',
150
+ 'Format' => 'Format',
151
+ 'Functions' => 'Fonctions',
152
+ 'Aggregation' => 'Agrégation',
153
+ 'Event has been dropped.' => 'L\'évènement a été supprimé.',
154
+ 'Event has been altered.' => 'L\'évènement a été modifié.',
155
+ 'Event has been created.' => 'L\'évènement a été créé.',
156
+ 'Alter event' => 'Modifier un évènement',
157
+ 'Create event' => 'Créer un évènement',
158
+ 'Start' => 'Démarrer',
159
+ 'End' => 'Terminer',
160
+ 'Every' => 'Chaque',
161
+ 'Status' => 'Statut',
162
+ 'On completion preserve' => 'Conserver quand complété',
163
+ 'Events' => 'Évènements',
164
+ 'Schedule' => 'Horaire',
165
+ 'At given time' => 'À un moment précis',
166
+ 'Save and continue edit' => 'Enr. et continuer édition',
167
+ 'original' => 'original',
168
+ 'Tables have been truncated.' => 'Les tables ont été tronquées.',
169
+ 'Tables have been moved.' => 'Les tables ont été déplacées.',
170
+ 'Tables have been dropped.' => 'Les tables ont été effacées.',
171
+ 'Tables and views' => 'Tables et vues',
172
+ 'Engine' => 'Moteur',
173
+ 'Collation' => 'Interclassement',
174
+ 'Data Length' => 'Longueur des données',
175
+ 'Index Length' => 'Longueur de l\'index',
176
+ 'Data Free' => 'Espace inutilisé',
177
+ 'Rows' => 'Lignes',
178
+ ',' => ',',
179
+ '0123456789' => '0123456789',
180
+ 'Analyze' => 'Analyser',
181
+ 'Optimize' => 'Optimiser',
182
+ 'Check' => 'Vérifier',
183
+ 'Repair' => 'Réparer',
184
+ 'Truncate' => 'Tronquer',
185
+ 'Move to other database' => 'Déplacer vers une autre base de données',
186
+ 'Move' => 'Déplacer',
187
+ '%d item(s) have been affected.' => array('%d élément a été modifié.', '%d éléments ont été modifiés.'),
188
+ 'whole result' => 'résultat entier',
189
+ 'Clone' => 'Cloner',
190
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Le nombre maximum de champs est dépassé. Veuillez augmenter %s.',
191
+ 'Partition by' => 'Partitionner par',
192
+ 'Partitions' => 'Partitions',
193
+ 'Partition name' => 'Nom de la partition',
194
+ 'Values' => 'Valeurs',
195
+ '%d row(s) have been imported.' => array('%d ligne a été importée.', '%d lignes ont été importées.'),
196
+ 'anywhere' => 'n\'importe où',
197
+ 'Import' => 'Importer',
198
+ 'Stop on error' => 'Arrêter en cas d\'erreur',
199
+ '%.3f s' => '%.3f s',
200
+ '$1-$3-$5' => '$5/$3/$1',
201
+ '[yyyy]-mm-dd' => 'jj/mm/[aaaa]',
202
+ 'History' => 'Historique',
203
+ 'Variables' => 'Variables',
204
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Les colonnes de source et de destination doivent être du même type, il doit y avoir un index sur les colonnes de destination et les données référencées doivent exister.',
205
+ 'Relations' => 'Relations',
206
+ 'Run file' => 'Exécuter le fichier',
207
+ 'Clear' => 'Effacer',
208
+ 'Maximum allowed file size is %sB.' => 'La taille maximale des fichiers est de %sB.',
209
+ 'Numbers' => 'Nombres',
210
+ 'Date and time' => 'Date et heure',
211
+ 'Strings' => 'Chaînes',
212
+ 'Binary' => 'Binaires',
213
+ 'Lists' => 'Listes',
214
+ 'Editor' => 'Éditeur',
215
+ 'E-mail' => 'Courriel',
216
+ 'From' => 'De',
217
+ 'Subject' => 'Sujet',
218
+ 'Send' => 'Envoyer',
219
+ '%d e-mail(s) have been sent.' => array('%d message a été envoyé.', '%d messages ont été envoyés.'),
220
+ 'Webserver file %s' => 'Fichier %s du serveur Web',
221
+ 'File does not exist.' => 'Le fichier est introuvable.',
222
+ '%d in total' => '%d au total',
223
+ 'Permanent login' => 'Authentification permanente',
224
+ 'Databases have been dropped.' => 'Les bases de données ont été supprimées.',
225
+ 'Database has been dropped.' => 'La base de données a été supprimée.',
226
+ 'Search data in tables' => 'Rechercher dans les tables',
227
+ 'Schema' => 'Schéma',
228
+ 'Alter schema' => 'Modifier le schéma',
229
+ 'Create schema' => 'Créer un schéma',
230
+ 'Schema has been dropped.' => 'Le schéma a été supprimé.',
231
+ 'Schema has been created.' => 'Le schéma a été créé.',
232
+ 'Schema has been altered.' => 'Le schéma a été modifié.',
233
+ 'Sequences' => 'Séquences',
234
+ 'Create sequence' => 'Créer une séquence',
235
+ 'Alter sequence' => 'Modifier la séquence',
236
+ 'Sequence has been dropped.' => 'La séquence a été supprimée.',
237
+ 'Sequence has been created.' => 'La séquence a été créée.',
238
+ 'Sequence has been altered.' => 'La séquence a été modifiée.',
239
+ 'User types' => 'Types utilisateur',
240
+ 'Create type' => 'Créer un type',
241
+ 'Alter type' => 'Modifier le type',
242
+ 'Type has been dropped.' => 'Le type a été supprimé.',
243
+ 'Type has been created.' => 'Le type a été créé.',
244
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+cliquez sur une valeur pour la modifier.',
245
+ 'Use edit link to modify this value.' => 'Utilisez le lien "modifier" pour modifier cette valeur.',
246
+ 'last' => 'dernière',
247
+ 'From server' => 'Depuis le serveur',
248
+ 'System' => 'Système',
249
+ 'Select data' => 'Afficher les données',
250
+ 'Show structure' => 'Afficher la structure',
251
+ 'empty' => 'vide',
252
+ 'Network' => 'Réseau',
253
+ 'Geometry' => 'Géométrie',
254
+ 'File exists.' => 'Le fichier existe.',
255
+ 'Attachments' => 'Pièces jointes',
256
+ 'Item%s has been inserted.' => 'L\'élément%s a été inséré.',
257
+ 'now' => 'maintenant',
258
+ '%d query(s) executed OK.' => array('%d requête exécutée avec succès.', '%d requêtes exécutées avec succès.'),
259
+ 'Show only errors' => 'Montrer seulement les erreurs',
260
+ 'Refresh' => 'Rafraîchir',
261
+ 'Invalid schema.' => 'Schéma invalide.',
262
+ 'Please use one of the extensions %s.' => 'Veuillez utiliser l\'une des extensions %s.',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'Les tables ont été copiées.',
265
+ 'Copy' => 'Copier',
266
+ 'Permanent link' => 'Lien permanent',
267
+ 'Edit all' => 'Tout modifier',
268
+ 'HH:MM:SS' => 'HH:MM:SS',
269
+ 'Selected' => 'Sélectionnée(s)',
270
+ 'Modify' => 'Modification',
271
+ 'Load more data' => 'Charger plus de données',
272
+ 'Loading' => 'Chargement',
273
+ 'Tables have been optimized.' => 'Les tables ont bien été optimisées.',
274
+ 'Vacuum' => 'Vide',
275
+ 'File must be in UTF-8 encoding.' => 'Les fichiers doivent être encodés en UTF-8.',
276
+ 'Full table scan' => 'Scan de toute la table',
277
+ 'Too many unsuccessful logins, try again in %d minute(s).' => array('Trop de connexions échouées, essayez à nouveau dans %d minute.', 'Trop de connexions échouées, essayez à nouveau dans %d minutes.'),
278
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Le mot de passe a expiré. <a href="https://www.adminer.org/en/extension/" target="_blank">Implémentez</a> la méthode %s afin de le rendre permanent.',
279
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Vous pouvez uploader un gros fichier SQL par FTP et ensuite l\'importer depuis le serveur.',
280
+ 'Size' => 'Taille',
281
+ 'Compute' => 'Calcul',
282
+ 'You have no privileges to update this table.' => 'Vous n\'avez pas les droits pour mettre à jour cette table.',
283
+ 'Saving' => 'Enregistrement',
284
+ 'yes' => 'oui',
285
+ 'no' => 'non',
286
+ 'Materialized View' => 'Vue matérialisée',
287
+ 'Create materialized view' => 'Créer une vue matérialisée',
288
+ '%d / ' => '%d / ',
289
+ 'Limit rows' => 'Limiter les lignes',
290
+ 'Default value' => 'Valeur par défaut',
291
+ 'If you did not send this request from Adminer then close this page.' => 'Si vous n\'avez pas envoyé cette requête depuis Adminer, alors fermez cette page.',
292
+ 'You are offline.' => 'Vous êtes hors ligne.',
293
+ );
adminer/adminer/adminer/lang/gl.inc.php ADDED
@@ -0,0 +1,293 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Conectar',
4
+ 'Logout successful.' => 'Pechouse a sesión con éxito.',
5
+ 'Invalid credentials.' => 'Credenciais (usuario e/ou contrasinal) inválidos.',
6
+ 'Server' => 'Servidor',
7
+ 'Username' => 'Usuario',
8
+ 'Password' => 'Contrasinal',
9
+ 'Select database' => 'Seleccionar Base de datos',
10
+ 'Invalid database.' => 'Base de datos incorrecta.',
11
+ 'Create new database' => 'Crear nova base de datos',
12
+ 'Table has been dropped.' => 'Eliminouse a táboa.',
13
+ 'Table has been altered.' => 'Modificouse a táboa.',
14
+ 'Table has been created.' => 'Creouse a táboa.',
15
+ 'Alter table' => 'Modificar táboa',
16
+ 'Create table' => 'Crear táboa',
17
+ 'Table name' => 'Nome da táboa',
18
+ 'engine' => 'motor',
19
+ 'collation' => 'xogo de caracteres (collation)',
20
+ 'Column name' => 'Nome da columna',
21
+ 'Type' => 'Tipo',
22
+ 'Length' => 'Lonxitude',
23
+ 'Auto Increment' => 'Incremento automático',
24
+ 'Options' => 'Opcións',
25
+ 'Save' => 'Gardar',
26
+ 'Drop' => 'Eliminar',
27
+ 'Database has been dropped.' => 'Eliminouse a base de datos.',
28
+ 'Database has been created.' => 'Creouse a base de datos.',
29
+ 'Database has been renamed.' => 'Renomeouse a base de datos.',
30
+ 'Database has been altered.' => 'Modificouse a base de datos.',
31
+ 'Alter database' => 'Modificar Base de datos',
32
+ 'Create database' => 'Crear Base de datos',
33
+ 'SQL command' => 'Comando SQL',
34
+ 'Logout' => 'Pechar sesión',
35
+ 'database' => 'base de datos',
36
+ 'Use' => 'Usar',
37
+ 'No tables.' => 'Nengunha táboa.',
38
+ 'select' => 'selecciona',
39
+ 'Item has been deleted.' => 'Eliminouse o elemento.',
40
+ 'Item has been updated.' => 'Modificouse o elemento.',
41
+ 'Item%s has been inserted.' => 'Inseríuse o elemento%s.',
42
+ 'Edit' => 'Editar',
43
+ 'Insert' => 'Inserir',
44
+ 'Save and insert next' => 'Guardar e inserir seguinte',
45
+ 'Delete' => 'Borrar',
46
+ 'Database' => 'Base de datos',
47
+ 'Routines' => 'Rutinas',
48
+ 'Indexes have been altered.' => 'Alteráronse os índices.',
49
+ 'Indexes' => 'Índices',
50
+ 'Alter indexes' => 'Modificar índices',
51
+ 'Add next' => 'Engadir seguinte',
52
+ 'Language' => 'Lingua',
53
+ 'Select' => 'Seleccionar',
54
+ 'New item' => 'Novo elemento',
55
+ 'Search' => 'Buscar',
56
+ 'Sort' => 'Ordenar',
57
+ 'descending' => 'descendente',
58
+ 'Limit' => 'Límite',
59
+ 'No rows.' => 'Nengún resultado.',
60
+ 'Action' => 'Acción',
61
+ 'edit' => 'editar',
62
+ 'Page' => 'Páxina',
63
+ 'Query executed OK, %d row(s) affected.' => array('Consulta executada, %d fila afectada.', 'Consulta executada, %d filas afectadas.'),
64
+ 'Error in query' => 'Erro na consulta',
65
+ 'Execute' => 'Executar',
66
+ 'Table' => 'Táboa',
67
+ 'Foreign keys' => 'Chaves externas',
68
+ 'Triggers' => 'Disparadores',
69
+ 'View' => 'Vista',
70
+ 'Unable to select the table' => 'No é posible seleccionar a táboa',
71
+ 'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Envíe de novo os datos do formulario.',
72
+ 'Comment' => 'Comentario',
73
+ 'Default values' => 'Valores predeterminados',
74
+ '%d byte(s)' => array('%d byte', '%d bytes'),
75
+ 'No commands to execute.' => 'Non hai comandos para executar.',
76
+ 'Unable to upload a file.' => 'Non é posible importar o ficheiro.',
77
+ 'File upload' => 'Importar ficheiro',
78
+ 'File uploads are disabled.' => 'Importación de ficheiros deshablilitada.',
79
+ 'Routine has been called, %d row(s) affected.' => array('Chamouse á rutina, %d fila afectada.', 'Chamouse á rutina, %d filas afectadas.'),
80
+ 'Call' => 'Chamar',
81
+ 'No extension' => 'Non ten extensión',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'Ningunha das extensións PHP soportadas (%s) está dispoñible.',
83
+ 'Session support must be enabled.' => 'As sesións deben estar habilitadas.',
84
+ 'Session expired, please login again.' => 'Caducou a sesión, por favor acceda de novo.',
85
+ 'Text length' => 'Lonxitud do texto',
86
+ 'Foreign key has been dropped.' => 'Eliminouse a chave externa.',
87
+ 'Foreign key has been altered.' => 'Modificouse a chave externa.',
88
+ 'Foreign key has been created.' => 'Creouse a chave externa.',
89
+ 'Foreign key' => 'Chave externa',
90
+ 'Target table' => 'táboa de destino',
91
+ 'Change' => 'Cambiar',
92
+ 'Source' => 'Orixe',
93
+ 'Target' => 'Destino',
94
+ 'Add column' => 'Engadir columna',
95
+ 'Alter' => 'Modificar',
96
+ 'Add foreign key' => 'Engadir chave externa',
97
+ 'ON DELETE' => 'AO BORRAR (ON DELETE)',
98
+ 'ON UPDATE' => 'AO ACTUALIZAR (ON UPDATE)',
99
+ 'Index Type' => 'Tipo de índice',
100
+ 'Column (length)' => 'Columna (lonxitude)',
101
+ 'View has been dropped.' => 'Eliminouse a vista.',
102
+ 'View has been altered.' => 'Modificouse a vista.',
103
+ 'View has been created.' => 'Creouse a vista.',
104
+ 'Alter view' => 'Modificar vista',
105
+ 'Create view' => 'Crear vista',
106
+ 'Name' => 'Nome',
107
+ 'Process list' => 'Lista de procesos',
108
+ '%d process(es) have been killed.' => array('%d proceso foi detido.', '%d procesos foron detidos.'),
109
+ 'Kill' => 'Deter',
110
+ 'Parameter name' => 'Nome de Parámetro',
111
+ 'Database schema' => 'Esquema de base de datos',
112
+ 'Create procedure' => 'Crear procedemento',
113
+ 'Create function' => 'Crear función',
114
+ 'Routine has been dropped.' => 'Eliminouse o procedemento.',
115
+ 'Routine has been altered.' => 'Alterouse o procedemento.',
116
+ 'Routine has been created.' => 'Creouse o procedemento.',
117
+ 'Alter function' => 'Modificar Función',
118
+ 'Alter procedure' => 'Modificar procedemento',
119
+ 'Return type' => 'Tipo de valor devolto',
120
+ 'Add trigger' => 'Engadir disparador',
121
+ 'Trigger has been dropped.' => 'Eliminouse o disparador.',
122
+ 'Trigger has been altered.' => 'Modificouse o disparador.',
123
+ 'Trigger has been created.' => 'Creouse o disparador.',
124
+ 'Alter trigger' => 'Modificar Disparador',
125
+ 'Create trigger' => 'Crear Disparador',
126
+ 'Time' => 'Tempo',
127
+ 'Event' => 'Evento',
128
+ '%s version: %s through PHP extension %s' => 'Versión %s: %s a través da extensión de PHP %s',
129
+ '%d row(s)' => array('%d fila', '%d filas'),
130
+ 'Remove' => 'Eliminar',
131
+ 'Are you sure?' => 'Está seguro?',
132
+ 'Privileges' => 'Privilexios',
133
+ 'Create user' => 'Crear Usuario',
134
+ 'User has been dropped.' => 'Eliminouse o usuario.',
135
+ 'User has been altered.' => 'Modificouse o usuario.',
136
+ 'User has been created.' => 'Creouse o usuario.',
137
+ 'Hashed' => 'Hashed',
138
+ 'Column' => 'Columna',
139
+ 'Routine' => 'Rutina',
140
+ 'Grant' => 'Conceder',
141
+ 'Revoke' => 'Revocar',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Datos POST demasiado grandes. Reduza os datos ou aumente a directiva de configuración %s.',
143
+ 'Logged as: %s' => 'Conectado como: %s',
144
+ 'Move up' => 'Mover arriba',
145
+ 'Move down' => 'Mover abaixo',
146
+ 'Functions' => 'Funcións',
147
+ 'Aggregation' => 'Agregados',
148
+ 'Export' => 'Exportar',
149
+ 'Output' => 'Salida',
150
+ 'open' => 'abrir',
151
+ 'save' => 'gardar',
152
+ 'Format' => 'Formato',
153
+ 'Tables' => 'Táboas',
154
+ 'Data' => 'Datos',
155
+ 'Event has been dropped.' => 'Eliminouse o evento.',
156
+ 'Event has been altered.' => 'Modificouse o evento.',
157
+ 'Event has been created.' => 'Creouse o evento.',
158
+ 'Alter event' => 'Modificar Evento',
159
+ 'Create event' => 'Crear Evento',
160
+ 'At given time' => 'No tempo indicado',
161
+ 'Every' => 'Cada',
162
+ 'Events' => 'Eventos',
163
+ 'Schedule' => 'Axenda',
164
+ 'Start' => 'Inicio',
165
+ 'End' => 'Fin',
166
+ 'Status' => 'Estado',
167
+ 'On completion preserve' => 'Ao completar manter',
168
+ 'Tables and views' => 'táboas e vistas',
169
+ 'Data Length' => 'Lonxitude de datos',
170
+ 'Index Length' => 'Lonxitude de índice',
171
+ 'Data Free' => 'Espazo dispoñible',
172
+ 'Collation' => 'Xogo de caracteres (collation)',
173
+ 'Analyze' => 'Analizar',
174
+ 'Optimize' => 'Optimizar',
175
+ 'Check' => 'Comprobar',
176
+ 'Repair' => 'Reparar',
177
+ 'Truncate' => 'Baleirar',
178
+ 'Tables have been truncated.' => 'Baleiráronse as táboas.',
179
+ 'Rows' => 'Filas',
180
+ ',' => ' ',
181
+ '0123456789' => '0123456789',
182
+ 'Tables have been moved.' => 'Movéronse as táboas.',
183
+ 'Move to other database' => 'Mover a outra base de datos',
184
+ 'Move' => 'Mover',
185
+ 'Engine' => 'Motor',
186
+ 'Save and continue edit' => 'Gardar se seguir editando',
187
+ 'original' => 'orixinal',
188
+ 'Tables have been dropped.' => 'Elimináronse as táboas.',
189
+ '%d item(s) have been affected.' => array('%d elemento afectado.', '%d elementos afectados.'),
190
+ 'whole result' => 'resultado completo',
191
+ 'Clone' => 'Clonar',
192
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Excedida o número máximo de campos permitidos. Por favor aumente %s.',
193
+ 'Partition by' => 'Particionar por',
194
+ 'Partitions' => 'Particións',
195
+ 'Partition name' => 'Nome da Partición',
196
+ 'Values' => 'Valores',
197
+ '%d row(s) have been imported.' => array('%d fila importada.', '%d filas importadas.'),
198
+ 'anywhere' => 'onde sexa',
199
+ 'Import' => 'Importar',
200
+ 'Stop on error' => 'Parar en caso de erro',
201
+ '%.3f s' => '%.3f s',
202
+ '$1-$3-$5' => '$5/$3/$1',
203
+ '[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
204
+ 'History' => 'Histórico',
205
+ 'Variables' => 'Variables',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'As columnas de orixe e destino deben ser do mesmo tipo, debe existir un índice nas columnas de destino e os datos referenciados deben existir.',
207
+ 'Relations' => 'Relacins',
208
+ 'Run file' => 'Executar ficheiro',
209
+ 'Clear' => 'Baleirar',
210
+ 'Maximum allowed file size is %sB.' => 'O tamaño máximo de ficheiro permitido é de %sB.',
211
+ 'Numbers' => 'Números',
212
+ 'Date and time' => 'Data e hora',
213
+ 'Strings' => 'Cadea',
214
+ 'Binary' => 'Binario',
215
+ 'Lists' => 'Listas',
216
+ 'Editor' => 'Editor',
217
+ 'E-mail' => 'Email',
218
+ 'From' => 'De',
219
+ 'Subject' => 'Asunto',
220
+ 'Send' => 'Enviar',
221
+ '%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
222
+ 'Webserver file %s' => 'Ficheiro de servidor web %s',
223
+ 'File does not exist.' => 'O ficheiro non existe.',
224
+ '%d in total' => '%d en total',
225
+ 'Permanent login' => 'Permanecer conectado',
226
+ 'Databases have been dropped.' => 'Elimináronse as bases de datos.',
227
+ 'Search data in tables' => 'Buscar datos en táboas',
228
+ 'Schema' => 'Esquema',
229
+ 'Alter schema' => 'Modificar esquema',
230
+ 'Create schema' => 'Crear esquema',
231
+ 'Schema has been dropped.' => 'Eliminouse o esquema.',
232
+ 'Schema has been created.' => 'Creouse o esquema.',
233
+ 'Schema has been altered.' => 'Modificouse o esquema.',
234
+ 'Sequences' => 'Secuencias',
235
+ 'Create sequence' => 'Crear secuencias',
236
+ 'Alter sequence' => 'Modificar secuencia',
237
+ 'Sequence has been dropped.' => 'Eliminouse a secuencia.',
238
+ 'Sequence has been created.' => 'Creouse a secuencia.',
239
+ 'Sequence has been altered.' => 'Modificaouse a secuencia.',
240
+ 'User types' => 'Tipos definidos polo usuario',
241
+ 'Create type' => 'Crear tipo',
242
+ 'Alter type' => 'Modificar tipo',
243
+ 'Type has been dropped.' => 'Eliminouse o tipo.',
244
+ 'Type has been created.' => 'Creouse o tipo.',
245
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+clic sobre o valor para editalo.',
246
+ 'Use edit link to modify this value.' => 'Use a ligazón de edición para modificar este valor.',
247
+ 'last' => 'último',
248
+ 'From server' => 'Desde o servidor',
249
+ 'System' => 'Sistema',
250
+ 'Select data' => 'Seleccionar datos',
251
+ 'Show structure' => 'Amosar estructura',
252
+ 'empty' => 'baleiro',
253
+ 'Network' => 'Rede',
254
+ 'Geometry' => 'Xeometría',
255
+ 'File exists.' => 'O ficheiro xa existe.',
256
+ 'Attachments' => 'Adxuntos',
257
+ '%d query(s) executed OK.' => array('%d consulta executada correctamente.', '%d consultas executadas correctamente.'),
258
+ 'Show only errors' => 'Amosar só erros',
259
+ 'Refresh' => 'Refrescar',
260
+ 'Invalid schema.' => 'Esquema inválido.',
261
+ 'Please use one of the extensions %s.' => 'Por favor use unha das extensións %s.',
262
+ 'now' => 'agora',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'Copiáronse as táboas.',
265
+ 'Copy' => 'Copiar',
266
+ 'Permanent link' => 'Ligazón permanente',
267
+ 'Edit all' => 'Editar todo',
268
+ 'HH:MM:SS' => 'HH:MM:SS',
269
+ 'Tables have been optimized.' => 'Optimizáronse as táboas',
270
+ 'Materialized View' => 'Vista materializada',
271
+ 'Vacuum' => 'Baleirar',
272
+ 'Selected' => 'Selección',
273
+ 'Create materialized view' => 'Crear vista materializada',
274
+ 'File must be in UTF-8 encoding.' => 'O ficheiro ten que estar codificado con UTF-8',
275
+ 'Modify' => 'Modificar',
276
+ 'Loading' => 'Cargando',
277
+ 'Load more data' => 'Cargar máis datos',
278
+ '%d / ' => array('%d / ','%d / '),
279
+ 'Limit rows' => 'Limitar filas',
280
+ 'Default value' => 'Valor por defecto',
281
+ 'Full table scan' => 'Escaneo completo da táboa',
282
+ 'Too many unsuccessful logins, try again in %d minute(s).' => array('Demasiados intentos de conexión, intentao de novo en %d minuto', 'Demasiados intentos de conexión, intentao de novo en %d minutos'),
283
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'O contrasinal principal caducou. <a href="https://www.adminer.org/en/extension/" target="_blank">Implementa</a> o método %s para facelo permanente.',
284
+ 'If you did not send this request from Adminer then close this page.' => 'Se non enviaches esta petición dende o Adminer entón pecha esta páxina',
285
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Podes subir un ficheiro SQL de gran tamaño vía FTP e importalo dende o servidor',
286
+ 'Size' => 'Tamaño',
287
+ 'Compute' => 'Calcular',
288
+ 'You are offline.' => 'Non tes conexión',
289
+ 'You have no privileges to update this table.' => 'Non tes privilexios para actualizar esta táboa',
290
+ 'Saving' => 'Gardando',
291
+ 'yes' => 'si',
292
+ 'no' => 'non',
293
+ );
adminer/adminer/adminer/lang/hu.inc.php ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Belépés',
4
+ 'Logout successful.' => 'Sikeres kilépés.',
5
+ 'Invalid credentials.' => 'Érvénytelen adatok.',
6
+ 'Server' => 'Szerver',
7
+ 'Username' => 'Felhasználó',
8
+ 'Password' => 'Jelszó',
9
+ 'Select database' => 'Adatbázis kiválasztása',
10
+ 'Invalid database.' => 'Érvénytelen adatbázis.',
11
+ 'Create new database' => 'Új adatbázis',
12
+ 'Table has been dropped.' => 'A tábla eldobva.',
13
+ 'Table has been altered.' => 'A tábla módosult.',
14
+ 'Table has been created.' => 'A tábla létrejött.',
15
+ 'Alter table' => 'Tábla módosítása',
16
+ 'Create table' => 'Tábla létrehozása',
17
+ 'Table name' => 'Tábla név',
18
+ 'engine' => 'motor',
19
+ 'collation' => 'egybevetés',
20
+ 'Column name' => 'Oszlop neve',
21
+ 'Type' => 'Típus',
22
+ 'Length' => 'Hossz',
23
+ 'Auto Increment' => 'Automatikus növelés',
24
+ 'Options' => 'Opciók',
25
+ 'Save' => 'Mentés',
26
+ 'Drop' => 'Eldob',
27
+ 'Database has been dropped.' => 'Az adatbázis eldobva.',
28
+ 'Database has been created.' => 'Az adatbázis létrejött.',
29
+ 'Database has been renamed.' => 'Az adadtbázis átnevezve.',
30
+ 'Database has been altered.' => 'Az adatbázis módosult.',
31
+ 'Alter database' => 'Adatbázis módosítása',
32
+ 'Create database' => 'Adatbázis létrehozása',
33
+ 'SQL command' => 'SQL parancs',
34
+ 'Logout' => 'Kilépés',
35
+ 'database' => 'adatbázis',
36
+ 'Use' => 'Használ',
37
+ 'No tables.' => 'Nincs tábla.',
38
+ 'select' => 'kiválasztás',
39
+ 'Item has been deleted.' => 'A tétel törölve.',
40
+ 'Item has been updated.' => 'A tétel frissítve.',
41
+ 'Item%s has been inserted.' => '%s tétel beszúrva.',
42
+ 'Edit' => 'Szerkeszt',
43
+ 'Insert' => 'Beszúr',
44
+ 'Save and insert next' => 'Mentés és újat beszúr',
45
+ 'Delete' => 'Törlés',
46
+ 'Database' => 'Adatbázis',
47
+ 'Routines' => 'Rutinok',
48
+ 'Indexes have been altered.' => 'Az indexek megváltoztak.',
49
+ 'Indexes' => 'Indexek',
50
+ 'Alter indexes' => 'Index módosítása',
51
+ 'Add next' => 'Következő hozzáadása',
52
+ 'Language' => 'Nyelv',
53
+ 'Select' => 'Kiválasztás',
54
+ 'New item' => 'Új tétel',
55
+ 'Search' => 'Keresés',
56
+ 'Sort' => 'Sorba rendezés',
57
+ 'descending' => 'csökkenő',
58
+ 'Limit' => 'korlát',
59
+ 'No rows.' => 'Nincs megjeleníthető eredmény.',
60
+ 'Action' => 'Művelet',
61
+ 'edit' => 'szerkeszt',
62
+ 'Page' => 'oldal',
63
+ 'Query executed OK, %d row(s) affected.' => array('Lekérdezés sikeresen végrehajtva, %d sor érintett.', 'Lekérdezés sikeresen végrehajtva, %d sor érintett.', 'Lekérdezés sikeresen végrehajtva, %d sor érintett.'),
64
+ 'Error in query' => 'Hiba a lekérdezésben',
65
+ 'Execute' => 'Végrehajt',
66
+ 'Table' => 'Tábla',
67
+ 'Foreign keys' => 'Idegen kulcs',
68
+ 'Triggers' => 'Trigger',
69
+ 'View' => 'Nézet',
70
+ 'Unable to select the table' => 'Nem tudom kiválasztani a táblát',
71
+ 'Invalid CSRF token. Send the form again.' => 'Érvénytelen CSRF azonosító. Küldd újra az űrlapot.',
72
+ 'Comment' => 'Megjegyzés',
73
+ 'Default values' => 'Alapértelmezett értékek',
74
+ '%d byte(s)' => array('%d bájt', '%d bájt', '%d bájt'),
75
+ 'No commands to execute.' => 'Nincs végrehajtható parancs.',
76
+ 'Unable to upload a file.' => 'Nem tudom feltölteni a fájlt.',
77
+ 'File upload' => 'Fájl feltöltése',
78
+ 'File uploads are disabled.' => 'A fájl feltöltés le van tiltva.',
79
+ 'Routine has been called, %d row(s) affected.' => array('Rutin meghívva, %d sor érintett.', 'Rutin meghívva, %d sor érintett.', 'Rutin meghívva, %d sor érintett.'),
80
+ 'Call' => 'Meghív',
81
+ 'No extension' => 'Nincs kiterjesztés',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'Nincs egy elérhető támogatott PHP kiterjesztés (%s) sem.',
83
+ 'Session support must be enabled.' => 'A munkameneteknek (session) engedélyezve kell lennie.',
84
+ 'Session expired, please login again.' => 'Munkamenet lejárt, jelentkezz be újra.',
85
+ 'Text length' => 'Szöveg hossz',
86
+ 'Foreign key has been dropped.' => 'Idegen kulcs eldobva.',
87
+ 'Foreign key has been altered.' => 'Idegen kulcs módosult.',
88
+ 'Foreign key has been created.' => 'Idegen kulcs létrejött.',
89
+ 'Foreign key' => 'Idegen kulcs',
90
+ 'Target table' => 'Cél tábla',
91
+ 'Change' => 'Változtat',
92
+ 'Source' => 'Forrás',
93
+ 'Target' => 'Cél',
94
+ 'Add column' => 'Oszlop hozzáadása',
95
+ 'Alter' => 'Módosítás',
96
+ 'Add foreign key' => 'Idegen kulcs hozzadása',
97
+ 'ON DELETE' => 'törléskor',
98
+ 'ON UPDATE' => 'frissítéskor',
99
+ 'Index Type' => 'Index típusa',
100
+ 'Column (length)' => 'Oszop (méret)',
101
+ 'View has been dropped.' => 'A nézet eldobva.',
102
+ 'View has been altered.' => 'A nézet módosult.',
103
+ 'View has been created.' => 'A nézet létrejött.',
104
+ 'Alter view' => 'Nézet módosítása',
105
+ 'Create view' => 'Nézet létrehozása',
106
+ 'Name' => 'Név',
107
+ 'Process list' => 'Folyamatok',
108
+ '%d process(es) have been killed.' => array('%d folyamat leállítva.', '%d folyamat leállítva.', '%d folyamat leállítva.'),
109
+ 'Kill' => 'Leállít',
110
+ 'Parameter name' => 'Paraméter neve',
111
+ 'Database schema' => 'Adatbázis séma',
112
+ 'Create procedure' => 'Eljárás létrehozása',
113
+ 'Create function' => 'Funkció létrehozása',
114
+ 'Routine has been dropped.' => 'A rutin eldobva.',
115
+ 'Routine has been altered.' => 'A rutin módosult.',
116
+ 'Routine has been created.' => 'A rutin létrejött.',
117
+ 'Alter function' => 'Funkció módosítása',
118
+ 'Alter procedure' => 'Eljárás módosítása',
119
+ 'Return type' => 'Visszatérési érték',
120
+ 'Add trigger' => 'Trigger hozzáadása',
121
+ 'Trigger has been dropped.' => 'A trigger eldobva.',
122
+ 'Trigger has been altered.' => 'A trigger módosult.',
123
+ 'Trigger has been created.' => 'A trigger létrejött.',
124
+ 'Alter trigger' => 'Trigger módosítása',
125
+ 'Create trigger' => 'Trigger létrehozása',
126
+ 'Time' => 'Idő',
127
+ 'Event' => 'Esemény',
128
+ '%s version: %s through PHP extension %s' => '%s verzió: %s, PHP: %s',
129
+ '%d row(s)' => array('%d sor', '%d sor', '%d sor'),
130
+ 'Remove' => 'Eltávolítás',
131
+ 'Are you sure?' => 'Biztos benne?',
132
+ 'Privileges' => 'Privilégiumok',
133
+ 'Create user' => 'Felhasználó hozzáadása',
134
+ 'User has been dropped.' => 'A felhasználó eldobva.',
135
+ 'User has been altered.' => 'A felhasználó módosult.',
136
+ 'User has been created.' => 'A felhasználó létrejött.',
137
+ 'Hashed' => 'Hashed',
138
+ 'Column' => 'Oszlop',
139
+ 'Routine' => 'Rutin',
140
+ 'Grant' => 'Engedélyezés',
141
+ 'Revoke' => 'Visszavonás',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Túl sok a POST adat! Csökkentsd az adat méretét, vagy növeld a %s beállítást.',
143
+ 'Logged as: %s' => 'Belépve: %s',
144
+ 'Move up' => 'Felfelé',
145
+ 'Move down' => 'Lefelé',
146
+ 'Functions' => 'Funkciók',
147
+ 'Aggregation' => 'Aggregálás',
148
+ 'Export' => 'Export',
149
+ 'Output' => 'Kimenet',
150
+ 'open' => 'megnyit',
151
+ 'save' => 'ment',
152
+ 'Format' => 'Formátum',
153
+ 'Tables' => 'Táblák',
154
+ 'Data' => 'Adat',
155
+ 'Event has been dropped.' => 'Az esemény eldobva.',
156
+ 'Event has been altered.' => 'Az esemény módosult.',
157
+ 'Event has been created.' => 'Az esemény létrejött.',
158
+ 'Alter event' => 'Esemény módosítása',
159
+ 'Create event' => 'Esemény létrehozása',
160
+ 'At given time' => 'Megadott időben',
161
+ 'Every' => 'Minden',
162
+ 'Events' => 'Esemény',
163
+ 'Schedule' => 'Ütemzés',
164
+ 'Start' => 'Kezd',
165
+ 'End' => 'Vége',
166
+ 'Status' => 'Állapot',
167
+ 'On completion preserve' => 'Befejezéskor megőrzi',
168
+ 'Tables and views' => 'Táblák és nézetek',
169
+ 'Data Length' => 'Méret',
170
+ 'Index Length' => 'Index hossz',
171
+ 'Data Free' => 'Adat szabad',
172
+ 'Collation' => 'Egybevetés',
173
+ 'Analyze' => 'Elemzés',
174
+ 'Optimize' => 'Optimalizál',
175
+ 'Check' => 'Ellenőrzés',
176
+ 'Repair' => 'Javít',
177
+ 'Truncate' => 'Felszabadít',
178
+ 'Tables have been truncated.' => 'A tábla felszabadítva.',
179
+ 'Rows' => 'Oszlop',
180
+ ',' => ' ',
181
+ '0123456789' => '0123456789',
182
+ 'Tables have been moved.' => 'Táblák áthelyezve.',
183
+ 'Move to other database' => 'Áthelyezés másik adatbázisba',
184
+ 'Move' => 'Áthelyez',
185
+ 'Engine' => 'Motor',
186
+ 'Save and continue edit' => 'Mentés és szerkesztés folytatása',
187
+ 'original' => 'eredeti',
188
+ '%d item(s) have been affected.' => array('%d tétel érintett.', '%d tétel érintett.', '%d tétel érintett.'),
189
+ 'whole result' => 'összes eredményt mutatása',
190
+ 'Tables have been dropped.' => 'Táblák eldobva.',
191
+ 'Clone' => 'Klónoz',
192
+ 'Partition by' => 'Particionálás ezzel',
193
+ 'Partitions' => 'Particiók',
194
+ 'Partition name' => 'Partició neve',
195
+ 'Values' => 'Értékek',
196
+ '%d row(s) have been imported.' => array('%d sor importálva.', '%d sor importálva.', '%d sor importálva.'),
197
+ 'Import' => 'Importálás',
198
+ 'Show structure' => 'Struktúra',
199
+ 'Select data' => 'Tartalom',
200
+ 'Stop on error' => 'Hiba esetén megáll',
201
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'A maximális mezőszámot elérted. Növeld meg ezeket: %s.',
202
+ 'anywhere' => 'bárhol',
203
+ '%.3f s' => '%.3f másodperc',
204
+ '$1-$3-$5' => '$6.$4.$1',
205
+ '[yyyy]-mm-dd' => '[yyyy].m.d',
206
+ 'History' => 'Történet',
207
+ 'Variables' => 'Változók',
208
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'A forrás és cél oszlopoknak azonos típusúak legyenek, a cél oszlopok indexeltek legyenek, és a hivatkozott adatnak léteznie kell.',
209
+ 'E-mail' => 'E-mail',
210
+ 'From' => 'Feladó',
211
+ 'Subject' => 'Tárgy',
212
+ 'Send' => 'Küldés',
213
+ '%d e-mail(s) have been sent.' => array('%d e-mail elküldve.', '%d e-mail elküldve.', '%d e-mail elküldve.'),
214
+ 'Run file' => 'Fájl futtatása',
215
+ 'Numbers' => 'Szám',
216
+ 'Date and time' => 'Dátum és idő',
217
+ 'Strings' => 'Szöveg',
218
+ 'Binary' => 'Bináris',
219
+ 'Lists' => 'Lista',
220
+ 'Relations' => 'Reláció',
221
+ 'Maximum allowed file size is %sB.' => 'A maximális fájlméret %s B.',
222
+ 'Clear' => 'Törlés',
223
+ 'Editor' => 'Szerkesztő',
224
+ 'Webserver file %s' => 'Webszerver fájl %s',
225
+ 'File does not exist.' => 'A fájl nem létezik.',
226
+ 'Permanent login' => 'Emlékezz rám',
227
+ '%d in total' => 'összesen %d',
228
+ 'Attachments' => 'Csatolmány',
229
+ 'System' => 'Adatbázis',
230
+ 'last' => 'utolsó',
231
+ 'Network' => 'Hálózat',
232
+ 'Geometry' => 'Geometria',
233
+ 'Databases have been dropped.' => 'Adatbázis eldobva.',
234
+ 'File exists.' => 'A fájl létezik.',
235
+ 'Use edit link to modify this value.' => 'Használd a szerkesztés hivatkozást ezen érték módosításához.',
236
+ 'Alter schema' => 'Séma módosítása',
237
+ 'Create schema' => 'Séma létrehozása',
238
+ 'Schema has been dropped.' => 'Séma eldobva.',
239
+ 'Schema has been created.' => 'Séma létrejött.',
240
+ 'Schema has been altered.' => 'Séma módosult.',
241
+ 'Schema' => 'Séma',
242
+ 'Sequences' => 'Sorozatok',
243
+ 'Create sequence' => 'Sorozat létrehozása',
244
+ 'Sequence has been dropped.' => 'Sorozat eldobva.',
245
+ 'Sequence has been created.' => 'Sorozat létrejött.',
246
+ 'Sequence has been altered.' => 'Sorozat módosult.',
247
+ 'Alter sequence' => 'Sorozat módosítása',
248
+ 'User types' => 'Felhasználói típus',
249
+ 'Create type' => 'Típus létrehozása',
250
+ 'Type has been dropped.' => 'Típus eldobva.',
251
+ 'Type has been created.' => 'Típus létrehozva.',
252
+ 'Alter type' => 'Típus módosítása',
253
+ 'Search data in tables' => 'Keresés a táblákban',
254
+ 'From server' => 'Szerverről',
255
+ 'empty' => 'üres',
256
+ 'now' => 'most',
257
+ '%d query(s) executed OK.' => '%d sikeres lekérdezés.',
258
+ 'Show only errors' => 'Csak a hibák mutatása',
259
+ 'Refresh' => 'Frissítés',
260
+ 'Invalid schema.' => 'Érvénytelen séma.',
261
+ 'Please use one of the extensions %s.' => 'Használja a(z) %s kiterjesztést.',
262
+ 'ltr' => 'ltr',
263
+ 'Tables have been copied.' => 'Táblák átmásolva.',
264
+ 'Copy' => 'Másolás',
265
+ 'Permanent link' => 'Hivatkozás',
266
+ 'Edit all' => 'Összes szerkesztése',
267
+ 'HH:MM:SS' => 'óó:pp:mm',
268
+ );
adminer/adminer/adminer/lang/id.inc.php ADDED
@@ -0,0 +1,317 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Sistem',
5
+ 'Server' => 'Server',
6
+ 'Username' => 'Pengguna',
7
+ 'Password' => 'Sandi',
8
+ 'Permanent login' => 'Masuk permanen',
9
+ 'Login' => 'Masuk',
10
+ 'Logout' => 'Keluar',
11
+ 'Logged as: %s' => 'Masuk sebagai: %s',
12
+ 'Logout successful.' => 'Berhasil keluar.',
13
+ 'Invalid credentials.' => 'Akses invalid.',
14
+ 'Language' => 'Bahasa',
15
+ 'Invalid CSRF token. Send the form again.' => 'Token CSRF invalid. Kirim ulang formulir.',
16
+ 'No extension' => 'Ekstensi tidak tersedia',
17
+ 'None of the supported PHP extensions (%s) are available.' => 'Ekstensi PHP yang didukung (%s) tidak tersedia.',
18
+ 'Session support must be enabled.' => 'Dukungan sesi harus aktif.',
19
+ 'Session expired, please login again.' => 'Sesi habis, silakan masuk lagi.',
20
+ '%s version: %s through PHP extension %s' => 'Versi %s: %s dengan ekstensi PHP %s',
21
+ 'Refresh' => 'Segarkan',
22
+
23
+ // text direction - 'ltr' or 'rtl'
24
+ 'ltr' => 'ltr',
25
+
26
+ 'Privileges' => 'Privilese',
27
+ 'Create user' => 'Buat pengguna',
28
+ 'User has been dropped.' => 'Pengguna berhasil dihapus.',
29
+ 'User has been altered.' => 'Pengguna berhasil diubah.',
30
+ 'User has been created.' => 'Pengguna berhasil dibuat.',
31
+ 'Hashed' => 'Hashed*',
32
+ 'Column' => 'Kolom',
33
+ 'Routine' => 'Rutin',
34
+ 'Grant' => 'Beri',
35
+ 'Revoke' => 'Tarik',
36
+
37
+ 'Process list' => 'Daftar proses',
38
+ '%d process(es) have been killed.' => '%d proses berhasil dihentikan.',
39
+ 'Kill' => 'Hentikan',
40
+
41
+ 'Variables' => 'Variabel',
42
+ 'Status' => 'Status',
43
+
44
+ 'SQL command' => 'Perintah SQL',
45
+ '%d query(s) executed OK.' => '%d kueri berhasil dijalankan.',
46
+ 'Query executed OK, %d row(s) affected.' => 'Kueri berhasil, %d baris terpengaruh.',
47
+ 'No commands to execute.' => 'Tiada perintah untuk dijalankan.',
48
+ 'Error in query' => 'Kesalahan dalam kueri',
49
+ 'Execute' => 'Jalankan',
50
+ 'Stop on error' => 'Hentikan pada kesalahan',
51
+ 'Show only errors' => 'Hanya tampilkan kesalahan',
52
+ // sprintf() format for time of the command
53
+ '%.3f s' => '%.3f s',
54
+ 'History' => 'Riwayat',
55
+ 'Clear' => 'Bersihkan',
56
+ 'Edit all' => 'Edit semua',
57
+
58
+ 'File upload' => 'Unggah berkas',
59
+ 'From server' => 'Dari server',
60
+ 'Webserver file %s' => 'Berkas server web %s',
61
+ 'Run file' => 'Jalankan berkas',
62
+ 'File does not exist.' => 'Berkas tidak ditemukan.',
63
+ 'File uploads are disabled.' => 'Pengunggahan berkas dimatikan.',
64
+ 'Unable to upload a file.' => 'Tidak dapat mengunggah berkas.',
65
+ 'Maximum allowed file size is %sB.' => 'Besar berkas yang diizinkan adalah %s bita.',
66
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Data POST terlalu besar. Kurangi data atau perbesar pengarah konfigurasi %s.',
67
+
68
+ 'Export' => 'Ekspor',
69
+ 'Output' => 'Hasil',
70
+ 'open' => 'buka',
71
+ 'save' => 'simpan',
72
+ 'Format' => 'Format',
73
+ 'Data' => 'Data',
74
+
75
+ 'Database' => 'Basis data',
76
+ 'database' => 'basis data',
77
+ 'Use' => 'Gunakan',
78
+ 'Select database' => 'Pilih basis data',
79
+ 'Invalid database.' => 'Basis data invalid.',
80
+ 'Create new database' => 'Buat basis data baru',
81
+ 'Database has been dropped.' => 'Basis data berhasil dihapus.',
82
+ 'Databases have been dropped.' => 'Basis data berhasil dihapus.',
83
+ 'Database has been created.' => 'Basis data berhasil dibuat.',
84
+ 'Database has been renamed.' => 'Basis data berhasil diganti nama.',
85
+ 'Database has been altered.' => 'Basis data berhasil diubah.',
86
+ 'Alter database' => 'Ubah basis data',
87
+ 'Create database' => 'Buat basis data',
88
+ 'Database schema' => 'Skema basis data',
89
+
90
+ // link to current database schema layout
91
+ 'Permanent link' => 'Tautan permanen',
92
+
93
+ // thousands separator - must contain single byte
94
+ ',' => '.',
95
+ '0123456789' => '0123456789',
96
+ 'Engine' => 'Mesin',
97
+ 'Collation' => 'Kolasi',
98
+ 'Data Length' => 'Panjang Data',
99
+ 'Index Length' => 'Panjang Indeks',
100
+ 'Data Free' => 'Data Bebas',
101
+ 'Rows' => 'Baris',
102
+ '%d in total' => '%d total',
103
+ 'Analyze' => 'Analisis',
104
+ 'Optimize' => 'Optimalkan',
105
+ 'Check' => 'Periksa',
106
+ 'Repair' => 'Perbaiki',
107
+ 'Truncate' => 'Kosongkan',
108
+ 'Tables have been truncated.' => 'Tabel berhasil dikosongkan.',
109
+ 'Move to other database' => 'Pindahkan ke basis data lain',
110
+ 'Move' => 'Pindahkan',
111
+ 'Tables have been moved.' => 'Tabel berhasil dipindahkan.',
112
+ 'Copy' => 'Salin',
113
+ 'Tables have been copied.' => 'Tabel berhasil disalin.',
114
+
115
+ 'Routines' => 'Rutin',
116
+ 'Routine has been called, %d row(s) affected.' => array('Rutin telah dipanggil, %d baris terpengaruh.', 'Rutin telah dipanggil, %d baris terpengaruh'),
117
+ 'Call' => 'Panggilan',
118
+ 'Parameter name' => 'Nama paramater',
119
+ 'Create procedure' => 'Buat prosedur',
120
+ 'Create function' => 'Buat fungsi',
121
+ 'Routine has been dropped.' => 'Rutin berhasil dihapus.',
122
+ 'Routine has been altered.' => 'Rutin berhasil diubah.',
123
+ 'Routine has been created.' => 'Rutin berhasil dibuat.',
124
+ 'Alter function' => 'Ubah fungsi',
125
+ 'Alter procedure' => 'Ubah prosedur',
126
+ 'Return type' => 'Jenis balikan',
127
+
128
+ 'Events' => 'Peristiwa',
129
+ 'Event has been dropped.' => 'Peristiwa berhasil dihapus.',
130
+ 'Event has been altered.' => 'Peristiwa berhasil diubah.',
131
+ 'Event has been created.' => 'Peristiwa berhasil dibuat.',
132
+ 'Alter event' => 'Ubah peristiwa',
133
+ 'Create event' => 'Buat peristiwa',
134
+ 'At given time' => 'Pada waktu tertentu',
135
+ 'Every' => 'Setiap',
136
+ 'Schedule' => 'Jadwal',
137
+ 'Start' => 'Mulai',
138
+ 'End' => 'Selesai',
139
+ 'On completion preserve' => 'Pertahankan saat selesai',
140
+
141
+ 'Tables' => 'Tabel',
142
+ 'Tables and views' => 'Tabel dan tampilan',
143
+ 'Table' => 'Tabel',
144
+ 'No tables.' => 'Tiada tabel.',
145
+ 'Alter table' => 'Ubah tabel',
146
+ 'Create table' => 'Buat tabel',
147
+ 'Table has been dropped.' => 'Tabel berhasil dihapus.',
148
+ 'Tables have been dropped.' => 'Tabel berhasil dihapus.',
149
+ 'Tables have been optimized.' => 'Tabel berhasil dioptimalkan.',
150
+ 'Table has been altered.' => 'Tabel berhasil diubah.',
151
+ 'Table has been created.' => 'Tabel berhasil dibuat.',
152
+ 'Table name' => 'Nama tabel',
153
+ 'Show structure' => 'Lihat struktur',
154
+ 'engine' => 'mesin',
155
+ 'collation' => 'kolasi',
156
+ 'Column name' => 'Nama kolom',
157
+ 'Type' => 'Jenis',
158
+ 'Length' => 'Panjang',
159
+ 'Auto Increment' => 'Kenaikan Otomatis',
160
+ 'Options' => 'Opsi',
161
+ 'Comment' => 'Komentar',
162
+ 'Default values' => 'Nilai bawaan',
163
+ 'Drop' => 'Hapus',
164
+ 'Are you sure?' => 'Anda yakin',
165
+ 'Move up' => 'Naik',
166
+ 'Move down' => 'Turun',
167
+ 'Remove' => 'Hapus',
168
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Jumlah ruas maksimum yang diizinkan dilewati. Harap naikkan %s.',
169
+
170
+ 'Partition by' => 'Partisi menurut',
171
+ 'Partitions' => 'Partisi',
172
+ 'Partition name' => 'Nama partisi',
173
+ 'Values' => 'Nilai',
174
+
175
+ 'View' => 'Tampilan',
176
+ 'View has been dropped.' => 'Tampilan berhasil dihapus.',
177
+ 'View has been altered.' => 'Tampilan berhasil diubah.',
178
+ 'View has been created.' => 'Tampilan berhasil dibuat.',
179
+ 'Alter view' => 'Ubah tampilan',
180
+ 'Create view' => 'Buat tampilan',
181
+
182
+ 'Indexes' => 'Indeks',
183
+ 'Indexes have been altered.' => 'Indeks berhasil diubah.',
184
+ 'Alter indexes' => 'Ubah indeks',
185
+ 'Add next' => 'Tambah setelahnya',
186
+ 'Index Type' => 'Jenis Indeks',
187
+ 'Column (length)' => 'Kolom (panjang)',
188
+
189
+ 'Foreign keys' => 'Kunci asing',
190
+ 'Foreign key' => 'Kunci asing',
191
+ 'Foreign key has been dropped.' => 'Kunci asing berhasil dihapus.',
192
+ 'Foreign key has been altered.' => 'Kunci asing berhasil diubah.',
193
+ 'Foreign key has been created.' => 'Kunci asing berhasil dibuat.',
194
+ 'Target table' => 'Tabel sasaran',
195
+ 'Change' => 'Ubah',
196
+ 'Source' => 'Sumber',
197
+ 'Target' => 'Sasaran',
198
+ 'Add column' => 'Tambah kolom',
199
+ 'Alter' => 'Ubah',
200
+ 'Add foreign key' => 'Tambah kunci asing',
201
+ 'ON DELETE' => 'ON DELETE',
202
+ 'ON UPDATE' => 'ON UPDATE',
203
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kolom sumber dan sasaran harus memiliki jenis data yang sama. Kolom sasaran harus memiliki indeks dan data rujukan harus ada.',
204
+
205
+ 'Triggers' => 'Picu',
206
+ 'Add trigger' => 'Tambah picu',
207
+ 'Trigger has been dropped.' => 'Picu berhasil dihapus.',
208
+ 'Trigger has been altered.' => 'Picu berhasil diubah.',
209
+ 'Trigger has been created.' => 'Picu berhasil dibuat.',
210
+ 'Alter trigger' => 'Ubah picu',
211
+ 'Create trigger' => 'Buat picu',
212
+ 'Time' => 'Waktu',
213
+ 'Event' => 'Peristiwa',
214
+ 'Name' => 'Nama',
215
+
216
+ 'select' => 'pilih',
217
+ 'Select' => 'Pilih',
218
+ 'Select data' => 'Pilih data',
219
+ 'Functions' => 'Fungsi',
220
+ 'Aggregation' => 'Agregasi',
221
+ 'Search' => 'Cari',
222
+ 'anywhere' => 'di mana pun',
223
+ 'Search data in tables' => 'Cari data dalam tabel',
224
+ 'Sort' => 'Urutan',
225
+ 'descending' => 'menurun',
226
+ 'Limit' => 'Limit',
227
+ 'Text length' => 'Panjang teks',
228
+ 'Action' => 'Tindakan',
229
+ 'Full table scan' => 'Pindai tabel lengkap',
230
+ 'Unable to select the table' => 'Gagal memilih tabel',
231
+ 'No rows.' => 'Tiada baris.',
232
+ '%d row(s)' => '%d baris',
233
+ 'Page' => 'Halaman',
234
+ 'last' => 'terakhir',
235
+ 'whole result' => 'Seluruh hasil',
236
+ '%d byte(s)' => '%d bita',
237
+
238
+ 'Import' => 'Impor',
239
+ '%d row(s) have been imported.' => '%d baris berhasil diimpor.',
240
+
241
+ // in-place editing in select
242
+ 'Use edit link to modify this value.' => 'Gunakan tautan edit untuk mengubah nilai ini.',
243
+
244
+ // %s can contain auto-increment value
245
+ 'Item%s has been inserted.' => 'Entri%s berhasil disisipkan.',
246
+ 'Item has been deleted.' => 'Entri berhasil dihapus.',
247
+ 'Item has been updated.' => 'Entri berhasil diperbarui.',
248
+ '%d item(s) have been affected.' => '%d entri terpengaruh.',
249
+ 'New item' => 'Entri baru',
250
+ 'original' => 'orisinal',
251
+ // label for value '' in enum data type
252
+ 'empty' => 'kosong',
253
+ 'edit' => 'edit',
254
+ 'Edit' => 'Edit',
255
+ 'Insert' => 'Sisipkan',
256
+ 'Save' => 'Simpan',
257
+ 'Save and continue edit' => 'Simpan dan terus mengedit',
258
+ 'Save and insert next' => 'Simpan dan sisipkan yang lain',
259
+ 'Clone' => 'Gandakan',
260
+ 'Delete' => 'Hapus',
261
+
262
+ 'E-mail' => 'Surel',
263
+ 'From' => 'Dari',
264
+ 'Subject' => 'Subjek',
265
+ 'Attachments' => 'Lampiran',
266
+ 'Send' => 'Kirim',
267
+ '%d e-mail(s) have been sent.' => array('%d surel berhasil dikirim.', '%d surel berhasil dikirim'),
268
+
269
+ // data type descriptions
270
+ 'Numbers' => 'Angka',
271
+ 'Date and time' => 'Tanggal dan waktu',
272
+ 'Strings' => 'String',
273
+ 'Binary' => 'Biner',
274
+ 'Lists' => 'Daftar',
275
+ 'Network' => 'Jaringan',
276
+ 'Geometry' => 'Geometri',
277
+ 'Relations' => 'Relasi',
278
+
279
+ 'Editor' => 'Editor',
280
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
281
+ '$1-$3-$5' => '$1-$3-$5',
282
+ // hint for date format - use language equivalents for day, month and year shortcuts
283
+ '[yyyy]-mm-dd' => '[yyyy]-mm-dd',
284
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
285
+ 'HH:MM:SS' => 'HH:MM:SS',
286
+ 'now' => 'now',
287
+ 'yes' => 'yes',
288
+ 'no' => 'no',
289
+
290
+ // general SQLite error in create, drop or rename database
291
+ 'File exists.' => 'Berkas sudah ada.',
292
+ 'Please use one of the extensions %s.' => 'Harap gunakan salah satu ekstensi %s.',
293
+
294
+ // PostgreSQL and MS SQL schema support
295
+ 'Alter schema' => 'Ubah skema',
296
+ 'Create schema' => 'Buat skema',
297
+ 'Schema has been dropped.' => 'Skema berhasil dihapus.',
298
+ 'Schema has been created.' => 'Skema berhasil dibuat.',
299
+ 'Schema has been altered.' => 'Skema berhasil diubah.',
300
+ 'Schema' => 'Skema',
301
+ 'Invalid schema.' => 'Skema invalid.',
302
+
303
+ // PostgreSQL sequences support
304
+ 'Sequences' => 'Deret',
305
+ 'Create sequence' => 'Buat deret',
306
+ 'Sequence has been dropped.' => 'Deret berhasil dihapus.',
307
+ 'Sequence has been created.' => 'Deret berhasil dibuat.',
308
+ 'Sequence has been altered.' => 'Deret berhasil diubah.',
309
+ 'Alter sequence' => 'Ubah deret',
310
+
311
+ // PostgreSQL user types support
312
+ 'User types' => 'Jenis pengguna',
313
+ 'Create type' => 'Buat jenis',
314
+ 'Type has been dropped.' => 'Jenis berhasil dihapus.',
315
+ 'Type has been created.' => 'Jenis berhasil dibuat.',
316
+ 'Alter type' => 'Ubah jenis',
317
+ );
adminer/adminer/adminer/lang/it.inc.php ADDED
@@ -0,0 +1,269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Autenticazione',
4
+ 'Logout successful.' => 'Uscita effettuata con successo.',
5
+ 'Invalid credentials.' => 'Credenziali non valide.',
6
+ 'Server' => 'Server',
7
+ 'Username' => 'Utente',
8
+ 'Password' => 'Password',
9
+ 'Select database' => 'Seleziona database',
10
+ 'Invalid database.' => 'Database non valido.',
11
+ 'Create new database' => 'Crea nuovo database',
12
+ 'Table has been dropped.' => 'Tabella eliminata.',
13
+ 'Table has been altered.' => 'Tabella modificata.',
14
+ 'Table has been created.' => 'Tabella creata.',
15
+ 'Alter table' => 'Modifica tabella',
16
+ 'Create table' => 'Crea tabella',
17
+ 'Table name' => 'Nome tabella',
18
+ 'engine' => 'motore',
19
+ 'collation' => 'collazione',
20
+ 'Column name' => 'Nome colonna',
21
+ 'Type' => 'Tipo',
22
+ 'Length' => 'Lunghezza',
23
+ 'Auto Increment' => 'Auto incremento',
24
+ 'Options' => 'Opzioni',
25
+ 'Save' => 'Salva',
26
+ 'Drop' => 'Elimina',
27
+ 'Database has been dropped.' => 'Database eliminato.',
28
+ 'Database has been created.' => 'Database creato.',
29
+ 'Database has been renamed.' => 'Database rinominato.',
30
+ 'Database has been altered.' => 'Database modificato.',
31
+ 'Alter database' => 'Modifica database',
32
+ 'Create database' => 'Crea database',
33
+ 'SQL command' => 'Comando SQL',
34
+ 'Logout' => 'Esci',
35
+ 'database' => 'database',
36
+ 'Use' => 'Usa',
37
+ 'No tables.' => 'No tabelle.',
38
+ 'select' => 'seleziona',
39
+ 'Item has been deleted.' => 'Elemento eliminato.',
40
+ 'Item has been updated.' => 'Elemento aggiornato.',
41
+ 'Item%s has been inserted.' => 'Elemento%s inserito.',
42
+ 'Edit' => 'Modifica',
43
+ 'Insert' => 'Inserisci',
44
+ 'Save and insert next' => 'Salva e inserisci un altro',
45
+ 'Delete' => 'Elimina',
46
+ 'Database' => 'Database',
47
+ 'Routines' => 'Routine',
48
+ 'Indexes have been altered.' => 'Indici modificati.',
49
+ 'Indexes' => 'Indici',
50
+ 'Alter indexes' => 'Modifica indici',
51
+ 'Add next' => 'Aggiungi altro',
52
+ 'Language' => 'Lingua',
53
+ 'Select' => 'Seleziona',
54
+ 'New item' => 'Nuovo elemento',
55
+ 'Search' => 'Cerca',
56
+ 'Sort' => 'Ordina',
57
+ 'descending' => 'discendente',
58
+ 'Limit' => 'Limite',
59
+ 'No rows.' => 'Nessuna riga.',
60
+ 'Action' => 'Azione',
61
+ 'edit' => 'modifica',
62
+ 'Page' => 'Pagina',
63
+ 'Query executed OK, %d row(s) affected.' => array('Esecuzione della query OK, %d riga interessata.', 'Esecuzione della query OK, %d righe interessate.'),
64
+ 'Error in query' => 'Errore nella query',
65
+ 'Execute' => 'Esegui',
66
+ 'Table' => 'Tabella',
67
+ 'Foreign keys' => 'Chiavi esterne',
68
+ 'Triggers' => 'Trigger',
69
+ 'View' => 'Vedi',
70
+ 'Unable to select the table' => 'Selezione della tabella non riuscita',
71
+ 'Invalid CSRF token. Send the form again.' => 'Token CSRF non valido. Reinvia la richiesta.',
72
+ 'Comment' => 'Commento',
73
+ 'Default values' => 'Valori predefiniti',
74
+ '%d byte(s)' => array('%d byte', '%d bytes'),
75
+ 'No commands to execute.' => 'Nessun commando da eseguire.',
76
+ 'Unable to upload a file.' => 'Caricamento del file non riuscito.',
77
+ 'File upload' => 'Caricamento file',
78
+ 'File uploads are disabled.' => 'Caricamento file disabilitato.',
79
+ 'Routine has been called, %d row(s) affected.' => array('Routine chiamata, %d riga interessata.', 'Routine chiamata, %d righe interessate.'),
80
+ 'Call' => 'Chiama',
81
+ 'No extension' => 'Estensioni non presenti',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'Nessuna delle estensioni PHP supportate (%s) disponibile.',
83
+ 'Session support must be enabled.' => 'Le sessioni devono essere abilitate.',
84
+ 'Session expired, please login again.' => 'Sessione scaduta, autenticarsi di nuovo.',
85
+ 'Text length' => 'Lunghezza testo',
86
+ 'Foreign key has been dropped.' => 'Foreign key eliminata.',
87
+ 'Foreign key has been altered.' => 'Foreign key modificata.',
88
+ 'Foreign key has been created.' => 'Foreign key creata.',
89
+ 'Foreign key' => 'Foreign key',
90
+ 'Target table' => 'Tabella obiettivo',
91
+ 'Change' => 'Cambia',
92
+ 'Source' => 'Sorgente',
93
+ 'Target' => 'Obiettivo',
94
+ 'Add column' => 'Aggiungi colonna',
95
+ 'Alter' => 'Modifica',
96
+ 'Add foreign key' => 'Aggiungi foreign key',
97
+ 'ON DELETE' => 'ON DELETE',
98
+ 'ON UPDATE' => 'ON UPDATE',
99
+ 'Index Type' => 'Tipo indice',
100
+ 'Column (length)' => 'Colonna (lunghezza)',
101
+ 'View has been dropped.' => 'Vista eliminata.',
102
+ 'View has been altered.' => 'Vista modificata.',
103
+ 'View has been created.' => 'Vista creata.',
104
+ 'Alter view' => 'Modifica vista',
105
+ 'Create view' => 'Crea vista',
106
+ 'Name' => 'Nome',
107
+ 'Process list' => 'Elenco processi',
108
+ '%d process(es) have been killed.' => array('%d processo interrotto.', '%d processi interrotti.'),
109
+ 'Kill' => 'Interrompi',
110
+ 'Parameter name' => 'Nome parametro',
111
+ 'Database schema' => 'Schema database',
112
+ 'Create procedure' => 'Crea procedura',
113
+ 'Create function' => 'Crea funzione',
114
+ 'Routine has been dropped.' => 'Routine eliminata.',
115
+ 'Routine has been altered.' => 'Routine modificata.',
116
+ 'Routine has been created.' => 'Routine creata.',
117
+ 'Alter function' => 'Modifica funzione',
118
+ 'Alter procedure' => 'Modifica procedura',
119
+ 'Return type' => 'Return type',
120
+ 'Add trigger' => 'Aggiungi trigger',
121
+ 'Trigger has been dropped.' => 'Trigger eliminato.',
122
+ 'Trigger has been altered.' => 'Trigger modificato.',
123
+ 'Trigger has been created.' => 'Trigger creato.',
124
+ 'Alter trigger' => 'Modifica trigger',
125
+ 'Create trigger' => 'Crea trigger',
126
+ 'Time' => 'Orario',
127
+ 'Event' => 'Evento',
128
+ '%s version: %s through PHP extension %s' => 'Versione %s: %s via estensione PHP %s',
129
+ '%d row(s)' => array('%d riga', '%d righe'),
130
+ 'Remove' => 'Rimuovi',
131
+ 'Are you sure?' => 'Sicuro?',
132
+ 'Privileges' => 'Privilegi',
133
+ 'Create user' => 'Crea utente',
134
+ 'User has been dropped.' => 'Utente eliminato.',
135
+ 'User has been altered.' => 'Utente modificato.',
136
+ 'User has been created.' => 'Utente creato.',
137
+ 'Hashed' => 'Hashed',
138
+ 'Column' => 'Colonna',
139
+ 'Routine' => 'Routine',
140
+ 'Grant' => 'Permetti',
141
+ 'Revoke' => 'Revoca',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Troppi dati via POST. Ridurre i dati o aumentare la direttiva di configurazione %s.',
143
+ 'Logged as: %s' => 'Autenticato come: %s',
144
+ 'Move up' => 'Sposta su',
145
+ 'Move down' => 'Sposta giu',
146
+ 'Functions' => 'Funzioni',
147
+ 'Aggregation' => 'Aggregazione',
148
+ 'Export' => 'Esporta',
149
+ 'Output' => 'Risultato',
150
+ 'open' => 'apri',
151
+ 'save' => 'salva',
152
+ 'Format' => 'Formato',
153
+ 'Tables' => 'Tabelle',
154
+ 'Data' => 'Dati',
155
+ 'Event has been dropped.' => 'Evento eliminato.',
156
+ 'Event has been altered.' => 'Evento modificato.',
157
+ 'Event has been created.' => 'Evento creato.',
158
+ 'Alter event' => 'Modifica evento',
159
+ 'Create event' => 'Crea evento',
160
+ 'Start' => 'Inizio',
161
+ 'End' => 'Fine',
162
+ 'Every' => 'Ogni',
163
+ 'Status' => 'Stato',
164
+ 'On completion preserve' => 'Al termine preservare',
165
+ 'Events' => 'Eventi',
166
+ 'Schedule' => 'Pianifica',
167
+ 'At given time' => 'A tempo prestabilito',
168
+ 'Save and continue edit' => 'Salva e continua',
169
+ 'original' => 'originale',
170
+ 'Tables have been truncated.' => 'Le tabelle sono state svuotate.',
171
+ 'Tables have been moved.' => 'Le tabelle sono state spostate.',
172
+ 'Tables have been dropped.' => 'Le tabelle sono state eliminate.',
173
+ 'Tables and views' => 'Tabelle e viste',
174
+ 'Engine' => 'Motore',
175
+ 'Collation' => 'Collazione',
176
+ 'Data Length' => 'Lunghezza dato',
177
+ 'Index Length' => 'Lunghezza indice',
178
+ 'Data Free' => 'Dati liberi',
179
+ 'Rows' => 'Righe',
180
+ ',' => '.',
181
+ '0123456789' => '0123456789',
182
+ 'Analyze' => 'Analizza',
183
+ 'Optimize' => 'Ottimizza',
184
+ 'Check' => 'Controlla',
185
+ 'Repair' => 'Ripara',
186
+ 'Truncate' => 'Svuota',
187
+ 'Move to other database' => 'Sposta in altro database',
188
+ 'Move' => 'Sposta',
189
+ '%d item(s) have been affected.' => array('Il risultato consiste in %d elemento.', 'Il risultato consiste in %d elementi.'),
190
+ 'whole result' => 'intero risultato',
191
+ 'Clone' => 'Clona',
192
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Troppi campi. Per favore aumentare %s.',
193
+ 'Partition by' => 'Partiziona per',
194
+ 'Partitions' => 'Partizioni',
195
+ 'Partition name' => 'Nome partizione',
196
+ 'Values' => 'Valori',
197
+ '%d row(s) have been imported.' => array('%d riga importata.', '%d righe importate.'),
198
+ 'anywhere' => 'ovunque',
199
+ 'Import' => 'Importa',
200
+ 'Stop on error' => 'Stop su errore',
201
+ '%.3f s' => '%.3f s',
202
+ '$1-$3-$5' => '$5/$3/$1',
203
+ '[yyyy]-mm-dd' => 'dd/mm/[yyyy]',
204
+ 'History' => 'Storico',
205
+ 'Variables' => 'Variabili',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Le colonne sorgente e destinazione devono essere dello stesso tipo e ci deve essere un indice sulla colonna di destinazione e sui dati referenziati.',
207
+ 'Relations' => 'Relazioni',
208
+ 'Run file' => 'Esegui file',
209
+ 'Clear' => 'Pulisci',
210
+ 'Maximum allowed file size is %sB.' => 'La dimensione massima del file è %sB.',
211
+ 'Numbers' => 'Numeri',
212
+ 'Date and time' => 'Data e ora',
213
+ 'Strings' => 'Stringhe',
214
+ 'Binary' => 'Binari',
215
+ 'Lists' => 'Liste',
216
+ 'Editor' => 'Editor',
217
+ 'E-mail' => 'E-mail',
218
+ 'From' => 'Da',
219
+ 'Subject' => 'Oggetto',
220
+ 'Send' => 'Invia',
221
+ '%d e-mail(s) have been sent.' => array('%d e-mail inviata.', '%d e-mail inviate.'),
222
+ 'Webserver file %s' => 'Webserver file %s',
223
+ 'File does not exist.' => 'Il file non esiste.',
224
+ '%d in total' => '%d in totale',
225
+ 'Permanent login' => 'Login permanente',
226
+ 'Databases have been dropped.' => 'Database eliminati.',
227
+ 'Search data in tables' => 'Cerca nelle tabelle',
228
+ 'Schema' => 'Schema',
229
+ 'Alter schema' => 'Modifica schema',
230
+ 'Create schema' => 'Crea schema',
231
+ 'Schema has been dropped.' => 'Schema eliminato.',
232
+ 'Schema has been created.' => 'Schema creato.',
233
+ 'Schema has been altered.' => 'Schema modificato.',
234
+ 'Sequences' => 'Sequenza',
235
+ 'Create sequence' => 'Crea sequenza',
236
+ 'Alter sequence' => 'Modifica sequenza',
237
+ 'Sequence has been dropped.' => 'Sequenza eliminata.',
238
+ 'Sequence has been created.' => 'Sequenza creata.',
239
+ 'Sequence has been altered.' => 'Sequenza modificata.',
240
+ 'User types' => 'Tipi definiti dall\'utente',
241
+ 'Create type' => 'Crea tipo definito dall\'utente',
242
+ 'Alter type' => 'Modifica tipo definito dall\'utente',
243
+ 'Type has been dropped.' => 'Tipo definito dall\'utente eliminato.',
244
+ 'Type has been created.' => 'Tipo definito dall\'utente creato.',
245
+ 'Ctrl+click on a value to modify it.' => 'Fai Ctrl+click su un valore per modificarlo.',
246
+ 'Use edit link to modify this value.' => 'Usa il link modifica per modificare questo valore.',
247
+ 'last' => 'ultima',
248
+ 'From server' => 'Dal server',
249
+ 'System' => 'Sistema',
250
+ 'Select data' => 'Visualizza dati',
251
+ 'Show structure' => 'Visualizza struttura',
252
+ 'empty' => 'vuoto',
253
+ 'Network' => 'Rete',
254
+ 'Geometry' => 'Geometria',
255
+ 'File exists.' => 'Il file esiste già.',
256
+ 'Attachments' => 'Allegati',
257
+ '%d query(s) executed OK.' => array('%d query eseguita con successo.', '%d query eseguite con successo.'),
258
+ 'Show only errors' => 'Mostra solo gli errori',
259
+ 'Refresh' => 'Aggiorna',
260
+ 'Invalid schema.' => 'Schema non valido.',
261
+ 'Please use one of the extensions %s.' => 'Usa una delle estensioni %s.',
262
+ 'now' => 'adesso',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'Le tabelle sono state copiate.',
265
+ 'Copy' => 'Copia',
266
+ 'Permanent link' => 'Link permanente',
267
+ 'Edit all' => 'Modifica tutto',
268
+ 'HH:MM:SS' => 'HH:MM:SS',
269
+ );
adminer/adminer/adminer/lang/ja.inc.php ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ 'Create new database' => '新規にデータベースを作成',
12
+ 'Table has been dropped.' => 'テーブルを削除しました',
13
+ 'Table has been altered.' => 'テーブルを変更しました',
14
+ 'Table has been created.' => 'テーブルを作成しました',
15
+ 'Alter table' => 'テーブルの変更',
16
+ 'Create table' => 'テーブルを作成',
17
+ 'Table name' => 'テーブル名',
18
+ 'engine' => 'エンジン',
19
+ 'collation' => '照合順序',
20
+ 'Column name' => '列名',
21
+ 'Type' => '型',
22
+ 'Length' => '長さ',
23
+ 'Auto Increment' => '連番',
24
+ 'Options' => '設定',
25
+ 'Save' => '保存',
26
+ 'Drop' => '削除',
27
+ 'Database has been dropped.' => 'データベースを削除しました',
28
+ 'Database has been created.' => 'データベースを作成しました',
29
+ 'Database has been renamed.' => 'データベースの名前を変えました',
30
+ 'Database has been altered.' => 'データベースを変更しました',
31
+ 'Alter database' => 'データベースを変更',
32
+ 'Create database' => 'データベースを作成',
33
+ 'SQL command' => 'SQLコマンド',
34
+ 'Logout' => 'ログアウト',
35
+ 'database' => 'データベース',
36
+ 'Use' => '使用',
37
+ 'No tables.' => 'テーブルがありません。',
38
+ 'select' => '選択',
39
+ 'Item has been deleted.' => '項目を削除しました',
40
+ 'Item has been updated.' => '項目を更新しました',
41
+ 'Edit' => '編集',
42
+ 'Insert' => '挿入',
43
+ 'Save and insert next' => '保存/追加',
44
+ 'Delete' => '削除',
45
+ 'Database' => 'データベース',
46
+ 'Routines' => 'ルーチン',
47
+ 'Indexes have been altered.' => '索引を変更しました',
48
+ 'Indexes' => '索引',
49
+ 'Alter indexes' => '索引の変更',
50
+ 'Add next' => '追加',
51
+ 'Language' => '言語',
52
+ 'Select' => '選択',
53
+ 'New item' => '項目の作成',
54
+ 'Search' => '検索',
55
+ 'Sort' => 'ソート',
56
+ 'descending' => '降順',
57
+ 'Limit' => '制約',
58
+ 'No rows.' => '行がありません',
59
+ 'Action' => '動作',
60
+ 'edit' => '編集',
61
+ 'Page' => 'ページ',
62
+ 'Query executed OK, %d row(s) affected.' => 'クエリーを実行しました。%d 行を変更しました',
63
+ 'Error in query' => 'クエリーのエラー',
64
+ 'Execute' => '実行',
65
+ 'Table' => 'テーブル',
66
+ 'Foreign keys' => '外部キー',
67
+ 'Triggers' => 'トリガー',
68
+ 'View' => 'ビュー',
69
+ 'Unable to select the table' => 'テーブルを選択できません',
70
+ 'Invalid CSRF token. Send the form again.' => '不正なCSRFトークン。再送信してください',
71
+ 'Comment' => 'コメント',
72
+ 'Default values' => '規定値',
73
+ '%d byte(s)' => '%d バイト',
74
+ 'No commands to execute.' => '実行するコマンドがありません',
75
+ 'Unable to upload a file.' => 'ファイルをアップロードできません',
76
+ 'File upload' => 'ファイルをアップロード',
77
+ 'File uploads are disabled.' => 'ファイルのアップロードが無効です',
78
+ 'Routine has been called, %d row(s) affected.' => 'ルーチンを呼びました。%d 行を変更しました',
79
+ 'Call' => '呼出し',
80
+ 'No extension' => '拡張機能がありません',
81
+ 'None of the supported PHP extensions (%s) are available.' => 'PHPの拡張機能(%s)がセットアップされていません',
82
+ 'Session support must be enabled.' => 'セッションを有効にしてください',
83
+ 'Session expired, please login again.' => 'セッションの期限切れ。ログインし直してください',
84
+ 'Text length' => '文字列の長さ',
85
+ 'Foreign key has been dropped.' => '外部キーを削除しました',
86
+ 'Foreign key has been altered.' => '外部キーを変更しました',
87
+ 'Foreign key has been created.' => '外部キーを作成しました',
88
+ 'Foreign key' => '外キー',
89
+ 'Target table' => 'テーブル',
90
+ 'Change' => '変更',
91
+ 'Source' => 'ソース',
92
+ 'Target' => 'ターゲット',
93
+ 'Add column' => '列を追加',
94
+ 'Alter' => '変更',
95
+ 'Add foreign key' => '外部キーを追加',
96
+ 'ON DELETE' => 'ON DELETE',
97
+ 'ON UPDATE' => 'ON UPDATE',
98
+ 'Index Type' => '索引の型',
99
+ 'Column (length)' => '列(長さ)',
100
+ 'View has been dropped.' => 'ビューを削除しました',
101
+ 'View has been altered.' => 'ビューを変更しました',
102
+ 'View has been created.' => 'ビューを作成しました',
103
+ 'Alter view' => 'ビューを変更',
104
+ 'Create view' => 'ビューを作成',
105
+ 'Name' => '名称',
106
+ 'Process list' => 'プロセス一覧',
107
+ '%d process(es) have been killed.' => '%d プロセスを強制終了しました',
108
+ 'Kill' => '強制終了',
109
+ 'Parameter name' => '参数名',
110
+ 'Database schema' => '構造',
111
+ 'Create procedure' => 'プロシージャの作成',
112
+ 'Create function' => '関数の作成',
113
+ 'Routine has been dropped.' => 'ルーチンを作成',
114
+ 'Routine has been altered.' => 'ルーチンを変更',
115
+ 'Routine has been created.' => 'ルーチンを作成',
116
+ 'Alter function' => '関数の変更',
117
+ 'Alter procedure' => 'プロシージャの変更',
118
+ 'Return type' => '戻り値の型',
119
+ 'Add trigger' => 'トリガーの追加',
120
+ 'Trigger has been dropped.' => 'トリガーを削除しました',
121
+ 'Trigger has been altered.' => 'トリガーを変更しました',
122
+ 'Trigger has been created.' => 'トリガーを追加しました',
123
+ 'Alter trigger' => 'トリガーの変更',
124
+ 'Create trigger' => 'トリガーの作成',
125
+ 'Time' => '時間',
126
+ 'Event' => 'イベント',
127
+ '%s version: %s through PHP extension %s' => '%sバージョン:%s、 PHP拡張機能 %s',
128
+ '%d row(s)' => '%d 行',
129
+ 'Remove' => '除外',
130
+ 'Are you sure?' => '実行しますか?',
131
+ 'Privileges' => '権限',
132
+ 'Create user' => 'ユーザを作成',
133
+ 'User has been dropped.' => 'ユーザを削除',
134
+ 'User has been altered.' => 'ユーザを変更',
135
+ 'User has been created.' => 'ユーザを作成',
136
+ 'Hashed' => 'Hashed',
137
+ 'Column' => '列',
138
+ 'Routine' => 'ルーチン',
139
+ 'Grant' => '権限の付与',
140
+ 'Revoke' => '権限の取消し',
141
+ 'Logged as: %s' => 'ログ:%s',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POSTデータが大きすぎます。データサイズを小さくするか %s 設定を大きくしてください',
143
+ 'Move up' => '上',
144
+ 'Move down' => '下',
145
+ 'Export' => 'エクスポート',
146
+ 'Tables' => 'テーブル',
147
+ 'Data' => 'データ',
148
+ 'Output' => '出力',
149
+ 'open' => '開く',
150
+ 'save' => '保存',
151
+ 'Format' => '形式',
152
+ 'Functions' => '関数',
153
+ 'Aggregation' => '集合',
154
+ 'Event has been dropped.' => '削除しました',
155
+ 'Event has been altered.' => '変更しました',
156
+ 'Event has been created.' => '作成しました',
157
+ 'Alter event' => '変更',
158
+ 'Create event' => '作成',
159
+ 'Start' => '開始',
160
+ 'End' => '終了',
161
+ 'Every' => '毎回',
162
+ 'Status' => '状態',
163
+ 'On completion preserve' => '完成後に保存',
164
+ 'Events' => 'イベント',
165
+ 'Schedule' => 'スケジュール',
166
+ 'At given time' => '指定時刻',
167
+ 'Tables have been truncated.' => 'テーブルをtruncateしました',
168
+ 'Tables have been moved.' => 'テーブルを移動しました',
169
+ 'Tables and views' => 'テーブルとビュー',
170
+ 'Engine' => 'エンジン',
171
+ 'Collation' => '照合順序',
172
+ 'Data Length' => 'データ長',
173
+ 'Index Length' => '索引長',
174
+ 'Data Free' => '空き',
175
+ 'Rows' => '行数',
176
+ ',' => ',',
177
+ '0123456789' => '0123456789',
178
+ 'Analyze' => '分析',
179
+ 'Optimize' => '最適化',
180
+ 'Check' => 'チェック',
181
+ 'Repair' => '修復',
182
+ 'Truncate' => 'Truncate',
183
+ 'Move to other database' => '別のデータベースへ移動',
184
+ 'Move' => '移動',
185
+ 'Save and continue edit' => '保存して継続',
186
+ 'original' => '元',
187
+ '%d item(s) have been affected.' => '%d を更新しました',
188
+ 'whole result' => '全結果',
189
+ 'Tables have been dropped.' => 'テーブルを削除しました',
190
+ 'Clone' => 'クローン',
191
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => '定義可能な最大フィールド数を越えました。%s を増やしてください。',
192
+ 'Partition by' => 'パーティション',
193
+ 'Partitions' => 'パーティション',
194
+ 'Partition name' => 'パーティション名',
195
+ 'Values' => '値',
196
+ '%d row(s) have been imported.' => '%d 行をインポートしました',
197
+ 'Show structure' => '構造',
198
+ 'anywhere' => '任意',
199
+ 'Import' => 'インポート',
200
+ 'Stop on error' => 'エラーの場合は停止',
201
+ 'Select data' => 'データ',
202
+ '%.3f s' => '%.3f 秒',
203
+ '$1-$3-$5' => '$1.$3.$5',
204
+ '[yyyy]-mm-dd' => '[yyyy].mm.dd',
205
+ 'History' => '履歴',
206
+ 'Variables' => '変数',
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.' => 'ソースとターゲットの列は同じデータ型でなければなりません。ターゲット列に索引があり、データが存在しなければなりません。',
208
+ 'Relations' => '関係',
209
+ 'Run file' => 'ファイルを実行',
210
+ 'Clear' => '消去',
211
+ 'Maximum allowed file size is %sB.' => '最大ファイルサイズ %sB',
212
+ 'Numbers' => '数字',
213
+ 'Date and time' => '日時',
214
+ 'Strings' => '文字列',
215
+ 'Binary' => 'バイナリ',
216
+ 'Lists' => 'リスト',
217
+ 'Editor' => 'エディタ',
218
+ 'E-mail' => 'メール',
219
+ 'From' => '差出人',
220
+ 'Subject' => '題名',
221
+ 'Send' => '送信',
222
+ '%d e-mail(s) have been sent.' => '%d メールを送信しました',
223
+ 'Webserver file %s' => 'Webサーバファイル %s',
224
+ 'File does not exist.' => 'ファイルは存在しません',
225
+ '%d in total' => '合計 %d',
226
+ 'Permanent login' => '永続的にログイン',
227
+ 'Databases have been dropped.' => 'データベースを削除しました',
228
+ 'Search data in tables' => 'データを検索する',
229
+ 'Schema' => 'スキーマ',
230
+ 'Alter schema' => 'スキーマ変更',
231
+ 'Create schema' => 'スキーマ追加',
232
+ 'Schema has been dropped.' => 'スキーマを削除しました',
233
+ 'Schema has been created.' => 'スキーマを追加しました',
234
+ 'Schema has been altered.' => 'スキーマを変更しました',
235
+ 'Sequences' => 'シーケンス',
236
+ 'Create sequence' => 'シーケンス作成',
237
+ 'Alter sequence' => 'シーケンス変更',
238
+ 'Sequence has been dropped.' => 'シーケンスを削除しました',
239
+ 'Sequence has been created.' => 'シーケンスを追加しました',
240
+ 'Sequence has been altered.' => 'シーケンスを変更しました',
241
+ 'User types' => 'ユーザー定義型',
242
+ 'Create type' => 'ユーザー定義型作成',
243
+ 'Alter type' => 'ユーザー定義型変更',
244
+ 'Type has been dropped.' => 'ユーザー定義型を削除しました',
245
+ 'Type has been created.' => 'ユーザー定義型を追加しました',
246
+ 'Use edit link to modify this value.' => 'リンクを編集する',
247
+ 'last' => '最終',
248
+ 'From server' => 'サーバーから実行',
249
+ 'System' => 'データベース種類',
250
+ 'empty' => '空',
251
+ 'Network' => 'ネットワーク型',
252
+ 'Geometry' => 'ジオメトリ型',
253
+ 'File exists.' => 'ファイルが既に存在します',
254
+ 'Attachments' => '添付ファイル',
255
+ 'Item%s has been inserted.' => '%s項目を挿入しました',
256
+ 'now' => '現在の日時',
257
+ '%d query(s) executed OK.' => '%d クエリーを実行しました',
258
+ 'Show only errors' => 'エラーのみ表示',
259
+ 'Refresh' => 'リフレッシュ',
260
+ 'Invalid schema.' => '無効なスキーマ',
261
+ 'Please use one of the extensions %s.' => 'いずれかの拡張機能を使ってください %s',
262
+ 'ltr' => 'ltr',
263
+ 'Tables have been copied.' => 'テーブルをコピーしました',
264
+ 'Copy' => 'コピー',
265
+ 'Permanent link' => 'パーマネントリンク',
266
+ 'Edit all' => 'すべて編集',
267
+ 'HH:MM:SS' => '時:分:秒',
268
+ );
adminer/adminer/adminer/lang/ko.inc.php ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ 'Create new database' => '새 데이터베이스 만들기',
12
+ 'Table has been dropped.' => '테이블을 삭제했습니다.',
13
+ 'Table has been altered.' => '테이블을 변경했습니다.',
14
+ 'Table has been created.' => '테이블을 만들었습니다.',
15
+ 'Alter table' => '테이블 변경',
16
+ 'Create table' => '테이블 만들기',
17
+ 'Table name' => '테이블 이름',
18
+ 'engine' => '엔진',
19
+ 'collation' => '정렬',
20
+ 'Column name' => '열 이름',
21
+ 'Type' => '형',
22
+ 'Length' => '길이',
23
+ 'Auto Increment' => '자동증가',
24
+ 'Options' => '설정',
25
+ 'Save' => '저장',
26
+ 'Drop' => '삭제',
27
+ 'Database has been dropped.' => '데이터베이스를 삭제했습니다.',
28
+ 'Database has been created.' => '데이터베이스를 만들었습니다.',
29
+ 'Database has been renamed.' => '데이터베이스의 이름을 바꾸었습니다.',
30
+ 'Database has been altered.' => '데이터베이스를 변경했습니다.',
31
+ 'Alter database' => '데이터베이스 변경',
32
+ 'Create database' => '데이터베이스 만들기',
33
+ 'SQL command' => 'SQL 명령',
34
+ 'Logout' => '로그아웃',
35
+ 'database' => '데이터베이스',
36
+ 'Use' => '사용',
37
+ 'No tables.' => '테이블이 없습니다.',
38
+ 'select' => '선택',
39
+ 'Item has been deleted.' => '항목을 삭제했습니다.',
40
+ 'Item has been updated.' => '항목을 갱신했습니다.',
41
+ 'Edit' => '편집',
42
+ 'Insert' => '삽입',
43
+ 'Save and insert next' => '저장하고 다음에 추가',
44
+ 'Delete' => '삭제',
45
+ 'Database' => '데이터베이스',
46
+ 'Routines' => '루틴',
47
+ 'Indexes have been altered.' => '인덱스를 변경했습니다.',
48
+ 'Indexes' => '색인',
49
+ 'Alter indexes' => '인덱스 변경',
50
+ 'Add next' => '추가',
51
+ 'Language' => '언어',
52
+ 'Select' => '선택',
53
+ 'New item' => '항목 만들기',
54
+ 'Search' => '검색',
55
+ 'Sort' => '정렬',
56
+ 'descending' => '역순',
57
+ 'Limit' => '제약',
58
+ 'No rows.' => '행이 없습니다.',
59
+ 'Action' => '실행',
60
+ 'edit' => '편집',
61
+ 'Page' => '페이지',
62
+ 'Query executed OK, %d row(s) affected.' => '쿼리를 실행했습니다. %d 행을 변경했습니다.',
63
+ 'Error in query' => '쿼리의 오류',
64
+ 'Execute' => '실행',
65
+ 'Table' => '테이블',
66
+ 'Foreign keys' => '외부 키',
67
+ 'Triggers' => '트리거',
68
+ 'View' => '보기',
69
+ 'Unable to select the table' => '테이블을 선택할 수 없습니다.',
70
+ 'Invalid CSRF token. Send the form again.' => '잘못된 CSRF 토큰. 다시 보내주십시오.',
71
+ 'Comment' => '코멘트',
72
+ 'Default values' => '기본값',
73
+ '%d byte(s)' => '%d 바이트',
74
+ 'No commands to execute.' => '실행할 수 있는 명령이 없습니다.',
75
+ 'Unable to upload a file.' => '파일을 업로드 할 수 없습니다.',
76
+ 'File upload' => '파일 올리기',
77
+ 'File uploads are disabled.' => '파일 업로드가 잘못되었습니다.',
78
+ 'Routine has been called, %d row(s) affected.' => '루틴을 호출했습니다. %d 행을 변경했습니다.',
79
+ 'Call' => '외침',
80
+ 'No extension' => '확장 기능이 없습니다.',
81
+ 'None of the supported PHP extensions (%s) are available.' => 'PHP 확장 (%s)가 설치되어 있지 않습니다.',
82
+ 'Session support must be enabled.' => '세션을 사용하십시오.',
83
+ 'Session expired, please login again.' => '세션 만료. 다시 로그인하십시오.',
84
+ 'Text length' => '문자열의 길이',
85
+ 'Foreign key has been dropped.' => '외부 키를 제거했습니다.',
86
+ 'Foreign key has been altered.' => '외부 키를 변경했습니다.',
87
+ 'Foreign key has been created.' => '외부 키를 만들었습니다.',
88
+ 'Foreign key' => '외부 키',
89
+ 'Target table' => '테이블',
90
+ 'Change' => '변경',
91
+ 'Source' => '소스',
92
+ 'Target' => '타겟',
93
+ 'Add column' => '열 추가',
94
+ 'Alter' => '변경',
95
+ 'Add foreign key' => '외부 키를 추가',
96
+ 'ON DELETE' => 'ON DELETE',
97
+ 'ON UPDATE' => 'ON UPDATE',
98
+ 'Index Type' => '인덱스 형',
99
+ 'Column (length)' => '열 (길이)',
100
+ 'View has been dropped.' => '보기를 삭제했습니다.',
101
+ 'View has been altered.' => '보기를 변경했습니다.',
102
+ 'View has been created.' => '보기를 만들었습니다.',
103
+ 'Alter view' => '보기 변경',
104
+ 'Create view' => '뷰 만들기',
105
+ 'Name' => '이름',
106
+ 'Process list' => '프로세스 목록',
107
+ '%d process(es) have been killed.' => '%d 프로세스를 강제 종료되었습니다.',
108
+ 'Kill' => '강제 종료',
109
+ 'Parameter name' => '참조 여명',
110
+ 'Database schema' => '구조',
111
+ 'Create procedure' => '시저 만들기',
112
+ 'Create function' => '함수 만들기',
113
+ 'Routine has been dropped.' => '루틴 만들기',
114
+ 'Routine has been altered.' => '루틴 변경',
115
+ 'Routine has been created.' => '루틴 만들기',
116
+ 'Alter function' => '함수의 변경',
117
+ 'Alter procedure' => '시저 변경',
118
+ 'Return type' => '반환 형식',
119
+ 'Add trigger' => '트리거 추가',
120
+ 'Trigger has been dropped.' => '트리거를 제거했습니다.',
121
+ 'Trigger has been altered.' => '트리거를 변경했습니다.',
122
+ 'Trigger has been created.' => '트리거를 추가했습니다.',
123
+ 'Alter trigger' => '트리거 변경',
124
+ 'Create trigger' => '트리거 만들기',
125
+ 'Time' => '시간',
126
+ 'Event' => '이벤트',
127
+ '%s version: %s through PHP extension %s' => '%s 버전 %s, PHP 확장 %s',
128
+ '%d row(s)' => '%d 행',
129
+ 'Remove' => '제외',
130
+ 'Are you sure?' => '실행 하시겠습니까?',
131
+ 'Privileges' => '권한',
132
+ 'Create user' => '사용자 만들기',
133
+ 'User has been dropped.' => '사용자 삭제',
134
+ 'User has been altered.' => '사용자 변경',
135
+ 'User has been created.' => '사용자 만들기',
136
+ 'Hashed' => 'Hashed',
137
+ 'Column' => '열',
138
+ 'Routine' => '루틴',
139
+ 'Grant' => '권한 부여',
140
+ 'Revoke' => '권한 취소',
141
+ 'Logged as: %s' => '로그 : %s',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 데이터가 너무 큽니다. 데이터 크기를 줄이거나 %s 설정을 늘리십시오.',
143
+ 'Move up' => '상',
144
+ 'Move down' => '아래',
145
+ 'Export' => '내보내기',
146
+ 'Tables' => '테이블',
147
+ 'Data' => '데이터',
148
+ 'Output' => '출력',
149
+ 'open' => '열',
150
+ 'save' => '저장',
151
+ 'Format' => '형식',
152
+ 'Functions' => '함수',
153
+ 'Aggregation' => '집합',
154
+ 'Event has been dropped.' => '삭제했습니다.',
155
+ 'Event has been altered.' => '변경했습니다.',
156
+ 'Event has been created.' => '만들었습니다.',
157
+ 'Alter event' => '변경',
158
+ 'Create event' => '만들기',
159
+ 'Start' => '시작',
160
+ 'End' => '종료',
161
+ 'Every' => '매번',
162
+ 'Status' => '상태',
163
+ 'On completion preserve' => '완성 후 저장',
164
+ 'Events' => '이벤트',
165
+ 'Schedule' => '일정',
166
+ 'At given time' => '지정 시간',
167
+ 'Tables have been truncated.' => '테이블을 truncate했습니다.',
168
+ 'Tables have been moved.' => '테이블을 옮겼습니다.',
169
+ 'Tables and views' => '테이블과 뷰',
170
+ 'Engine' => '엔진',
171
+ 'Collation' => '정렬',
172
+ 'Data Length' => '데이터 길이',
173
+ 'Index Length' => '인덱스 길이',
174
+ 'Data Free' => '여유',
175
+ 'Rows' => '행',
176
+ ',' => ',',
177
+ '0123456789' => '0123456789',
178
+ 'Analyze' => '분석',
179
+ 'Optimize' => '최적화',
180
+ 'Check' => '확인',
181
+ 'Repair' => '복구',
182
+ 'Truncate' => 'Truncate',
183
+ 'Move to other database' => '다른 데이터베이스로 이동',
184
+ 'Move' => '이동',
185
+ 'Save and continue edit' => '저장하고 계속',
186
+ 'original' => '원래',
187
+ '%d item(s) have been affected.' => '%d를 갱신했습니다.',
188
+ 'whole result' => '모든 결과',
189
+ 'Tables have been dropped.' => '테이블을 삭제했습니다.',
190
+ 'Clone' => '복제',
191
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => '정의 가능한 최대 필드 수를 초과했습니다. %s를 늘리십시오.',
192
+ 'Partition by' => '파티션',
193
+ 'Partitions' => '파티션',
194
+ 'Partition name' => '파티션 이름',
195
+ 'Values' => '값',
196
+ '%d row(s) have been imported.' => '%d 행을 가져 왔습니다.',
197
+ 'Show structure' => '구조',
198
+ 'anywhere' => '모든',
199
+ 'Import' => '가져 오기',
200
+ 'Stop on error' => '오류의 경우 중지',
201
+ 'Select data' => '데이터',
202
+ '%.3f s' => '%.3f 초',
203
+ '$1-$3-$5' => '$1-$3-$5',
204
+ '[yyyy]-mm-dd' => '[yyyy]-mm-dd',
205
+ 'History' => '역사',
206
+ 'Variables' => '변수',
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.' => '원본 및 대상 열은 동일한 데이터 형식이어야합니다. 목표 컬럼에 인덱스와 데이터가 존재해야합니다.',
208
+ 'Relations' => '관계',
209
+ 'Run file' => '파일을 실행',
210
+ 'Clear' => '삭제',
211
+ 'Maximum allowed file size is %sB.' => '파일의 최대 크기 %sB',
212
+ 'Numbers' => '숫자',
213
+ 'Date and time' => '시간',
214
+ 'Strings' => '문자열',
215
+ 'Binary' => '이진',
216
+ 'Lists' => '목록',
217
+ 'Editor' => '에디터',
218
+ 'E-mail' => '메일',
219
+ 'From' => '보낸 사람',
220
+ 'Subject' => '제목',
221
+ 'Send' => '보내기',
222
+ '%d e-mail(s) have been sent.' => '%d 메일을 보냈습니다.',
223
+ 'Webserver file %s' => 'Web 서버 파일 %s',
224
+ 'File does not exist.' => '파일이 존재하지 않습니다.',
225
+ '%d in total' => '총 %d',
226
+ 'Permanent login' => '영구적으로 로그인',
227
+ 'Databases have been dropped.' => '데이터베이스를 삭제했습니다.',
228
+ 'Search data in tables' => '데이터 검색',
229
+ 'Schema' => '스키마',
230
+ 'Alter schema' => '스키마 변경',
231
+ 'Create schema' => '스키마 추가',
232
+ 'Schema has been dropped.' => '스키마를 삭제했습니다.',
233
+ 'Schema has been created.' => '스키마를 추가했습니다.',
234
+ 'Schema has been altered.' => '스키마를 변경했습니다.',
235
+ 'Sequences' => '시퀀스',
236
+ 'Create sequence' => '시퀀스 만들기',
237
+ 'Alter sequence' => '순서 변경',
238
+ 'Sequence has been dropped.' => '시퀀스를 제거했습니다.',
239
+ 'Sequence has been created.' => '시퀀스를 추가했습니다.',
240
+ 'Sequence has been altered.' => '순서를 변경했습니다.',
241
+ 'User types' => '사용자 정의 형',
242
+ 'Create type' => '사용자 정의 형식 만들기',
243
+ 'Alter type' => '사용자 정의 형식 변경',
244
+ 'Type has been dropped.' => '사용자 정의 형식을 삭제했습니다.',
245
+ 'Type has been created.' => '사용자 정의 형식을 추가했습니다.',
246
+ 'Use edit link to modify this value.' => '링크 편집',
247
+ 'last' => '마지막',
248
+ 'From server' => '서버에서 실행',
249
+ 'System' => '데이터베이스 형식',
250
+ 'empty' => '하늘',
251
+ 'Network' => '네트워크 형',
252
+ 'Geometry' => '기하 형',
253
+ 'File exists.' => '파일이 이미 있습니다.',
254
+ 'Attachments' => '첨부 파일',
255
+ 'Item%s has been inserted.' => '%s 항목을 삽입했습니다.',
256
+ 'now' => '현재 시간',
257
+ '%d query(s) executed OK.' => '%d 쿼리를 실행했습니다.',
258
+ 'Show only errors' => '오류 만 표시',
259
+ 'Refresh' => '새로 고침',
260
+ 'Invalid schema.' => '잘못된 스키마',
261
+ 'Please use one of the extensions %s.' => '하나의 확장 기능을 사용하십시오 %s',
262
+ 'ltr' => 'ltr',
263
+ 'Tables have been copied.' => '테이블을 복사했습니다',
264
+ 'Copy' => '복사',
265
+ 'Permanent link' => '영구 링크',
266
+ 'Edit all' => '모든 편집',
267
+ 'HH:MM:SS' => '시:분:초',
268
+ );
adminer/adminer/adminer/lang/lt.inc.php ADDED
@@ -0,0 +1,313 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Sistema',
5
+ 'Server' => 'Serveris',
6
+ 'Username' => 'Vartotojas',
7
+ 'Password' => 'Slaptažodis',
8
+ 'Permanent login' => 'Pastovus prisijungimas',
9
+ 'Login' => 'Prisijungti',
10
+ 'Logout' => 'Atsijungti',
11
+ 'Logged as: %s' => 'Prisijungęs kaip: %s',
12
+ 'Logout successful.' => 'Jūs atsijungėte nuo sistemos.',
13
+ 'Invalid credentials.' => 'Neteisingi prisijungimo duomenys.',
14
+ 'Language' => 'Kalba',
15
+ 'Invalid CSRF token. Send the form again.' => 'Neteisingas CSRF tokenas. Bandykite siųsti formos duomenis dar kartą.',
16
+ 'No extension' => 'Nėra plėtiio',
17
+ 'None of the supported PHP extensions (%s) are available.' => 'Nėra nei vieno iš palaikomų PHP plėtinių (%s).',
18
+ 'Session support must be enabled.' => 'Sesijų palaikymas turi būti įjungtas.',
19
+ 'Session expired, please login again.' => 'Sesijos galiojimas baigėsi. Prisijunkite iš naujo.',
20
+ '%s version: %s through PHP extension %s' => '%s versija: %s per PHP plėtinį %s',
21
+ 'Refresh' => 'Atnaujinti',
22
+
23
+ // text direction - 'ltr' or 'rtl'
24
+ 'ltr' => 'ltr',
25
+
26
+ 'Privileges' => 'Privilegijos',
27
+ 'Create user' => 'Sukurti vartotoją',
28
+ 'User has been dropped.' => 'Vartotojas ištrintas.',
29
+ 'User has been altered.' => 'Vartotojo duomenys pakeisti.',
30
+ 'User has been created.' => 'Vartotojas sukurtas.',
31
+ 'Hashed' => 'Šifruotas',
32
+ 'Column' => 'Stulpelis',
33
+ 'Routine' => 'Procedūra',
34
+ 'Grant' => 'Suteikti',
35
+ 'Revoke' => 'Atšaukti',
36
+
37
+ 'Process list' => 'Procesų sąrašas',
38
+ '%d process(es) have been killed.' => array('%d procesas nutrauktas.', '%d procesai nutraukti.', '%d procesų nutraukta.'),
39
+ 'Kill' => 'Nutraukti',
40
+
41
+ 'Variables' => 'Kintamieji',
42
+ 'Status' => 'Būsena',
43
+
44
+ 'SQL command' => 'SQL užklausa',
45
+ '%d query(s) executed OK.' => array('%d užklausa įvykdyta.', '%d užklausos įvykdytos.', '%d užklausų įvykdyta.'),
46
+ 'Query executed OK, %d row(s) affected.' => array('Užklausa įvykdyta. Pakeistas %d įrašas.', 'Užklausa įvykdyta. Pakeisti %d įrašai.', 'Užklausa įvykdyta. Pakeista %d įrašų.'),
47
+ 'No commands to execute.' => 'Nėra vykdomų užklausų.',
48
+ 'Error in query' => 'Klaida užklausoje',
49
+ 'Execute' => 'Vykdyti',
50
+ 'Stop on error' => 'Sustabdyti esant klaidai',
51
+ 'Show only errors' => 'Rodyti tik klaidas',
52
+ // sprintf() format for time of the command
53
+ '%.3f s' => '%.3f s',
54
+ 'History' => 'Istorija',
55
+ 'Clear' => 'Išvalyti',
56
+ 'Edit all' => 'Redaguoti visus',
57
+
58
+ 'File upload' => 'Failo įkėlimas',
59
+ 'From server' => 'Iš serverio',
60
+ 'Webserver file %s' => 'Failas %s iš serverio',
61
+ 'Run file' => 'Vykdyti failą',
62
+ 'File does not exist.' => 'Failas neegzistuoja.',
63
+ 'File uploads are disabled.' => 'Failų įkėlimas išjungtas.',
64
+ 'Unable to upload a file.' => 'Nepavyko įkelti failo.',
65
+ 'Maximum allowed file size is %sB.' => 'Maksimalus failo dydis - %sB.',
66
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Per daug POST duomenų. Sumažinkite duomenų kiekį arba padidinkite konfigūracijos nustatymą %s.',
67
+
68
+ 'Export' => 'Eksportas',
69
+ 'Output' => 'Išvestis',
70
+ 'open' => 'atidaryti',
71
+ 'save' => 'išsaugoti',
72
+ 'Format' => 'Formatas',
73
+ 'Data' => 'Duomenys',
74
+
75
+ 'Database' => 'Duomenų bazė',
76
+ 'database' => 'duomenų bazė',
77
+ 'Use' => 'Naudoti',
78
+ 'Select database' => 'Pasirinkti duomenų bazę',
79
+ 'Invalid database.' => 'Neteisinga duomenų bazė.',
80
+ 'Create new database' => 'Sukurti naują duomenų bazę',
81
+ 'Database has been dropped.' => 'Duomenų bazė panaikinta.',
82
+ 'Databases have been dropped.' => 'Duomenų bazės panaikintos.',
83
+ 'Database has been created.' => 'Duomenų bazė sukurta.',
84
+ 'Database has been renamed.' => 'Duomenų bazė pervadinta.',
85
+ 'Database has been altered.' => 'Duomenų bazė pakeista.',
86
+ 'Alter database' => 'Redaguoti duomenų bazę',
87
+ 'Create database' => 'Sukurti duomenų bazę',
88
+ 'Database schema' => 'Duomenų bazės schema',
89
+
90
+ // link to current database schema layout
91
+ 'Permanent link' => 'Pastovi nuoroda',
92
+
93
+ // thousands separator - must contain single byte
94
+ ',' => ' ',
95
+ '0123456789' => '0123456789',
96
+ 'Engine' => 'Variklis',
97
+ 'Collation' => 'Lyginimas',
98
+ 'Data Length' => 'Duomenų ilgis',
99
+ 'Index Length' => 'Indekso ilgis',
100
+ 'Data Free' => 'Laisvos vietos',
101
+ 'Rows' => 'Įrašai',
102
+ '%d in total' => '%d iš viso',
103
+ 'Analyze' => 'Analizuoti',
104
+ 'Optimize' => 'Optimizuoti',
105
+ 'Check' => 'Patikrinti',
106
+ 'Repair' => 'Pataisyti',
107
+ 'Truncate' => 'Tuštinti',
108
+ 'Tables have been truncated.' => 'Lentelės buvo ištuštintos.',
109
+ 'Move to other database' => 'Perkelti į kitą duomenų bazę',
110
+ 'Move' => 'Perkelti',
111
+ 'Tables have been moved.' => 'Lentelės perkeltos.',
112
+ 'Copy' => 'Kopijuoti',
113
+ 'Tables have been copied.' => 'Lentelės nukopijuotos.',
114
+
115
+ 'Routines' => 'Procedūros',
116
+ 'Routine has been called, %d row(s) affected.' => array('Procedūra įvykdyta. %d įrašas pakeistas.', 'Procedūra įvykdyta. %d įrašai pakeisti.', 'Procedūra įvykdyta. %d įrašų pakeista.'),
117
+ 'Call' => 'Vykdyti',
118
+ 'Parameter name' => 'Parametro pavadinimas',
119
+ 'Create procedure' => 'Sukurti procedūrą',
120
+ 'Create function' => 'Sukurti funkciją',
121
+ 'Routine has been dropped.' => 'Procedūra pašalinta.',
122
+ 'Routine has been altered.' => 'Procedūra pakeista.',
123
+ 'Routine has been created.' => 'Procedūra sukurta.',
124
+ 'Alter function' => 'Keisti funkciją',
125
+ 'Alter procedure' => 'Keiskti procedūrą',
126
+ 'Return type' => 'Grąžinimo tipas',
127
+
128
+ 'Events' => 'Įvykiai',
129
+ 'Event has been dropped.' => 'Įvykis pašalintas.',
130
+ 'Event has been altered.' => 'Įvykis pakeistas.',
131
+ 'Event has been created.' => 'Įvykis sukurtas.',
132
+ 'Alter event' => 'Redaguoti įvykį',
133
+ 'Create event' => 'Sukurti įvykį',
134
+ 'At given time' => 'Nurodytu laiku',
135
+ 'Every' => 'Kas',
136
+ 'Schedule' => 'Grafikas',
137
+ 'Start' => 'Pradžia',
138
+ 'End' => 'Pabaiga',
139
+ 'On completion preserve' => 'Įvykdžius išsaugoti',
140
+
141
+ 'Tables' => 'Lentelės',
142
+ 'Tables and views' => 'Lentelės ir vaizdai',
143
+ 'Table' => 'Lentelė',
144
+ 'No tables.' => 'Nėra lentelių.',
145
+ 'Alter table' => 'Redaguoti lentelę',
146
+ 'Create table' => 'Sukurti lentelę',
147
+ 'Table has been dropped.' => 'Lentelė pašalinta.',
148
+ 'Tables have been dropped.' => 'Lentelės pašalintos.',
149
+ 'Table has been altered.' => 'Lentelė pakeista.',
150
+ 'Table has been created.' => 'Lentelė sukurta.',
151
+ 'Table name' => 'Lentelės pavadinimas',
152
+ 'Show structure' => 'Rodyti struktūrą',
153
+ 'engine' => 'variklis',
154
+ 'collation' => 'palyginimas',
155
+ 'Column name' => 'Stulpelio pavadinimas',
156
+ 'Type' => 'Tipas',
157
+ 'Length' => 'Ilgis',
158
+ 'Auto Increment' => 'Auto Increment',
159
+ 'Options' => 'Nustatymai',
160
+ 'Comment' => 'Komentaras',
161
+ 'Default values' => 'Reikšmės pagal nutylėjimą',
162
+ 'Drop' => 'Pašalinti',
163
+ 'Are you sure?' => 'Tikrai?',
164
+ 'Move up' => 'Perkelti į viršų',
165
+ 'Move down' => 'Perkelti žemyn',
166
+ 'Remove' => 'Pašalinti',
167
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Viršytas maksimalus leidžiamų stulpelių kiekis. Padidinkite %s.',
168
+
169
+ 'Partition by' => 'Skirstyti pagal',
170
+ 'Partitions' => 'Skirsniai',
171
+ 'Partition name' => 'Skirsnio pavadinimas',
172
+ 'Values' => 'Reikšmės',
173
+
174
+ 'View' => 'Vaizdas',
175
+ 'View has been dropped.' => 'Vaizdas pašalintas.',
176
+ 'View has been altered.' => 'Vaizdas pakeistas.',
177
+ 'View has been created.' => 'Vaizdas sukurtas.',
178
+ 'Alter view' => 'Redaguoti vaizdą',
179
+ 'Create view' => 'Sukurti vaizdą',
180
+
181
+ 'Indexes' => 'Indeksai',
182
+ 'Indexes have been altered.' => 'Indeksai pakeisti.',
183
+ 'Alter indexes' => 'Redaguoti indeksus',
184
+ 'Add next' => 'Pridėti kitą',
185
+ 'Index Type' => 'Indekso tipas',
186
+ 'Column (length)' => 'Stulpelis (ilgis)',
187
+
188
+ 'Foreign keys' => 'Išoriniai raktai',
189
+ 'Foreign key' => 'Išorinis raktas',
190
+ 'Foreign key has been dropped.' => 'Išorinis raktas pašalintas.',
191
+ 'Foreign key has been altered.' => 'Išorinis raktas pakeistas.',
192
+ 'Foreign key has been created.' => 'Išorinis raktas sukurtas.',
193
+ 'Target table' => 'Tikslinė lentelė',
194
+ 'Change' => 'Pakeisti',
195
+ 'Source' => 'Šaltinis',
196
+ 'Target' => 'Tikslas',
197
+ 'Add column' => 'Pridėti stulpelį',
198
+ 'Alter' => 'Redaguoti',
199
+ 'Add foreign key' => 'Pridėti išorinį raktą',
200
+ 'ON DELETE' => 'Ištrinant',
201
+ 'ON UPDATE' => 'Atnaujinant',
202
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Šaltinio ir tikslinis stulpelis turi būti to paties tipo, tiksliniame stulpelyje turi būti naudojamas indeksas ir duomenys turi egzistuoti.',
203
+
204
+ 'Triggers' => 'Trigeriai',
205
+ 'Add trigger' => 'Pridėti trigerį',
206
+ 'Trigger has been dropped.' => 'Trigeris pašalintas.',
207
+ 'Trigger has been altered.' => 'Trigeris pakeistas.',
208
+ 'Trigger has been created.' => 'Trigeris sukurtas.',
209
+ 'Alter trigger' => 'Keisti trigerį',
210
+ 'Create trigger' => 'Sukurti trigerį',
211
+ 'Time' => 'Laikas',
212
+ 'Event' => 'Įvykis',
213
+ 'Name' => 'Pavadinimas',
214
+
215
+ 'select' => 'atrinkti',
216
+ 'Select' => 'Atrinkti',
217
+ 'Select data' => 'Atrinkti duomenis',
218
+ 'Functions' => 'Funkcijos',
219
+ 'Aggregation' => 'Agregacija',
220
+ 'Search' => 'Ieškoti',
221
+ 'anywhere' => 'visur',
222
+ 'Search data in tables' => 'Ieškoti duomenų lentelėse',
223
+ 'Sort' => 'Rikiuoti',
224
+ 'descending' => 'mažėjimo tvarka',
225
+ 'Limit' => 'Limitas',
226
+ 'Text length' => 'Teksto ilgis',
227
+ 'Action' => 'Veiksmas',
228
+ 'Unable to select the table' => 'Neįmanoma atrinkti lentelės',
229
+ 'No rows.' => 'Nėra įrašų.',
230
+ '%d row(s)' => array('%d įrašas', '%d įrašai', '%d įrašų'),
231
+ 'Page' => 'Puslapis',
232
+ 'last' => 'paskutinis',
233
+ 'whole result' => 'visas rezultatas',
234
+ '%d byte(s)' => array('%d baitas', '%d baigai', '%d baitų'),
235
+
236
+ 'Import' => 'Importas',
237
+ '%d row(s) have been imported.' => array('%d įrašas įkelta.', '%d įrašai įkelti.', '%d įrašų įkelta.'),
238
+
239
+ // in-place editing in select
240
+ 'Use edit link to modify this value.' => 'Norėdami redaguoti reikšmę naudokite redagavimo nuorodą.',
241
+
242
+ // %s can contain auto-increment value
243
+ 'Item%s has been inserted.' => 'Įrašas%s sukurtas.',
244
+ 'Item has been deleted.' => 'Įrašas ištrintas.',
245
+ 'Item has been updated.' => 'Įrašas pakeistas.',
246
+ '%d item(s) have been affected.' => array('Pakeistas %d įrašas.', 'Pakeisti %d įrašai.', 'Pakeistas %d įrašų.'),
247
+ 'New item' => 'Naujas įrašas',
248
+ 'original' => 'originalas',
249
+ // label for value '' in enum data type
250
+ 'empty' => 'tuščia',
251
+ 'edit' => 'redaguoti',
252
+ 'Edit' => 'Redaguoti',
253
+ 'Insert' => 'Įrašyti',
254
+ 'Save' => 'Išsaugoti',
255
+ 'Save and continue edit' => 'Išsaugoti ir tęsti redagavimą',
256
+ 'Save and insert next' => 'Išsaugoti ir įrašyti kitą',
257
+ 'Clone' => 'Klonuoti',
258
+ 'Delete' => 'Trinti',
259
+
260
+ 'E-mail' => 'El. paštas',
261
+ 'From' => 'Nuo',
262
+ 'Subject' => 'Antraštė',
263
+ 'Attachments' => 'Priedai',
264
+ 'Send' => 'Siųsti',
265
+ '%d e-mail(s) have been sent.' => array('Išsiųstas %d laiškas.', 'Išsiųsti %d laiškai.', 'Išsiųsta %d laiškų.'),
266
+
267
+ // data type descriptions
268
+ 'Numbers' => 'Skaičiai',
269
+ 'Date and time' => 'Data ir laikas',
270
+ 'Strings' => 'Tekstas',
271
+ 'Binary' => 'Dvejetainis',
272
+ 'Lists' => 'Sąrašai',
273
+ 'Network' => 'Tinklas',
274
+ 'Geometry' => 'Geometrija',
275
+ 'Relations' => 'Ryšiai',
276
+
277
+ 'Editor' => 'Redaktorius',
278
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
279
+ '$1-$3-$5' => '$1-$3-$5',
280
+ // hint for date format - use language equivalents for day, month and year shortcuts
281
+ '[yyyy]-mm-dd' => '[yyyy]-mm-dd',
282
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
283
+ 'HH:MM:SS' => 'HH:MM:SS',
284
+ 'now' => 'dabar',
285
+
286
+ // general SQLite error in create, drop or rename database
287
+ 'File exists.' => 'Failas egzistuoja.',
288
+ 'Please use one of the extensions %s.' => 'Naudokite vieną iš plėtinių %s.',
289
+
290
+ // PostgreSQL and MS SQL schema support
291
+ 'Alter schema' => 'Keisti schemą',
292
+ 'Create schema' => 'Sukurti schemą',
293
+ 'Schema has been dropped.' => 'Schema pašalinta.',
294
+ 'Schema has been created.' => 'Schema sukurta.',
295
+ 'Schema has been altered.' => 'Schema pakeista.',
296
+ 'Schema' => 'Schema',
297
+ 'Invalid schema.' => 'Neteisinga schema.',
298
+
299
+ // PostgreSQL sequences support
300
+ 'Sequences' => 'Sekos',
301
+ 'Create sequence' => 'Sukurti seką',
302
+ 'Sequence has been dropped.' => 'Seka pašalinta.',
303
+ 'Sequence has been created.' => 'Seka sukurta.',
304
+ 'Sequence has been altered.' => 'Seka pakeista.',
305
+ 'Alter sequence' => 'Keisti seką',
306
+
307
+ // PostgreSQL user types support
308
+ 'User types' => 'Vartotojų tipai',
309
+ 'Create type' => 'Sukurti tipą',
310
+ 'Type has been dropped.' => 'Tipas pašalintas.',
311
+ 'Type has been created.' => 'Tipas sukurtas.',
312
+ 'Alter type' => 'Keisti tipą',
313
+ );
adminer/adminer/adminer/lang/nl.inc.php ADDED
@@ -0,0 +1,269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Inloggen',
4
+ 'Logout successful.' => 'Uitloggen geslaagd.',
5
+ 'Invalid credentials.' => 'Ongeldige logingegevens.',
6
+ 'Server' => 'Server',
7
+ 'Username' => 'Gebruikersnaam',
8
+ 'Password' => 'Wachtwoord',
9
+ 'Select database' => 'Database selecteren',
10
+ 'Invalid database.' => 'Ongeldige database.',
11
+ 'Create new database' => 'Nieuwe database',
12
+ 'Table has been dropped.' => 'Tabel verwijderd.',
13
+ 'Table has been altered.' => 'Tabel aangepast.',
14
+ 'Table has been created.' => 'Tabel aangemaakt.',
15
+ 'Alter table' => 'Tabel aanpassen',
16
+ 'Create table' => 'Tabel aanmaken',
17
+ 'Table name' => 'Tabelnaam',
18
+ 'engine' => 'engine',
19
+ 'collation' => 'collation',
20
+ 'Column name' => 'Kolomnaam',
21
+ 'Type' => 'Type',
22
+ 'Length' => 'Lengte',
23
+ 'Auto Increment' => 'Auto nummering',
24
+ 'Options' => 'Opties',
25
+ 'Save' => 'Opslaan',
26
+ 'Drop' => 'Verwijderen',
27
+ 'Databases have been dropped.' => 'Databases verwijderd.',
28
+ 'Database has been dropped.' => 'Database verwijderd.',
29
+ 'Database has been created.' => 'Database aangemaakt.',
30
+ 'Database has been renamed.' => 'Database hernoemd.',
31
+ 'Database has been altered.' => 'Database aangepast.',
32
+ 'Alter database' => 'Database aanpassen',
33
+ 'Create database' => 'Database aanmaken',
34
+ 'SQL command' => 'SQL opdracht',
35
+ 'Logout' => 'Uitloggen',
36
+ 'database' => 'database',
37
+ 'Use' => 'Gebruik',
38
+ 'No tables.' => 'Geen tabellen.',
39
+ 'select' => 'kies',
40
+ 'Item has been deleted.' => 'Item verwijderd.',
41
+ 'Item has been updated.' => 'Item aangepast.',
42
+ 'Item%s has been inserted.' => 'Item%s toegevoegd.',
43
+ 'Edit' => 'Bewerk',
44
+ 'Insert' => 'Toevoegen',
45
+ 'Save and insert next' => 'Opslaan, daarna toevoegen',
46
+ 'Delete' => 'Verwijderen',
47
+ 'Database' => 'Database',
48
+ 'Routines' => 'Procedures',
49
+ 'Indexes have been altered.' => 'Index aangepast.',
50
+ 'Indexes' => 'Indexen',
51
+ 'Alter indexes' => 'Indexen aanpassen',
52
+ 'Add next' => 'Volgende toevoegen',
53
+ 'Language' => 'Taal',
54
+ 'Select' => 'Kies',
55
+ 'New item' => 'Nieuw item',
56
+ 'Search' => 'Zoeken',
57
+ 'Sort' => 'Sorteren',
58
+ 'descending' => 'Aflopend',
59
+ 'Limit' => 'Beperk',
60
+ 'No rows.' => 'Geen rijen.',
61
+ 'Action' => 'Acties',
62
+ 'edit' => 'bewerk',
63
+ 'Page' => 'Pagina',
64
+ 'Query executed OK, %d row(s) affected.' => array('Query uitgevoerd, %d rij geraakt.', 'Query uitgevoerd, %d rijen geraakt.'),
65
+ 'Error in query' => 'Fout in query',
66
+ 'Execute' => 'Uitvoeren',
67
+ 'Table' => 'Tabel',
68
+ 'Foreign keys' => 'Foreign keys',
69
+ 'Triggers' => 'Triggers',
70
+ 'View' => 'View',
71
+ 'Unable to select the table' => 'Onmogelijk tabel te selecteren',
72
+ 'Invalid CSRF token. Send the form again.' => 'Ongeldig CSRF token. Verstuur het formulier opnieuw.',
73
+ 'Comment' => 'Commentaar',
74
+ 'Default values' => 'Standaard waarden',
75
+ '%d byte(s)' => array('%d byte', '%d bytes'),
76
+ 'No commands to execute.' => 'Geen opdrachten uit te voeren.',
77
+ 'Unable to upload a file.' => 'Onmogelijk bestand te uploaden.',
78
+ 'File upload' => 'Bestand uploaden',
79
+ 'File uploads are disabled.' => 'Bestanden uploaden is uitgeschakeld.',
80
+ 'Routine has been called, %d row(s) affected.' => array('Procedure uitgevoerd, %d rij geraakt.', 'Procedure uitgevoerd, %d rijen geraakt.'),
81
+ 'Call' => 'Uitvoeren',
82
+ 'No extension' => 'Geen extensie',
83
+ 'None of the supported PHP extensions (%s) are available.' => 'Geen geldige PHP extensies beschikbaar (%s).',
84
+ 'Session support must be enabled.' => 'Sessies moeten geactiveerd zijn.',
85
+ 'Session expired, please login again.' => 'Uw sessie is verlopen. Gelieve opnieuw in te loggen.',
86
+ 'Text length' => 'Tekst lengte',
87
+ 'Foreign key has been dropped.' => 'Foreign key verwijderd.',
88
+ 'Foreign key has been altered.' => 'Foreign key aangepast.',
89
+ 'Foreign key has been created.' => 'Foreign key aangemaakt.',
90
+ 'Foreign key' => 'Foreign key',
91
+ 'Target table' => 'Doeltabel',
92
+ 'Change' => 'Veranderen',
93
+ 'Source' => 'Bron',
94
+ 'Target' => 'Doel',
95
+ 'Add column' => 'Kolom toevoegen',
96
+ 'Alter' => 'Aanpassen',
97
+ 'Add foreign key' => 'Foreign key aanmaken',
98
+ 'ON DELETE' => 'ON DELETE',
99
+ 'ON UPDATE' => 'ON UPDATE',
100
+ 'Index Type' => 'Index type',
101
+ 'Column (length)' => 'Kolom (lengte)',
102
+ 'View has been dropped.' => 'View verwijderd.',
103
+ 'View has been altered.' => 'View aangepast.',
104
+ 'View has been created.' => 'View aangemaakt.',
105
+ 'Alter view' => 'View aanpassen',
106
+ 'Create view' => 'View aanmaken',
107
+ 'Name' => 'Naam',
108
+ 'Process list' => 'Proceslijst',
109
+ '%d process(es) have been killed.' => array('%d proces gestopt.', '%d processen gestopt.'),
110
+ 'Kill' => 'Stoppen',
111
+ 'Parameter name' => 'Parameternaam',
112
+ 'Database schema' => 'Database schema',
113
+ 'Create procedure' => 'Procedure aanmaken',
114
+ 'Create function' => 'Functie aanmaken',
115
+ 'Routine has been dropped.' => 'Procedure verwijderd.',
116
+ 'Routine has been altered.' => 'Procedure aangepast.',
117
+ 'Routine has been created.' => 'Procedure aangemaakt.',
118
+ 'Alter function' => 'Functie aanpassen',
119
+ 'Alter procedure' => 'Procedure aanpassen',
120
+ 'Return type' => 'Return type',
121
+ 'Add trigger' => 'Trigger aanmaken',
122
+ 'Trigger has been dropped.' => 'Trigger verwijderd.',
123
+ 'Trigger has been altered.' => 'Trigger aangepast.',
124
+ 'Trigger has been created.' => 'Trigger aangemaakt.',
125
+ 'Alter trigger' => 'Trigger aanpassen',
126
+ 'Create trigger' => 'Trigger aanmaken',
127
+ 'Time' => 'Time',
128
+ 'Event' => 'Event',
129
+ '%s version: %s through PHP extension %s' => '%s versie: %s met PHP extensie %s',
130
+ '%d row(s)' => array('%d rij', '%d rijen'),
131
+ 'Remove' => 'Verwijderen',
132
+ 'Are you sure?' => 'Weet u het zeker?',
133
+ 'Privileges' => 'Rechten',
134
+ 'Create user' => 'Gebruiker aanmaken',
135
+ 'User has been dropped.' => 'Gebruiker verwijderd.',
136
+ 'User has been altered.' => 'Gebruiker aangepast.',
137
+ 'User has been created.' => 'Gebruiker aangemaakt.',
138
+ 'Hashed' => 'Gehashed',
139
+ 'Column' => 'Kolom',
140
+ 'Routine' => 'Routine',
141
+ 'Grant' => 'Toekennen',
142
+ 'Revoke' => 'Intrekken',
143
+ 'Logged as: %s' => 'Aangemeld als: %s',
144
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST-data is te groot. Verklein de hoeveelheid data of verhoog de %s configuratie.',
145
+ 'Move up' => 'Omhoog',
146
+ 'Move down' => 'Omlaag',
147
+ 'Export' => 'Exporteren',
148
+ 'Tables' => 'Tabellen',
149
+ 'Data' => 'Data',
150
+ 'Output' => 'Uitvoer',
151
+ 'open' => 'openen',
152
+ 'save' => 'opslaan',
153
+ 'Format' => 'Formaat',
154
+ 'Functions' => 'Functies',
155
+ 'Aggregation' => 'Totalen',
156
+ 'Event has been dropped.' => 'Event werd verwijderd.',
157
+ 'Event has been altered.' => 'Event werd aangepast.',
158
+ 'Event has been created.' => 'Event werd aangemaakt.',
159
+ 'Alter event' => 'Event aanpassen',
160
+ 'Create event' => 'Event aanmaken',
161
+ 'Start' => 'Start',
162
+ 'End' => 'Stop',
163
+ 'Every' => 'Iedere',
164
+ 'Status' => 'Status',
165
+ 'On completion preserve' => 'Bewaren na voltooiing',
166
+ 'Events' => 'Events',
167
+ 'Schedule' => 'Schedule',
168
+ 'At given time' => 'Op aangegeven tijd',
169
+ 'Save and continue edit' => 'Opslaan en verder bewerken',
170
+ 'original' => 'origineel',
171
+ 'Tables have been truncated.' => 'Tabellen werden geleegd.',
172
+ 'Tables have been moved.' => 'Tabellen werden verplaatst.',
173
+ 'Tables have been dropped.' => 'Tabellen werden verwijderd.',
174
+ 'Tables and views' => 'Tabellen en views',
175
+ 'Engine' => 'Engine',
176
+ 'Collation' => 'Collatie',
177
+ 'Data Length' => 'Data lengte',
178
+ 'Index Length' => 'Index lengte',
179
+ 'Data Free' => 'Data Vrij',
180
+ 'Rows' => 'Rijen',
181
+ ',' => '.',
182
+ '0123456789' => '0123456789',
183
+ 'Analyze' => 'Analyseer',
184
+ 'Optimize' => 'Optimaliseer',
185
+ 'Check' => 'Controleer',
186
+ 'Repair' => 'Herstel',
187
+ 'Truncate' => 'Legen',
188
+ 'Move to other database' => 'Verplaats naar andere database',
189
+ 'Move' => 'Verplaats',
190
+ '%d item(s) have been affected.' => array('%d item aangepast.', '%d items aangepast.'),
191
+ 'whole result' => 'volledig resultaat',
192
+ 'Clone' => 'Dupliceer',
193
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maximum aantal velden bereikt. Verhoog %s.',
194
+ 'Partition by' => 'Partitioneren op',
195
+ 'Partitions' => 'Partities',
196
+ 'Partition name' => 'Partitie naam',
197
+ 'Values' => 'Waarden',
198
+ '%d row(s) have been imported.' => array('%d rij werd geïmporteerd.', '%d rijen werden geïmporteerd.'),
199
+ 'anywhere' => 'overal',
200
+ 'Import' => 'Importeren',
201
+ 'Stop on error' => 'Stoppen bij fout',
202
+ '%.3f s' => '%.3f s',
203
+ '$1-$3-$5' => '$5-$3-$1',
204
+ '[yyyy]-mm-dd' => 'dd-mm-[jjjj]',
205
+ 'History' => 'Geschiedenis',
206
+ 'Variables' => 'Variabelen',
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.' => 'Bron- en doelkolommen moeten van hetzelfde data type zijn, er moet een index bestaan op de gekozen kolommen en er moet gerelateerde data bestaan.',
208
+ 'Relations' => 'Relaties',
209
+ 'Run file' => 'Bestand uitvoeren',
210
+ 'Clear' => 'Wissen',
211
+ 'Maximum allowed file size is %sB.' => 'Maximum toegelaten bestandsgrootte is %sB.',
212
+ 'Numbers' => 'Getallen',
213
+ 'Date and time' => 'Datum en tijd',
214
+ 'Strings' => 'Tekst',
215
+ 'Binary' => 'Binaire gegevens',
216
+ 'Lists' => 'Lijsten',
217
+ 'Editor' => 'Editor',
218
+ 'E-mail' => 'E-mail',
219
+ 'From' => 'Van',
220
+ 'Subject' => 'Onderwerp',
221
+ 'Send' => 'Verzenden',
222
+ '%d e-mail(s) have been sent.' => array('%d e-mail verzonden.', '%d e-mails verzonden.'),
223
+ 'Webserver file %s' => 'Webserver bestand %s',
224
+ 'File does not exist.' => 'Bestand niet gevonden.',
225
+ '%d in total' => '%d in totaal',
226
+ 'Permanent login' => 'Blijf aangemeld',
227
+ 'Search data in tables' => 'Zoeken in database',
228
+ 'Schema' => 'Schema',
229
+ 'Alter schema' => 'Schema wijzigen',
230
+ 'Create schema' => 'Schema maken',
231
+ 'Schema has been dropped.' => 'Schema verwijderd.',
232
+ 'Schema has been created.' => 'Schema aangemaakt.',
233
+ 'Schema has been altered.' => 'Schema gewijzigd.',
234
+ 'Sequences' => 'Sequences',
235
+ 'Create sequence' => 'Sequence maken',
236
+ 'Alter sequence' => 'Sequence wijzigen',
237
+ 'Sequence has been dropped.' => 'Sequence verwijderd.',
238
+ 'Sequence has been created.' => 'Sequence aangemaakt.',
239
+ 'Sequence has been altered.' => 'Sequence gewijzigd.',
240
+ 'User types' => 'Gebruikersgedefiniëerde types',
241
+ 'Create type' => 'Type maken',
242
+ 'Alter type' => 'Type wijzigen',
243
+ 'Type has been dropped.' => 'Type verwijderd.',
244
+ 'Type has been created.' => 'Type aangemaakt.',
245
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+klik op een waarde om deze te bewerken.',
246
+ 'Use edit link to modify this value.' => 'Gebruik de link "bewerk" om deze waarde te wijzigen.',
247
+ 'last' => 'laatste',
248
+ 'From server' => 'Van server',
249
+ 'System' => 'Databasesysteem',
250
+ 'Select data' => 'Gegevens selecteren',
251
+ 'Show structure' => 'Toon structuur',
252
+ 'empty' => 'leeg',
253
+ 'Network' => 'Netwerk',
254
+ 'Geometry' => 'Geometrie',
255
+ 'File exists.' => 'Bestand bestaat reeds.',
256
+ 'Attachments' => 'Bijlagen',
257
+ '%d query(s) executed OK.' => array('%d query succesvol uitgevoerd.', '%d querys succesvol uitgevoerd'),
258
+ 'Show only errors' => 'Enkel fouten tonen',
259
+ 'Refresh' => 'Vernieuwen',
260
+ 'Invalid schema.' => 'Ongeldig schema.',
261
+ 'Please use one of the extensions %s.' => 'Gebruik 1 van volgende extensies: %s.',
262
+ 'now' => 'nu',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'De tabellen zijn gekopieerd.',
265
+ 'Copy' => 'Kopieren',
266
+ 'Permanent link' => 'Permanente link',
267
+ 'Edit all' => 'Alles bewerken',
268
+ 'HH:MM:SS' => 'HH:MM:SS',
269
+ );
adminer/adminer/adminer/lang/no.inc.php ADDED
@@ -0,0 +1,283 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'System' => 'System',
4
+ 'Server' => 'Server',
5
+ 'Username' => 'Brukernavn',
6
+ 'Password' => 'Passord',
7
+ 'Permanent login' => 'Permanent login',
8
+ 'Login' => 'Logg inn',
9
+ 'Logout' => 'Logg ut',
10
+ 'Logged as: %s' => 'Logget inn som: %s',
11
+ 'Logout successful.' => 'Utlogging vellykket.',
12
+ 'Invalid credentials.' => 'Ugylding innloggingsinformasjon.',
13
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Master-passord er utløpt. <a href="https://www.adminer.org/en/extension/" target="_blank">Implementer</a> en metode for %s for å gjøre det permanent.',
14
+ 'Language' => 'Språk',
15
+ 'Invalid CSRF token. Send the form again.' => 'Ugylding CSRF-token - Send inn skjemaet igjen.',
16
+ 'No extension' => 'Ingen utvidelse',
17
+ 'None of the supported PHP extensions (%s) are available.' => 'Ingen av de støttede PHP-utvidelsene (%s) er tilgjengelige.',
18
+ 'Session support must be enabled.' => 'Økt-støtte må være skrudd på.',
19
+ 'Session expired, please login again.' => 'Økt utløpt - vennligst logg inn på nytt.',
20
+ '%s version: %s through PHP extension %s' => '%s versjon: %s via PHP-utvidelse %s',
21
+ 'Refresh' => 'Gjenoppfrisk',
22
+ 'ltr' => 'venstre-til-høyre',
23
+ 'Privileges' => 'Privilegier',
24
+ 'Create user' => 'Lag bruker',
25
+ 'User has been dropped.' => 'Bruker slettet.',
26
+ 'User has been altered.' => 'Bruker endret.',
27
+ 'User has been created.' => 'Bruker opprettet.',
28
+ 'Hashed' => 'Hashet',
29
+ 'Column' => 'Kolonne',
30
+ 'Routine' => 'Rutine',
31
+ 'Grant' => 'Gi privilegier',
32
+ 'Revoke' => 'Trekk tilbake',
33
+ 'Process list' => 'Prosessliste',
34
+ '%d process(es) have been killed.' => array('%d prosess avsluttet.', '%d prosesser avsluttet.'),
35
+ 'Kill' => 'Avslutt',
36
+ 'Variables' => 'Variabler',
37
+ 'Status' => 'Status',
38
+ 'SQL command' => 'SQL-kommando',
39
+ '%d query(s) executed OK.' => array('%d kall utført OK.', '%d kall utført OK.'),
40
+ 'Query executed OK, %d row(s) affected.' => array('Kall utført OK, %d rad påvirket.', 'Kall utført OK, %d rader påvirket.'),
41
+ 'No commands to execute.' => 'Ingen kommandoer å utføre.',
42
+ 'Error in query' => 'Feil i forespørsel',
43
+ 'Execute' => 'Kjør',
44
+ 'Stop on error' => 'Stopp ved feil',
45
+ 'Show only errors' => 'Vis bare feil',
46
+ '%.3f s' => '%.3f s',
47
+ 'History' => 'Historie',
48
+ 'Clear' => 'Tøm skjema',
49
+ 'Edit all' => 'Rediger alle',
50
+ 'File upload' => 'Filopplasting',
51
+ 'From server' => 'Fra server',
52
+ 'Webserver file %s' => 'Webserver-fil %s',
53
+ 'Run file' => 'Kjør fil',
54
+ 'File does not exist.' => 'Filen eksisterer ikke.',
55
+ 'File uploads are disabled.' => 'Filopplastinger ikke tillatt.',
56
+ 'Unable to upload a file.' => 'Kunne ikke laste opp fil.',
57
+ 'Maximum allowed file size is %sB.' => 'Maksimum tillatte filstørrelse er %sB.',
58
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'For stor datamengde i skjemaet. Reduser datamengden, eller øk størrelsen på %s-konfigurasjonsdirektivet.',
59
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Du kan laste opp en stor SQL-fil via FTP og importere den fra serveren.',
60
+ 'Export' => 'Eksport',
61
+ 'Output' => 'Resultat',
62
+ 'open' => 'åpne',
63
+ 'save' => 'lagre',
64
+ 'Format' => 'Format',
65
+ 'Data' => 'Data',
66
+ 'Database' => 'Database',
67
+ 'database' => 'database',
68
+ 'Use' => 'Bruk',
69
+ 'Select database' => 'Velg database',
70
+ 'Invalid database.' => 'Ugyldig database.',
71
+ 'Create new database' => 'Lag ny database',
72
+ 'Database has been dropped.' => 'Databasen har blitt slettet.',
73
+ 'Databases have been dropped.' => 'Databasene har blitt slettet.',
74
+ 'Database has been created.' => 'Databasen er opprettet.',
75
+ 'Database has been renamed.' => 'Databasen har fått nytt navn.',
76
+ 'Database has been altered.' => 'Databasen er endret.',
77
+ 'Alter database' => 'Endre database',
78
+ 'Create database' => 'Opprett database',
79
+ 'Database schema' => 'Databaseskjema',
80
+ 'Permanent link' => 'Permanent lenke',
81
+ ',' => ' ',
82
+ '0123456789' => '0123456789',
83
+ 'Engine' => 'Motor',
84
+ 'Collation' => 'Tekstsortering',
85
+ 'Data Length' => 'Datalengde',
86
+ 'Index Length' => 'Indekslengde',
87
+ 'Data Free' => 'Frie data',
88
+ 'Rows' => 'Rader',
89
+ '%d in total' => '%d totalt',
90
+ 'Analyze' => 'Analyser',
91
+ 'Optimize' => 'Optimaliser',
92
+ 'Vacuum' => 'Støvsug',
93
+ 'Check' => 'Sjekk',
94
+ 'Repair' => 'Reparer',
95
+ 'Truncate' => 'Avkort',
96
+ 'Tables have been truncated.' => 'Tabellene har blitt avkortet.',
97
+ 'Move to other database' => 'Flytt til annen database',
98
+ 'Move' => 'Flytt',
99
+ 'Tables have been moved.' => 'Tabellene har blitt flyttet.',
100
+ 'Copy' => 'Kopier',
101
+ 'Tables have been copied.' => 'Tabellene har blitt kopiert.',
102
+ 'Routines' => 'Rutiner',
103
+ 'Routine has been called, %d row(s) affected.' => array('Rutinen er utført, %d rad påvirket.', 'Rutinen er utført, %d rader påvirket.'),
104
+ 'Call' => 'Kall',
105
+ 'Parameter name' => 'Parameternavn',
106
+ 'Create procedure' => 'Opprett prosedyre',
107
+ 'Create function' => 'Opprett funksjon',
108
+ 'Routine has been dropped.' => 'Rutinen er slettet.',
109
+ 'Routine has been altered.' => 'Rutinen er endret.',
110
+ 'Routine has been created.' => 'Rutinen er opprettet.',
111
+ 'Alter function' => 'Endre funksjon',
112
+ 'Alter procedure' => 'Endre prosedyre',
113
+ 'Return type' => 'Returtype',
114
+ 'Events' => 'Eventer',
115
+ 'Event has been dropped.' => 'Eventen er slettet.',
116
+ 'Event has been altered.' => 'Eventen er endret.',
117
+ 'Event has been created.' => 'Eventen er opprettet.',
118
+ 'Alter event' => 'Endre event',
119
+ 'Create event' => 'Opprett event',
120
+ 'At given time' => 'På gitte tid',
121
+ 'Every' => 'Hver',
122
+ 'Schedule' => 'Tidsplan',
123
+ 'Start' => 'Start',
124
+ 'End' => 'Slutt',
125
+ 'On completion preserve' => 'Ved fullførelse bevar',
126
+ 'Tables' => 'Tabeller',
127
+ 'Tables and views' => 'Tabeller og views',
128
+ 'Table' => 'Tabell',
129
+ 'No tables.' => 'Ingen tabeller.',
130
+ 'Alter table' => 'Endre tabell',
131
+ 'Create table' => 'Opprett tabell',
132
+ 'Table has been dropped.' => 'Tabellen er slettet.',
133
+ 'Tables have been dropped.' => 'Tabellene er slettet.',
134
+ 'Tables have been optimized.' => 'Tabellene er blitt optimalisert.',
135
+ 'Table has been altered.' => 'Tabellen er endret.',
136
+ 'Table has been created.' => 'Tabellen er opprettet.',
137
+ 'Table name' => 'Tabellnavn',
138
+ 'Show structure' => 'Vis struktur',
139
+ 'engine' => 'mottor',
140
+ 'collation' => 'sortering',
141
+ 'Column name' => 'Kolonnenavn',
142
+ 'Type' => 'Type',
143
+ 'Length' => 'Lengde',
144
+ 'Auto Increment' => 'Autoinkrement',
145
+ 'Options' => 'Valg',
146
+ 'Comment' => 'Kommentarer',
147
+ 'Default values' => 'Standardverdier',
148
+ 'Drop' => 'Dropp',
149
+ 'Are you sure?' => 'Er du sikker?',
150
+ 'Move up' => 'Flytt opp',
151
+ 'Move down' => 'Flytt ned',
152
+ 'Remove' => 'Fjern',
153
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maksimum antall feltnavn overskredet - venligst øk %s.',
154
+ 'Partition by' => 'Partisjoner ved',
155
+ 'Partitions' => 'Partisjoner',
156
+ 'Partition name' => 'Partisjonsnavn',
157
+ 'Values' => 'Verdier',
158
+ 'View' => 'View',
159
+ 'View has been dropped.' => 'Viewet er slettet.',
160
+ 'View has been altered.' => 'Viewet er endret.',
161
+ 'View has been created.' => 'Viewet er opprettet.',
162
+ 'Alter view' => 'Endre view',
163
+ 'Create view' => 'Lag nytt view',
164
+ 'Indexes' => 'Indekser',
165
+ 'Indexes have been altered.' => 'Indeksene er endret.',
166
+ 'Alter indexes' => 'Endre indekser',
167
+ 'Add next' => 'Legg til neste',
168
+ 'Index Type' => 'Indekstype',
169
+ 'Column (length)' => 'Kolonne (lengde)',
170
+ 'Foreign keys' => 'Fremmednøkler',
171
+ 'Foreign key' => 'Fremmednøkkel',
172
+ 'Foreign key has been dropped.' => 'Fremmednøkkelen er slettet.',
173
+ 'Foreign key has been altered.' => 'Fremmednøkkelen er endret.',
174
+ 'Foreign key has been created.' => 'Fremmednøkkelen er opprettet.',
175
+ 'Target table' => 'Måltabell',
176
+ 'Change' => 'Endre',
177
+ 'Source' => 'Kilde',
178
+ 'Target' => 'Mål',
179
+ 'Add column' => 'Legg til kolonne',
180
+ 'Alter' => 'Endre',
181
+ 'Add foreign key' => 'Legg til fremmednøkkel',
182
+ 'ON DELETE' => 'ON DELETE',
183
+ 'ON UPDATE' => 'ON UPDATE',
184
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kilde- og mål-kolonner må ha samme datatype, det må være en indeks på mål-kolonnen, og dataene som refereres til må eksistere.',
185
+ 'Triggers' => 'Triggere',
186
+ 'Add trigger' => 'Legg til trigger',
187
+ 'Trigger has been dropped.' => 'Triggeren er slettet.',
188
+ 'Trigger has been altered.' => 'Triggeren er endret.',
189
+ 'Trigger has been created.' => 'Triggeren er opprettet.',
190
+ 'Alter trigger' => 'Endre trigger',
191
+ 'Create trigger' => 'Opprett trigger',
192
+ 'Time' => 'Tid',
193
+ 'Event' => 'Hendelse',
194
+ 'Name' => 'Navn',
195
+ 'select' => 'Vis',
196
+ 'Select' => 'Velg',
197
+ 'Select data' => 'Velg data',
198
+ 'Functions' => 'Funksjoner',
199
+ 'Aggregation' => 'Sammenfatning',
200
+ 'Search' => 'Søk',
201
+ 'anywhere' => 'hvorsomhelst',
202
+ 'Search data in tables' => 'Søk data i tabeller',
203
+ 'Sort' => 'Sorter',
204
+ 'descending' => 'minkende',
205
+ 'Limit' => 'Skranke',
206
+ 'Text length' => 'Tekstlengde',
207
+ 'Action' => 'Handling',
208
+ 'Full table scan' => 'Full tabell-scan',
209
+ 'Unable to select the table' => 'Kan ikke velge tabellen',
210
+ 'No rows.' => 'Ingen rader.',
211
+ '%d row(s)' => array('%d rad', '%d rader'),
212
+ 'Page' => 'Side',
213
+ 'last' => 'siste',
214
+ 'Load more data' => 'Last mer data',
215
+ 'Loading' => 'Laster',
216
+ 'whole result' => 'hele resultatet',
217
+ '%d byte(s)' => array('%d byte', '%d bytes'),
218
+ 'Import' => 'Importer',
219
+ '%d row(s) have been imported.' => array('%d rad er importert.', '%d rader er importert.'),
220
+ 'File must be in UTF-8 encoding.' => 'Filen må være i UTF8-tegnkoding.',
221
+ 'Modify' => 'Endre',
222
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+klikk på en verdi for å endre den.',
223
+ 'Use edit link to modify this value.' => 'Bruk rediger-lengde for å endre dennne verdien.',
224
+ 'Item%s has been inserted.' => 'Rad%s er satt inn.',
225
+ 'Item has been deleted.' => 'Raden er slettet.',
226
+ 'Item has been updated.' => 'Raden er oppdatert.',
227
+ '%d item(s) have been affected.' => array('%d rad påvirket.', '%d rader påvirket.'),
228
+ 'New item' => 'Ny rad',
229
+ 'original' => 'original',
230
+ 'empty' => 'tom',
231
+ 'edit' => 'rediger',
232
+ 'Edit' => 'Rediger',
233
+ 'Insert' => 'Sett inn',
234
+ 'Save' => 'Lagre',
235
+ 'Save and continue edit' => 'Lagre og fortsett å redigere',
236
+ 'Save and insert next' => 'Lagre og sett inn neste',
237
+ 'Selected' => 'Valgt',
238
+ 'Clone' => 'Klon',
239
+ 'Delete' => 'Slett',
240
+ 'You have no privileges to update this table.' => 'Du mangler rettighetene som trengs for å endre denne tabellen.',
241
+ 'E-mail' => 'E-post',
242
+ 'From' => 'Fra',
243
+ 'Subject' => 'Tittel',
244
+ 'Attachments' => 'Vedlegg',
245
+ 'Send' => 'Send',
246
+ '%d e-mail(s) have been sent.' => array('%d epost sendt.', '%d eposter sendt.'),
247
+ 'Numbers' => 'Nummer',
248
+ 'Date and time' => 'Dato og tid',
249
+ 'Strings' => 'Strenger',
250
+ 'Binary' => 'Binære',
251
+ 'Lists' => 'Lister',
252
+ 'Network' => 'Nettverk',
253
+ 'Geometry' => 'Geometri',
254
+ 'Relations' => 'Relasjoner',
255
+ 'Editor' => 'Redigering',
256
+ '$1-$3-$5' => '$6/$4 $1',
257
+ '[yyyy]-mm-dd' => 'd/m [åååå]',
258
+ 'HH:MM:SS' => 'HH:MM:SS',
259
+ 'now' => 'nå',
260
+ 'yes' => 'ja',
261
+ 'no' => 'nei',
262
+ 'File exists.' => 'Filen finnes.',
263
+ 'Please use one of the extensions %s.' => 'Vennligst bruk en av filendelsene %s.',
264
+ 'Alter schema' => 'Endre skjema',
265
+ 'Create schema' => 'Opprett skjema',
266
+ 'Schema has been dropped.' => 'Skjemaet er slettet.',
267
+ 'Schema has been created.' => 'Skjemaet er opprettet.',
268
+ 'Schema has been altered.' => 'Skjemaet er endret.',
269
+ 'Schema' => 'Skjema',
270
+ 'Invalid schema.' => 'Ugylding skjema.',
271
+ 'Sequences' => 'Sekvenser',
272
+ 'Create sequence' => 'Opprett sekvens',
273
+ 'Sequence has been dropped.' => 'Sekvensen er slettet.',
274
+ 'Sequence has been created.' => 'Sekvensen er opprettet.',
275
+ 'Sequence has been altered.' => 'Sekvensen er endret.',
276
+ 'Alter sequence' => 'Endre sekvens',
277
+ 'User types' => 'Brukertyper',
278
+ 'Create type' => 'Opprett type',
279
+ 'Type has been dropped.' => 'Type er slettet.',
280
+ 'Type has been created.' => 'Type er opprettet.',
281
+ 'Alter type' => 'Endre type',
282
+ 'Saving' => 'Lagrer',
283
+ );
adminer/adminer/adminer/lang/pl.inc.php ADDED
@@ -0,0 +1,336 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Rodzaj bazy',
5
+ 'Server' => 'Serwer',
6
+ 'Username' => 'Użytkownik',
7
+ 'Password' => 'Hasło',
8
+ 'Permanent login' => 'Zapamiętaj sesję',
9
+ 'Login' => 'Zaloguj się',
10
+ 'Logout' => 'Wyloguj',
11
+ 'Logged as: %s' => 'Zalogowany jako: %s',
12
+ 'Logout successful.' => 'Wylogowano pomyślnie.',
13
+ 'Invalid credentials.' => 'Nieprawidłowe dane logowania.',
14
+ '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.'),
15
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Ważność hasła głównego wygasła. <a href="https://www.adminer.org/pl/extension/" target="_blank">Zaimplementuj</a> własną metodę %s, aby ustawić je na stałe.',
16
+ 'Language' => 'Język',
17
+ 'Invalid CSRF token. Send the form again.' => 'Nieprawidłowy token CSRF. Spróbuj wysłać formularz ponownie.',
18
+ 'If you did not send this request from Adminer then close this page.' => 'Jeżeli nie wywołałeś tej strony z Adminera, zamknij to okno.',
19
+ 'No extension' => 'Brak rozszerzenia',
20
+ 'None of the supported PHP extensions (%s) are available.' => 'Żadne z rozszerzeń PHP umożliwiających połączenie się z bazą danych (%s) nie jest dostępne.',
21
+ 'Session support must be enabled.' => 'Wymagana jest obsługa sesji w PHP.',
22
+ 'Session expired, please login again.' => 'Sesja wygasła, zaloguj się ponownie.',
23
+ '%s version: %s through PHP extension %s' => 'Wersja %s: %s za pomocą %s',
24
+ 'Refresh' => 'Odśwież',
25
+
26
+ // text direction - 'ltr' or 'rtl'
27
+ 'ltr' => 'ltr',
28
+
29
+ 'Privileges' => 'Uprawnienia użytkowników',
30
+ 'Create user' => 'Dodaj użytkownika',
31
+ 'User has been dropped.' => 'Użytkownik został usunięty.',
32
+ 'User has been altered.' => 'Użytkownik został zmieniony.',
33
+ 'User has been created.' => 'Użytkownik został dodany.',
34
+ 'Hashed' => 'Zahashowane',
35
+ 'Column' => 'Kolumna',
36
+ 'Routine' => 'Procedura',
37
+ 'Grant' => 'Uprawnienia',
38
+ 'Revoke' => 'Usuń uprawnienia',
39
+
40
+ 'Process list' => 'Lista procesów',
41
+ '%d process(es) have been killed.' => array('Przerwano %d wątek.', 'Przerwano %d wątki.', 'Przerwano %d wątków.'),
42
+ 'Kill' => 'Przerwij wykonywanie',
43
+
44
+ 'Variables' => 'Zmienne',
45
+ 'Status' => 'Status',
46
+
47
+ 'SQL command' => 'Zapytanie SQL',
48
+ '%d query(s) executed OK.' => array('Pomyślnie wykonano %d zapytanie.', 'Pomyślnie wykonano %d zapytania.', 'Pomyślnie wykonano %d zapytań.'),
49
+ 'Query executed OK, %d row(s) affected.' => array('Zapytanie wykonane pomyślnie, zmieniono %d rekord.', 'Zapytanie wykonane pomyślnie, zmieniono %d rekordy.', 'Zapytanie wykonane pomyślnie, zmieniono %d rekordów.'),
50
+ 'No commands to execute.' => 'Nic do wykonania.',
51
+ 'Error in query' => 'Błąd w zapytaniu',
52
+ 'Execute' => 'Wykonaj',
53
+ 'Stop on error' => 'Zatrzymaj w przypadku błędu',
54
+ 'Show only errors' => 'Pokaż tylko błędy',
55
+ // sprintf() format for time of the command
56
+ '%.3f s' => '%.3f s',
57
+ 'History' => 'Historia',
58
+ 'Clear' => 'Wyczyść',
59
+ 'Edit all' => 'Edytuj wszystkie',
60
+
61
+ 'File upload' => 'Wgranie pliku',
62
+ 'From server' => 'Z serwera',
63
+ 'Webserver file %s' => 'Plik %s na serwerze',
64
+ 'Run file' => 'Uruchom z pliku',
65
+ 'File does not exist.' => 'Plik nie istnieje.',
66
+ 'File uploads are disabled.' => 'Wgrywanie plików jest wyłączone.',
67
+ 'Unable to upload a file.' => 'Wgranie pliku było niemożliwe.',
68
+ 'Maximum allowed file size is %sB.' => 'Maksymalna wielkość pliku to %sB.',
69
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Przesłano zbyt dużo danych. Zmniejsz objętość danych lub zwiększ zmienną konfiguracyjną %s.',
70
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Większe pliki SQL możesz wgrać na serwer poprzez FTP przed zaimportowaniem.',
71
+ 'You are offline.' => 'Jesteś offline.',
72
+
73
+ 'Export' => 'Eksport',
74
+ 'Output' => 'Rezultat',
75
+ 'open' => 'otwórz',
76
+ 'save' => 'zapisz',
77
+ 'Format' => 'Format',
78
+ 'Data' => 'Dane',
79
+
80
+ 'Database' => 'Baza danych',
81
+ 'database' => 'baza danych',
82
+ 'Use' => 'Wybierz',
83
+ 'Select database' => 'Wybierz bazę danych',
84
+ 'Invalid database.' => 'Nie znaleziono bazy danych.',
85
+ 'Create new database' => 'Utwórz nową bazę danych',
86
+ 'Database has been dropped.' => 'Baza danych została usunięta.',
87
+ 'Databases have been dropped.' => 'Bazy danych zostały usunięte.',
88
+ 'Database has been created.' => 'Baza danych została utworzona.',
89
+ 'Database has been renamed.' => 'Nazwa bazy danych została zmieniona.',
90
+ 'Database has been altered.' => 'Baza danych została zmieniona.',
91
+ 'Alter database' => 'Zmień bazę danych',
92
+ 'Create database' => 'Utwórz bazę danych',
93
+ 'Database schema' => 'Schemat bazy danych',
94
+
95
+ // link to current database schema layout
96
+ 'Permanent link' => 'Trwały link',
97
+
98
+ // thousands separator - must contain single byte
99
+ ',' => ' ',
100
+ '0123456789' => '0123456789',
101
+ 'Engine' => 'Składowanie',
102
+ 'Collation' => 'Porównywanie znaków',
103
+ 'Data Length' => 'Rozmiar danych',
104
+ 'Index Length' => 'Rozmiar indeksów',
105
+ 'Data Free' => 'Wolne miejsce',
106
+ 'Rows' => 'Liczba rekordów',
107
+ '%d in total' => '%d w sumie',
108
+ 'Analyze' => 'Analizuj',
109
+ 'Optimize' => 'Optymalizuj',
110
+ 'Vacuum' => 'Wyczyść',
111
+ 'Check' => 'Sprawdź',
112
+ 'Repair' => 'Napraw',
113
+ 'Truncate' => 'Opróżnij',
114
+ 'Tables have been truncated.' => 'Tabele zostały opróżnione.',
115
+ 'Move to other database' => 'Przenieś do innej bazy danych',
116
+ 'Move' => 'Przenieś',
117
+ 'Tables have been moved.' => 'Tabele zostały przeniesione.',
118
+ 'Copy' => 'Kopiuj',
119
+ 'Tables have been copied.' => 'Tabele zostały skopiowane.',
120
+
121
+ 'Routines' => 'Procedury i funkcje',
122
+ 'Routine has been called, %d row(s) affected.' => array('Procedura została uruchomiona, zmieniono %d rekord.', 'Procedura została uruchomiona, zmieniono %d rekordy.', 'Procedura została uruchomiona, zmieniono %d rekordów.'),
123
+ 'Call' => 'Uruchom',
124
+ 'Parameter name' => 'Nazwa parametru',
125
+ 'Create procedure' => 'Utwórz procedurę',
126
+ 'Create function' => 'Utwórz funkcję',
127
+ 'Routine has been dropped.' => 'Procedura została usunięta.',
128
+ 'Routine has been altered.' => 'Procedura została zmieniona.',
129
+ 'Routine has been created.' => 'Procedura została utworzona.',
130
+ 'Alter function' => 'Zmień funkcję',
131
+ 'Alter procedure' => 'Zmień procedurę',
132
+ 'Return type' => 'Zwracany typ',
133
+
134
+ 'Events' => 'Wydarzenia',
135
+ 'Event has been dropped.' => 'Wydarzenie zostało usunięte.',
136
+ 'Event has been altered.' => 'Wydarzenie zostało zmienione.',
137
+ 'Event has been created.' => 'Wydarzenie zostało utworzone.',
138
+ 'Alter event' => 'Zmień wydarzenie',
139
+ 'Create event' => 'Utwórz wydarzenie',
140
+ 'At given time' => 'O danym czasie',
141
+ 'Every' => 'Wykonuj co',
142
+ 'Schedule' => 'Harmonogram',
143
+ 'Start' => 'Początek',
144
+ 'End' => 'Koniec',
145
+ 'On completion preserve' => 'Nie kasuj wydarzenia po przeterminowaniu',
146
+
147
+ 'Tables' => 'Tabele',
148
+ 'Tables and views' => 'Tabele i perspektywy',
149
+ 'Table' => 'Tabela',
150
+ 'No tables.' => 'Brak tabel.',
151
+ 'Alter table' => 'Zmień tabelę',
152
+ 'Create table' => 'Utwórz tabelę',
153
+ 'Table has been dropped.' => 'Tabela została usunięta.',
154
+ 'Tables have been dropped.' => 'Tabele zostały usunięte.',
155
+ 'Tables have been optimized.' => 'Tabele zostały zoptymalizowane.',
156
+ 'Table has been altered.' => 'Tabela została zmieniona.',
157
+ 'Table has been created.' => 'Tabela została utworzona.',
158
+ 'Table name' => 'Nazwa tabeli',
159
+ 'Show structure' => 'Struktura tabeli',
160
+ 'engine' => 'składowanie',
161
+ 'collation' => 'porównywanie znaków',
162
+ 'Column name' => 'Nazwa kolumny',
163
+ 'Type' => 'Typ',
164
+ 'Length' => 'Długość',
165
+ 'Auto Increment' => 'Auto Increment',
166
+ 'Options' => 'Opcje',
167
+ 'Comment' => 'Komentarz',
168
+ 'Default value' => 'Wartość domyślna',
169
+ 'Default values' => 'Wartości domyślne',
170
+ 'Drop' => 'Usuń',
171
+ 'Are you sure?' => 'Czy jesteś pewien?',
172
+ 'Size' => 'Wielkość',
173
+ 'Compute' => 'Oblicz',
174
+ 'Move up' => 'Przesuń w górę',
175
+ 'Move down' => 'Przesuń w dół',
176
+ 'Remove' => 'Usuń',
177
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Przekroczono maksymalną liczbę pól. Zwiększ %s.',
178
+
179
+ 'Partition by' => 'Partycjonowanie',
180
+ 'Partitions' => 'Partycje',
181
+ 'Partition name' => 'Nazwa partycji',
182
+ 'Values' => 'Wartości',
183
+
184
+ 'View' => 'Perspektywa',
185
+ 'Materialized View' => 'Zmaterializowana perspektywa',
186
+ 'View has been dropped.' => 'Perspektywa została usunięta.',
187
+ 'View has been altered.' => 'Perspektywa została zmieniona.',
188
+ 'View has been created.' => 'Perspektywa została utworzona.',
189
+ 'Alter view' => 'Zmień perspektywę',
190
+ 'Create view' => 'Utwórz perspektywę',
191
+ 'Create materialized view' => 'Utwórz zmaterializowaną perspektywę',
192
+
193
+ 'Indexes' => 'Indeksy',
194
+ 'Indexes have been altered.' => 'Indeksy zostały zmienione.',
195
+ 'Alter indexes' => 'Zmień indeksy',
196
+ 'Add next' => 'Dodaj następny',
197
+ 'Index Type' => 'Typ indeksu',
198
+ 'Column (length)' => 'Kolumna (długość)',
199
+
200
+ 'Foreign keys' => 'Klucze obce',
201
+ 'Foreign key' => 'Klucz obcy',
202
+ 'Foreign key has been dropped.' => 'Klucz obcy został usunięty.',
203
+ 'Foreign key has been altered.' => 'Klucz obcy został zmieniony.',
204
+ 'Foreign key has been created.' => 'Klucz obcy został utworzony.',
205
+ 'Target table' => 'Tabela docelowa',
206
+ 'Change' => 'Zmień',
207
+ 'Source' => 'Źródło',
208
+ 'Target' => 'Cel',
209
+ 'Add column' => 'Dodaj kolumnę',
210
+ 'Alter' => 'Zmień',
211
+ 'Add foreign key' => 'Dodaj klucz obcy',
212
+ 'ON DELETE' => 'W przypadku usunięcia',
213
+ 'ON UPDATE' => 'W przypadku zmiany',
214
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Źródłowa i docelowa kolumna muszą być tego samego typu, powinien istnieć indeks na docelowej kolumnie oraz muszą istnieć dane referencyjne.',
215
+
216
+ 'Triggers' => 'Wyzwalacze',
217
+ 'Add trigger' => 'Dodaj wyzwalacz',
218
+ 'Trigger has been dropped.' => 'Wyzwalacz został usunięty.',
219
+ 'Trigger has been altered.' => 'Wyzwalacz został zmieniony.',
220
+ 'Trigger has been created.' => 'Wyzwalacz został utworzony.',
221
+ 'Alter trigger' => 'Zmień wyzwalacz',
222
+ 'Create trigger' => 'Utwórz wyzwalacz',
223
+ 'Time' => 'Czas',
224
+ 'Event' => 'Wydarzenie',
225
+ 'Name' => 'Nazwa',
226
+
227
+ 'select' => 'przeglądaj',
228
+ 'Select' => 'pokaż',
229
+ 'Select data' => 'Pokaż dane',
230
+ 'Functions' => 'Funkcje',
231
+ 'Aggregation' => 'Agregacje',
232
+ 'Search' => 'Szukaj',
233
+ 'anywhere' => 'gdziekolwiek',
234
+ 'Search data in tables' => 'Wyszukaj we wszystkich tabelach',
235
+ 'Sort' => 'Sortuj',
236
+ 'descending' => 'malejąco',
237
+ 'Limit' => 'Limit',
238
+ 'Text length' => 'Długość tekstu',
239
+ 'Action' => 'Czynność',
240
+ 'Full table scan' => 'Wymaga pełnego przeskanowania tabeli',
241
+ 'Unable to select the table' => 'Nie udało się pobrać danych z tabeli',
242
+ 'No rows.' => 'Brak rekordów.',
243
+ '%d row(s)' => array('%d rekord', '%d rekordy', '%d rekordów'),
244
+ 'Page' => 'Strona',
245
+ 'last' => 'ostatni',
246
+ 'Load more data' => 'Wczytaj więcej danych',
247
+ 'Loading' => 'Wczytywanie',
248
+ 'whole result' => 'wybierz wszystkie',
249
+ '%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtów'),
250
+
251
+ 'Import' => 'Import',
252
+ '%d row(s) have been imported.' => array('%d rekord został zaimportowany.', '%d rekordy zostały zaimportowane.', '%d rekordów zostało zaimportowanych.'),
253
+ 'File must be in UTF-8 encoding.' => 'Kodowanie pliku musi być ustawione na UTF-8.',
254
+
255
+ // in-place editing in select
256
+ 'Modify' => 'Zmień',
257
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+kliknij wartość, aby ją edytować.',
258
+ 'Use edit link to modify this value.' => 'Użyj linku edycji aby zmienić tę wartość.',
259
+
260
+ // %s can contain auto-increment value
261
+ 'Item%s has been inserted.' => 'Rekord%s został dodany.',
262
+ 'Item has been deleted.' => 'Rekord został usunięty.',
263
+ 'Item has been updated.' => 'Rekord został zaktualizowany.',
264
+ '%d item(s) have been affected.' => array('Zmieniono %d rekord.', 'Zmieniono %d rekordy.', 'Zmieniono %d rekordów.'),
265
+ 'New item' => 'Nowy rekord',
266
+ 'original' => 'bez zmian',
267
+ // label for value '' in enum data type
268
+ 'empty' => 'puste',
269
+ 'edit' => 'edytuj',
270
+ 'Edit' => 'Edytuj',
271
+ 'Insert' => 'Dodaj',
272
+ 'Save' => 'Zapisz zmiany',
273
+ 'Saving' => 'Zapisywanie',
274
+ 'Save and continue edit' => 'Zapisz i kontynuuj edycję',
275
+ 'Save and insert next' => 'Zapisz i dodaj następny',
276
+ 'Selected' => 'Zaznaczone',
277
+ 'Clone' => 'Duplikuj',
278
+ 'Delete' => 'Usuń',
279
+ 'You have no privileges to update this table.' => 'Brak uprawnień do edycji tej tabeli',
280
+
281
+ 'E-mail' => 'E-mail',
282
+ 'From' => 'Nadawca',
283
+ 'Subject' => 'Temat',
284
+ 'Attachments' => 'Załączniki',
285
+ 'Send' => 'Wyślij',
286
+ '%d e-mail(s) have been sent.' => array('Wysłano %d e-mail.', 'Wysłano %d e-maile.', 'Wysłano %d e-maili.'),
287
+
288
+ // data type descriptions
289
+ 'Numbers' => 'Numeryczne',
290
+ 'Date and time' => 'Data i czas',
291
+ 'Strings' => 'Tekstowe',
292
+ 'Binary' => 'Binarne',
293
+ 'Lists' => 'Listy',
294
+ 'Network' => 'Sieć',
295
+ 'Geometry' => 'Geometria',
296
+ 'Relations' => 'Relacje',
297
+
298
+ 'Editor' => 'Edytor',
299
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
300
+ '$1-$3-$5' => '$6.$4.$1',
301
+ // hint for date format - use language equivalents for day, month and year shortcuts
302
+ '[yyyy]-mm-dd' => 'd.m.[rrrr]',
303
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
304
+ 'HH:MM:SS' => 'HH:MM:SS',
305
+ 'now' => 'teraz',
306
+ 'yes' => 'tak',
307
+ 'no' => 'nie',
308
+
309
+ // general SQLite error in create, drop or rename database
310
+ 'File exists.' => 'Plik już istnieje.',
311
+ 'Please use one of the extensions %s.' => 'Proszę użyć jednego z rozszerzeń: %s.',
312
+
313
+ // PostgreSQL and MS SQL schema support
314
+ 'Alter schema' => 'Zmień schemat',
315
+ 'Create schema' => 'Utwórz schemat',
316
+ 'Schema has been dropped.' => 'Schemat został usunięty.',
317
+ 'Schema has been created.' => 'Schemat został utworzony.',
318
+ 'Schema has been altered.' => 'Schemat został zmieniony.',
319
+ 'Schema' => 'Schemat',
320
+ 'Invalid schema.' => 'Nieprawidłowy schemat.',
321
+
322
+ // PostgreSQL sequences support
323
+ 'Sequences' => 'Sekwencje',
324
+ 'Create sequence' => 'Utwórz sekwencję',
325
+ 'Sequence has been dropped.' => 'Sekwencja została usunięta.',
326
+ 'Sequence has been created.' => 'Sekwencja została utworzona.',
327
+ 'Sequence has been altered.' => 'Sekwencja została zmieniona.',
328
+ 'Alter sequence' => 'Zmień sekwencję',
329
+
330
+ // PostgreSQL user types support
331
+ 'User types' => 'Typy użytkownika',
332
+ 'Create type' => 'Utwórz typ',
333
+ 'Type has been dropped.' => 'Typ został usunięty.',
334
+ 'Type has been created.' => 'Typ został utworzony.',
335
+ 'Alter type' => 'Zmień typ',
336
+ );
adminer/adminer/adminer/lang/pt-br.inc.php ADDED
@@ -0,0 +1,264 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Entrar',
4
+ 'Logout successful.' => 'Saída bem sucedida.',
5
+ 'Invalid credentials.' => 'Identificação inválida.',
6
+ 'Server' => 'Servidor',
7
+ 'Username' => 'Usuário',
8
+ 'Password' => 'Senha',
9
+ 'Select database' => 'Selecionar Base de dados',
10
+ 'Invalid database.' => 'Base de dados inválida.',
11
+ 'Create new database' => 'Criar nova base de dados',
12
+ 'Table has been dropped.' => 'A Tabela foi eliminada.',
13
+ 'Table has been altered.' => 'A Tabela foi alterada.',
14
+ 'Table has been created.' => 'A Tabela foi criada.',
15
+ 'Alter table' => 'Alterar estrutura',
16
+ 'Create table' => 'Criar tabela',
17
+ 'Table name' => 'Nome da tabela',
18
+ 'engine' => 'motor',
19
+ 'collation' => 'collation',
20
+ 'Column name' => 'Nome da coluna',
21
+ 'Type' => 'Tipo',
22
+ 'Length' => 'Tamanho',
23
+ 'Auto Increment' => 'Incremento Automático',
24
+ 'Options' => 'Opções',
25
+ 'Save' => 'Salvar',
26
+ 'Drop' => 'Apagar',
27
+ 'Database has been dropped.' => 'A Base de dados foi apagada.',
28
+ 'Database has been created.' => 'A Base de dados foi criada.',
29
+ 'Database has been renamed.' => 'A Base de dados foi renomeada.',
30
+ 'Database has been altered.' => 'A Base de dados foi alterada.',
31
+ 'Alter database' => 'Alterar Base de dados',
32
+ 'Create database' => 'Criar Base de dados',
33
+ 'SQL command' => 'Comando SQL',
34
+ 'Logout' => 'Sair',
35
+ 'database' => 'base de dados',
36
+ 'Use' => 'Usar',
37
+ 'No tables.' => 'Não existem tabelas.',
38
+ 'select' => 'selecionar',
39
+ 'Item has been deleted.' => 'O Registro foi deletado.',
40
+ 'Item has been updated.' => 'O Registro foi atualizado.',
41
+ 'Item%s has been inserted.' => 'O Registro%s foi inserido.',
42
+ 'Edit' => 'Editar',
43
+ 'Insert' => 'Inserir',
44
+ 'Save and insert next' => 'Salvar e inserir outro',
45
+ 'Delete' => 'Deletar',
46
+ 'Database' => 'Base de dados',
47
+ 'Routines' => 'Rotinas',
48
+ 'Indexes have been altered.' => 'Os Índices foram alterados.',
49
+ 'Indexes' => 'Índices',
50
+ 'Alter indexes' => 'Alterar índices',
51
+ 'Add next' => 'Adicionar proximo',
52
+ 'Language' => 'Idioma',
53
+ 'Select' => 'Selecionar',
54
+ 'New item' => 'Novo Registro',
55
+ 'Search' => 'Procurar',
56
+ 'Sort' => 'Ordenar',
57
+ 'descending' => 'decrescente',
58
+ 'Limit' => 'Limite',
59
+ 'No rows.' => 'Não existem registros.',
60
+ 'Action' => 'Ação',
61
+ 'edit' => 'editar',
62
+ 'Page' => 'Página',
63
+ 'Query executed OK, %d row(s) affected.' => array('Consulta executada, %d registro afetado.', 'Consulta executada, %d registros afetados.'),
64
+ 'Error in query' => 'Erro na consulta',
65
+ 'Execute' => 'Executar',
66
+ 'Table' => 'Tabela',
67
+ 'Foreign keys' => 'Chaves estrangeiras',
68
+ 'Triggers' => 'Triggers',
69
+ 'View' => 'Visão',
70
+ 'Unable to select the table' => 'Não é possivel selecionar a Tabela',
71
+ 'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Enviar o formulario novamente.',
72
+ 'Comment' => 'Comentário',
73
+ 'Default values' => 'Valores padrões',
74
+ '%d byte(s)' => array('%d byte', '%d bytes'),
75
+ 'No commands to execute.' => 'Nenhum comando para executar.',
76
+ 'Unable to upload a file.' => 'Não é possível enviar o arquivo.',
77
+ 'File upload' => 'Importar arquivo',
78
+ 'File uploads are disabled.' => 'Importação de arquivos desablilitada.',
79
+ 'Routine has been called, %d row(s) affected.' => array('Rotina executada, %d registro afetado.', 'Rotina executada, %d registros afetados.'),
80
+ 'Call' => 'Chamar',
81
+ 'No extension' => 'Não há extension',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'Nenhuma das extensões PHP suportadas (%s) está disponivel.',
83
+ 'Session support must be enabled.' => 'Suporte a sessões deve estar habilitado.',
84
+ 'Session expired, please login again.' => 'Sessão expirada, por favor logue-se novamente.',
85
+ 'Text length' => 'Tamanho de texto',
86
+ 'Foreign key has been dropped.' => 'A Chave Estrangeira foi apagada.',
87
+ 'Foreign key has been altered.' => 'A Chave Estrangeira foi alterada.',
88
+ 'Foreign key has been created.' => 'A Chave Estrangeira foi criada.',
89
+ 'Foreign key' => 'Chave Estrangeira',
90
+ 'Target table' => 'Tabela de destino',
91
+ 'Change' => 'Modificar',
92
+ 'Source' => 'Origem',
93
+ 'Target' => 'Destino',
94
+ 'Add column' => 'Adicionar coluna',
95
+ 'Alter' => 'Alterar',
96
+ 'Add foreign key' => 'Adicionar Chave Estrangeira',
97
+ 'ON DELETE' => 'ON DELETE',
98
+ 'ON UPDATE' => 'ON UPDATE',
99
+ 'Index Type' => 'Tipo de índice',
100
+ 'Column (length)' => 'Coluna (tamanho)',
101
+ 'View has been dropped.' => 'A Visão foi apagada.',
102
+ 'View has been altered.' => 'A Visão foi alterada.',
103
+ 'View has been created.' => 'A Visão foi criada.',
104
+ 'Alter view' => 'Alterar visão',
105
+ 'Create view' => 'Criar visão',
106
+ 'Name' => 'Nome',
107
+ 'Process list' => 'Lista de processos',
108
+ '%d process(es) have been killed.' => array('%d processo foi terminado.', '%d processos foram terminados.'),
109
+ 'Kill' => 'Parar',
110
+ 'Parameter name' => 'Nome de Parâmetro',
111
+ 'Database schema' => 'Esquema de Base de dados',
112
+ 'Create procedure' => 'Criar procedimento',
113
+ 'Create function' => 'Criar função',
114
+ 'Routine has been dropped.' => 'A Rotina foi apagada.',
115
+ 'Routine has been altered.' => 'A Rotina foi alterada.',
116
+ 'Routine has been created.' => 'A Rotina foi criada.',
117
+ 'Alter function' => 'Alterar função',
118
+ 'Alter procedure' => 'Alterar procedimento',
119
+ 'Return type' => 'Tipo de valor de retorno',
120
+ 'Add trigger' => 'Adicionar trigger',
121
+ 'Trigger has been dropped.' => 'O Trigger foi apagado.',
122
+ 'Trigger has been altered.' => 'O Trigger foi alterado.',
123
+ 'Trigger has been created.' => 'O Trigger foi criado.',
124
+ 'Alter trigger' => 'Alterar Trigger',
125
+ 'Create trigger' => 'Adicionar Trigger',
126
+ 'Time' => 'Tempo',
127
+ 'Event' => 'Evento',
128
+ '%s version: %s through PHP extension %s' => 'Versão %s: %s através da extensão PHP %s',
129
+ '%d row(s)' => array('%d registro', '%d registros'),
130
+ 'Remove' => 'Remover',
131
+ 'Are you sure?' => 'Você tem certeza?',
132
+ 'Privileges' => 'Privilégios',
133
+ 'Create user' => 'Criar Usuário',
134
+ 'User has been dropped.' => 'O Usuário foi apagado.',
135
+ 'User has been altered.' => 'O Usuário foi alterado.',
136
+ 'User has been created.' => 'O Usuário foi criado.',
137
+ 'Hashed' => 'Hash',
138
+ 'Column' => 'Coluna',
139
+ 'Routine' => 'Rotina',
140
+ 'Grant' => 'Conceder',
141
+ 'Revoke' => 'Impedir',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST data demasiado grande. Reduza o tamanho ou aumente a diretiva de configuração %s.',
143
+ 'Logged as: %s' => 'Logado como: %s',
144
+ 'Move up' => 'Mover acima',
145
+ 'Move down' => 'Mover abaixo',
146
+ 'Functions' => 'Funções',
147
+ 'Aggregation' => 'Adições',
148
+ 'Export' => 'Exportar',
149
+ 'Output' => 'Saída',
150
+ 'open' => 'abrir',
151
+ 'save' => 'salvar',
152
+ 'Format' => 'Formato',
153
+ 'Tables' => 'Tabelas',
154
+ 'Data' => 'Dados',
155
+ 'Event has been dropped.' => 'O Evento foi apagado.',
156
+ 'Event has been altered.' => 'O Evento foi alterado.',
157
+ 'Event has been created.' => 'O Evento foi criado.',
158
+ 'Alter event' => 'Modificar Evento',
159
+ 'Create event' => 'Criar Evento',
160
+ 'At given time' => 'A hora determinada',
161
+ 'Every' => 'Cada',
162
+ 'Events' => 'Eventos',
163
+ 'Schedule' => 'Agenda',
164
+ 'Start' => 'Início',
165
+ 'End' => 'Fim',
166
+ 'Status' => 'Estado',
167
+ 'On completion preserve' => 'Ao completar preservar',
168
+ 'Tables and views' => 'Tabelas e Visões',
169
+ 'Data Length' => 'Tamanho de dados',
170
+ 'Index Length' => 'Tamanho de índice',
171
+ 'Data Free' => 'Espaço Livre',
172
+ 'Collation' => 'Colação',
173
+ 'Analyze' => 'Analizar',
174
+ 'Optimize' => 'Otimizar',
175
+ 'Check' => 'Verificar',
176
+ 'Repair' => 'Reparar',
177
+ 'Truncate' => 'Truncar',
178
+ 'Tables have been truncated.' => 'As Tabelas foram truncadas.',
179
+ 'Rows' => 'Registros',
180
+ ',' => ' ',
181
+ '0123456789' => '0123456789',
182
+ 'Tables have been moved.' => 'As Tabelas foram movidas.',
183
+ 'Move to other database' => 'Mover para outra Base de dados',
184
+ 'Move' => 'Mover',
185
+ 'Engine' => 'Motor',
186
+ 'Save and continue edit' => 'Salvar e continuar editando',
187
+ 'original' => 'original',
188
+ 'Tables have been dropped.' => 'As Tabelas foram eliminadas.',
189
+ '%d item(s) have been affected.' => array('%d item foi afetado.', '%d itens foram afetados.'),
190
+ 'whole result' => 'resultado completo',
191
+ 'Clone' => 'Clonar',
192
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s.',
193
+ 'Partition by' => 'Particionar por',
194
+ 'Partitions' => 'Partições',
195
+ 'Partition name' => 'Nome da Partição',
196
+ 'Values' => 'Valores',
197
+ '%d row(s) have been imported.' => array('%d registro foi importado.', '%d registros foram importados.'),
198
+ 'anywhere' => 'qualquer local',
199
+ 'Import' => 'Importar',
200
+ 'Stop on error' => 'Parar em caso de erro',
201
+ '%.3f s' => '%.3f s',
202
+ '$1-$3-$5' => '$5/$3/$1',
203
+ '[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
204
+ 'History' => 'Histórico',
205
+ 'Variables' => 'Variáveis',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'As colunas de origen e destino devem ser do mesmo tipo, deve existir um índice entre as colunas de destino e o registro referenciado deve existir.',
207
+ 'Relations' => 'Relações',
208
+ 'Run file' => 'Executar Arquivo',
209
+ 'Clear' => 'Limpar',
210
+ 'Maximum allowed file size is %sB.' => 'Tamanho máximo do arquivo permitido é %sB.',
211
+ 'Numbers' => 'Números',
212
+ 'Date and time' => 'Data e hora',
213
+ 'Strings' => 'Cadena',
214
+ 'Binary' => 'Binário',
215
+ 'Lists' => 'Listas',
216
+ 'Editor' => 'Editor',
217
+ 'E-mail' => 'E-mail',
218
+ 'From' => 'De',
219
+ 'Subject' => 'Assunto',
220
+ 'Send' => 'Enviar',
221
+ '%d e-mail(s) have been sent.' => array('%d email foi enviado.', '%d emails foram enviados.'),
222
+ 'Webserver file %s' => 'Arquivo do servidor web %s',
223
+ 'File does not exist.' => 'Arquivo não existe.',
224
+ '%d in total' => '%d no total',
225
+ 'Permanent login' => 'Login permanente',
226
+ 'Databases have been dropped.' => 'A Base de dados foi apagada.',
227
+ 'Search data in tables' => 'Buscar dados nas Tabelas',
228
+ 'Schema' => 'Esquema',
229
+ 'Alter schema' => 'Alterar esquema',
230
+ 'Create schema' => 'Criar esquema',
231
+ 'Schema has been dropped.' => 'O Esquema foi apagado.',
232
+ 'Schema has been created.' => 'O Esquema foi criado.',
233
+ 'Schema has been altered.' => 'O Esquema foi alterado.',
234
+ 'Sequences' => 'Sequências',
235
+ 'Create sequence' => 'Criar sequência',
236
+ 'Alter sequence' => 'Alterar sequência',
237
+ 'Sequence has been dropped.' => 'A Sequência foi apagada.',
238
+ 'Sequence has been created.' => 'A Sequência foi criada.',
239
+ 'Sequence has been altered.' => 'A Sequência foi alterada.',
240
+ 'User types' => 'Tipos definidos pelo usuário',
241
+ 'Create type' => 'Criar tipo',
242
+ 'Alter type' => 'Alterar tipo',
243
+ 'Type has been dropped.' => 'O Tipo foi apagado.',
244
+ 'Type has been created.' => 'O Tipo foi criado.',
245
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+clique sobre o valor para edita-lo.',
246
+ 'Use edit link to modify this value.' => 'Utilize o link editar para modificar este valor.',
247
+ 'last' => 'último',
248
+ 'From server' => 'A partir do servidor',
249
+ 'System' => 'Sistema',
250
+ 'Select data' => 'Selecionar dados',
251
+ 'Show structure' => 'Mostrar estrutura',
252
+ 'empty' => 'vazio',
253
+ 'Network' => 'Rede',
254
+ 'Geometry' => 'Geometria',
255
+ 'File exists.' => 'Arquivo já existe.',
256
+ 'Attachments' => 'Anexos',
257
+ '%d query(s) executed OK.' => array('%d consulta sql executada corretamente.', '%d consultas sql executadas corretamente.'),
258
+ 'Show only errors' => 'Mostrar somente erros',
259
+ 'Refresh' => 'Atualizar',
260
+ 'Invalid schema.' => 'Esquema inválido.',
261
+ 'Please use one of the extensions %s.' => 'Por favor use uma das extensões %s.',
262
+ 'now' => 'agora',
263
+ 'ltr' => 'ltr',
264
+ );
adminer/adminer/adminer/lang/pt.inc.php ADDED
@@ -0,0 +1,264 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Entrar',
4
+ 'Logout successful.' => 'Sessão terminada com sucesso.',
5
+ 'Invalid credentials.' => 'Identificação inválida.',
6
+ 'Server' => 'Servidor',
7
+ 'Username' => 'Nome de utilizador',
8
+ 'Password' => 'Senha',
9
+ 'Select database' => 'Selecionar Base de dados',
10
+ 'Invalid database.' => 'Base de dados inválida.',
11
+ 'Create new database' => 'Criar nova base de dados',
12
+ 'Table has been dropped.' => 'Tabela eliminada.',
13
+ 'Table has been altered.' => 'Tabela modificada.',
14
+ 'Table has been created.' => 'Tabela criada.',
15
+ 'Alter table' => 'Modificar estrutura',
16
+ 'Create table' => 'Criar tabela',
17
+ 'Table name' => 'Nome da tabela',
18
+ 'engine' => 'motor',
19
+ 'collation' => 'collation',
20
+ 'Column name' => 'Nome da coluna',
21
+ 'Type' => 'Tipo',
22
+ 'Length' => 'Tamanho',
23
+ 'Auto Increment' => 'Incremento Automático',
24
+ 'Options' => 'Opções',
25
+ 'Save' => 'Guardar',
26
+ 'Drop' => 'Remover',
27
+ 'Database has been dropped.' => 'Base de dados eliminada.',
28
+ 'Database has been created.' => 'Base de dados criada.',
29
+ 'Database has been renamed.' => 'Base de dados renomeada.',
30
+ 'Database has been altered.' => 'Base de dados modificada.',
31
+ 'Alter database' => 'Modificar Base de dados',
32
+ 'Create database' => 'Criar Base de dados',
33
+ 'SQL command' => 'Comando SQL',
34
+ 'Logout' => 'Terminar sessão',
35
+ 'database' => 'base de dados',
36
+ 'Use' => 'Usar',
37
+ 'No tables.' => 'Não existem tabelas.',
38
+ 'select' => 'registos',
39
+ 'Item has been deleted.' => 'Registo eliminado.',
40
+ 'Item has been updated.' => 'Registo modificado.',
41
+ 'Item%s has been inserted.' => 'Registo%s inserido.',
42
+ 'Edit' => 'Modificar',
43
+ 'Insert' => 'Inserir',
44
+ 'Save and insert next' => 'Guardar e inserir outro',
45
+ 'Delete' => 'Eliminar',
46
+ 'Database' => 'Base de dados',
47
+ 'Routines' => 'Procedimentos',
48
+ 'Indexes have been altered.' => 'Índices modificados.',
49
+ 'Indexes' => 'Índices',
50
+ 'Alter indexes' => 'Modificar índices',
51
+ 'Add next' => 'Adicionar próximo',
52
+ 'Language' => 'Idioma',
53
+ 'Select' => 'Selecionar',
54
+ 'New item' => 'Novo Registo',
55
+ 'Search' => 'Procurar',
56
+ 'Sort' => 'Ordenar',
57
+ 'descending' => 'decrescente',
58
+ 'Limit' => 'Limite',
59
+ 'No rows.' => 'Não existem registos.',
60
+ 'Action' => 'Ação',
61
+ 'edit' => 'modificar',
62
+ 'Page' => 'Página',
63
+ 'Query executed OK, %d row(s) affected.' => array('Consulta executada, %d registo afetado.', 'Consulta executada, %d registos afetados.'),
64
+ 'Error in query' => 'Erro na consulta',
65
+ 'Execute' => 'Executar',
66
+ 'Table' => 'Tabela',
67
+ 'Foreign keys' => 'Chaves estrangeiras',
68
+ 'Triggers' => 'Triggers',
69
+ 'View' => 'Visualizar',
70
+ 'Unable to select the table' => 'Não é possivel selecionar a Tabela',
71
+ 'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Enviar o formulario novamente.',
72
+ 'Comment' => 'Comentário',
73
+ 'Default values' => 'Valores predeterminados',
74
+ '%d byte(s)' => array('%d byte', '%d bytes'),
75
+ 'No commands to execute.' => 'Nenhum comando para executar.',
76
+ 'Unable to upload a file.' => 'Não é possível enviar o ficheiro.',
77
+ 'File upload' => 'Importar ficheiro',
78
+ 'File uploads are disabled.' => 'Importação de ficheiros desativada.',
79
+ 'Routine has been called, %d row(s) affected.' => array('Consulta executada, %d registo afetado.', 'Consulta executada, %d registos afetados.'),
80
+ 'Call' => 'Chamar',
81
+ 'No extension' => 'Não há extensão',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'Nenhuma das extensões PHP suportadas (%s) está disponivel.',
83
+ 'Session support must be enabled.' => 'As sessões devem estar ativas.',
84
+ 'Session expired, please login again.' => 'Sessão expirada, por favor entre de novo.',
85
+ 'Text length' => 'Tamanho do texto',
86
+ 'Foreign key has been dropped.' => 'Chave estrangeira eliminada.',
87
+ 'Foreign key has been altered.' => 'Chave estrangeira modificada.',
88
+ 'Foreign key has been created.' => 'Chave estrangeira criada.',
89
+ 'Foreign key' => 'Chave estrangeira',
90
+ 'Target table' => 'Tabela de destino',
91
+ 'Change' => 'Modificar',
92
+ 'Source' => 'Origem',
93
+ 'Target' => 'Destino',
94
+ 'Add column' => 'Adicionar coluna',
95
+ 'Alter' => 'Modificar',
96
+ 'Add foreign key' => 'Adicionar Chave estrangeira',
97
+ 'ON DELETE' => 'ON DELETE',
98
+ 'ON UPDATE' => 'ON UPDATE',
99
+ 'Index Type' => 'Tipo de índice',
100
+ 'Column (length)' => 'coluna (tamanho)',
101
+ 'View has been dropped.' => 'Vista eliminada.',
102
+ 'View has been altered.' => 'Vista modificada.',
103
+ 'View has been created.' => 'Vista criada.',
104
+ 'Alter view' => 'Modificar vista',
105
+ 'Create view' => 'Criar vista',
106
+ 'Name' => 'Nome',
107
+ 'Process list' => 'Lista de processos',
108
+ '%d process(es) have been killed.' => array('%d processo terminado.', '%d processos terminados.'),
109
+ 'Kill' => 'Parar',
110
+ 'Parameter name' => 'Nome de Parâmetro',
111
+ 'Database schema' => 'Esquema de Base de dados',
112
+ 'Create procedure' => 'Criar procedimento',
113
+ 'Create function' => 'Criar função',
114
+ 'Routine has been dropped.' => 'Procedimento eliminado.',
115
+ 'Routine has been altered.' => 'Procedimento modificado.',
116
+ 'Routine has been created.' => 'Procedimento criado.',
117
+ 'Alter function' => 'Modificar Função',
118
+ 'Alter procedure' => 'Modificar procedimento',
119
+ 'Return type' => 'Tipo de valor de regresso',
120
+ 'Add trigger' => 'Adicionar trigger',
121
+ 'Trigger has been dropped.' => 'Trigger eliminado.',
122
+ 'Trigger has been altered.' => 'Trigger modificado.',
123
+ 'Trigger has been created.' => 'Trigger criado.',
124
+ 'Alter trigger' => 'Modificar Trigger',
125
+ 'Create trigger' => 'Adicionar Trigger',
126
+ 'Time' => 'Tempo',
127
+ 'Event' => 'Evento',
128
+ '%s version: %s through PHP extension %s' => 'Versão %s: %s através da extensão PHP %s',
129
+ '%d row(s)' => array('%d registo', '%d registos'),
130
+ 'Remove' => 'Remover',
131
+ 'Are you sure?' => 'Tem a certeza?',
132
+ 'Privileges' => 'Privilégios',
133
+ 'Create user' => 'Criar utilizador',
134
+ 'User has been dropped.' => 'Utilizador eliminado.',
135
+ 'User has been altered.' => 'Utilizador modificado.',
136
+ 'User has been created.' => 'Utilizador criado.',
137
+ 'Hashed' => 'Hash',
138
+ 'Column' => 'Coluna',
139
+ 'Routine' => 'Rotina',
140
+ 'Grant' => 'Conceder',
141
+ 'Revoke' => 'Impedir',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST data demasiado grande. Reduza o tamanho ou aumente a diretiva de configuração %s.',
143
+ 'Logged as: %s' => 'Ligado como: %s',
144
+ 'Move up' => 'Mover para cima',
145
+ 'Move down' => 'Mover para baixo',
146
+ 'Functions' => 'Funções',
147
+ 'Aggregation' => 'Adições',
148
+ 'Export' => 'Exportar',
149
+ 'Output' => 'Saída',
150
+ 'open' => 'abrir',
151
+ 'save' => 'guardar',
152
+ 'Format' => 'Formato',
153
+ 'Tables' => 'Tabelas',
154
+ 'Data' => 'Dados',
155
+ 'Event has been dropped.' => 'Evento eliminado.',
156
+ 'Event has been altered.' => 'Evento modificado.',
157
+ 'Event has been created.' => 'Evento criado.',
158
+ 'Alter event' => 'Modificar Evento',
159
+ 'Create event' => 'Criar Evento',
160
+ 'At given time' => 'À hora determinada',
161
+ 'Every' => 'Cada',
162
+ 'Events' => 'Eventos',
163
+ 'Schedule' => 'Agenda',
164
+ 'Start' => 'Início',
165
+ 'End' => 'Fim',
166
+ 'Status' => 'Estado',
167
+ 'On completion preserve' => 'Preservar ao completar',
168
+ 'Tables and views' => 'Tabelas e vistas',
169
+ 'Data Length' => 'Tamanho de dados',
170
+ 'Index Length' => 'Tamanho de índice',
171
+ 'Data Free' => 'Espaço Livre',
172
+ 'Collation' => 'Colação',
173
+ 'Analyze' => 'Analizar',
174
+ 'Optimize' => 'Otimizar',
175
+ 'Check' => 'Verificar',
176
+ 'Repair' => 'Reparar',
177
+ 'Truncate' => 'Truncar',
178
+ 'Tables have been truncated.' => 'Tabelas truncadas (truncate).',
179
+ 'Rows' => 'Registos',
180
+ ',' => ' ',
181
+ '0123456789' => '0123456789',
182
+ 'Tables have been moved.' => 'As Tabelas foram movidas.',
183
+ 'Move to other database' => 'Mover outra Base de dados',
184
+ 'Move' => 'Mover',
185
+ 'Engine' => 'Motor',
186
+ 'Save and continue edit' => 'Guardar e continuar a edição',
187
+ 'original' => 'original',
188
+ 'Tables have been dropped.' => 'As tabelas foram eliminadas.',
189
+ '%d item(s) have been affected.' => array('%d item afetado.', '%d itens afetados.'),
190
+ 'whole result' => 'resultado completo',
191
+ 'Clone' => 'Clonar',
192
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s.',
193
+ 'Partition by' => 'Particionar por',
194
+ 'Partitions' => 'Partições',
195
+ 'Partition name' => 'Nome da Partição',
196
+ 'Values' => 'Valores',
197
+ '%d row(s) have been imported.' => array('%d registo importado.', '%d registos importados.'),
198
+ 'anywhere' => 'qualquer local',
199
+ 'Import' => 'Importar',
200
+ 'Stop on error' => 'Parar em caso de erro',
201
+ '%.3f s' => '%.3f s',
202
+ '$1-$3-$5' => '$5/$3/$1',
203
+ '[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
204
+ 'History' => 'Histórico',
205
+ 'Variables' => 'Variáveis',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'As colunas de origen e destino devem ser do mesmo tipo, deve existir um índice entre as colunas de destino e o registo referenciado deve existir.',
207
+ 'Relations' => 'Relações',
208
+ 'Run file' => 'Executar ficheiro',
209
+ 'Clear' => 'Limpar',
210
+ 'Maximum allowed file size is %sB.' => 'Tamanho máximo do ficheiro é %sB.',
211
+ 'Numbers' => 'Números',
212
+ 'Date and time' => 'Data e hora',
213
+ 'Strings' => 'Cadeia',
214
+ 'Binary' => 'Binário',
215
+ 'Lists' => 'Listas',
216
+ 'Editor' => 'Editor',
217
+ 'E-mail' => 'E-mail',
218
+ 'From' => 'De',
219
+ 'Subject' => 'Assunto',
220
+ 'Send' => 'Enviar',
221
+ '%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
222
+ 'Webserver file %s' => 'Ficheiro do servidor web %s',
223
+ 'File does not exist.' => 'Ficheiro não existe.',
224
+ '%d in total' => '%d no total',
225
+ 'Permanent login' => 'Memorizar a senha',
226
+ 'Databases have been dropped.' => 'Bases de dados eliminadas.',
227
+ 'Search data in tables' => 'Pesquisar dados nas Tabelas',
228
+ 'Schema' => 'Esquema',
229
+ 'Alter schema' => 'Modificar esquema',
230
+ 'Create schema' => 'Criar esquema',
231
+ 'Schema has been dropped.' => 'Esquema eliminado.',
232
+ 'Schema has been created.' => 'Esquema criado.',
233
+ 'Schema has been altered.' => 'Esquema modificado.',
234
+ 'Sequences' => 'Sequências',
235
+ 'Create sequence' => 'Criar sequências',
236
+ 'Alter sequence' => 'Modificar sequência',
237
+ 'Sequence has been dropped.' => 'Sequência eliminada.',
238
+ 'Sequence has been created.' => 'Sequência criada.',
239
+ 'Sequence has been altered.' => 'Sequência modificada.',
240
+ 'User types' => 'Tipos definidos pelo utilizador',
241
+ 'Create type' => 'Criar tipo',
242
+ 'Alter type' => 'Modificar tipo',
243
+ 'Type has been dropped.' => 'Tipo eliminado.',
244
+ 'Type has been created.' => 'Tipo criado.',
245
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+clique vezes sobre o valor para edita-lo.',
246
+ 'Use edit link to modify this value.' => 'Utilize o link modificar para alterar.',
247
+ 'last' => 'último',
248
+ 'From server' => 'Do servidor',
249
+ 'System' => 'Motor de Base de dados',
250
+ 'Select data' => 'Selecionar dados',
251
+ 'Show structure' => 'Mostrar estrutura',
252
+ 'empty' => 'vazio',
253
+ 'Network' => 'Rede',
254
+ 'Geometry' => 'Geometria',
255
+ 'File exists.' => 'Ficheiro já existe.',
256
+ 'Attachments' => 'Anexos',
257
+ '%d query(s) executed OK.' => array('%d consulta sql executada corretamente.', '%d consultas sql executadas corretamente.'),
258
+ 'Show only errors' => 'Mostrar somente erros',
259
+ 'Refresh' => 'Atualizar',
260
+ 'Invalid schema.' => 'Esquema inválido.',
261
+ 'Please use one of the extensions %s.' => 'Por favor use uma das extensões %s.',
262
+ 'now' => 'agora',
263
+ 'ltr' => 'ltr',
264
+ );
adminer/adminer/adminer/lang/ro.inc.php ADDED
@@ -0,0 +1,269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Intră',
4
+ 'Logout successful.' => 'Ați ieșit cu succes.',
5
+ 'Invalid credentials.' => 'Numele de utilizator sau parola este greșită.',
6
+ 'Server' => 'Server',
7
+ 'Username' => 'Nume de utilizator',
8
+ 'Password' => 'Parola',
9
+ 'Select database' => 'Alege baza de date',
10
+ 'Invalid database.' => 'Bază de deate invalidă.',
11
+ 'Create new database' => 'Crează o bază de date nouă',
12
+ 'Table has been dropped.' => 'Tabelul a fost șters.',
13
+ 'Table has been altered.' => 'Tabelul a fost modificat.',
14
+ 'Table has been created.' => 'Tabelul a fost creat.',
15
+ 'Alter table' => 'Modifică tabelul',
16
+ 'Create table' => 'Crează tabel',
17
+ 'Table name' => 'Denumirea tabelului',
18
+ 'engine' => 'tip',
19
+ 'collation' => 'colaționarea',
20
+ 'Column name' => 'Denumirea coloanei',
21
+ 'Type' => 'Tip',
22
+ 'Length' => 'Lungime',
23
+ 'Auto Increment' => 'Creșterea automată',
24
+ 'Options' => 'Acțiune',
25
+ 'Save' => 'Salvează',
26
+ 'Drop' => 'Șterge',
27
+ 'Database has been dropped.' => 'Baza de date a fost ștearsă.',
28
+ 'Database has been created.' => 'Baza de date a fost creată.',
29
+ 'Database has been renamed.' => 'Baza de date a fost redenumită.',
30
+ 'Database has been altered.' => 'Baza de date a fost modificată.',
31
+ 'Alter database' => 'Modifică baza de date',
32
+ 'Create database' => 'Crează baza de date',
33
+ 'SQL command' => 'SQL query',
34
+ 'Logout' => 'Ieșire',
35
+ 'database' => 'baza de date',
36
+ 'Use' => 'Alege',
37
+ 'No tables.' => 'În baza de date nu sunt tabele.',
38
+ 'select' => 'selectează',
39
+ 'Item has been deleted.' => 'Înregistrare a fost ștearsă.',
40
+ 'Item has been updated.' => 'Înregistrare a fost înnoită.',
41
+ 'Item%s has been inserted.' => 'Înregistrarea%s a fost inserată.',
42
+ 'Edit' => 'Editează',
43
+ 'Insert' => 'Inserează',
44
+ 'Save and insert next' => 'Salvează și mai inserează',
45
+ 'Delete' => 'Șterge',
46
+ 'Database' => 'Baza de date',
47
+ 'Routines' => 'Proceduri și funcții salvate',
48
+ 'Indexes have been altered.' => 'Indexurile au fost modificate.',
49
+ 'Indexes' => 'Indexuri',
50
+ 'Alter indexes' => 'Modifică indexuri',
51
+ 'Add next' => 'Adaugă încă',
52
+ 'Language' => 'Limba',
53
+ 'Select' => 'Selectează',
54
+ 'New item' => 'Înscriere nouă',
55
+ 'Search' => 'Căutare',
56
+ 'Sort' => 'Sortare',
57
+ 'descending' => 'descrescător',
58
+ 'Limit' => 'Limit',
59
+ 'No rows.' => 'Nu sunt înscrieri.',
60
+ 'Action' => 'Acțiune',
61
+ 'edit' => 'editare',
62
+ 'Page' => 'Pagina',
63
+ 'Query executed OK, %d row(s) affected.' => array('Query executat, %d înscriere modificată.', 'Query executat, %d înscrieri modificate.'),
64
+ 'Error in query' => 'Greșeală în query',
65
+ 'Execute' => 'Execută',
66
+ 'Table' => 'Tabel',
67
+ 'Foreign keys' => 'Chei externe',
68
+ 'Triggers' => 'Declanșatoare',
69
+ 'View' => 'Reprezentare',
70
+ 'Unable to select the table' => 'Nu am putut selecta date din tabel',
71
+ 'Invalid CSRF token. Send the form again.' => 'CSRF token imposibil. Retrimite forma.',
72
+ 'Comment' => 'Comentariu',
73
+ 'Default values' => 'Valoarea inițială',
74
+ '%d byte(s)' => array('%d octet', '%d octeți'),
75
+ 'No commands to execute.' => 'Nu sunt comenzi de executat.',
76
+ 'Unable to upload a file.' => 'Nu am putut încărca fișierul pe server.',
77
+ 'File upload' => 'Încarcă fișierul',
78
+ 'File uploads are disabled.' => 'Încărcarea fișierelor este interzisă.',
79
+ 'Routine has been called, %d row(s) affected.' => array('A fost executată procedura, %d înscriere a fost modificată.', 'A fost executată procedura, %d înscrieri au fost modificate.'),
80
+ 'Call' => 'Apelează',
81
+ 'No extension' => 'Nu este extensie',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'Nu este aviabilă nici o extensie suportată (%s).',
83
+ 'Session support must be enabled.' => 'Sesiunile trebuie să fie pornite.',
84
+ 'Session expired, please login again.' => 'Timpul sesiunii a expirat, rog să vă conectați din nou.',
85
+ 'Text length' => 'Lungimea textului',
86
+ 'Foreign key has been dropped.' => 'Cheia externă a fost ștearsă.',
87
+ 'Foreign key has been altered.' => 'Cheia externă a fost modificată.',
88
+ 'Foreign key has been created.' => 'Cheia externă a fost creată.',
89
+ 'Foreign key' => 'Cheie externă',
90
+ 'Target table' => 'Tabela scop',
91
+ 'Change' => 'Modifică',
92
+ 'Source' => 'Sursă',
93
+ 'Target' => 'Scop',
94
+ 'Add column' => 'Adaugă coloană',
95
+ 'Alter' => 'Modifică',
96
+ 'Add foreign key' => 'Adaugă cheie externă',
97
+ 'ON DELETE' => 'La ștergere',
98
+ 'ON UPDATE' => 'La modificare',
99
+ 'Index Type' => 'Tipul indexului',
100
+ 'Column (length)' => 'Coloană (lungimea)',
101
+ 'View has been dropped.' => 'Reprezentarea a fost ștearsă.',
102
+ 'View has been altered.' => 'Reprezentarea a fost modificată.',
103
+ 'View has been created.' => 'Reprezentarea a fost creată.',
104
+ 'Alter view' => 'Modifică reprezentarea',
105
+ 'Create view' => 'Crează reprezentare',
106
+ 'Name' => 'Titlu',
107
+ 'Process list' => 'Lista proceselor',
108
+ '%d process(es) have been killed.' => array('A fost terminat %d proces.', 'Au fost terminate %d procese.'),
109
+ 'Kill' => 'Termină',
110
+ 'Parameter name' => 'Numele parametrului',
111
+ 'Database schema' => 'Schema bazei de date',
112
+ 'Create procedure' => 'Crează procedură',
113
+ 'Create function' => 'Crează funcție',
114
+ 'Routine has been dropped.' => 'Procedura a fost ștearsă.',
115
+ 'Routine has been altered.' => 'Procedura a fost modificată.',
116
+ 'Routine has been created.' => 'Procedura a fost creată.',
117
+ 'Alter function' => 'Modifică funcția',
118
+ 'Alter procedure' => 'Modifică procedura',
119
+ 'Return type' => 'Tipul returnării',
120
+ 'Add trigger' => 'Adaugă trigger (declanșator)',
121
+ 'Trigger has been dropped.' => 'Triggerul a fost șters.',
122
+ 'Trigger has been altered.' => 'Triggerul a fost modificat.',
123
+ 'Trigger has been created.' => 'Triggerul a fost creat.',
124
+ 'Alter trigger' => 'Modifică trigger',
125
+ 'Create trigger' => 'Crează trigger',
126
+ 'Time' => 'Timp',
127
+ 'Event' => 'Eveniment',
128
+ '%s version: %s through PHP extension %s' => 'Versiunea %s: %s cu extensia PHP %s',
129
+ '%d row(s)' => array('%d înscriere', '%d înscrieri'),
130
+ 'Remove' => 'Șterge',
131
+ 'Are you sure?' => 'Sunteți sigur(ă)?',
132
+ 'Privileges' => 'Privilegii',
133
+ 'Create user' => 'Crează utilizator',
134
+ 'User has been dropped.' => 'Utilizatorul a fost șters.',
135
+ 'User has been altered.' => 'Utilizatorul a fost modificat.',
136
+ 'User has been created.' => 'Utilizatorul a fost creat.',
137
+ 'Hashed' => 'Hashed',
138
+ 'Column' => 'Coloană',
139
+ 'Routine' => 'Procedură',
140
+ 'Grant' => 'Permite',
141
+ 'Revoke' => 'Interzice',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Mesajul POST este prea mare. Trimiteți mai puține date sau măriți parametrul configurației directivei %s.',
143
+ 'Logged as: %s' => 'Ați intrat ca: %s',
144
+ 'Move up' => 'Mișcă în sus',
145
+ 'Move down' => 'Mișcă în jos',
146
+ 'Functions' => 'Funcții',
147
+ 'Aggregation' => 'Agregare',
148
+ 'Export' => 'Export',
149
+ 'Output' => 'Date de ieșire',
150
+ 'open' => 'deschide',
151
+ 'save' => 'salvează',
152
+ 'Format' => 'Format',
153
+ 'Tables' => 'Tabele',
154
+ 'Data' => 'Date',
155
+ 'Event has been dropped.' => 'Evenimentul a fost șters.',
156
+ 'Event has been altered.' => 'Evenimentul a fost modificat.',
157
+ 'Event has been created.' => 'Evenimentul a fost adăugat.',
158
+ 'Alter event' => 'Modifică eveniment',
159
+ 'Create event' => 'Creează evenimet',
160
+ 'At given time' => 'În timpul curent',
161
+ 'Every' => 'Fiecare',
162
+ 'Events' => 'Evenimente',
163
+ 'Schedule' => 'Program',
164
+ 'Start' => 'Început',
165
+ 'End' => 'Sfârșit',
166
+ 'Status' => 'Stare',
167
+ 'On completion preserve' => 'Salvează după finisare',
168
+ 'Tables and views' => 'Tabele și reprezentări',
169
+ 'Data Length' => 'Cantitatea de date',
170
+ 'Index Length' => 'Cantitatea de indecși',
171
+ 'Data Free' => 'Spațiu liber',
172
+ 'Collation' => 'Colaționare',
173
+ 'Analyze' => 'Analizează',
174
+ 'Optimize' => 'Optimizează',
175
+ 'Check' => 'Controlează',
176
+ 'Repair' => 'Repară',
177
+ 'Truncate' => 'Curăță',
178
+ 'Tables have been truncated.' => 'Tabelele au fost curățate.',
179
+ 'Rows' => 'Înscrieri',
180
+ ',' => ',',
181
+ '0123456789' => '0123456789',
182
+ 'Tables have been moved.' => 'Tabelele au fost mutate.',
183
+ 'Move to other database' => 'Mută în altă bază de date',
184
+ 'Move' => 'Mută',
185
+ 'Engine' => 'Tip',
186
+ 'Save and continue edit' => 'Salvează și continuă editarea',
187
+ 'original' => 'original',
188
+ '%d item(s) have been affected.' => array('A fost modificată %d înscriere.', 'Au fost modificate %d înscrieri.'),
189
+ 'whole result' => 'tot rezultatul',
190
+ 'Tables have been dropped.' => 'Tabelele au fost șterse.',
191
+ 'Clone' => 'Clonează',
192
+ 'Partition by' => 'Împarte',
193
+ 'Partitions' => 'Secțiuni',
194
+ 'Partition name' => 'Denumirea secțiunii',
195
+ 'Values' => 'Parametru',
196
+ '%d row(s) have been imported.' => array('%d rînd importat.', '%d rînduri importate.'),
197
+ 'Import' => 'Importă',
198
+ 'Stop on error' => 'Se oprește la greșeală',
199
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Numărul maxim de înscrieri disponibile a fost atins. Majorați %s.',
200
+ 'anywhere' => 'oriunde',
201
+ '%.3f s' => '%.3f s',
202
+ '$1-$3-$5' => '$5.$3.$1',
203
+ '[yyyy]-mm-dd' => 'dd.mm.[yyyy]',
204
+ 'History' => 'Istoria',
205
+ 'Variables' => 'Variabile',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Coloanele ar trebui să aibă aceleaşi tipuri de date, trebuie să existe date de referinţă și un index pe coloanela-ţintă.',
207
+ 'Relations' => 'Relații',
208
+ 'Run file' => 'Execută fișier',
209
+ 'Clear' => 'Curăță',
210
+ 'Maximum allowed file size is %sB.' => 'Fișierul maxim admis - %sO.',
211
+ 'Numbers' => 'Număr',
212
+ 'Date and time' => 'Data și timpul',
213
+ 'Strings' => 'Șiruri de caractere',
214
+ 'Binary' => 'Tip binar',
215
+ 'Lists' => 'Liste',
216
+ 'Editor' => 'Editor',
217
+ 'E-mail' => 'Poșta electronică',
218
+ 'From' => 'De la',
219
+ 'Subject' => 'Pentru',
220
+ 'Send' => 'Trimite',
221
+ '%d e-mail(s) have been sent.' => array('A fost trimis %d mail.', 'Au fost trimise %d mail-uri.'),
222
+ 'Webserver file %s' => 'Fișierul %s pe server',
223
+ 'File does not exist.' => 'Acest fișier nu există.',
224
+ '%d in total' => 'În total %d',
225
+ 'Permanent login' => 'Logare permanentă',
226
+ 'Databases have been dropped.' => 'Bazele de date au fost șterse.',
227
+ 'Search data in tables' => 'Caută în tabele',
228
+ 'Schema' => 'Schema',
229
+ 'Alter schema' => 'Modifică schema',
230
+ 'Create schema' => 'Crează o schemă',
231
+ 'Schema has been dropped.' => 'Schema a fost ștearsă.',
232
+ 'Schema has been created.' => 'Schema a fost creată.',
233
+ 'Schema has been altered.' => 'Schema a fost modificată.',
234
+ 'Sequences' => '«Secvențe»',
235
+ 'Create sequence' => 'Crează «secvență»',
236
+ 'Alter sequence' => 'Modifică «secvență»',
237
+ 'Sequence has been dropped.' => '«secvența» a fost ștearsă.',
238
+ 'Sequence has been created.' => '«secvența» a fost creată.',
239
+ 'Sequence has been altered.' => '«secvența» a fost modificată.',
240
+ 'User types' => 'Tipuri de utilizatori',
241
+ 'Create type' => 'Crează tip noi',
242
+ 'Alter type' => 'Modifică tip',
243
+ 'Type has been dropped.' => 'Tiipul a fost șters.',
244
+ 'Type has been created.' => 'Crează tip nou.',
245
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+click pe o valoare pentru a o modifica.',
246
+ 'Use edit link to modify this value.' => 'Valoare poate fi modificată cu ajutorul butonului «modifică».',
247
+ 'last' => 'ultima',
248
+ 'From server' => 'De pe server',
249
+ 'System' => 'Sistem',
250
+ 'Select data' => 'Selectează',
251
+ 'Show structure' => 'Arată structura',
252
+ 'empty' => 'gol',
253
+ 'Network' => 'Rețea',
254
+ 'Geometry' => 'Geometrie',
255
+ 'File exists.' => 'Fișierul există deja.',
256
+ 'Attachments' => 'Fișiere atașate',
257
+ '%d query(s) executed OK.' => array('%d query executat.', '%d query-uri executate cu succes.'),
258
+ 'Show only errors' => 'Arată doar greșeli',
259
+ 'Refresh' => 'Împrospătează',
260
+ 'Invalid schema.' => 'Schemă incorectă.',
261
+ 'Please use one of the extensions %s.' => 'Folosiți una din următoarele extensii %s.',
262
+ 'now' => 'acum',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'Tabelele au fost copiate',
265
+ 'Copy' => 'Copiază',
266
+ 'Permanent link' => 'Adresă permanentă',
267
+ 'Edit all' => 'Editează tot',
268
+ 'HH:MM:SS' => 'HH:MM:SS',
269
+ );
adminer/adminer/adminer/lang/ru.inc.php ADDED
@@ -0,0 +1,269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ 'Create new database' => 'Создать новую базу данных',
12
+ 'Table has been dropped.' => 'Таблица была удалена.',
13
+ 'Table has been altered.' => 'Таблица была изменена.',
14
+ 'Table has been created.' => 'Таблица была создана.',
15
+ 'Alter table' => 'Изменить таблицу',
16
+ 'Create table' => 'Создать таблицу',
17
+ 'Table name' => 'Название таблицы',
18
+ 'engine' => 'тип',
19
+ 'collation' => 'режим сопоставления',
20
+ 'Column name' => 'Название поля',
21
+ 'Type' => 'Тип',
22
+ 'Length' => 'Длина',
23
+ 'Auto Increment' => 'Автоматическое приращение',
24
+ 'Options' => 'Действие',
25
+ 'Save' => 'Сохранить',
26
+ 'Drop' => 'Удалить',
27
+ 'Database has been dropped.' => 'База данных была удалена.',
28
+ 'Database has been created.' => 'База данных была создана.',
29
+ 'Database has been renamed.' => 'База данных была переименована.',
30
+ 'Database has been altered.' => 'База данных была изменена.',
31
+ 'Alter database' => 'Изменить базу данных',
32
+ 'Create database' => 'Создать базу данных',
33
+ 'SQL command' => 'SQL запрос',
34
+ 'Logout' => 'Выйти',
35
+ 'database' => 'база данных',
36
+ 'Use' => 'Выбрать',
37
+ 'No tables.' => 'В базе данных нет таблиц.',
38
+ 'select' => 'выбрать',
39
+ 'Item has been deleted.' => 'Запись удалена.',
40
+ 'Item has been updated.' => 'Запись обновлена.',
41
+ 'Item%s has been inserted.' => 'Запись%s была вставлена.',
42
+ 'Edit' => 'Редактировать',
43
+ 'Insert' => 'Вставить',
44
+ 'Save and insert next' => 'Сохранить и вставить ещё',
45
+ 'Delete' => 'Стереть',
46
+ 'Database' => 'База данных',
47
+ 'Routines' => 'Хранимые процедуры и функции',
48
+ 'Indexes have been altered.' => 'Индексы изменены.',
49
+ 'Indexes' => 'Индексы',
50
+ 'Alter indexes' => 'Изменить индексы',
51
+ 'Add next' => 'Добавить ещё',
52
+ 'Language' => 'Язык',
53
+ 'Select' => 'Выбрать',
54
+ 'New item' => 'Новая запись',
55
+ 'Search' => 'Поиск',
56
+ 'Sort' => 'Сортировать',
57
+ 'descending' => 'по убыванию',
58
+ 'Limit' => 'Лимит',
59
+ 'No rows.' => 'Нет записей.',
60
+ 'Action' => 'Действие',
61
+ 'edit' => 'редактировать',
62
+ 'Page' => 'Страница',
63
+ 'Query executed OK, %d row(s) affected.' => array('Запрос завершён, изменена %d запись.', 'Запрос завершён, изменены %d записи.', 'Запрос завершён, изменено %d записей.'),
64
+ 'Error in query' => 'Ошибка в запросe',
65
+ 'Execute' => 'Выполнить',
66
+ 'Table' => 'Таблица',
67
+ 'Foreign keys' => 'Внешние ключи',
68
+ 'Triggers' => 'Триггеры',
69
+ 'View' => 'Представление',
70
+ 'Unable to select the table' => 'Не удалось получить данные из таблицы',
71
+ 'Invalid CSRF token. Send the form again.' => 'Недействительный CSRF токен. Отправите форму ещё раз.',
72
+ 'Comment' => 'Комментарий',
73
+ 'Default values' => 'Значения по умолчанию',
74
+ '%d byte(s)' => array('%d байт', '%d байта', '%d байтов'),
75
+ 'No commands to execute.' => 'Нет команд для выполнения.',
76
+ 'Unable to upload a file.' => 'Не удалось загрузить файл на сервер.',
77
+ 'File upload' => 'Загрузить файл на сервер',
78
+ 'File uploads are disabled.' => 'Загрузка файлов на сервер запрещена.',
79
+ 'Routine has been called, %d row(s) affected.' => array('Была вызвана процедура, %d запись была изменена.', 'Была вызвана процедура, %d записи было изменено.', 'Была вызвана процедура, %d записей было изменено.'),
80
+ 'Call' => 'Вызвать',
81
+ 'No extension' => 'Нет расширений',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'Недоступно ни одного расширения из поддерживаемых (%s).',
83
+ 'Session support must be enabled.' => 'Сессии должны быть включены.',
84
+ 'Session expired, please login again.' => 'Срок действия сессии истёк, нужно снова войти в систему.',
85
+ 'Text length' => 'Длина текста',
86
+ 'Foreign key has been dropped.' => 'Внешний ключ был удалён.',
87
+ 'Foreign key has been altered.' => 'Внешний ключ был изменён.',
88
+ 'Foreign key has been created.' => 'Внешний ключ был создан.',
89
+ 'Foreign key' => 'Внешний ключ',
90
+ 'Target table' => 'Результирующая таблица',
91
+ 'Change' => 'Изменить',
92
+ 'Source' => 'Источник',
93
+ 'Target' => 'Цель',
94
+ 'Add column' => 'Добавить колонку',
95
+ 'Alter' => 'Изменить',
96
+ 'Add foreign key' => 'Добавить внешний ключ',
97
+ 'ON DELETE' => 'При стирании',
98
+ 'ON UPDATE' => 'При обновлении',
99
+ 'Index Type' => 'Тип индекса',
100
+ 'Column (length)' => 'Колонка (длина)',
101
+ 'View has been dropped.' => 'Представление было удалено.',
102
+ 'View has been altered.' => 'Представление было изменено.',
103
+ 'View has been created.' => 'Представление было создано.',
104
+ 'Alter view' => 'Изменить представление',
105
+ 'Create view' => 'Создать представление',
106
+ 'Name' => 'Название',
107
+ 'Process list' => 'Список процессов',
108
+ '%d process(es) have been killed.' => array('Был завершён %d процесс.', 'Было завершено %d процесса.', 'Было завершено %d процессов.'),
109
+ 'Kill' => 'Завершить',
110
+ 'Parameter name' => 'Название параметра',
111
+ 'Database schema' => 'Схема базы данных',
112
+ 'Create procedure' => 'Создать процедуру',
113
+ 'Create function' => 'Создать функцию',
114
+ 'Routine has been dropped.' => 'Процедура была удалена.',
115
+ 'Routine has been altered.' => 'Процедура была изменена.',
116
+ 'Routine has been created.' => 'Процедура была создана.',
117
+ 'Alter function' => 'Изменить функцию',
118
+ 'Alter procedure' => 'Изменить процедуру',
119
+ 'Return type' => 'Возвращаемый тип',
120
+ 'Add trigger' => 'Добавить триггер',
121
+ 'Trigger has been dropped.' => 'Триггер был удалён.',
122
+ 'Trigger has been altered.' => 'Триггер был изменён.',
123
+ 'Trigger has been created.' => 'Триггер был создан.',
124
+ 'Alter trigger' => 'Изменить триггер',
125
+ 'Create trigger' => 'Создать триггер',
126
+ 'Time' => 'Время',
127
+ 'Event' => 'Событие',
128
+ '%s version: %s through PHP extension %s' => 'Версия %s: %s с PHP-расширением %s',
129
+ '%d row(s)' => array('%d строка', '%d строки', '%d строк'),
130
+ 'Remove' => 'Удалить',
131
+ 'Are you sure?' => 'Вы уверены?',
132
+ 'Privileges' => 'Полномочия',
133
+ 'Create user' => 'Создать пользователя',
134
+ 'User has been dropped.' => 'Пользователь был удалён.',
135
+ 'User has been altered.' => 'Пользователь был изменён.',
136
+ 'User has been created.' => 'Пользователь был создан.',
137
+ 'Hashed' => 'Хешировано',
138
+ 'Column' => 'Колонка',
139
+ 'Routine' => 'Процедура',
140
+ 'Grant' => 'Позволить',
141
+ 'Revoke' => 'Запретить',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Слишком большой объем POST-данных. Пошлите меньший объем данных или увеличьте параметр конфигурационной директивы %s.',
143
+ 'Logged as: %s' => 'Вы вошли как: %s',
144
+ 'Move up' => 'Переместить вверх',
145
+ 'Move down' => 'Переместить вниз',
146
+ 'Functions' => 'Функции',
147
+ 'Aggregation' => 'Агрегация',
148
+ 'Export' => 'Экспорт',
149
+ 'Output' => 'Выходные данные',
150
+ 'open' => 'открыть',
151
+ 'save' => 'сохранить',
152
+ 'Format' => 'Формат',
153
+ 'Tables' => 'Таблицы',
154
+ 'Data' => 'Данные',
155
+ 'Event has been dropped.' => 'Событие было удалено.',
156
+ 'Event has been altered.' => 'Событие было изменено.',
157
+ 'Event has been created.' => 'Событие было создано.',
158
+ 'Alter event' => 'Изменить событие',
159
+ 'Create event' => 'Создать событие',
160
+ 'At given time' => 'В данное время',
161
+ 'Every' => 'Каждые',
162
+ 'Events' => 'События',
163
+ 'Schedule' => 'Расписание',
164
+ 'Start' => 'Начало',
165
+ 'End' => 'Конец',
166
+ 'Status' => 'Состояние',
167
+ 'On completion preserve' => 'После завершения сохранить',
168
+ 'Tables and views' => 'Таблицы и представления',
169
+ 'Data Length' => 'Объём данных',
170
+ 'Index Length' => 'Объём индексов',
171
+ 'Data Free' => 'Свободное место',
172
+ 'Collation' => 'Режим сопоставления',
173
+ 'Analyze' => 'Анализировать',
174
+ 'Optimize' => 'Оптимизировать',
175
+ 'Check' => 'Проверить',
176
+ 'Repair' => 'Исправить',
177
+ 'Truncate' => 'Очистить',
178
+ 'Tables have been truncated.' => 'Таблицы были очищены.',
179
+ 'Rows' => 'Строк',
180
+ ',' => ' ',
181
+ '0123456789' => '0123456789',
182
+ 'Tables have been moved.' => 'Таблицы были перемещены.',
183
+ 'Move to other database' => 'Переместить в другую базу данных',
184
+ 'Move' => 'Переместить',
185
+ 'Engine' => 'Тип',
186
+ 'Save and continue edit' => 'Сохранить и продолжить редактирование',
187
+ 'original' => 'исходный',
188
+ '%d item(s) have been affected.' => array('Была изменена %d запись.', 'Были изменены %d записи.', 'Было изменено %d записей.'),
189
+ 'whole result' => 'весь результат',
190
+ 'Tables have been dropped.' => 'Таблицы были удалены.',
191
+ 'Clone' => 'Клонировать',
192
+ 'Partition by' => 'Разделить по',
193
+ 'Partitions' => 'Разделы',
194
+ 'Partition name' => 'Название раздела',
195
+ 'Values' => 'Параметры',
196
+ '%d row(s) have been imported.' => array('Импортирована %d строка.', 'Импортировано %d строки.', 'Импортировано %d строк.'),
197
+ 'Import' => 'Импорт',
198
+ 'Stop on error' => 'Остановить при ошибке',
199
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Достигнуто максимальное значение количества доступных полей. Увеличьте %s.',
200
+ 'anywhere' => 'в любом месте',
201
+ '%.3f s' => '%.3f s',
202
+ '$1-$3-$5' => '$5.$3.$1',
203
+ '[yyyy]-mm-dd' => 'дд.мм.[гггг]',
204
+ 'History' => 'История',
205
+ 'Variables' => 'Переменные',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Колонки должны иметь одинаковые типы данных, в результирующей колонке должен быть индекс, данные для импорта должны существовать.',
207
+ 'Relations' => 'Реляции',
208
+ 'Run file' => 'Запустить файл',
209
+ 'Clear' => 'Очистить',
210
+ 'Maximum allowed file size is %sB.' => 'Максимальный разрешённый размер файла - %sB.',
211
+ 'Numbers' => 'Число',
212
+ 'Date and time' => 'Дата и время',
213
+ 'Strings' => 'Строки',
214
+ 'Binary' => 'Двоичный тип',
215
+ 'Lists' => 'Списки',
216
+ 'Editor' => 'Редактор',
217
+ 'E-mail' => 'Электропочта',
218
+ 'From' => 'От',
219
+ 'Subject' => 'Кому',
220
+ 'Send' => 'Послать',
221
+ '%d e-mail(s) have been sent.' => array('Было отправлено %d письмо.', 'Было отправлено %d письма.', 'Было отправлено %d писем.'),
222
+ 'Webserver file %s' => 'Файл %s на вебсервере',
223
+ 'File does not exist.' => 'Такого файла не существует.',
224
+ '%d in total' => 'Всего %d',
225
+ 'Permanent login' => 'Оставаться в системе',
226
+ 'Databases have been dropped.' => 'Базы данных удалены.',
227
+ 'Search data in tables' => 'Поиск в таблицах',
228
+ 'Schema' => 'Схема',
229
+ 'Alter schema' => 'Изменить схему',
230
+ 'Create schema' => 'Новая схема',
231
+ 'Schema has been dropped.' => 'Схема удалена.',
232
+ 'Schema has been created.' => 'Создана новая схема.',
233
+ 'Schema has been altered.' => 'Схема изменена.',
234
+ 'Sequences' => '«Последовательности»',
235
+ 'Create sequence' => 'Создать «последовательность»',
236
+ 'Alter sequence' => 'Изменить «последовательность»',
237
+ 'Sequence has been dropped.' => '«Последовательность» удалена.',
238
+ 'Sequence has been created.' => 'Создана новая «последовательность».',
239
+ 'Sequence has been altered.' => '«Последовательность» изменена.',
240
+ 'User types' => 'Типы пользователей',
241
+ 'Create type' => 'Создать тип',
242
+ 'Alter type' => 'Изменить тип',
243
+ 'Type has been dropped.' => 'Тип удален.',
244
+ 'Type has been created.' => 'Создан новый тип.',
245
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+кликни по значению, чтобы его изменить.',
246
+ 'Use edit link to modify this value.' => 'Изменить это значение можно с помощью ссылки «изменить».',
247
+ 'last' => 'последняя',
248
+ 'From server' => 'С сервера',
249
+ 'System' => 'Движок',
250
+ 'Select data' => 'Выбрать',
251
+ 'Show structure' => 'Показать структуру',
252
+ 'empty' => 'пусто',
253
+ 'Network' => 'Сеть',
254
+ 'Geometry' => 'Геометрия',
255
+ 'File exists.' => 'Файл уже существует.',
256
+ 'Attachments' => 'Прикреплённые файлы',
257
+ '%d query(s) executed OK.' => array('%d запрос выполнен успешно.', '%d запроса выполнено успешно.', '%d запросов выполнено успешно.'),
258
+ 'Show only errors' => 'Только ошибки',
259
+ 'Refresh' => 'Обновить',
260
+ 'Invalid schema.' => 'Неправильная схема.',
261
+ 'Please use one of the extensions %s.' => 'Используйте одно из этих расширений %s.',
262
+ 'now' => 'сейчас',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'Таблицы скопированы.',
265
+ 'Copy' => 'Копировать',
266
+ 'Permanent link' => 'Постоянная ссылка',
267
+ 'Edit all' => 'Редактировать всё',
268
+ 'HH:MM:SS' => 'ЧЧ:ММ:СС',
269
+ );
adminer/adminer/adminer/lang/sk.inc.php ADDED
@@ -0,0 +1,269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'Prihlásiť sa',
4
+ 'Logout successful.' => 'Odhlásenie prebehlo v poriadku.',
5
+ 'Invalid credentials.' => 'Neplatné prihlasovacie údaje.',
6
+ 'Server' => 'Server',
7
+ 'Username' => 'Používateľ',
8
+ 'Password' => 'Heslo',
9
+ 'Select database' => 'Vybrať databázu',
10
+ 'Invalid database.' => 'Nesprávna databáza.',
11
+ 'Create new database' => 'Vytvoriť novú databázu',
12
+ 'Table has been dropped.' => 'Tabuľka bola odstránená.',
13
+ 'Table has been altered.' => 'Tabuľka bola zmenená.',
14
+ 'Table has been created.' => 'Tabuľka bola vytvorená.',
15
+ 'Alter table' => 'Zmeniť tabuľku',
16
+ 'Create table' => 'Vytvoriť tabuľku',
17
+ 'Table name' => 'Názov tabuľky',
18
+ 'engine' => 'úložisko',
19
+ 'collation' => 'porovnávanie',
20
+ 'Column name' => 'Názov stĺpca',
21
+ 'Type' => 'Typ',
22
+ 'Length' => 'Dĺžka',
23
+ 'Auto Increment' => 'Auto Increment',
24
+ 'Options' => 'Voľby',
25
+ 'Save' => 'Uložiť',
26
+ 'Drop' => 'Odstrániť',
27
+ 'Databases have been dropped.' => 'Databázy boli odstránené.',
28
+ 'Database has been dropped.' => 'Databáza bola odstránená.',
29
+ 'Database has been created.' => 'Databáza bola vytvorená.',
30
+ 'Database has been renamed.' => 'Databáza bola premenovaná.',
31
+ 'Database has been altered.' => 'Databáza bola zmenená.',
32
+ 'Alter database' => 'Zmeniť databázu',
33
+ 'Create database' => 'Vytvoriť databázu',
34
+ 'SQL command' => 'SQL príkaz',
35
+ 'Logout' => 'Odhlásiť',
36
+ 'database' => 'databáza',
37
+ 'Use' => 'Vybrať',
38
+ 'No tables.' => 'Žiadne tabuľky.',
39
+ 'select' => 'vypísať',
40
+ 'Item has been deleted.' => 'Položka bola vymazaná.',
41
+ 'Item has been updated.' => 'Položka bola aktualizovaná.',
42
+ 'Item%s has been inserted.' => 'Položka%s bola vložená.',
43
+ 'Edit' => 'Upraviť',
44
+ 'Insert' => 'Vložiť',
45
+ 'Save and insert next' => 'Uložiť a vložiť ďalší',
46
+ 'Delete' => 'Zmazať',
47
+ 'Database' => 'Databáza',
48
+ 'Routines' => 'Procedúry',
49
+ 'Indexes have been altered.' => 'Indexy boli zmenené.',
50
+ 'Indexes' => 'Indexy',
51
+ 'Alter indexes' => 'Zmeniť indexy',
52
+ 'Add next' => 'Pridať ďalší',
53
+ 'Language' => 'Jazyk',
54
+ 'Select' => 'Vypísať',
55
+ 'New item' => 'Nová položka',
56
+ 'Search' => 'Vyhľadať',
57
+ 'Sort' => 'Zotriediť',
58
+ 'descending' => 'zostupne',
59
+ 'Limit' => 'Limit',
60
+ 'No rows.' => 'Žiadne riadky.',
61
+ 'Action' => 'Akcia',
62
+ 'edit' => 'upraviť',
63
+ 'Page' => 'Stránka',
64
+ 'Query executed OK, %d row(s) affected.' => array('Príkaz prebehol v poriadku, bol zmenený %d záznam.', 'Príkaz prebehol v poriadku boli zmenené %d záznamy.', 'Príkaz prebehol v poriadku bolo zmenených %d záznamov.'),
65
+ 'Error in query' => 'Chyba v dotaze',
66
+ 'Execute' => 'Vykonať',
67
+ 'Table' => 'Tabuľka',
68
+ 'Foreign keys' => 'Cudzie kľúče',
69
+ 'Triggers' => 'Triggery',
70
+ 'View' => 'Pohľad',
71
+ 'Unable to select the table' => 'Tabuľku sa nepodarilo vypísať',
72
+ 'Invalid CSRF token. Send the form again.' => 'Neplatný token CSRF. Odošlite formulár znova.',
73
+ 'Comment' => 'Komentár',
74
+ 'Default values' => 'Východzie hodnoty',
75
+ '%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtov'),
76
+ 'No commands to execute.' => 'Žiadne príkazy na vykonanie.',
77
+ 'Unable to upload a file.' => 'Súbor sa nepodarilo nahrať.',
78
+ 'File upload' => 'Nahranie súboru',
79
+ 'File uploads are disabled.' => 'Nahrávánie súborov nie je povolené.',
80
+ 'Routine has been called, %d row(s) affected.' => array('Procedúra bola zavolaná, bol zmenený %d záznam.', 'Procedúra bola zavolaná, boli zmenené %d záznamy.', 'Procedúra bola zavolaná, bolo zmenených %d záznamov.'),
81
+ 'Call' => 'Zavolať',
82
+ 'No extension' => 'Žiadne rozšírenie',
83
+ 'None of the supported PHP extensions (%s) are available.' => 'Nie je dostupné žiadne z podporovaných rozšírení (%s).',
84
+ 'Session support must be enabled.' => 'Session premenné musia byť povolené.',
85
+ 'Session expired, please login again.' => 'Session vypršala, prihláste sa prosím znova.',
86
+ 'Text length' => 'Dĺžka textov',
87
+ 'Foreign key has been dropped.' => 'Cudzí kľúč bol odstránený.',
88
+ 'Foreign key has been altered.' => 'Cudzí kľúč bol zmenený.',
89
+ 'Foreign key has been created.' => 'Cudzí kľúč bol vytvorený.',
90
+ 'Foreign key' => 'Cudzí kľúč',
91
+ 'Target table' => 'Cieľová tabuľka',
92
+ 'Change' => 'Zmeniť',
93
+ 'Source' => 'Zdroj',
94
+ 'Target' => 'Cieľ',
95
+ 'Add column' => 'Pridať stĺpec',
96
+ 'Alter' => 'Zmeniť',
97
+ 'Add foreign key' => 'Pridať cudzí kľúč',
98
+ 'ON DELETE' => 'ON DELETE',
99
+ 'ON UPDATE' => 'ON UPDATE',
100
+ 'Index Type' => 'Typ indexu',
101
+ 'Column (length)' => 'Stĺpec (dĺžka)',
102
+ 'View has been dropped.' => 'Pohľad bol odstránený.',
103
+ 'View has been altered.' => 'Pohľad bol zmenený.',
104
+ 'View has been created.' => 'Pohľad bol vytvorený.',
105
+ 'Alter view' => 'Zmeniť pohľad',
106
+ 'Create view' => 'Vytvoriť pohľad',
107
+ 'Name' => 'Názov',
108
+ 'Process list' => 'Zoznam procesov',
109
+ '%d process(es) have been killed.' => array('Bol ukončený %d proces.', 'Boli ukončené %d procesy.', 'Bolo ukončených %d procesov.'),
110
+ 'Kill' => 'Ukončiť',
111
+ 'Parameter name' => 'Názov parametra',
112
+ 'Database schema' => 'Schéma databázy',
113
+ 'Create procedure' => 'Vytvoriť procedúru',
114
+ 'Create function' => 'Vytvoriť funkciu',
115
+ 'Routine has been dropped.' => 'Procedúra bola odstránená.',
116
+ 'Routine has been altered.' => 'Procedúra bola zmenená.',
117
+ 'Routine has been created.' => 'Procedúra bola vytvorená.',
118
+ 'Alter function' => 'Zmeniť funkciu',
119
+ 'Alter procedure' => 'Zmeniť procedúru',
120
+ 'Return type' => 'Návratový typ',
121
+ 'Add trigger' => 'Pridať trigger',
122
+ 'Trigger has been dropped.' => 'Trigger bol odstránený.',
123
+ 'Trigger has been altered.' => 'Trigger bol zmenený.',
124
+ 'Trigger has been created.' => 'Trigger bol vytvorený.',
125
+ 'Alter trigger' => 'Zmeniť trigger',
126
+ 'Create trigger' => 'Vytvoriť trigger',
127
+ 'Time' => 'Čas',
128
+ 'Event' => 'Udalosť',
129
+ '%s version: %s through PHP extension %s' => 'Verzia %s: %s cez PHP rozšírenie %s',
130
+ '%d row(s)' => array('%d riadok', '%d riadky', '%d riadkov'),
131
+ 'Remove' => 'Odobrať',
132
+ 'Are you sure?' => 'Naozaj?',
133
+ 'Privileges' => 'Oprávnenia',
134
+ 'Create user' => 'Vytvoriť používateľa',
135
+ 'User has been dropped.' => 'Používateľ bol odstránený.',
136
+ 'User has been altered.' => 'Používateľ bol zmenený.',
137
+ 'User has been created.' => 'Používateľ bol vytvorený.',
138
+ 'Hashed' => 'Zahašované',
139
+ 'Column' => 'Stĺpec',
140
+ 'Routine' => 'Procedúra',
141
+ 'Grant' => 'Povoliť',
142
+ 'Revoke' => 'Zakázať',
143
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Príliš veľké POST dáta. Zmenšite dáta alebo zvýšte hodnotu konfiguračej direktívy %s.',
144
+ 'Logged as: %s' => 'Prihlásený ako: %s',
145
+ 'Move up' => 'Presunúť hore',
146
+ 'Move down' => 'Presunúť dolu',
147
+ 'Functions' => 'Funkcie',
148
+ 'Aggregation' => 'Agregácia',
149
+ 'Export' => 'Export',
150
+ 'Output' => 'Výstup',
151
+ 'open' => 'otvoriť',
152
+ 'save' => 'uložiť',
153
+ 'Format' => 'Formát',
154
+ 'Tables' => 'Tabuľky',
155
+ 'Data' => 'Dáta',
156
+ 'Event has been dropped.' => 'Udalosť bola odstránená.',
157
+ 'Event has been altered.' => 'Udalosť bola zmenená.',
158
+ 'Event has been created.' => 'Udalosť bola vytvorená.',
159
+ 'Alter event' => 'Upraviť udalosť',
160
+ 'Create event' => 'Vytvoriť udalosť',
161
+ 'At given time' => 'V stanovený čas',
162
+ 'Every' => 'Každých',
163
+ 'Events' => 'Udalosti',
164
+ 'Schedule' => 'Plán',
165
+ 'Start' => 'Začiatok',
166
+ 'End' => 'Koniec',
167
+ 'Status' => 'Stav',
168
+ 'On completion preserve' => 'Po dokončení zachovat',
169
+ 'Save and continue edit' => 'Uložiť a pokračovať v úpravách',
170
+ 'original' => 'originál',
171
+ 'Tables have been truncated.' => 'Tabuľka bola vyprázdnená.',
172
+ 'Tables have been moved.' => 'Tabuľka bola presunutá.',
173
+ 'Tables have been dropped.' => 'Tabuľka bola odstránená.',
174
+ 'Tables and views' => 'Tabuľky a pohľady',
175
+ 'Engine' => 'Typ',
176
+ 'Collation' => 'Porovnávanie',
177
+ 'Data Length' => 'Veľkosť dát',
178
+ 'Index Length' => 'Veľkosť indexu',
179
+ 'Data Free' => 'Voľné miesto',
180
+ 'Rows' => 'Riadky',
181
+ ',' => ' ',
182
+ '0123456789' => '0123456789',
183
+ 'Analyze' => 'Analyzovať',
184
+ 'Optimize' => 'Optimalizovať',
185
+ 'Check' => 'Skontrolovať',
186
+ 'Repair' => 'Opraviť',
187
+ 'Truncate' => 'Vyprázdniť',
188
+ 'Move to other database' => 'Presunúť do inej databázy',
189
+ 'Move' => 'Presunúť',
190
+ '%d item(s) have been affected.' => '%d položiek bolo ovplyvnených.',
191
+ 'whole result' => 'celý výsledok',
192
+ 'Clone' => 'Klonovať',
193
+ 'Partition by' => 'Rozdeliť podľa',
194
+ 'Partitions' => 'Oddiely',
195
+ 'Partition name' => 'Názov oddielu',
196
+ 'Values' => 'Hodnoty',
197
+ '%d row(s) have been imported.' => array('Bol importovaný %d záznam.', 'Boli importované %d záznamy.', 'Bolo importovaných %d záznamov.'),
198
+ 'Import' => 'Import',
199
+ 'Stop on error' => 'Zastaviť pri chybe',
200
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Bol prekročený maximálny počet povolených polí. Zvýšte prosím %s.',
201
+ 'anywhere' => 'kdekoľvek',
202
+ '%.3f s' => '%.3f s',
203
+ '$1-$3-$5' => '$6.$4.$1',
204
+ '[yyyy]-mm-dd' => 'd.m.[rrrr]',
205
+ 'History' => 'História',
206
+ 'Variables' => 'Premenné',
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.' => 'Zdrojové a cieľové stĺpce musia mať rovnaký datový typ, nad cieľovými stĺpcami musí byť definovaný index a odkazované dáta musia existovať.',
208
+ 'E-mail' => 'E-mail',
209
+ 'From' => 'Odosielateľ',
210
+ 'Subject' => 'Predmet',
211
+ 'Send' => 'Odoslať',
212
+ '%d e-mail(s) have been sent.' => array('Bol odoslaný %d e-mail.', 'Boli odoslané %d e-maily.', 'Bolo odoslaných %d e-mailov.'),
213
+ 'Run file' => 'Spustiť súbor',
214
+ 'Numbers' => 'Čísla',
215
+ 'Date and time' => 'Dátum a čas',
216
+ 'Strings' => 'Reťazce',
217
+ 'Binary' => 'Binárne',
218
+ 'Lists' => 'Zoznamy',
219
+ 'Relations' => 'Vzťahy',
220
+ 'Maximum allowed file size is %sB.' => 'Maximálna povolená veľkosť súboru je %sB.',
221
+ 'Clear' => 'Vyčistiť',
222
+ 'Editor' => 'Editor',
223
+ 'Webserver file %s' => 'Súbor %s na webovom serveri',
224
+ 'File does not exist.' => 'Súbor neexistuje.',
225
+ 'Permanent login' => 'Trvalé prihlásenie',
226
+ '%d in total' => '%d celkom',
227
+ 'Search data in tables' => 'Vyhľadať dáta v tabuľkách',
228
+ 'Alter schema' => 'Pozmeniť schému',
229
+ 'Create schema' => 'Vytvoriť schému',
230
+ 'Schema has been dropped.' => 'Schéma bola odstránená.',
231
+ 'Schema has been created.' => 'Schéma bola vytvorená.',
232
+ 'Schema has been altered.' => 'Schéma bola zmenená.',
233
+ 'Schema' => 'Schéma',
234
+ 'Sequences' => 'Sekvencia',
235
+ 'Create sequence' => 'Vytvoriť sekvenciu',
236
+ 'Sequence has been dropped.' => 'Sekvencia bola odstránená.',
237
+ 'Sequence has been created.' => 'Sekvencia bola vytvorená.',
238
+ 'Sequence has been altered.' => 'Sekvencia bola zmenená.',
239
+ 'Alter sequence' => 'Pozmeniť sekvenciu',
240
+ 'User types' => 'Užívateľské typy',
241
+ 'Create type' => 'Vytvoriť typ',
242
+ 'Type has been dropped.' => 'Typ bol odstránený.',
243
+ 'Type has been created.' => 'Typ bol vytvorený.',
244
+ 'Alter type' => 'Pozmeniť typ',
245
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+kliknite na políčko, ktoré chcete zmeniť.',
246
+ 'Use edit link to modify this value.' => 'Pre zmenu tejto hodnoty použite odkaz upraviť.',
247
+ 'last' => 'posledný',
248
+ 'From server' => 'Zo serveru',
249
+ 'System' => 'Systém',
250
+ 'Show structure' => 'Zobraziť štruktúru',
251
+ 'Select data' => 'Vypísať dáta',
252
+ 'empty' => 'prázdne',
253
+ 'Network' => 'Sieť',
254
+ 'Geometry' => 'Geometria',
255
+ 'File exists.' => 'Súbor existuje.',
256
+ 'Attachments' => 'Prílohy',
257
+ '%d query(s) executed OK.' => array('Bol vykonaný %d dotaz.', 'Boli vykonané %d dotazy.', 'Bolo vykonaných %d dotazov.'),
258
+ 'Show only errors' => 'Zobraziť iba chyby',
259
+ 'Refresh' => 'Obnoviť',
260
+ 'Invalid schema.' => 'Neplatné schéma.',
261
+ 'Please use one of the extensions %s.' => 'Prosím vyberte jednu z koncoviek %s.',
262
+ 'now' => 'teraz',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'Tabuľky boli skopírované.',
265
+ 'Copy' => 'Kopírovať',
266
+ 'Permanent link' => 'Permanentný odkaz',
267
+ 'Edit all' => 'Upraviť všetko',
268
+ 'HH:MM:SS' => 'HH:MM:SS',
269
+ );
adminer/adminer/adminer/lang/sl.inc.php ADDED
@@ -0,0 +1,308 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Sistem',
5
+ 'Server' => 'Strežnik',
6
+ 'Username' => 'Uporabniško ime',
7
+ 'Password' => 'Geslo',
8
+ 'Permanent login' => 'Trajna prijava',
9
+ 'Login' => 'Prijavi se',
10
+ 'Logout' => 'Odjavi se',
11
+ 'Logged as: %s' => 'Prijavljen kot: %s',
12
+ 'Logout successful.' => 'Prijava uspešna.',
13
+ 'Invalid credentials.' => 'Neveljavne pravice.',
14
+ 'Language' => 'Jezik',
15
+ 'Invalid CSRF token. Send the form again.' => 'Neveljaven token CSRF. Pošljite formular še enkrat.',
16
+ 'No extension' => 'Brez dodatkov',
17
+ 'None of the supported PHP extensions (%s) are available.' => 'Noben od podprtih dodatkov za PHP (%s) ni na voljo.',
18
+ 'Session support must be enabled.' => 'Podpora za seje mora biti omogočena.',
19
+ 'Session expired, please login again.' => 'Seja je potekla. Prosimo, ponovno se prijavite.',
20
+ '%s version: %s through PHP extension %s' => 'Verzija %s: %s preko dodatka za PHP %s',
21
+ 'Refresh' => 'Osveži',
22
+
23
+ // text direction
24
+ 'ltr' => 'ltr',
25
+
26
+ 'Privileges' => 'Pravice',
27
+ 'Create user' => 'Ustvari uporabnika',
28
+ 'User has been dropped.' => 'Uporabnik je odstranjen.',
29
+ 'User has been altered.' => 'Uporabnik je spremenjen.',
30
+ 'User has been created.' => 'Uporabnik je ustvarjen.',
31
+ 'Hashed' => 'Zakodirano',
32
+ 'Column' => 'Stolpec',
33
+ 'Routine' => 'Postopek',
34
+ 'Grant' => 'Dovoli',
35
+ 'Revoke' => 'Odvzemi',
36
+
37
+ 'Process list' => 'Seznam procesov',
38
+ '%d process(es) have been killed.' => array('Končan je %d proces.', 'Končana sta %d procesa.', 'Končani so %d procesi.', 'Končanih je %d procesov.'),
39
+ 'Kill' => 'Končaj',
40
+
41
+ 'Variables' => 'Spremenljivke',
42
+ 'Status' => 'Stanje',
43
+
44
+ 'SQL command' => 'Ukaz SQL',
45
+ '%d query(s) executed OK.' => array('Uspešno se je končala %d poizvedba.', 'Uspešno sta se končali %d poizvedbi.', 'Uspešno so se končale %d poizvedbe.', 'Uspešno se je končalo %d poizvedb.'),
46
+ 'Query executed OK, %d row(s) affected.' => array('Poizvedba se je uspešno izvedla, spremenjena je %d vrstica.', 'Poizvedba se je uspešno izvedla, spremenjeni sta %d vrstici.', 'Poizvedba se je uspešno izvedla, spremenjene so %d vrstice.', 'Poizvedba se je uspešno izvedla, spremenjenih je %d vrstic.'),
47
+ 'No commands to execute.' => 'Ni ukazov za izvedbo.',
48
+ 'Error in query' => 'Napaka v poizvedbi',
49
+ 'Execute' => 'Izvedi',
50
+ 'Stop on error' => 'Ustavi ob napaki',
51
+ 'Show only errors' => 'Pokaži samo napake',
52
+ // sprintf() format for time of the command
53
+ '%.3f s' => '%.3f s',
54
+ 'History' => 'Zgodovina',
55
+ 'Clear' => 'Počisti',
56
+
57
+ 'File upload' => 'Naloži datoteko',
58
+ 'From server' => 'z strežnika',
59
+ 'Webserver file %s' => 'Datoteka na spletnem strežniku %s',
60
+ 'Run file' => 'Zaženi datoteko',
61
+ 'File does not exist.' => 'Datoteka ne obstaja.',
62
+ 'File uploads are disabled.' => 'Nalaganje datotek je onemogočeno.',
63
+ 'Unable to upload a file.' => 'Ne morem naložiti datoteke.',
64
+ 'Maximum allowed file size is %sB.' => 'Največja velikost datoteke je %sB.',
65
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Preveliko podatkov za POST. Zmanjšajte število podatkov ali povečajte nastavitev za %s.',
66
+
67
+ 'Export' => 'Izvozi',
68
+ 'Output' => 'Izhod rezultata',
69
+ 'open' => 'odpri',
70
+ 'save' => 'shrani',
71
+ 'Format' => 'Format',
72
+ 'Data' => 'Podatki',
73
+
74
+ 'Database' => 'Baza',
75
+ 'database' => 'baza',
76
+ 'Use' => 'Uporabi',
77
+ 'Select database' => 'Izberi bazo',
78
+ 'Invalid database.' => 'Neveljavna baza.',
79
+ 'Create new database' => 'Ustvari novo bazo',
80
+ 'Database has been dropped.' => 'Baza je zavržena.',
81
+ 'Databases have been dropped.' => 'Baze so zavržene.',
82
+ 'Database has been created.' => 'Baza je ustvarjena.',
83
+ 'Database has been renamed.' => 'Baza je preimenovana.',
84
+ 'Database has been altered.' => 'Baza je spremenjena.',
85
+ 'Alter database' => 'Spremeni bazo',
86
+ 'Create database' => 'Ustvari bazo',
87
+ 'Database schema' => 'Shema baze',
88
+
89
+ // thousands separator - must contain single byte
90
+ ',' => ' ',
91
+ '0123456789' => '0123456789',
92
+ 'Engine' => 'Pogon',
93
+ 'Collation' => 'Zbiranje',
94
+ 'Data Length' => 'Velikost podatkov',
95
+ 'Index Length' => 'Velikost indeksa',
96
+ 'Data Free' => 'Podatkov prosto ',
97
+ 'Rows' => 'Vrstic',
98
+ '%d in total' => 'Skupaj %d',
99
+ 'Analyze' => 'Analiziraj',
100
+ 'Optimize' => 'Optimiziraj',
101
+ 'Check' => 'Preveri',
102
+ 'Repair' => 'Popravi',
103
+ 'Truncate' => 'Skrajšaj',
104
+ 'Tables have been truncated.' => 'Tabele so skrajšane.',
105
+ 'Move to other database' => 'Premakni v drugo bazo',
106
+ 'Move' => 'Premakni',
107
+ 'Tables have been moved.' => 'Tabele so premaknjene.',
108
+ 'Copy' => 'Kopiraj',
109
+ 'Tables have been copied.' => 'Tabele so kopirane.',
110
+
111
+ 'Routines' => 'Postopki',
112
+ 'Routine has been called, %d row(s) affected.' => array('Klican je bil postopek, spremenjena je %d vrstica.', 'Klican je bil postopek, spremenjeni sta %d vrstici.', 'Klican je bil postopek, spremenjene so %d vrstice.', 'Klican je bil postopek, spremenjenih je %d vrstic.'),
113
+ 'Call' => 'Pokliči',
114
+ 'Parameter name' => 'Ime parametra',
115
+ 'Create procedure' => 'Ustvari postopek',
116
+ 'Create function' => 'Ustvari funkcijo',
117
+ 'Routine has been dropped.' => 'Postopek je zavržen.',
118
+ 'Routine has been altered.' => 'Postopek je spremenjen.',
119
+ 'Routine has been created.' => 'Postopek je ustvarjen.',
120
+ 'Alter function' => 'Spremeni funkcijo',
121
+ 'Alter procedure' => 'Spremeni postopek',
122
+ 'Return type' => 'Vračalni tip',
123
+
124
+ 'Events' => 'Dogodki',
125
+ 'Event has been dropped.' => 'Dogodek je zavržen.',
126
+ 'Event has been altered.' => 'Dogodek je spremenjen.',
127
+ 'Event has been created.' => 'Dogodek je ustvarjen.',
128
+ 'Alter event' => 'Spremeni dogodek',
129
+ 'Create event' => 'Ustvari dogodek',
130
+ 'At given time' => 'v danem času',
131
+ 'Every' => 'vsake',
132
+ 'Schedule' => 'Urnik',
133
+ 'Start' => 'Začetek',
134
+ 'End' => 'Konec',
135
+ 'On completion preserve' => 'Po zaključku ohrani',
136
+
137
+ 'Tables' => 'Tabele',
138
+ 'Tables and views' => 'Tabele in pogledi',
139
+ 'Table' => 'Tabela',
140
+ 'No tables.' => 'Ni tabel.',
141
+ 'Alter table' => 'Spremeni tabelo',
142
+ 'Create table' => 'Ustvari tabelo',
143
+ 'Table has been dropped.' => 'Tabela je zavržena.',
144
+ 'Tables have been dropped.' => 'Tabele so zavržene.',
145
+ 'Table has been altered.' => 'Tabela je spremenjena.',
146
+ 'Table has been created.' => 'Tabela je ustvarjena.',
147
+ 'Table name' => 'Ime tabele',
148
+ 'Show structure' => 'Pokaži zgradbo',
149
+ 'engine' => 'pogon',
150
+ 'collation' => 'zbiranje',
151
+ 'Column name' => 'Ime stolpca',
152
+ 'Type' => 'Tip',
153
+ 'Length' => 'Dolžina',
154
+ 'Auto Increment' => 'Samodejno povečevanje',
155
+ 'Options' => 'Možnosti',
156
+ 'Comment' => 'Komentar',
157
+ 'Default values' => 'Privzete vrednosti',
158
+ 'Drop' => 'Zavrzi',
159
+ 'Are you sure?' => 'Ste prepričani?',
160
+ 'Move up' => 'Premakni gor',
161
+ 'Move down' => 'Premakni dol',
162
+ 'Remove' => 'Odstrani',
163
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Največje število dovoljenih polje je preseženo. Prosimo, povečajte %s.',
164
+
165
+ 'Partition by' => 'Porazdeli po',
166
+ 'Partitions' => 'Porazdelitve',
167
+ 'Partition name' => 'Ime porazdelitve',
168
+ 'Values' => 'Vrednosti',
169
+
170
+ 'View' => 'Pogledi',
171
+ 'View has been dropped.' => 'Pogled je zavržen.',
172
+ 'View has been altered.' => 'Pogled je spremenjen.',
173
+ 'View has been created.' => 'Pogled je ustvarjen.',
174
+ 'Alter view' => 'Spremeni pogled',
175
+ 'Create view' => 'Ustvari pogled',
176
+
177
+ 'Indexes' => 'Indeksi',
178
+ 'Indexes have been altered.' => 'Indeksi so spremenjeni.',
179
+ 'Alter indexes' => 'Spremeni indekse',
180
+ 'Add next' => 'Dodaj naslednjega',
181
+ 'Index Type' => 'Tip indeksa',
182
+ 'Column (length)' => 'Stolpec (dolžina)',
183
+
184
+ 'Foreign keys' => 'Tuji ključi',
185
+ 'Foreign key' => 'Tuj ključ',
186
+ 'Foreign key has been dropped.' => 'Tuj ključ je zavržen.',
187
+ 'Foreign key has been altered.' => 'Tuj ključ je spremenjen.',
188
+ 'Foreign key has been created.' => 'Tuj ključ je ustvarjen.',
189
+ 'Target table' => 'Ciljna tabela',
190
+ 'Change' => 'Spremeni',
191
+ 'Source' => 'Izvor',
192
+ 'Target' => 'Cilj',
193
+ 'Add column' => 'Dodaj stolpec',
194
+ 'Alter' => 'Spremeni',
195
+ 'Add foreign key' => 'Dodaj tuj ključ',
196
+ 'ON DELETE' => 'pri brisanju',
197
+ 'ON UPDATE' => 'pri posodabljanju',
198
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Izvorni in ciljni stolpec mora imeti isti podatkovni tip. Obstajati mora indeks na ciljnih stolpcih in obstajati morajo referenčni podatki.',
199
+
200
+ 'Triggers' => 'Sprožilniki',
201
+ 'Add trigger' => 'Dodaj sprožilnik',
202
+ 'Trigger has been dropped.' => 'Sprožilnik je odstranjen.',
203
+ 'Trigger has been altered.' => 'Sprožilnik je spremenjen.',
204
+ 'Trigger has been created.' => 'Sprožilnik je ustvarjen.',
205
+ 'Alter trigger' => 'Spremeni sprožilnik',
206
+ 'Create trigger' => 'Ustvari sprožilnik',
207
+ 'Time' => 'Čas',
208
+ 'Event' => 'Dogodek',
209
+ 'Name' => 'Naziv',
210
+
211
+ 'select' => 'izberi',
212
+ 'Select' => 'Izberi',
213
+ 'Select data' => 'Izberi podatke',
214
+ 'Functions' => 'Funkcije',
215
+ 'Aggregation' => 'Združitev',
216
+ 'Search' => 'Išči',
217
+ 'anywhere' => 'kjerkoli',
218
+ 'Search data in tables' => 'Išče podatke po tabelah',
219
+ 'Sort' => 'Sortiraj',
220
+ 'descending' => 'padajoče',
221
+ 'Limit' => 'Limita',
222
+ 'Text length' => 'Dolžina teksta',
223
+ 'Action' => 'Dejanje',
224
+ 'Unable to select the table' => 'Ne morem izbrati tabele',
225
+ 'No rows.' => 'Ni vrstic.',
226
+ '%d row(s)' => array('%d vrstica', '%d vrstici', '%d vrstice', '%d vrstic'),
227
+ 'Page' => 'Stran',
228
+ 'last' => 'Zadnja',
229
+ 'whole result' => 'cel razultat',
230
+ '%d byte(s)' => array('%d bajt', '%d bajta', '%d bajti', '%d bajtov'),
231
+
232
+ 'Import' => 'Uvozi',
233
+ '%d row(s) have been imported.' => array('Uvožena je %d vrstica.', 'Uvoženi sta %d vrstici.', 'Uvožene so %d vrstice.', 'Uvoženih je %d vrstic.'),
234
+
235
+ // in-place editing in select
236
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+klik na vrednost za urejanje.',
237
+ 'Use edit link to modify this value.' => 'Uporabite urejanje povezave za spreminjanje te vrednosti.',
238
+
239
+ // %s can contain auto-increment value
240
+ 'Item%s has been inserted.' => 'Predmet%s je vstavljen.',
241
+ 'Item has been deleted.' => 'Predmet je izbrisan.',
242
+ 'Item has been updated.' => 'Predmet je posodobljen.',
243
+ '%d item(s) have been affected.' => array('Spremenjen je %d predmet.', 'Spremenjena sta %d predmeta.', 'Spremenjeni so %d predmeti.', 'Spremenjenih je %d predmetov.'),
244
+ 'New item' => 'Nov predmet',
245
+ 'original' => 'original',
246
+ // label for value '' in enum data type
247
+ 'empty' => 'prazno',
248
+ 'edit' => 'uredi',
249
+ 'Edit' => 'Uredi',
250
+ 'Insert' => 'Vstavi',
251
+ 'Save' => 'Shrani',
252
+ 'Save and continue edit' => 'Shrani in nadaljuj z urejanjem',
253
+ 'Save and insert next' => 'Shrani in vstavi tekst',
254
+ 'Clone' => 'Kloniraj',
255
+ 'Delete' => 'Izbriši',
256
+
257
+ 'E-mail' => 'E-mail',
258
+ 'From' => 'Od',
259
+ 'Subject' => 'Zadeva',
260
+ 'Attachments' => 'Priponke',
261
+ 'Send' => 'Pošlji',
262
+ '%d e-mail(s) have been sent.' => array('Poslan je %d e-mail.', 'Poslana sta %d e-maila.', 'Poslani so %d e-maili.', 'Poslanih je %d e-mailov.'),
263
+
264
+ // data type descriptions
265
+ 'Numbers' => 'Števila',
266
+ 'Date and time' => 'Datum in čas',
267
+ 'Strings' => 'Nizi',
268
+ 'Binary' => 'Binarni',
269
+ 'Lists' => 'Seznami',
270
+ 'Network' => 'Mrežni',
271
+ 'Geometry' => 'Geometrčni',
272
+ 'Relations' => 'Relacijski',
273
+
274
+ 'Editor' => 'Urejevalnik',
275
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
276
+ '$1-$3-$5' => '$6.$4.$1',
277
+ // hint for date format - use language equivalents for day, month and year shortcuts
278
+ '[yyyy]-mm-dd' => 'd.m.[rrrr]',
279
+ 'now' => 'zdaj',
280
+
281
+ // general SQLite error in create, drop or rename database
282
+ 'File exists.' => 'Datoteka obstaja.',
283
+ 'Please use one of the extensions %s.' => 'Prosim, uporabite enega od dodatkov %s.',
284
+
285
+ // PostgreSQL and MS SQL schema support
286
+ 'Alter schema' => 'Spremeni shemo',
287
+ 'Create schema' => 'Ustvari shemo',
288
+ 'Schema has been dropped.' => 'Shema je zavržena.',
289
+ 'Schema has been created.' => 'Shema je ustvarjena.',
290
+ 'Schema has been altered.' => 'Shema je spremenjena.',
291
+ 'Schema' => 'Shema',
292
+ 'Invalid schema.' => 'Neveljavna shema.',
293
+
294
+ // PostgreSQL sequences support
295
+ 'Sequences' => 'Sekvence',
296
+ 'Create sequence' => 'Ustvari sekvenco',
297
+ 'Sequence has been dropped.' => 'Sekvenca je zavržena.',
298
+ 'Sequence has been created.' => 'Sekvence je ustvarjena.',
299
+ 'Sequence has been altered.' => 'Sekvence je spremenjena.',
300
+ 'Alter sequence' => 'Spremni sekvenco',
301
+
302
+ // PostgreSQL user types support
303
+ 'User types' => 'Uporabniški tipi',
304
+ 'Create type' => 'Ustvari tip',
305
+ 'Type has been dropped.' => 'Tip je zavržen.',
306
+ 'Type has been created.' => 'Tip je ustvarjen.',
307
+ 'Alter type' => 'Spremeni tip',
308
+ );
adminer/adminer/adminer/lang/sr.inc.php ADDED
@@ -0,0 +1,320 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Систем',
5
+ 'Server' => 'Сервер',
6
+ 'Username' => 'Корисничко име',
7
+ 'Password' => 'Лозинка',
8
+ 'Permanent login' => 'Трајна пријава',
9
+ 'Login' => 'Пријава',
10
+ 'Logout' => 'Одјава',
11
+ 'Logged as: %s' => 'Пријави се као: %s',
12
+ 'Logout successful.' => 'Успешна одјава.',
13
+ 'Invalid credentials.' => 'Неважеће дозволе.',
14
+ 'Language' => 'Језик',
15
+ 'Invalid CSRF token. Send the form again.' => 'Неважећи CSRF код. Проследите поново форму.',
16
+ 'No extension' => 'Без додатака',
17
+ 'None of the supported PHP extensions (%s) are available.' => 'Ниједан од подржаних PHP додатака није доступан.',
18
+ 'Session support must be enabled.' => 'Морате омогућити подршку за сесије.',
19
+ 'Session expired, please login again.' => 'Ваша сесија је истекла, пријавите се поново.',
20
+ '%s version: %s through PHP extension %s' => '%s верзија: %s помоћу PHP додатка је %s',
21
+ 'Refresh' => 'Освежи',
22
+
23
+ // text direction - 'ltr' or 'rtl'
24
+ 'ltr' => 'ltr',
25
+
26
+ 'Privileges' => 'Дозволе',
27
+ 'Create user' => 'Направи корисника',
28
+ 'User has been dropped.' => 'Корисник је избрисан.',
29
+ 'User has been altered.' => 'Корисник је измењен.',
30
+ 'User has been created.' => 'корисник је креиран.',
31
+ 'Hashed' => 'Хеширано',
32
+ 'Column' => 'Колона',
33
+ 'Routine' => 'Рутина',
34
+ 'Grant' => 'Дозволи',
35
+ 'Revoke' => 'Опозови',
36
+
37
+ 'Process list' => 'Списак процеса',
38
+ '%d process(es) have been killed.' => array('%d процес је убијен.', '%d процеса су убијена.', '%d процеса је убијено.'),
39
+ 'Kill' => 'Убиј',
40
+
41
+ 'Variables' => 'Променљиве',
42
+ 'Status' => 'Статус',
43
+
44
+ 'SQL command' => 'SQL команда',
45
+ '%d query(s) executed OK.' => array('%d упит је успешно извршен.', '%d упита су успешно извршена.', '%d упита је успешно извршено.'),
46
+ 'Query executed OK, %d row(s) affected.' => array('Упит је успешно извршен, %d ред је погођен.', 'Упит је успешно извршен, %d реда су погођена.', 'Упит је успешно извршен, %d редова је погођено.'),
47
+ 'No commands to execute.' => 'Без команди за извршавање.',
48
+ 'Error in query' => 'Грешка у упиту',
49
+ 'Execute' => 'Изврши',
50
+ 'Stop on error' => 'Заустави приликом грешке',
51
+ 'Show only errors' => 'Приказуј само грешке',
52
+ // sprintf() format for time of the command
53
+ '%.3f s' => '%.3f s',
54
+ 'History' => 'Историјат',
55
+ 'Clear' => 'Очисти',
56
+ 'Edit all' => 'Измени све',
57
+
58
+ 'File upload' => 'Слање датотека',
59
+ 'From server' => 'Са сервера',
60
+ 'Webserver file %s' => 'Датотека %s са веб сервера',
61
+ 'Run file' => 'Покрени датотеку',
62
+ 'File does not exist.' => 'Датотека не постоји.',
63
+ 'File uploads are disabled.' => 'Онемогућено је слање датотека.',
64
+ 'Unable to upload a file.' => 'Слање датотеке није успело.',
65
+ 'Maximum allowed file size is %sB.' => 'Највећа дозвољена величина датотеке је %sB.',
66
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Превелики POST податак. Морате да смањите податак или повећајте вредност конфигурационе директиве %s.',
67
+
68
+ 'Export' => 'Извоз',
69
+ 'Output' => 'Испис',
70
+ 'open' => 'отвори',
71
+ 'save' => 'сачувај',
72
+ 'Format' => 'Формат',
73
+ 'Data' => 'Податци',
74
+
75
+ 'Database' => 'База података',
76
+ 'database' => 'база података',
77
+ 'Use' => 'Користи',
78
+ 'Select database' => 'Изаберите базу',
79
+ 'Invalid database.' => 'Неисправна база података.',
80
+ 'Create new database' => 'Направи нову базу података',
81
+ 'Database has been dropped.' => 'База података је избрисана.',
82
+ 'Databases have been dropped.' => 'Базњ података су избрисане.',
83
+ 'Database has been created.' => 'База података је креирана.',
84
+ 'Database has been renamed.' => 'База података је преименована.',
85
+ 'Database has been altered.' => 'База података је измењена.',
86
+ 'Alter database' => 'Уреди базу података',
87
+ 'Create database' => 'Формирај базу података',
88
+ 'Database schema' => 'Шема базе података',
89
+
90
+ // link to current database schema layout
91
+ 'Permanent link' => 'Трајна веза',
92
+
93
+ // thousands separator - must contain single byte
94
+ ',' => ',',
95
+ '0123456789' => '0123456789',
96
+ 'Engine' => 'Механизам',
97
+ 'Collation' => 'Сравњивање',
98
+ 'Data Length' => 'Дужина података',
99
+ 'Index Length' => 'Дужина индекса',
100
+ 'Data Free' => 'Слободно података',
101
+ 'Rows' => 'Редова',
102
+ '%d in total' => 'укупно %d',
103
+ 'Analyze' => 'Анализирај',
104
+ 'Optimize' => 'Оптимизуј',
105
+ 'Check' => 'Провери',
106
+ 'Repair' => 'Поправи',
107
+ 'Truncate' => 'Испразни',
108
+ 'Tables have been truncated.' => 'Табеле су испражњене.',
109
+ 'Move to other database' => 'Премести у другу базу података',
110
+ 'Move' => 'Премести',
111
+ 'Tables have been moved.' => 'Табеле су премешћене.',
112
+ 'Copy' => 'Умножи',
113
+ 'Tables have been copied.' => 'Табеле су умножене.',
114
+
115
+ 'Routines' => 'Рутине',
116
+ 'Routine has been called, %d row(s) affected.' => array('Позвана је рутина, %d ред је погођен.', 'Позвана је рутина, %d реда су погођена.', 'Позвана је рутина, %d редова је погођено.'),
117
+ 'Call' => 'Позови',
118
+ 'Parameter name' => 'Назив параметра',
119
+ 'Create procedure' => 'Формирај процедуру',
120
+ 'Create function' => 'Формирај функцију',
121
+ 'Routine has been dropped.' => 'Рутина је избрисана.',
122
+ 'Routine has been altered.' => 'Рутина је измењена.',
123
+ 'Routine has been created.' => 'Рутина је креирана.',
124
+ 'Alter function' => 'Уреди функцију',
125
+ 'Alter procedure' => 'Уреди процедуру',
126
+ 'Return type' => 'Повратни тип',
127
+
128
+ 'Events' => 'Догађаји',
129
+ 'Event has been dropped.' => 'Догађај је избрисан.',
130
+ 'Event has been altered.' => 'Догађај је измењен.',
131
+ 'Event has been created.' => 'Догађај је креиран.',
132
+ 'Alter event' => 'Уреди догађај',
133
+ 'Create event' => 'Направи догађај',
134
+ 'At given time' => 'У задато време',
135
+ 'Every' => 'Сваки',
136
+ 'Schedule' => 'Распоред',
137
+ 'Start' => 'Почетак',
138
+ 'End' => 'Крај',
139
+ 'On completion preserve' => 'Задржи по завршетку',
140
+
141
+ 'Tables' => 'Табеле',
142
+ 'Tables and views' => 'Табеле и погледи',
143
+ 'Table' => 'Табела',
144
+ 'No tables.' => 'Без табела.',
145
+ 'Alter table' => 'Уреди табелу',
146
+ 'Create table' => 'Направи табелу',
147
+ 'Table has been dropped.' => 'Табела је избрисана.',
148
+ 'Tables have been dropped.' => 'Табеле су избрисане.',
149
+ 'Tables have been optimized.' => 'Табеле су оптимизоване.',
150
+ 'Table has been altered.' => 'Табела је измењена.',
151
+ 'Table has been created.' => 'Табела је креирана.',
152
+ 'Table name' => 'Назив табеле',
153
+ 'Show structure' => 'Прикажи структуру',
154
+ 'engine' => 'механизам',
155
+ 'collation' => 'Сравњивање',
156
+ 'Column name' => 'Назив колоне',
157
+ 'Type' => 'Тип',
158
+ 'Length' => 'Дужина',
159
+ 'Auto Increment' => 'Ауто-прираштај',
160
+ 'Options' => 'Опције',
161
+ 'Comment' => 'Коментар',
162
+ 'Default values' => 'Подразумеване вредности',
163
+ 'Drop' => 'Избриши',
164
+ 'Are you sure?' => 'Да ли сте сигурни?',
165
+ 'Move up' => 'Помери на горе',
166
+ 'Move down' => 'Помери на доле',
167
+ 'Remove' => 'Уклони',
168
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Премашен је максимални број дозвољених поља. Молим увећајте %s.',
169
+
170
+ 'Partition by' => 'Подели по',
171
+ 'Partitions' => 'Поделе',
172
+ 'Partition name' => 'Име поделе',
173
+ 'Values' => 'Вредности',
174
+
175
+ 'View' => 'Поглед',
176
+ 'View has been dropped.' => 'Поглед је избрисан.',
177
+ 'View has been altered.' => 'Поглед је измењен.',
178
+ 'View has been created.' => 'Поглед је креиран.',
179
+ 'Alter view' => 'Уреди поглед',
180
+ 'Create view' => 'Направи поглед',
181
+
182
+ 'Indexes' => 'Индекси',
183
+ 'Indexes have been altered.' => 'Индекси су измењени.',
184
+ 'Alter indexes' => 'Уреди индексе',
185
+ 'Add next' => 'Додај следећи',
186
+ 'Index Type' => 'Тип индекса',
187
+ 'Column (length)' => 'Колона (дужина)',
188
+
189
+ 'Foreign keys' => 'Страни кључеви',
190
+ 'Foreign key' => 'Страни кључ',
191
+ 'Foreign key has been dropped.' => 'Страни кључ је избрисан.',
192
+ 'Foreign key has been altered.' => 'Страни кључ је измењен.',
193
+ 'Foreign key has been created.' => 'Страни кључ је креиран.',
194
+ 'Target table' => 'Циљна табела',
195
+ 'Change' => 'Измени',
196
+ 'Source' => 'Извор',
197
+ 'Target' => 'Циљ',
198
+ 'Add column' => 'Додај колону',
199
+ 'Alter' => 'Уреди',
200
+ 'Add foreign key' => 'Додај страни кључ',
201
+ 'ON DELETE' => 'ON DELETE (приликом брисања)',
202
+ 'ON UPDATE' => 'ON UPDATE (приликом освежавања)',
203
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Изворне и циљне колоне морају бити истог типа, циљна колона мора бити индексирана и изворна табела мора садржати податке из циљне.',
204
+
205
+ 'Triggers' => 'Окидачи',
206
+ 'Add trigger' => 'Додај окидач',
207
+ 'Trigger has been dropped.' => 'Окидач је избрисан.',
208
+ 'Trigger has been altered.' => 'Окидач је измењен.',
209
+ 'Trigger has been created.' => 'Окидач је креиран.',
210
+ 'Alter trigger' => 'Уреди окидач',
211
+ 'Create trigger' => 'Формирај окидач',
212
+ 'Time' => 'Време',
213
+ 'Event' => 'Догађај',
214
+ 'Name' => 'Име',
215
+
216
+ 'select' => 'изабери',
217
+ 'Select' => 'Изабери',
218
+ 'Select data' => 'Изабери податке',
219
+ 'Functions' => 'Функције',
220
+ 'Aggregation' => 'Сакупљање',
221
+ 'Search' => 'Претрага',
222
+ 'anywhere' => 'било где',
223
+ 'Search data in tables' => 'Претражи податке у табелама',
224
+ 'Sort' => 'Поређај',
225
+ 'descending' => 'опадајуће',
226
+ 'Limit' => 'Граница',
227
+ 'Text length' => 'Дужина текста',
228
+ 'Action' => 'Акција',
229
+ 'Full table scan' => 'Скренирање комплетне табеле',
230
+ 'Unable to select the table' => 'Не могу да изаберем табелу',
231
+ 'No rows.' => 'Без редова.',
232
+ '%d row(s)' => array('%d ред', '%d реда', '%d редова'),
233
+ 'Page' => 'Страна',
234
+ 'last' => 'последња',
235
+ 'Loading' => 'Учитавам',
236
+ 'Load more data' => 'Учитавам још података',
237
+ 'whole result' => 'цео резултат',
238
+ '%d byte(s)' => array('%d бајт', '%d бајта', '%d бајтова'),
239
+
240
+ 'Import' => 'Увоз',
241
+ '%d row(s) have been imported.' => array('%d ред је увежен.', '%d реда су увежена.', '%d редова је увежено.'),
242
+
243
+ // in-place editing in select
244
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+клик на вредност за измену.',
245
+ 'Use edit link to modify this value.' => 'Користи везу за измену ове вредности.',
246
+
247
+ // %s can contain auto-increment value
248
+ 'Item%s has been inserted.' => 'Ставка%s је додата.',
249
+ 'Item has been deleted.' => 'Ставка је избрисана.',
250
+ 'Item has been updated.' => 'Ставка је измењена.',
251
+ '%d item(s) have been affected.' => array('%d ставка је погођена.', '%d ставке су погођене.', '%d ставки је погођено.'),
252
+ 'New item' => 'Нова ставка',
253
+ 'original' => 'оригинал',
254
+ // label for value '' in enum data type
255
+ 'empty' => 'празно',
256
+ 'edit' => 'измени',
257
+ 'Edit' => 'Измени',
258
+ 'Insert' => 'Уметни',
259
+ 'Save' => 'Сачувај',
260
+ 'Save and continue edit' => 'Сачувај и настави уређење',
261
+ 'Save and insert next' => 'Сачувај и уметни следеће',
262
+ 'Clone' => 'Дуплирај',
263
+ 'Delete' => 'Избриши',
264
+
265
+ 'E-mail' => 'Ел. пошта',
266
+ 'From' => 'Од',
267
+ 'Subject' => 'Наслов',
268
+ 'Attachments' => 'Прилози',
269
+ 'Send' => 'Пошаљи',
270
+ '%d e-mail(s) have been sent.' => array('%d порука ел. поште је послата.', '%d поруке ел. поште су послате.', '%d порука ел. поште је послато.'),
271
+
272
+ // data type descriptions
273
+ 'Numbers' => 'Број',
274
+ 'Date and time' => 'Датум и време',
275
+ 'Strings' => 'Текст',
276
+ 'Binary' => 'Бинарно',
277
+ 'Lists' => 'Листе',
278
+ 'Network' => 'Мрежа',
279
+ 'Geometry' => 'Геометрија',
280
+ 'Relations' => 'Односи',
281
+
282
+ 'Editor' => 'Уређивач',
283
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
284
+ '$1-$3-$5' => '$5.$3.$1.',
285
+ // hint for date format - use language equivalents for day, month and year shortcuts
286
+ '[yyyy]-mm-dd' => 'dd.mm.[yyyy].',
287
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
288
+ 'HH:MM:SS' => 'HH:MM:SS',
289
+ 'now' => 'сад',
290
+ 'yes' => 'да',
291
+ 'no' => 'не',
292
+
293
+ // general SQLite error in create, drop or rename database
294
+ 'File exists.' => 'Датотека већ постоји.',
295
+ 'Please use one of the extensions %s.' => 'Молим користите један од наставака %s.',
296
+
297
+ // PostgreSQL and MS SQL schema support
298
+ 'Alter schema' => 'Уреди шему',
299
+ 'Create schema' => 'Формирај шему',
300
+ 'Schema has been dropped.' => 'Шема је избрисана.',
301
+ 'Schema has been created.' => 'Шема је креирана.',
302
+ 'Schema has been altered.' => 'Шема је измењена.',
303
+ 'Schema' => 'Шема',
304
+ 'Invalid schema.' => 'Шема није исправна.',
305
+
306
+ // PostgreSQL sequences support
307
+ 'Sequences' => 'Низови',
308
+ 'Create sequence' => 'Направи низ',
309
+ 'Sequence has been dropped.' => 'Низ је избрисан.',
310
+ 'Sequence has been created.' => 'Низ је формиран.',
311
+ 'Sequence has been altered.' => 'Низ је измењен.',
312
+ 'Alter sequence' => 'Уреди низ',
313
+
314
+ // PostgreSQL user types support
315
+ 'User types' => 'Кориснички типови',
316
+ 'Create type' => 'Дефиниши тип',
317
+ 'Type has been dropped.' => 'Тип је избрисан.',
318
+ 'Type has been created.' => 'тип је креиран.',
319
+ 'Alter type' => 'Уреди тип',
320
+ );
adminer/adminer/adminer/lang/ta.inc.php ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ 'Login' => 'நுழை',
4
+ 'Logout successful.' => 'வெற்றிக‌ர‌மாய் வெளியேறியாயிற்று.',
5
+ 'Invalid credentials.' => 'ச‌ரியான‌ விப‌ர‌ங்க‌ள் இல்லை.',
6
+ 'Server' => 'வ‌ழ‌ங்கி (Server)',
7
+ 'Username' => 'ப‌ய‌னாள‌ர் (User)',
8
+ 'Password' => 'க‌ட‌வுச்சொல்',
9
+ 'Select database' => 'த‌க‌வ‌ல்த‌ள‌த்தை தேர்வு செய்',
10
+ 'Invalid database.' => 'த‌க‌வ‌ல்த‌ள‌ம் ச‌ரியானதல்ல‌.',
11
+ 'Create new database' => 'புதிய‌ த‌க‌வ‌ல்த‌ள‌த்தை உருவாக்கு',
12
+ 'Table has been dropped.' => 'அட்ட‌வ‌ணை நீக்க‌ப்ப‌ட்ட‌து.',
13
+ 'Table has been altered.' => 'அட்ட‌வணை மாற்ற‌ப்ப‌ட்ட‌து.',
14
+ 'Table has been created.' => 'அட்ட‌வ‌ணை உருவாக்க‌ப்ப‌ட்ட‌து.',
15
+ 'Alter table' => 'அட்ட‌வ‌ணையை மாற்று',
16
+ 'Create table' => 'அட்ட‌வ‌ணையை உருவாக்கு',
17
+ 'Table name' => 'அட்ட‌வ‌ணைப் பெய‌ர்',
18
+ 'engine' => 'எஞ்சின்',
19
+ 'collation' => 'கொலேச‌ன்',
20
+ 'Column name' => 'நெடுவ‌ரிசையின் பெய‌ர்',
21
+ 'Type' => 'வ‌கை',
22
+ 'Length' => 'நீளம்',
23
+ 'Auto Increment' => 'ஏறுமான‌ம்',
24
+ 'Options' => 'வேண்டிய‌வ‌ற்றை ',
25
+ 'Save' => 'சேமி',
26
+ 'Drop' => 'நீக்கு',
27
+ 'Database has been dropped.' => 'த‌க‌வ‌ல்த‌ள‌ம் நீக்க‌ப்ப‌ட்ட‌து.',
28
+ 'Database has been created.' => 'த‌க‌வ‌ல்த‌ள‌ம் உருவாக்க‌ப்ப‌ட்ட‌து.',
29
+ 'Database has been renamed.' => 'த‌க‌வ‌ல்த‌ள‌ம் பெய‌ர் மாற்ற‌ப்ப‌ட்ட‌து.',
30
+ 'Database has been altered.' => 'த‌க‌வ‌ல்த‌ள‌ம் மாற்ற‌ப்ப‌ட்ட‌து.',
31
+ 'Alter database' => 'த‌க‌வ‌ல்த‌ள‌த்தை மாற்று',
32
+ 'Create database' => 'த‌க‌வ‌ல்த‌ள‌த்தை உருவாக்கு',
33
+ 'SQL command' => 'SQL க‌ட்ட‌ளை',
34
+ 'Logout' => 'வெளியேறு',
35
+ 'database' => 'த‌க‌வ‌ல்த‌ள‌ம்',
36
+ 'Use' => 'உப‌யோகி',
37
+ 'No tables.' => 'அட்ட‌வ‌ணை இல்லை.',
38
+ 'select' => 'தேர்வு செய்',
39
+ 'Item has been deleted.' => 'உருப்படி நீக்க‌ப்ப‌ட்ட‌து.',
40
+ 'Item has been updated.' => 'உருப்ப‌டி புதுப்பிக்க‌ப்ப‌ட்ட‌து.',
41
+ 'Edit' => 'தொகு',
42
+ 'Insert' => 'புகுத்து',
43
+ 'Save and insert next' => 'சேமித்த‌ப் பின் அடுத்த‌தை புகுத்து',
44
+ 'Delete' => 'நீக்கு',
45
+ 'Database' => 'த‌க‌வ‌ல்த‌ள‌ம்',
46
+ 'Routines' => 'ரொட்டீன் ',
47
+ 'Indexes have been altered.' => 'அக‌வ‌ரிசைக‌ள் (Indexes) மாற்ற‌ப்பட்ட‌து.',
48
+ 'Indexes' => 'அக‌வ‌ரிசைக‌ள் (Index) ',
49
+ 'Alter indexes' => 'அக‌வ‌ரிசையை (Index) மாற்று',
50
+ 'Add next' => 'அடுத்த‌தை சேர்க்க‌வும்',
51
+ 'Language' => 'மொழி',
52
+ 'Select' => 'தேர்வு செய்',
53
+ 'New item' => 'புதிய‌ உருப்ப‌டி',
54
+ 'Search' => 'தேடு',
55
+ 'Sort' => 'த‌ர‌ம் பிரி',
56
+ 'descending' => 'இற‌ங்குமுக‌மான‌',
57
+ 'Limit' => 'வ‌ர‌ம்பு',
58
+ 'No rows.' => 'வ‌ரிசை இல்லை.',
59
+ 'Action' => 'செய‌ல்',
60
+ 'edit' => 'தொகு',
61
+ 'Page' => 'ப‌க்க‌ம்',
62
+ 'Query executed OK, %d row(s) affected.' => array('வின‌வ‌ல் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌து, %d வ‌ரிசை மாற்ற‌ப்ப‌ட்ட‌து.', 'வின‌வ‌ல் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌து, %d வ‌ரிசைக‌ள் மாற்றப்ப‌ட்ட‌ன‌.'),
63
+ 'Error in query' => 'வின‌வ‌லில் த‌வ‌றுள்ள‌து',
64
+ 'Execute' => 'செய‌ல்ப‌டுத்து',
65
+ 'Table' => 'அட்ட‌வ‌ணை',
66
+ 'Foreign keys' => 'வேற்று விசைக‌ள்',
67
+ 'Triggers' => 'தூண்டுத‌ல்க‌ள்',
68
+ 'View' => 'தோற்றம்',
69
+ 'Unable to select the table' => 'அட்ட‌வ‌ணையை தேர்வு செய்ய‌ முடிய‌வில்லை',
70
+ 'Invalid CSRF token. Send the form again.' => 'CSRF டோக்க‌ன் செல்லாது. ப‌டிவ‌த்தை மீண்டும் அனுப்ப‌வும்.',
71
+ 'Comment' => 'குறிப்பு',
72
+ 'Default values' => 'உள்ளிருக்கும் (Default) ம‌திப்புக‌ள் ',
73
+ '%d byte(s)' => array('%d பைட்', '%d பைட்டுக‌ள்'),
74
+ 'No commands to execute.' => 'செய‌ல் ப‌டுத்த‌ எந்த‌ க‌ட்ட‌ளைக‌ளும் இல்லை.',
75
+ 'Unable to upload a file.' => 'கோப்பை மேலேற்ற‌ம் (upload) செய்ய‌ இயல‌வில்லை.',
76
+ 'File upload' => 'கோப்பை மேலேற்று (upload) ',
77
+ 'File uploads are disabled.' => 'கோப்புக‌ள் மேலேற்றம் (upload)முட‌க்க‌ப்ப‌ட்டுள்ள‌ன‌.',
78
+ 'Routine has been called, %d row(s) affected.' => array('ரொட்டீன்க‌ள் அழைக்க‌ப்பட்டுள்ள‌ன‌, %d வ‌ரிசை மாற்ற‌ம் அடைந்த‌து.', 'ரொட்டீன்க‌ள் அழைக்க‌ப்ப‌ட்டுள்ள‌ன‌, %d வ‌ரிசைக‌ள் மாற்றம் அடைந்துள்ள‌ன‌.'),
79
+ 'Call' => 'அழை',
80
+ 'None of the supported PHP extensions (%s) are available.' => 'PHP ஆத‌ர‌வு விரிவுக‌ள் (%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
+ 'Target table' => 'அட்ட‌வ‌ணை இல‌க்கு',
89
+ 'Change' => 'மாற்று',
90
+ 'Source' => 'மூல‌ம்',
91
+ 'Target' => 'இல‌க்கு',
92
+ 'Add column' => 'நெடு வ‌ரிசையை சேர்க்க‌வும்',
93
+ 'Alter' => 'மாற்று',
94
+ 'Add foreign key' => 'வேற்று விசை சேர்க்க‌வும்',
95
+ 'ON DELETE' => 'ON DELETE',
96
+ 'ON UPDATE' => 'ON UPDATE',
97
+ 'Index Type' => 'அக‌வ‌ரிசை வ‌கை (Index Type)',
98
+ 'Column (length)' => 'நெடுவ‌ரிசை (நீள‌ம்)',
99
+ 'View has been dropped.' => 'தோற்ற‌ம் நீக்க‌ப்ப‌ட்ட‌து.',
100
+ 'View has been altered.' => 'தோற்றம் மாற்றப்ப‌ட்ட‌து.',
101
+ 'View has been created.' => 'தோற்ற‌ம் உருவாக்க‌ப்ப‌ட்ட‌து.',
102
+ 'Alter view' => 'தோற்ற‌த்தை மாற்று',
103
+ 'Create view' => 'தோற்றத்தை உருவாக்கு',
104
+ 'Name' => 'பெய‌ர்',
105
+ 'Process list' => 'வேலைக‌ளின் ப‌ட்டி',
106
+ '%d process(es) have been killed.' => array('%d வேலை வ‌லுவில் நிறுத்த‌ப‌ட்ட‌து.', '%d வேலைக‌ள் வ‌லுவில் நிறுத்த‌ப‌ட்ட‌ன‌.'),
107
+ 'Kill' => 'வ‌லுவில் நிறுத்து',
108
+ 'Parameter name' => 'அள‌புரு (Parameter) பெய‌ர்',
109
+ 'Database schema' => 'த‌க‌வ‌ல்த‌ள‌ அமைப்பு முறைக‌ள்',
110
+ 'Create procedure' => 'செய்முறையை உருவாக்கு',
111
+ 'Create function' => 'Function உருவாக்கு',
112
+ 'Routine has been dropped.' => 'ரொட்டீன் நீக்க‌ப்ப‌ட்ட‌து.',
113
+ 'Routine has been altered.' => 'ரொட்டீன் மாற்ற‌ப்ப‌ட்டது.',
114
+ 'Routine has been created.' => 'ரொட்டீன் உருவாக்க‌ப்ப‌ட்ட‌து.',
115
+ 'Alter function' => 'Function மாற்று',
116
+ 'Alter procedure' => 'செய‌ல்முறையை மாற்று',
117
+ 'Return type' => 'திரும்பு வ‌கை',
118
+ 'Add trigger' => 'தூண்டு விசையை சேர்',
119
+ 'Trigger has been dropped.' => 'தூண்டு விசை நீக்க‌ப்ப‌ட்ட‌து.',
120
+ 'Trigger has been altered.' => 'தூண்டு விசை மாற்ற‌ப்ப‌ட்ட‌து.',
121
+ 'Trigger has been created.' => 'தூண்டு விசை உருவாக்க‌ப்ப‌ட்ட‌து.',
122
+ 'Alter trigger' => 'தூண்டு விசையை மாற்று',
123
+ 'Create trigger' => 'தூண்டு விசையை உருவாக்கு',
124
+ 'Time' => 'நேர‌ம்',
125
+ 'Event' => 'நிக‌ழ்ச்சி',
126
+ '%d row(s)' => array('%d வ‌ரிசை', '%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
+ 'Routine' => 'ரொட்டீன்',
137
+ 'Grant' => 'அனும‌திய‌ளி',
138
+ 'Revoke' => 'இர‌த்துச்செய்',
139
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'மிக‌ அதிக‌மான‌ POST த‌க‌வ‌ல். த‌க‌வ‌லை குறைக்க‌வும் அல்ல‌து %s வ‌டிவ‌மைப்பை (configuration directive) மாற்ற‌வும்.',
140
+ 'Logged as: %s' => 'ப‌ய‌னாளர்: %s',
141
+ 'Move up' => 'மேலே ந‌க‌ர்த்து',
142
+ 'Move down' => 'கீழே நக‌ர்த்து',
143
+ 'Functions' => 'Functions',
144
+ 'Aggregation' => 'திர‌ள்வு (Aggregation)',
145
+ 'Export' => 'ஏற்றும‌தி',
146
+ 'Output' => 'வெளியீடு',
147
+ 'open' => 'திற‌',
148
+ 'save' => 'சேமி',
149
+ 'Format' => 'ஃபார்ம‌ட் (Format)',
150
+ 'Tables' => 'அட்ட‌வ‌ணை',
151
+ 'Data' => 'த‌க‌வ‌ல்',
152
+ 'Event has been dropped.' => 'நிக‌ழ்ச்சி (Event) நீக்க‌ப்ப‌ட்ட‌து.',
153
+ 'Event has been altered.' => 'நிக‌ழ்ச்சி (Event) மாற்றப்ப‌ட்ட‌து.',
154
+ 'Event has been created.' => 'நிக‌ழ்ச்சி (Event) உருவாக்க‌‌ப்ப‌ட்ட‌து.',
155
+ 'Alter event' => 'நிக‌ழ்ச்சியை (Event) மாற்று',
156
+ 'Create event' => 'நிக‌ழ்ச்சியை (Event) உருவாக்கு',
157
+ 'At given time' => 'குறித்த‌ நேர‌த்தில்',
158
+ 'Every' => 'ஒவ்வொரு',
159
+ 'Events' => 'நிக‌ழ்ச்சிக‌ள்',
160
+ 'Schedule' => 'கால‌ அட்ட‌வ‌ணை',
161
+ 'Start' => 'தொட‌ங்கு',
162
+ 'End' => 'முடி (வு)',
163
+ 'Status' => 'நிக‌ழ்நிலை (Status)',
164
+ 'On completion preserve' => 'முடிந்த‌தின் பின் பாதுகாக்க‌வும்',
165
+ 'Tables and views' => 'அட்ட‌வ‌ணைக‌ளும் பார்வைக‌ளும்',
166
+ 'Data Length' => 'த‌க‌வ‌ல் நீள‌ம்',
167
+ 'Index Length' => 'Index நீள‌ம்',
168
+ 'Data Free' => 'Data Free',
169
+ 'Collation' => 'கொலேச‌ன்',
170
+ 'Analyze' => 'நுணுகி ஆராய‌வும்',
171
+ 'Optimize' => 'உக‌ப்பாக்கு (Optimize)',
172
+ 'Check' => 'ப‌ரிசோதி',
173
+ 'Repair' => 'ப‌ழுது பார்',
174
+ 'Truncate' => 'குறை (Truncate)',
175
+ 'Tables have been truncated.' => 'அட்ட‌வ‌ணை குறைக்க‌ப்ப‌ட்ட‌து (truncated).',
176
+ 'Rows' => 'வ‌ரிசைக‌ள்',
177
+ ',' => ',',
178
+ '0123456789' => '0123456789',
179
+ 'Tables have been moved.' => 'அட்ட‌வ‌ணை ந‌க‌ர்த்த‌ப்ப‌ட்ட‌து.',
180
+ 'Move to other database' => 'ம‌ற்ற‌ த‌க‌வ‌ல் தள‌த்திற்க்கு ந‌க‌ர்த்து',
181
+ 'Move' => 'ந‌க‌ர்த்து',
182
+ 'Engine' => 'எஞ்சின் (Engine)',
183
+ 'Save and continue edit' => 'சேமித்த‌ பிற‌கு தொகுப்ப‌தை தொட‌ர‌வும்',
184
+ 'original' => 'அச‌ல்',
185
+ 'Tables have been dropped.' => 'அட்ட‌வ‌ணை நீக்க‌ப்ப‌ட்ட‌து.',
186
+ '%d item(s) have been affected.' => array('%d உருப்ப‌டி மாற்ற‌ம‌டைந்தது.', '%d உருப்ப‌டிக‌ள் மாற்ற‌ம‌டைந்த‌ன‌.'),
187
+ 'whole result' => 'முழுமையான‌ முடிவு',
188
+ 'Clone' => 'ந‌க‌லி (Clone)',
189
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'அனும‌திக்க‌ப்ப‌ட்ட‌ அதிக‌ப‌ட்ச‌ கோப்புக‌ளின் எண்ணிக்கை மீற‌ப்ப‌ட்ட‌து. த‌ய‌வு செய்து %s ம‌ற்றும் %s யை அதிக‌ரிக்க‌வும்.',
190
+ 'Partition by' => 'பிரித்த‌து',
191
+ 'Partitions' => 'பிரிவுக‌ள்',
192
+ 'Partition name' => 'பிரிவின் பெய‌ர்',
193
+ 'Values' => 'ம‌திப்புக‌ள்',
194
+ '%d row(s) have been imported.' => array('%d வ‌ரிசை இற‌க்கும‌தி (Import) செய்ய‌ப்ப‌ட்ட‌து.', '%d வ‌ரிசைக‌ள் இற‌க்கும‌தி (Import) செய்ய‌ப்ப‌ட்டன‌.'),
195
+ 'Show structure' => 'க‌ட்ட‌மைப்பை காண்பிக்க‌வும்',
196
+ 'Import' => 'இற‌க்கும‌தி (Import)',
197
+ 'Stop on error' => 'பிழை ஏற்ப‌டின் நிற்க‌',
198
+ 'Select data' => 'த‌க‌வ‌லை தேர்வு செய்',
199
+ '%.3f s' => '%.3f s',
200
+ '$1-$3-$5' => '$5/$3/$1',
201
+ '[yyyy]-mm-dd' => 'dd/mm/[yyyy]',
202
+ 'History' => 'வ‌ர‌லாறு',
203
+ 'Variables' => 'மாறிலிக‌ள் (Variables)',
204
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'இல‌க்கு நெடுவ‌ரிசையில் அக‌வ‌ரிசை (Index) ம‌ற்றும் குறிக்க‌ப்ப‌ட்ட‌ த‌க‌வல் (Referenced DATA) க‌ண்டிப்பாக‌ இருத்த‌ல் வேண்டும். மூல‌ நெடுவ‌ரிசை ம‌ற்றும் இலக்கு நெடுவ‌ரிசையின் த‌க‌வ‌ல் வ‌டிவ‌ம் (DATA TYPE) ஒன்றாக‌ இருக்க‌ வேண்டும்.',
205
+ 'Relations' => 'உற‌வுக‌ள் (Relations)',
206
+ 'Run file' => 'கோப்பினை இய‌க்க‌வும்',
207
+ 'Clear' => 'துடை (Clear)',
208
+ 'Maximum allowed file size is %sB.' => 'கோப்பின் அதிக‌ப‌ட்ச‌ அள‌வு %sB.',
209
+ 'Numbers' => 'எண்க‌ள்',
210
+ 'Date and time' => 'தேதி ம‌ற்றும் நேர‌ம்',
211
+ 'Strings' => 'ச‌ர‌ம் (String)',
212
+ 'Binary' => 'பைன‌ரி',
213
+ 'Lists' => 'ப‌ட்டிய‌ல்',
214
+ 'Editor' => 'தொகுப்பாளர்',
215
+ 'E-mail' => 'மின்ன‌ஞ்ச‌ல்',
216
+ 'From' => 'அனுப்புனர்',
217
+ 'Subject' => 'பொருள்',
218
+ 'Send' => 'அனுப்பு',
219
+ '%d e-mail(s) have been sent.' => array('%d மின்ன‌ஞ்ச‌ல் அனுப்ப‌ப‌ட்ட‌து.', '%d மின்ன‌ஞ்ச‌ல்க‌ள் அனுப்ப‌ப்ப‌ட்ட‌ன‌.'),
220
+ 'Webserver file %s' => 'வெப் ச‌ர்வ‌ர் கோப்பு %s',
221
+ 'File does not exist.' => 'கோப்பு இல்லை.',
222
+ '%d in total' => 'மொத்தம் %d ',
223
+ 'Permanent login' => 'நிர‌ந்த‌ர‌மாக‌ நுழைய‌வும்',
224
+ 'Schema' => 'அமைப்புமுறை',
225
+ 'Alter schema' => 'அமைப்புமுறையை மாற்று',
226
+ 'Create schema' => 'அமைப்புமுறையை உருவாக்கு',
227
+ 'Search data in tables' => 'த‌க‌வ‌லை அட்ட‌வ‌ணையில் தேடு',
228
+ 'Sequences' => 'வ‌ரிசைமுறை',
229
+ 'Create sequence' => 'வ‌ரிசைமுறையை உருவாக்கு',
230
+ 'User types' => 'ப‌ய‌னாள‌ர் வ‌கைக‌ள்',
231
+ 'Create type' => 'வ‌கையை உருவாக்கு',
232
+ 'Item%s has been inserted.' => 'உருப்ப‌டி (Item) சேர்க்க‌ப்ப‌ட்ட‌து.',
233
+ 'Schema has been dropped.' => 'அமைப்புமுறை நீக்க‌ப்ப‌ட்ட‌து.',
234
+ 'Schema has been created.' => 'அமைப்புமுறை உருவாக்க‌ப்ப‌ட்ட‌து.',
235
+ 'Schema has been altered.' => 'அமைப்புமுறை மாற்ற‌ப்ப‌ட்ட‌து.',
236
+ 'Use edit link to modify this value.' => 'இந்த‌ ம‌திப்பினை மாற்ற‌, தொகுப்பு இணைப்பினை உப‌யோகிக்க‌வும்.',
237
+ 'last' => 'க‌டைசி',
238
+ 'Sequence has been dropped.' => 'வ‌ரிசைமுறை நீக்க‌ப்ப‌ட்ட‌து.',
239
+ 'Sequence has been created.' => 'வ‌ரிசைமுறை உருவாக்க‌ப்ப‌ட்ட‌து.',
240
+ 'Sequence has been altered.' => 'வ‌ரிசைமுறை மாற்ற‌ப்ப‌ட்ட‌து.',
241
+ 'Alter sequence' => 'வ‌ரிசைமுறையை மாற்று',
242
+ 'From server' => 'செர்வ‌ரில் இருந்து',
243
+ 'Type has been dropped.' => 'வ‌கை (type) நீக்க‌ப்ப‌ட்ட‌து.',
244
+ 'Type has been created.' => 'வ‌கை (type) உருவாக்க‌ப்ப‌ட்ட‌து.',
245
+ 'Alter type' => 'வ‌கையினை (type) மாற்று',
246
+ 'System' => 'சிஸ்ட‌ம் (System)',
247
+ 'anywhere' => 'எங்காயினும்',
248
+ 'empty' => 'வெறுமை (empty)',
249
+ 'No extension' => 'விரிவு (extensஇஒன்) இல்லை ',
250
+ 'Databases have been dropped.' => 'த‌க‌வ‌ல் த‌ள‌ங்க‌ள் நீக்க‌ப்ப‌ட்டன‌.',
251
+ '%s version: %s through PHP extension %s' => '%s ப‌திப்பு: %s through PHP extension %s',
252
+ 'Network' => 'நெட்வொர்க்',
253
+ 'Geometry' => 'வ‌டிவ‌விய‌ல் (Geometry)',
254
+ 'File exists.' => 'கோப்பு உள்ள‌து.',
255
+ 'Attachments' => 'இணைப்புக‌ள்',
256
+ 'now' => 'இப்பொழுது',
257
+ '%d query(s) executed OK.' => array('%d வின‌வ‌ல் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌து.', '%d வின‌வ‌ல்க‌ள் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌ன‌.'),
258
+ 'Show only errors' => 'பிழைக‌ளை ம‌ட்டும் காண்பிக்க‌வும்',
259
+ 'Refresh' => 'புதுப்பி (Refresh)',
260
+ 'Invalid schema.' => 'அமைப்புமுறை ச‌ரியான‌த‌ல்ல‌ (Invalid Schema).',
261
+ 'Please use one of the extensions %s.' => 'த‌ய‌வு செய்து ஒரு விரிவினை %s (extension) உப‌யோகிக்க‌வும்.',
262
+ 'ltr' => 'ltr',
263
+ 'Tables have been copied.' => 'அட்டவணைகள் நகலெடுக்கப் பட்டது.',
264
+ 'Copy' => 'நகல்',
265
+ 'Permanent link' => 'நிரந்தர இணைப்பு',
266
+ 'Edit all' => 'அனைத்தையும் தொகு',
267
+ 'HH:MM:SS' => 'HH:MM:SS',
268
+ );
adminer/adminer/adminer/lang/th.inc.php ADDED
@@ -0,0 +1,269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ 'Create new database' => 'สร้างฐานข้อมูลใหม่',
12
+ 'Table has been dropped.' => 'ลบตารางแล้ว.',
13
+ 'Table has been altered.' => 'แก้ไขตารางแล้ว.',
14
+ 'Table has been created.' => 'สร้างตารางใหม่แล้ว.',
15
+ 'Alter table' => 'เปลี่ยนแปลงตารางแล้ว',
16
+ 'Create table' => 'สร้างตารางใหม่',
17
+ 'Table name' => 'ชื่อตาราง',
18
+ 'engine' => 'ชนิดของฐานข้อมูล',
19
+ 'collation' => 'การตรวจทาน',
20
+ 'Column name' => 'ชื่อคอลัมน์',
21
+ 'Type' => 'ชนิด',
22
+ 'Length' => 'ความยาว',
23
+ 'Auto Increment' => 'เพิ่มลำดับโดยอัตโนมัติ',
24
+ 'Options' => 'ตัวเลือก',
25
+ 'Save' => 'บันทึก',
26
+ 'Drop' => 'ลบ',
27
+ 'Database has been dropped.' => 'ฐานข้อมูลถูกลบแล้ว.',
28
+ 'Database has been created.' => 'สร้างฐานข้อมูลใหม่แล้ว.',
29
+ 'Database has been renamed.' => 'เปลี่ยนชื่อฐานข้อมูลแล้ว.',
30
+ 'Database has been altered.' => 'เปลี่ยนแปลงฐานข้อมูลแล้ว.',
31
+ 'Alter database' => 'เปลี่ยนแปลงฐานข้อมูล',
32
+ 'Create database' => 'สร้างฐานข้อมูล',
33
+ 'SQL command' => 'คำสั่ง SQL',
34
+ 'Logout' => 'ออกจากระบบ',
35
+ 'database' => 'ฐานข้อมูล',
36
+ 'Use' => 'ใช้งาน',
37
+ 'No tables.' => 'ไม่พบตาราง.',
38
+ 'select' => 'เลือก',
39
+ 'Item has been deleted.' => 'รายการถูกลบแล้ว.',
40
+ 'Item has been updated.' => 'ปรับปรุงรายการแล้ว.',
41
+ 'Item%s has been inserted.' => 'มี%s รายการ ถูกเพิ่มแล้ว.',
42
+ 'Edit' => 'แก้ไข',
43
+ 'Insert' => 'เพิ่ม',
44
+ 'Save and insert next' => 'บันทึกแล้วเพิ่มรายการถัดไป',
45
+ 'Delete' => 'ลบ',
46
+ 'Database' => 'ฐานข้อมูล',
47
+ 'Routines' => 'รูทีน',
48
+ 'Indexes have been altered.' => 'เปลี่ยนแปลงดัชนีแล้ว.',
49
+ 'Indexes' => 'ดัชนี',
50
+ 'Alter indexes' => 'เปลี่ยนแปลงดัชนี',
51
+ 'Add next' => 'เพิ่มรายการถัดไป',
52
+ 'Language' => 'ภาษา',
53
+ 'Select' => 'เลือก',
54
+ 'New item' => 'รายการใหม่',
55
+ 'Search' => 'ค้นหา',
56
+ 'Sort' => 'เรียงลำดับ',
57
+ 'descending' => 'มากไปน้อย',
58
+ 'Limit' => 'จำกัด',
59
+ 'No rows.' => 'ไม่มีแถวของตาราง.',
60
+ 'Action' => 'ดำเนินการ',
61
+ 'edit' => 'แก้ไข',
62
+ 'Page' => 'หน้า',
63
+ 'Query executed OK, %d row(s) affected.' => 'ประมวลผลคำสั่งแล้ว มี %d ถูกดำเนินการ.',
64
+ 'Error in query' => 'คำสั่งไม่ถูกต้อง',
65
+ 'Execute' => 'ประมวลผล',
66
+ 'Table' => 'ตาราง',
67
+ 'Foreign keys' => 'คีย์คู่แข่ง',
68
+ 'Triggers' => 'ทริกเกอร์',
69
+ 'View' => 'วิว',
70
+ 'Unable to select the table' => 'ไม่สามารถเลือกตารางได้',
71
+ 'Invalid CSRF token. Send the form again.' => 'เครื่องหมาย CSRF ไม่ถูกต้อง ส่งข้อมูลใหม่อีกครั้ง.',
72
+ 'Comment' => 'หมายเหตุ',
73
+ 'Default values' => 'ค่าเริ่มต้น',
74
+ '%d byte(s)' => '%d ไบท์',
75
+ 'No commands to execute.' => 'ไม่มีคำสั่งที่จะประมวลผล.',
76
+ 'Unable to upload a file.' => 'ไม่สามารถอัปโหลดไฟล์ได้.',
77
+ 'File upload' => 'อัปโหลดไฟล์',
78
+ 'File uploads are disabled.' => 'การอัปโหลดไฟล์ถูกปิดการใช้งาน.',
79
+ 'Routine has been called, %d row(s) affected.' => 'รูทีนถูกเรียกใช้งาน มี %d แถวถูกดำเนินการ.',
80
+ 'Call' => 'เรียกใช้งาน',
81
+ 'No extension' => 'ไม่พบส่วนเสริม',
82
+ 'None of the supported PHP extensions (%s) are available.' => 'ไม่มีส่วนเสริมของ PHP (%s) ที่สามารถใช้งานได้.',
83
+ 'Session support must be enabled.' => 'ต้องเปิดใช้งาน Session.',
84
+ 'Session expired, please login again.' => 'Session หมดอายุแล้ว กรุณาเข้าสู่ระบบใหม่อีกครั้ง.',
85
+ 'Text length' => 'ความยาวของอักษร',
86
+ 'Foreign key has been dropped.' => 'คีย์คู่แข่งถูกลบแล้ว.',
87
+ 'Foreign key has been altered.' => 'คีย์คู่แข่งถูกเปลี่ยนแปลงแล้ว.',
88
+ 'Foreign key has been created.' => 'คีย์คู่แข่งถูกสร้างแล้ว.',
89
+ 'Foreign key' => 'คีย์คู่แข่ง',
90
+ 'Target table' => 'คารางเป้าหมาย',
91
+ 'Change' => 'แก้ไข',
92
+ 'Source' => 'แหล่งข้อมูล',
93
+ 'Target' => 'เป้าหมาย',
94
+ 'Add column' => 'เพิ่มคอลัมน์',
95
+ 'Alter' => 'เปลี่ยนแปลง',
96
+ 'Add foreign key' => 'เพิ่มคีย์คู่แข่ง',
97
+ 'ON DELETE' => 'ON DELETE',
98
+ 'ON UPDATE' => 'ON UPDATE',
99
+ 'Index Type' => 'ชนิดของดัชนี',
100
+ 'Column (length)' => 'คอลัมน์ (ความยาว)',
101
+ 'View has been dropped.' => 'วิวถูกลบแล้ว.',
102
+ 'View has been altered.' => 'วิวถูกเปลี่ยนแปลงแล้ว.',
103
+ 'View has been created.' => 'วิวถูกสร้างแล้ว.',
104
+ 'Alter view' => 'เปลี่ยนแปลงวิว',
105
+ 'Create view' => 'เพิ่มวิว',
106
+ 'Name' => 'ชื่อ',
107
+ 'Process list' => 'รายการของกระบวนการ',
108
+ '%d process(es) have been killed.' => 'มี %d กระบวนการถูกทำลายแล้ว.',
109
+ 'Kill' => 'ทำลาย',
110
+ 'Parameter name' => 'ชื่อพารามิเตอร์',
111
+ 'Database schema' => 'Schema ของฐานข้อมูล',
112
+ 'Create procedure' => 'สร้าง procedure',
113
+ 'Create function' => 'สร้าง Function',
114
+ 'Routine has been dropped.' => 'Routine ถูกลบแล้ว.',
115
+ 'Routine has been altered.' => 'Routine ถูกเปลี่ยนแปลงแล้ว.',
116
+ 'Routine has been created.' => 'Routine ถูกสร้างแล้ว.',
117
+ 'Alter function' => 'เปลี่ยนแปลง Function',
118
+ 'Alter procedure' => 'เปลี่ยนแปลง procedure',
119
+ 'Return type' => 'ประเภทของค่าที่คืนกลับ',
120
+ 'Add trigger' => 'เพิ่ม trigger',
121
+ 'Trigger has been dropped.' => 'Trigger ถูกลบแล้ว.',
122
+ 'Trigger has been altered.' => 'Trigger ถูกเปลี่ยนแปลงแล้ว.',
123
+ 'Trigger has been created.' => 'Trigger ถูกสร้างแล้ว.',
124
+ 'Alter trigger' => 'เปลี่ยนแปลง Trigger',
125
+ 'Create trigger' => 'สร้าง Trigger',
126
+ 'Time' => 'เวลา',
127
+ 'Event' => 'เหตุการณ์',
128
+ '%s version: %s through PHP extension %s' => '%s รุ่น: %s ผ่านส่วนขยาย PHP %s',
129
+ '%d row(s)' => '%d แถว',
130
+ 'Remove' => 'ลบ',
131
+ 'Are you sure?' => 'คุณแน่ใจแล้วหรือ',
132
+ 'Privileges' => 'สิทธิ์',
133
+ 'Create user' => 'สร้างผู้ใช้งาน',
134
+ 'User has been dropped.' => 'ลบผู้ใช้งานแล้ว.',
135
+ 'User has been altered.' => 'เปลี่ยนแปลงผู้ใช้งานแล้ว.',
136
+ 'User has been created.' => 'สร้างผู้ใช้งานแล้ว.',
137
+ 'Hashed' => 'Hash',
138
+ 'Column' => 'คอลัมน์',
139
+ 'Routine' => 'รูทีน',
140
+ 'Grant' => 'การอนุญาต',
141
+ 'Revoke' => 'ยกเลิก',
142
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'ข้อมูลที่ส่งเข้ามีขนาดใหญ่เกิน คุณสามารถ เพิ่ม-ลดขนาดได้ที่ %s คำสั่งการตั้งค่า.',
143
+ 'Logged as: %s' => 'สวัสดีคุณ: %s',
144
+ 'Move up' => 'ย้ายไปข้างบน',
145
+ 'Move down' => 'ย้ายลงล่าง',
146
+ 'Functions' => 'ฟังก์ชั่น',
147
+ 'Aggregation' => 'รวบรวม',
148
+ 'Export' => 'ส่งออก',
149
+ 'Output' => 'ข้อมูลที่ส่งออก',
150
+ 'open' => 'เปิด',
151
+ 'save' => 'บันทึก',
152
+ 'Format' => 'รูปแบบ',
153
+ 'Tables' => 'ตาราง',
154
+ 'Data' => 'ข้อมูล',
155
+ 'Event has been dropped.' => 'เหตุการณ์ถูกลบแล้ว.',
156
+ 'Event has been altered.' => 'เหตุการณ์ถูกเปลี่ยนแปลงแล้ว.',
157
+ 'Event has been created.' => 'เหตุการณ์ถูกสร้างแล้ว.',
158
+ 'Alter event' => 'เปลี่ยนแปลงเหตุการณ์',
159
+ 'Create event' => 'สร้างเหตุการณ์',
160
+ 'At given time' => 'ในเวลาที่กำหนด',
161
+ 'Every' => 'ทุกๆ',
162
+ 'Events' => 'เหตุการณ์',
163
+ 'Schedule' => 'กำหนดการณ์',
164
+ 'Start' => 'เริ่มต้น',
165
+ 'End' => 'สิ้นสุด',
166
+ 'Status' => 'สถานะ',
167
+ 'On completion preserve' => 'เมื่อเสร็จสิ้นการสงวน',
168
+ 'Tables and views' => 'ตารางและวิว',
169
+ 'Data Length' => 'ความยาวของข้อมูล',
170
+ 'Index Length' => 'ความยาวของดัชนี',
171
+ 'Data Free' => 'พื้นที่ว่าง',
172
+ 'Collation' => 'การตรวจทาน',
173
+ 'Analyze' => 'วิเคราะห์',
174
+ 'Optimize' => 'เพิ่มประสิทธิภาพ',
175
+ 'Check' => 'ตรวจสอบ',
176
+ 'Repair' => 'ซ่อมแซม',
177
+ 'Truncate' => 'ตัดทิ้ง',
178
+ 'Tables have been truncated.' => 'เคลียร์ตารางแล้ว (truncate).',
179
+ 'Rows' => 'แถว',
180
+ ',' => ' ',
181
+ '0123456789' => '0123456789',
182
+ 'Tables have been moved.' => 'ตารางถูกย้ายแล้ว.',
183
+ 'Move to other database' => 'ย้ายไปยังฐานข้อมูลอื่น',
184
+ 'Move' => 'ย้าย',
185
+ 'Engine' => 'ชนิดของฐานข้อมูล',
186
+ 'Save and continue edit' => 'บันทึกและแก้ไขข้อมูลอื่นๆต่อ',
187
+ 'original' => 'ต้นฉบับ',
188
+ 'Tables have been dropped.' => 'ตารางถูกลบแล้ว.',
189
+ '%d item(s) have been affected.' => 'มี %d รายการถูกดำเนินการแล้ว.',
190
+ 'whole result' => 'รวมผล',
191
+ 'Clone' => 'ทำซ้ำ',
192
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'จำนวนสูงสุดของฟิลด์อนุญาตให้เกิน กรุณาเพิ่มอีก %s.',
193
+ 'Partition by' => 'พาร์ทิชันโดย',
194
+ 'Partitions' => 'พาร์ทิชัน',
195
+ 'Partition name' => 'ชื่อของพาร์ทิชัน',
196
+ 'Values' => 'ค่า',
197
+ '%d row(s) have been imported.' => '%d แถวถูกนำเข้าแล้ว.',
198
+ 'anywhere' => 'ทุกแห่ง',
199
+ 'Import' => 'นำเข้า',
200
+ 'Stop on error' => 'หยุดการทำงานเมื่อเออเรอ',
201
+ '%.3f s' => '%.3f วินาที',
202
+ '$1-$3-$5' => '$5/$3/$1',
203
+ '[yyyy]-mm-dd' => 'วันที่/เดือน/[ปี]',
204
+ 'History' => 'ประวัติ',
205
+ 'Variables' => 'ตัวแปร',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'แหล่งที่มาและเป้าหมายของคอลมัน์ต้องมีชนิดข้อมูลเดียวกัน คือต้องมีดัชนีและข้อมูลอ้างอิงของคอลัมน์เป้าหมาย.',
207
+ 'Relations' => 'ความสำพันธ์',
208
+ 'Run file' => 'ทำงานจากไฟล์',
209
+ 'Clear' => 'เคลียร์',
210
+ 'Maximum allowed file size is %sB.' => 'ขนาดไฟล์สูงสุดที่อนุญาตให้ใช้งานคือ %sB.',
211
+ 'Numbers' => 'ตัวเลข',
212
+ 'Date and time' => 'วันและเวลา',
213
+ 'Strings' => 'ตัวอักษร',
214
+ 'Binary' => 'เลขฐานสอง',
215
+ 'Lists' => 'รายการ',
216
+ 'Editor' => 'ผู้แก้ไข',
217
+ 'E-mail' => 'อีเมล์',
218
+ 'From' => 'จาก',
219
+ 'Subject' => 'หัวข้อ',
220
+ 'Send' => 'ส่ง',
221
+ '%d e-mail(s) have been sent.' => 'มี %d อีเมล์ ถูกส่งออกแล้ว.',
222
+ 'Webserver file %s' => 'Webserver file %s',
223
+ 'File does not exist.' => 'ไม่มีไฟล์.',
224
+ '%d in total' => '%d ของทั้งหมด',
225
+ 'Permanent login' => 'จดจำการเข้าสู่ระบบตลอดไป',
226
+ 'Databases have been dropped.' => 'ฐานข้อมูลถูกลบแล้ว.',
227
+ 'Search data in tables' => 'ค้นหาในตาราง',
228
+ 'Schema' => 'Schema',
229
+ 'Alter schema' => 'เปลี่ยนแปลง schema',
230
+ 'Create schema' => 'สร้าง schema',
231
+ 'Schema has been dropped.' => 'Schema ถูกลบแล้ว.',
232
+ 'Schema has been created.' => 'Schema ถูกสร้างแล้ว.',
233
+ 'Schema has been altered.' => 'Schema ถูกเปลี่ยนแปลงแล้ว.',
234
+ 'Sequences' => 'Sequences',
235
+ 'Create sequence' => 'Sequence ถูกสร้างแล้ว',
236
+ 'Alter sequence' => 'Sequence ถูกเปลี่ยนแปลงแล้ว',
237
+ 'Sequence has been dropped.' => 'Sequence ถูกลบแล้ว.',
238
+ 'Sequence has been created.' => 'Sequence ถูกสร้างแล้ว.',
239
+ 'Sequence has been altered.' => 'Sequence ถูกเปลี่ยนแปลงแล้ว.',
240
+ 'User types' => 'ประเภทผู้ใช้งาน',
241
+ 'Create type' => 'สร้างประเภทผู้ใช้งาน',
242
+ 'Alter type' => 'แก้ไขประเภท',
243
+ 'Type has been dropped.' => 'ประเภทถูกลบแล้ว.',
244
+ 'Type has been created.' => 'ประเภทถูกสร้างแล้ว.',
245
+ 'Ctrl+click on a value to modify it.' => 'กด Ctrl+click เพื่อแก้ไขค่า.',
246
+ 'Use edit link to modify this value.' => 'ใช้ลิงค์ แก้ไข เพื่อปรับเปลี่ยนค่านี้.',
247
+ 'last' => 'ล่าสุด',
248
+ 'From server' => 'จากเซเวอร์',
249
+ 'System' => 'ระบบ',
250
+ 'Select data' => 'เลือกข้อมูล',
251
+ 'Show structure' => 'แสดงโครงสร้าง',
252
+ 'empty' => 'ว่างเปล่า',
253
+ 'Network' => 'เครื่องข่าย',
254
+ 'Geometry' => 'เรขาคณิต',
255
+ 'File exists.' => 'มีไฟล์นี้อยู่แล้ว.',
256
+ 'Attachments' => 'ไฟล์แนบ',
257
+ '%d query(s) executed OK.' => '%d คำสั่งถูกดำเนินการแล้ว.',
258
+ 'Show only errors' => 'แสดงเฉพาะเออเรอ',
259
+ 'Refresh' => 'โหลดใหม่',
260
+ 'Invalid schema.' => 'schema ไม่ถูกต้อง.',
261
+ 'Please use one of the extensions %s.' => 'กรุณาใช้ส่วนเสริมอย่างน้อย 1 ส่วนเสริมจากทั้งหมด %s.',
262
+ 'now' => 'ตอนนี้',
263
+ 'ltr' => 'ltr',
264
+ 'Tables have been copied.' => 'ทำซ้ำตารางฐานข้อมูลแล้ว.',
265
+ 'Copy' => 'ทำซ้ำ',
266
+ 'Permanent link' => 'ลิงค์ถาวร',
267
+ 'Edit all' => 'แก้ไขทั้งหมด',
268
+ 'HH:MM:SS' => 'HH:MM:SS',
269
+ );
adminer/adminer/adminer/lang/tr.inc.php ADDED
@@ -0,0 +1,320 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Sistem',
5
+ 'Server' => 'Sunucu',
6
+ 'Username' => 'Kullanıcı',
7
+ 'Password' => 'Parola',
8
+ 'Permanent login' => 'Beni hatırla',
9
+ 'Login' => 'Giriş',
10
+ 'Logout' => 'Çıkış',
11
+ 'Logged as: %s' => '%s olarak giriş yapıldı.',
12
+ 'Logout successful.' => 'Başarıyla çıkış yapıldı.',
13
+ 'Invalid credentials.' => 'Geçersiz kimlik.',
14
+ 'Language' => 'Dil',
15
+ 'Invalid CSRF token. Send the form again.' => 'Geçersiz (CSRF) jetonu. Formu tekrar yolla.',
16
+ 'No extension' => 'Uzantı yok',
17
+ 'None of the supported PHP extensions (%s) are available.' => 'Desteklenen PHP eklentilerinden (%s) hiçbiri mevcut değil.',
18
+ 'Session support must be enabled.' => 'Oturum desteği etkin olmalıdır.',
19
+ 'Session expired, please login again.' => 'Oturum süresi doldu, lütfen tekrar giriş yapın.',
20
+ '%s version: %s through PHP extension %s' => '%s sürüm: %s, %s PHP eklentisi ile',
21
+ 'Refresh' => 'Tazele',
22
+
23
+ // text direction
24
+ 'ltr' => 'ltr',
25
+
26
+ 'Privileges' => 'İzinler',
27
+ 'Create user' => 'Kullanıcı oluştur',
28
+ 'User has been dropped.' => 'Kullanıcı silindi.',
29
+ 'User has been altered.' => 'Kullanıcı değiştirildi.',
30
+ 'User has been created.' => 'Kullanıcı oluşturuldu.',
31
+ 'Hashed' => 'Harmanlandı',
32
+ 'Column' => 'Kolon',
33
+ 'Routine' => 'Yordam',
34
+ 'Grant' => 'Yetki Ver',
35
+ 'Revoke' => 'Yetki Kaldır',
36
+
37
+ 'Process list' => 'İşlem listesi',
38
+ '%d process(es) have been killed.' => array('%d işlem sonlandırıldı.', '%d adet işlem sonlandırıldı.'),
39
+ 'Kill' => 'Sonlandır',
40
+
41
+ 'Variables' => 'Değişkenler',
42
+ 'Status' => 'Durum',
43
+
44
+ 'SQL command' => 'SQL komutu',
45
+ '%d query(s) executed OK.' => array('%d sorgu başarıyla çalıştırıldı.', '%d adet sorgu başarıyla çalıştırıldı.'),
46
+ 'Query executed OK, %d row(s) affected.' => array('Sorgu başarıyla çalıştırıldı, %d adet kayıt etkilendi.', 'Sorgu başarıyla çalıştırıldı, %d adet kayıt etkilendi.'),
47
+ 'No commands to execute.' => 'Çalıştırılacak komut yok.',
48
+ 'Error in query' => 'Sorguda hata',
49
+ 'Execute' => 'Çalıştır',
50
+ 'Stop on error' => 'Hata oluşursa dur',
51
+ 'Show only errors' => 'Sadece hataları göster.',
52
+ // sprintf() format for time of the command
53
+ '%.3f s' => '%.3f s',
54
+ 'History' => 'Geçmiş',
55
+ 'Clear' => 'Temizle',
56
+ 'Edit all' => 'Tümünü düzenle',
57
+
58
+ 'File upload' => 'Dosya gönder',
59
+ 'From server' => 'Sunucudan',
60
+ 'Webserver file %s' => '%s web sunucusu dosyası',
61
+ 'Run file' => 'Dosyayı çalıştır',
62
+ 'File does not exist.' => 'Dosya mevcut değil.',
63
+ 'File uploads are disabled.' => 'Dosya gönderimi etkin değil.',
64
+ 'Unable to upload a file.' => 'Dosya gönderilemiyor.',
65
+ 'Maximum allowed file size is %sB.' => 'İzin verilen dosya boyutu sınırı %sB.',
66
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Çok büyük POST verisi, veriyi azaltın ya da %s ayar yönergesini uygun olarak yapılandırın.',
67
+
68
+ 'Export' => 'Dışarı Aktar',
69
+ 'Output' => 'Çıktı',
70
+ 'open' => 'aç',
71
+ 'save' => 'kaydet',
72
+ 'Format' => 'Biçim',
73
+ 'Data' => 'Veri',
74
+
75
+ 'Database' => 'Veri Tabanı',
76
+ 'database' => 'veri tabanı',
77
+ 'Use' => 'Kullan',
78
+ 'Select database' => 'Veri tabanı seç',
79
+ 'Invalid database.' => 'Geçersiz veri tabanı.',
80
+ 'Create new database' => 'Yeni veri tabanı oluştur',
81
+ 'Database has been dropped.' => 'Veri tabanı silindi.',
82
+ 'Databases have been dropped.' => 'Veritabanları silindi.',
83
+ 'Database has been created.' => 'Veri tabanı oluşturuldu.',
84
+ 'Database has been renamed.' => 'Veri tabanının ismi değiştirildi.',
85
+ 'Database has been altered.' => 'Veri tabanı değiştirildi.',
86
+ 'Alter database' => 'Veri tabanını değiştir',
87
+ 'Create database' => 'Veri tabanı oluştur',
88
+ 'Database schema' => 'Veri tabanı şeması',
89
+
90
+ // link to current database schema layout
91
+ 'Permanent link' => 'Kalıcı bağlantı',
92
+
93
+ // thousands separator - must contain single byte
94
+ ',' => ' ',
95
+ '0123456789' => '0123456789',
96
+ 'Engine' => 'Motor',
97
+ 'Collation' => 'Karşılaştırma',
98
+ 'Data Length' => 'Veri Uzunluğu',
99
+ 'Index Length' => 'Dizin Uzunluğu',
100
+ 'Data Free' => 'Boş Veri',
101
+ 'Rows' => 'Kayıtlar',
102
+ '%d in total' => 'toplam %d',
103
+ 'Analyze' => 'Çözümle',
104
+ 'Optimize' => 'En uygun hale getir',
105
+ 'Check' => 'Denetle',
106
+ 'Repair' => 'Tamir Et',
107
+ 'Truncate' => 'Boşalt',
108
+ 'Tables have been truncated.' => 'Tablolar boşaltıldı.',
109
+ 'Move to other database' => 'Başka veri tabanına taşı',
110
+ 'Move' => 'Taşı',
111
+ 'Tables have been moved.' => 'Tablolar taşındı.',
112
+ 'Copy' => 'Kopyala',
113
+ 'Tables have been copied.' => 'Tablolar kopyalandı.',
114
+
115
+ 'Routines' => 'Yordamlar',
116
+ 'Routine has been called, %d row(s) affected.' => array('Yordam çağrıldı, %d adet kayıt etkilendi.', 'Yordam çağrıldı, %d kayıt etkilendi.'),
117
+ 'Call' => 'Çağır',
118
+ 'Parameter name' => 'Parametre adı',
119
+ 'Create procedure' => 'Yöntem oluştur',
120
+ 'Create function' => 'Fonksiyon oluştur',
121
+ 'Routine has been dropped.' => 'Yordam silindi.',
122
+ 'Routine has been altered.' => 'Yordam değiştirildi.',
123
+ 'Routine has been created.' => 'Yordam oluşturuldu.',
124
+ 'Alter function' => 'Fonksyionu değiştir',
125
+ 'Alter procedure' => 'Yöntemi değiştir',
126
+ 'Return type' => 'Geri dönüş türü',
127
+
128
+ 'Events' => 'Olaylar',
129
+ 'Event has been dropped.' => 'Olay silindi.',
130
+ 'Event has been altered.' => 'Olay değiştirildi.',
131
+ 'Event has been created.' => 'Olay oluşturuldu.',
132
+ 'Alter event' => 'Olayı değiştir',
133
+ 'Create event' => 'Olay oluştur',
134
+ 'At given time' => 'Verilen zamanda',
135
+ 'Every' => 'Her zaman',
136
+ 'Schedule' => 'Takvimli',
137
+ 'Start' => 'Başla',
138
+ 'End' => 'Son',
139
+ 'On completion preserve' => 'Tamamlama koruması',
140
+
141
+ 'Tables' => 'Tablolar',
142
+ 'Tables and views' => 'Tablolar ve görünümler',
143
+ 'Table' => 'Tablo',
144
+ 'No tables.' => 'Tablo yok.',
145
+ 'Alter table' => 'Tabloyu değiştir',
146
+ 'Create table' => 'Tablo oluştur',
147
+ 'Table has been dropped.' => 'Tablo silindi.',
148
+ 'Tables have been dropped.' => 'Tablolar silindi.',
149
+ 'Tables have been optimized.' => 'Tablolar en uygun hale getirildi.',
150
+ 'Table has been altered.' => 'Tablo değiştirildi.',
151
+ 'Table has been created.' => 'Tablo oluşturuldu.',
152
+ 'Table name' => 'Tablo adı',
153
+ 'Show structure' => 'Yapıyı göster',
154
+ 'engine' => 'motor',
155
+ 'collation' => 'karşılaştırma',
156
+ 'Column name' => 'Kolon adı',
157
+ 'Type' => 'Tür',
158
+ 'Length' => 'Uzunluk',
159
+ 'Auto Increment' => 'Otomatik Artır',
160
+ 'Options' => 'Seçenekler',
161
+ 'Comment' => 'Yorum',
162
+ 'Default values' => 'Varsayılan değerler',
163
+ 'Drop' => 'Sil',
164
+ 'Are you sure?' => 'Emin misiniz?',
165
+ 'Move up' => 'Yukarı taşı',
166
+ 'Move down' => 'Aşağı taşı',
167
+ 'Remove' => 'Sil',
168
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'İzin verilen en fazla alan sayısı aşıldı. Lütfen %s değerlerini artırın.',
169
+
170
+ 'Partition by' => 'Bununla bölümle',
171
+ 'Partitions' => 'Bölümler',
172
+ 'Partition name' => 'Bölüm adı',
173
+ 'Values' => 'Değerler',
174
+
175
+ 'View' => 'Görünüm',
176
+ 'View has been dropped.' => 'Görünüm silindi.',
177
+ 'View has been altered.' => 'Görünüm değiştirildi.',
178
+ 'View has been created.' => 'Görünüm oluşturuldu.',
179
+ 'Alter view' => 'Görünümü değiştir',
180
+ 'Create view' => 'Görünüm oluştur',
181
+
182
+ 'Indexes' => 'Dizinler',
183
+ 'Indexes have been altered.' => 'Dizinler değiştirildi.',
184
+ 'Alter indexes' => 'Dizinleri değiştir',
185
+ 'Add next' => 'Bundan sonra ekle',
186
+ 'Index Type' => 'Dizin Türü',
187
+ 'Column (length)' => 'Kolon (uzunluğu)',
188
+
189
+ 'Foreign keys' => 'Dış anahtarlar',
190
+ 'Foreign key' => 'Dış anahtar',
191
+ 'Foreign key has been dropped.' => 'Dış anahtar silindi.',
192
+ 'Foreign key has been altered.' => 'Dış anahtar değiştirildi.',
193
+ 'Foreign key has been created.' => 'Dış anahtar oluşturuldu.',
194
+ 'Target table' => 'Hedef tablo',
195
+ 'Change' => 'Değiştir',
196
+ 'Source' => 'Kaynak',
197
+ 'Target' => 'Hedef',
198
+ 'Add column' => 'Kolon ekle',
199
+ 'Alter' => 'Değiştir',
200
+ 'Add foreign key' => 'Dış anahtar ekle',
201
+ 'ON DELETE' => 'ON DELETE (Hedefteki Kayıt Silinirse)',
202
+ 'ON UPDATE' => 'ON UPDATE (Hedefteki Kayıt Değiştirilirse)',
203
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kaynak ve hedef kolonlar aynı veri türünde olmalı, hedef kolonlarda dizin bulunmalı ve başvurulan veri mevcut olmalı.',
204
+
205
+ 'Triggers' => 'Tetikler',
206
+ 'Add trigger' => 'Tetik ekle',
207
+ 'Trigger has been dropped.' => 'Tetik silindi.',
208
+ 'Trigger has been altered.' => 'Tetik değiştirildi.',
209
+ 'Trigger has been created.' => 'Tetik oluşturuldu.',
210
+ 'Alter trigger' => 'Tetiği değiştir.',
211
+ 'Create trigger' => 'Tetik oluştur',
212
+ 'Time' => 'Zaman',
213
+ 'Event' => 'Olay',
214
+ 'Name' => 'Ad',
215
+
216
+ 'select' => 'seç',
217
+ 'Select' => 'Seç',
218
+ 'Select data' => 'Veri seç',
219
+ 'Functions' => 'Fonksiyonlar',
220
+ 'Aggregation' => 'Kümeleme',
221
+ 'Search' => 'Ara',
222
+ 'anywhere' => 'hiçbir yerde',
223
+ 'Search data in tables' => 'Tablolarda veri ara',
224
+ 'Sort' => 'Sırala',
225
+ 'descending' => 'azalan',
226
+ 'Limit' => 'sınır',
227
+ 'Text length' => 'Yazı uzunluğu',
228
+ 'Action' => 'Eylem',
229
+ 'Full table scan' => 'Tam tablo tarama',
230
+ 'Unable to select the table' => 'Tablo seçilemedi',
231
+ 'No rows.' => 'Kayıt yok.',
232
+ '%d row(s)' => array('%d kayıt', '%d adet kayıt'),
233
+ 'Page' => 'Sayfa',
234
+ 'last' => 'son',
235
+ 'Load more data' => 'Daha fazla veri yükle',
236
+ 'Loading' => 'Yükleniyor',
237
+ 'whole result' => 'tüm sonuç',
238
+ '%d byte(s)' => array('%d bayt', '%d bayt'),
239
+
240
+ 'Import' => 'İçeri Aktar',
241
+ '%d row(s) have been imported.' => array('%d kayıt içeri aktarıldı.', '%d adet kayıt içeri aktarıldı.'),
242
+
243
+ // in-place editing in select
244
+ 'Ctrl+click on a value to modify it.' => 'Bir değeri değiştirmek için üzerine Ctrl+tıklayın.',
245
+ 'Use edit link to modify this value.' => 'Değeri değiştirmek için düzenleme bağlantısını kullanın.',
246
+
247
+ // %s can contain auto-increment value
248
+ 'Item%s has been inserted.' => 'Kayıt%s eklendi.',
249
+ 'Item has been deleted.' => 'Kayıt silindi.',
250
+ 'Item has been updated.' => 'Kayıt güncellendi.',
251
+ '%d item(s) have been affected.' => array('%d kayıt etkilendi.', '%d adet kayıt etkilendi.'),
252
+ 'New item' => 'Yeni kayıt',
253
+ 'original' => 'orijinal',
254
+ // label for value '' in enum data type
255
+ 'empty' => 'boş',
256
+ 'edit' => 'düzenle',
257
+ 'Edit' => 'Düzenle',
258
+ 'Insert' => 'Ekle',
259
+ 'Save' => 'Kaydet',
260
+ 'Save and continue edit' => 'Kaydet ve düzenlemeye devam et',
261
+ 'Save and insert next' => 'Kaydet ve sonrakini ekle',
262
+ 'Clone' => 'Kopyala',
263
+ 'Delete' => 'Sil',
264
+
265
+ 'E-mail' => 'E-posta',
266
+ 'From' => 'Gönderen',
267
+ 'Subject' => 'Konu',
268
+ 'Attachments' => 'Ekler',
269
+ 'Send' => 'Gönder',
270
+ '%d e-mail(s) have been sent.' => array('%d e-posta gönderildi.', '%d adet e-posta gönderildi.'),
271
+
272
+ // data type descriptions
273
+ 'Numbers' => 'Sayılar',
274
+ 'Date and time' => 'Tarih ve zaman',
275
+ 'Strings' => 'Dizge',
276
+ 'Binary' => 'İkili',
277
+ 'Lists' => 'Listeler',
278
+ 'Network' => 'Ağ',
279
+ 'Geometry' => 'Geometri',
280
+ 'Relations' => 'İlişkiler',
281
+
282
+ 'Editor' => 'Düzenleyici',
283
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
284
+ '$1-$3-$5' => '$6.$4.$1',
285
+ // hint for date format - use language equivalents for day, month and year shortcuts
286
+ '[yyyy]-mm-dd' => '[yyyy]-aa-gg',
287
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
288
+ 'HH:MM:SS' => 'SS:DD:ss',
289
+ 'now' => 'şimdi',
290
+ 'yes' => 'evet',
291
+ 'no' => 'hayır',
292
+
293
+ // general SQLite error in create, drop or rename database
294
+ 'File exists.' => 'Dosya zaten mevcut.',
295
+ 'Please use one of the extensions %s.' => '%s uzantılarından birini kullanın.',
296
+
297
+ // PostgreSQL and MS SQL schema support
298
+ 'Alter schema' => 'Şemayı değiştir',
299
+ 'Create schema' => 'Şema oluştur',
300
+ 'Schema has been dropped.' => 'Şema silindi.',
301
+ 'Schema has been created.' => 'Şema oluşturuldu.',
302
+ 'Schema has been altered.' => 'Şema değiştirildi.',
303
+ 'Schema' => 'Şema',
304
+ 'Invalid schema.' => 'Geçersiz şema.',
305
+
306
+ // PostgreSQL sequences support
307
+ 'Sequences' => 'Diziler',
308
+ 'Create sequence' => 'Dizi oluştur',
309
+ 'Sequence has been dropped.' => 'Dizi silindi.',
310
+ 'Sequence has been created.' => 'Dizi oluşturuldu.',
311
+ 'Sequence has been altered.' => 'Dizi değiştirildi.',
312
+ 'Alter sequence' => 'Diziyi değiştir',
313
+
314
+ // PostgreSQL user types support
315
+ 'User types' => 'Kullanıcı türleri',
316
+ 'Create type' => 'Tür oluştur',
317
+ 'Type has been dropped.' => 'Tür silindi.',
318
+ 'Type has been created.' => 'Tür oluşturuldu.',
319
+ 'Alter type' => 'Türü değiştir',
320
+ );
adminer/adminer/adminer/lang/uk.inc.php ADDED
@@ -0,0 +1,317 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Система Бази Даних',
5
+ 'Server' => 'Сервер',
6
+ 'Username' => 'Користувач',
7
+ 'Password' => 'Пароль',
8
+ 'Permanent login' => 'Пам\'ятати сесію',
9
+ 'Login' => 'Увійти',
10
+ 'Logout' => 'Вийти',
11
+ 'Logged as: %s' => 'Ви увійшли як: %s',
12
+ 'Logout successful.' => 'Ви вдало вийшли з системи.',
13
+ 'Invalid credentials.' => 'Неправильні дані входу.',
14
+ 'Language' => 'Мова',
15
+ 'Invalid CSRF token. Send the form again.' => 'Недійсний CSRF токен. Надішліть форму ще раз.',
16
+ 'No extension' => 'Нема розширень',
17
+ 'None of the supported PHP extensions (%s) are available.' => 'Жодне з PHP-розширень (%s), що підтримуються, не доступне.',
18
+ 'Session support must be enabled.' => 'Сесії повинні бути дозволені.',
19
+ 'Session expired, please login again.' => 'Сесія закінчилась, будь ласка, увійдіть в систему знову.',
20
+ '%s version: %s through PHP extension %s' => 'Версія %s: %s з PHP-розширенням %s',
21
+ 'Refresh' => 'Оновити',
22
+
23
+ // text direction - 'ltr' or 'rtl'
24
+ 'ltr' => 'ltr',
25
+
26
+ 'Privileges' => 'Привілеї',
27
+ 'Create user' => 'Створити користувача',
28
+ 'User has been dropped.' => 'Користувача було видалено.',
29
+ 'User has been altered.' => 'Користувача було змінено.',
30
+ 'User has been created.' => 'Користувача було створено.',
31
+ 'Hashed' => 'Хешовано',
32
+ 'Column' => 'Колонка',
33
+ 'Routine' => 'Процедура',
34
+ 'Grant' => 'Дозволити',
35
+ 'Revoke' => 'Заборонити',
36
+
37
+ 'Process list' => 'Перелік процесів',
38
+ '%d process(es) have been killed.' => array('Було завершено %d процес.', 'Було завершено %d процеси.', 'Було завершёно %d процесів.'),
39
+ 'Kill' => 'Завершити процес',
40
+
41
+ 'Variables' => 'Змінні',
42
+ 'Status' => 'Статус',
43
+
44
+ 'SQL command' => 'SQL запит',
45
+ '%d query(s) executed OK.' => array('%d запит виконано успішно.', '%d запити виконано успішно.', '%d запитів виконано успішно.'),
46
+ 'Query executed OK, %d row(s) affected.' => array('Запит виконано успішно, змінено %d рядок.', 'Запит виконано успішно, змінено %d рядки.', 'Запит виконано успішно, змінено %d рядків.'),
47
+ 'No commands to execute.' => 'Нема запитів до виконання.',
48
+ 'Error in query' => 'Помилка в запиті',
49
+ 'Execute' => 'Виконати',
50
+ 'Stop on error' => 'Зупинитись при помилці',
51
+ 'Show only errors' => 'Показувати тільки помилки',
52
+ // sprintf() format for time of the command
53
+ '%.3f s' => '%.3f s',
54
+ 'History' => 'Історія',
55
+ 'Clear' => 'Очистити',
56
+ 'Edit all' => 'Редагувати все',
57
+
58
+ 'File upload' => 'Завантажити файл',
59
+ 'From server' => 'З сервера',
60
+ 'Webserver file %s' => 'Файл %s на вебсервері',
61
+ 'Run file' => 'Запустити файл',
62
+ 'File does not exist.' => 'Файл не існує.',
63
+ 'File uploads are disabled.' => 'Завантаження файлів заборонене.',
64
+ 'Unable to upload a file.' => 'Неможливо завантажити файл.',
65
+ 'Maximum allowed file size is %sB.' => 'Максимально допустимий розмір файлу %sБ.',
66
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Занадто великий об\'єм POST-даних. Зменшіть об\'єм або збільшіть параметр директиви %s конфигурації.',
67
+
68
+ 'Export' => 'Експорт',
69
+ 'Output' => 'Вихідні дані',
70
+ 'open' => 'відкрити',
71
+ 'save' => 'зберегти',
72
+ 'Format' => 'Формат',
73
+ 'Data' => 'Дані',
74
+
75
+ 'Database' => 'База даних',
76
+ 'database' => 'база даних',
77
+ 'Use' => 'Обрати',
78
+ 'Select database' => 'Обрати базу даних',
79
+ 'Invalid database.' => 'Погана база даних.',
80
+ 'Create new database' => 'Створити нову базу даних',
81
+ 'Database has been dropped.' => 'Базу даних було видалено.',
82
+ 'Databases have been dropped.' => 'Бази даних були видалені.',
83
+ 'Database has been created.' => 'Базу даних було створено.',
84
+ 'Database has been renamed.' => 'Базу даних було переіменовано.',
85
+ 'Database has been altered.' => 'Базу даних було змінено.',
86
+ 'Alter database' => 'Змінити базу даних',
87
+ 'Create database' => 'Створити базу даних',
88
+ 'Database schema' => 'Схема бази даних',
89
+
90
+ // link to current database schema layout
91
+ 'Permanent link' => 'Постійне посилання',
92
+
93
+ // thousands separator - must contain single byte
94
+ ',' => ' ',
95
+ '0123456789' => '0123456789',
96
+ 'Engine' => 'Рушій',
97
+ 'Collation' => 'Співставлення',
98
+ 'Data Length' => 'Об\'єм даних',
99
+ 'Index Length' => 'Об\'єм індексів',
100
+ 'Data Free' => 'Вільне місце',
101
+ 'Rows' => 'Рядків',
102
+ '%d in total' => '%d всього',
103
+ 'Analyze' => 'Аналізувати',
104
+ 'Optimize' => 'Оптимізувати',
105
+ 'Check' => 'Перевірити',
106
+ 'Repair' => 'Виправити',
107
+ 'Truncate' => 'Очистити',
108
+ 'Tables have been truncated.' => 'Таблиці було очищено.',
109
+ 'Move to other database' => 'Перенести до іншої бази даних',
110
+ 'Move' => 'Перенести',
111
+ 'Tables have been moved.' => 'Таблиці було перенесено.',
112
+ 'Copy' => 'копіювати',
113
+ 'Tables have been copied.' => 'Таблиці було зкопійовано.',
114
+
115
+ 'Routines' => 'Збережені процедури',
116
+ 'Routine has been called, %d row(s) affected.' => array('Була викликана процедура, %d запис було змінено.', 'Була викликана процедура, %d записи було змінено.', 'Була викликана процедура, %d записів було змінено.'),
117
+ 'Call' => 'Викликати',
118
+ 'Parameter name' => 'Назва параметра',
119
+ 'Create procedure' => 'Створити процедуру',
120
+ 'Create function' => 'Створити функцію',
121
+ 'Routine has been dropped.' => 'Процедуру було видалено.',
122
+ 'Routine has been altered.' => 'Процедуру було змінено.',
123
+ 'Routine has been created.' => 'Процедуру було створено.',
124
+ 'Alter function' => 'Змінити функцію',
125
+ 'Alter procedure' => 'Змінити процедуру',
126
+ 'Return type' => 'Тип, що повернеться',
127
+
128
+ 'Events' => 'Події',
129
+ 'Event has been dropped.' => 'Подію було видалено.',
130
+ 'Event has been altered.' => 'Подію було змінено.',
131
+ 'Event has been created.' => 'Подію було створено.',
132
+ 'Alter event' => 'Змінити подію',
133
+ 'Create event' => 'Створити подію',
134
+ 'At given time' => 'В даний час',
135
+ 'Every' => 'Кожного',
136
+ 'Schedule' => 'Розклад',
137
+ 'Start' => 'Початок',
138
+ 'End' => 'Кінець',
139
+ 'On completion preserve' => 'Після завершення зберегти',
140
+
141
+ 'Tables' => 'Таблиці',
142
+ 'Tables and views' => 'Таблиці і вигляди',
143
+ 'Table' => 'Таблиця',
144
+ 'No tables.' => 'Нема таблиць.',
145
+ 'Alter table' => 'Змінити таблицю',
146
+ 'Create table' => 'Створити таблицю',
147
+ 'Table has been dropped.' => 'Таблицю було видалено.',
148
+ 'Tables have been dropped.' => 'Таблиці були видалені.',
149
+ 'Tables have been optimized.' => 'Таблиці були оптимізовані.',
150
+ 'Table has been altered.' => 'Таблица була змінена.',
151
+ 'Table has been created.' => 'Таблиця була створена.',
152
+ 'Table name' => 'Назва таблиці',
153
+ 'Show structure' => 'Показати структуру',
154
+ 'engine' => 'рушій',
155
+ 'collation' => 'співставлення',
156
+ 'Column name' => 'Назва стовпця',
157
+ 'Type' => 'Тип',
158
+ 'Length' => 'Довжина',
159
+ 'Auto Increment' => 'Автоматичне збільшення',
160
+ 'Options' => 'Опції',
161
+ 'Comment' => 'Коментарі',
162
+ 'Default values' => 'Значення за замовчуванням',
163
+ 'Drop' => 'Видалити',
164
+ 'Are you sure?' => 'Ви впевнені?',
165
+ 'Move up' => 'Пересунути вгору',
166
+ 'Move down' => 'Пересунути вниз',
167
+ 'Remove' => 'Видалити',
168
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Досягнута максимальна кількість доступних полів. Будь ласка, збільшіть %s.',
169
+
170
+ 'Partition by' => 'Розділити по',
171
+ 'Partitions' => 'Розділи',
172
+ 'Partition name' => 'Назва розділу',
173
+ 'Values' => 'Значення',
174
+
175
+ 'View' => 'Вигляд',
176
+ 'View has been dropped.' => 'Вигляд було видалено.',
177
+ 'View has been altered.' => 'Вигляд було змінено.',
178
+ 'View has been created.' => 'Вигляд було створено.',
179
+ 'Alter view' => 'Змінити вигляд',
180
+ 'Create view' => 'Створити вигляд',
181
+
182
+ 'Indexes' => 'Індекси',
183
+ 'Indexes have been altered.' => 'Індексування було змінено.',
184
+ 'Alter indexes' => 'Змінити індексування',
185
+ 'Add next' => 'Додати ще',
186
+ 'Index Type' => 'Тип індексу',
187
+ 'Column (length)' => 'Стовпець (довжина)',
188
+
189
+ 'Foreign keys' => 'Зовнішні ключі',
190
+ 'Foreign key' => 'Зовнішній ключ',
191
+ 'Foreign key has been dropped.' => 'Зовнішній ключ було видалено.',
192
+ 'Foreign key has been altered.' => 'Зовнішній ключ було змінено.',
193
+ 'Foreign key has been created.' => 'Зовнішній ключ було створено.',
194
+ 'Target table' => 'Цільова таблиця',
195
+ 'Change' => 'Змінити',
196
+ 'Source' => 'Джерело',
197
+ 'Target' => 'Ціль',
198
+ 'Add column' => 'Додати стовпець',
199
+ 'Alter' => 'Змінити',
200
+ 'Add foreign key' => 'Додати зовнішній ключ',
201
+ 'ON DELETE' => 'ПРИ ВИДАЛЕННІ',
202
+ 'ON UPDATE' => 'ПРИ ЗМІНІ',
203
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Стовпці повинні мати той самий тип даних, цільові стовпці повинні бути проіндексовані і дані, на які посилаються повинні існувати.',
204
+
205
+ 'Triggers' => 'Тригери',
206
+ 'Add trigger' => 'Додати тригер',
207
+ 'Trigger has been dropped.' => 'Тригер було видалено.',
208
+ 'Trigger has been altered.' => 'Тригер було змінено.',
209
+ 'Trigger has been created.' => 'Тригер було створено.',
210
+ 'Alter trigger' => 'Змінити тригер',
211
+ 'Create trigger' => 'Створити тригер',
212
+ 'Time' => 'Час',
213
+ 'Event' => 'Подія',
214
+ 'Name' => 'Назва',
215
+
216
+ 'select' => 'вибрати',
217
+ 'Select' => 'Вибрати',
218
+ 'Select data' => 'Вибрати дані',
219
+ 'Functions' => 'Функції',
220
+ 'Aggregation' => 'Агрегація',
221
+ 'Search' => 'Пошук',
222
+ 'anywhere' => 'будь-де',
223
+ 'Search data in tables' => 'Шукати дані в таблицях',
224
+ 'Sort' => 'Сортувати',
225
+ 'descending' => 'по спаданню',
226
+ 'Limit' => 'Обмеження',
227
+ 'Text length' => 'Довжина тексту',
228
+ 'Action' => 'Дія',
229
+ 'Unable to select the table' => 'Неможливо вибрати таблицю',
230
+ 'No rows.' => 'Нема рядків.',
231
+ '%d row(s)' => array('%d рядок', '%d рядки', '%d рядків'),
232
+ 'Page' => 'Сторінка',
233
+ 'last' => 'остання',
234
+ 'whole result' => 'весь результат',
235
+ '%d byte(s)' => array('%d байт', '%d байта', '%d байтів'),
236
+
237
+ 'Import' => 'Імпортувати',
238
+ '%d row(s) have been imported.' => array('%d рядок було імпортовано.', '%d рядки було імпортовано.', '%d рядків було імпортовано.'),
239
+
240
+ // in-place editing in select
241
+ 'Ctrl+click on a value to modify it.' => 'Ctrl+клікніть на значенні щоб змінити його.',
242
+ 'Use edit link to modify this value.' => 'Використовуйте посилання щоб змінити це значення.',
243
+
244
+ // %s can contain auto-increment value
245
+ 'Item%s has been inserted.' => 'Запис%s було вставлено.',
246
+ 'Item has been deleted.' => 'Запис було видалено.',
247
+ 'Item has been updated.' => 'Запис було змінено.',
248
+ '%d item(s) have been affected.' => array('Було змінено %d запис.', 'Було змінено %d записи.', 'Було змінено %d записів.'),
249
+ 'New item' => 'Новий запис',
250
+ 'original' => 'початковий',
251
+ // label for value '' in enum data type
252
+ 'empty' => 'порожньо',
253
+ 'edit' => 'редагувати',
254
+ 'Edit' => 'Редагувати',
255
+ 'Insert' => 'Вставити',
256
+ 'Save' => 'Зберегти',
257
+ 'Save and continue edit' => 'Зберегти і продовжити редагування',
258
+ 'Save and insert next' => 'Зберегти і вставити знову',
259
+ 'Clone' => 'Клонувати',
260
+ 'Delete' => 'Видалити',
261
+
262
+ 'E-mail' => 'E-mail',
263
+ 'From' => 'Від',
264
+ 'Subject' => 'Заголовок',
265
+ 'Attachments' => 'Додатки',
266
+ 'Send' => 'Надіслати',
267
+ '%d e-mail(s) have been sent.' => array('Було надіслано %d повідомлення.', 'Було надіслано %d повідомлення.', 'Було надіслано %d повідомлень.'),
268
+
269
+ // data type descriptions
270
+ 'Numbers' => 'Числа',
271
+ 'Date and time' => 'Дата і час',
272
+ 'Strings' => 'Радки',
273
+ 'Binary' => 'Двійкові',
274
+ 'Lists' => 'Списки',
275
+ 'Network' => 'Мережа',
276
+ 'Geometry' => 'Геометрія',
277
+ 'Relations' => 'Зв\'язки',
278
+
279
+ 'Editor' => 'Редактор',
280
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
281
+ '$1-$3-$5' => '$5.$3.$1',
282
+ // hint for date format - use language equivalents for day, month and year shortcuts
283
+ '[yyyy]-mm-dd' => 'дд.мм.[рррр]',
284
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
285
+ 'HH:MM:SS' => 'ГГ:ХХ:СС',
286
+ 'now' => 'зараз',
287
+ 'yes' => 'так',
288
+ 'no' => 'ні',
289
+
290
+ // general SQLite error in create, drop or rename database
291
+ 'File exists.' => 'Файл існує.',
292
+ 'Please use one of the extensions %s.' => 'Будь ласка, використовуйте одне з розширень %s.',
293
+
294
+ // PostgreSQL and MS SQL schema support
295
+ 'Alter schema' => 'Змінити схему',
296
+ 'Create schema' => 'Створити схему',
297
+ 'Schema has been dropped.' => 'Схему було видалено.',
298
+ 'Schema has been created.' => 'Схему було створено.',
299
+ 'Schema has been altered.' => 'Схему було змінено.',
300
+ 'Schema' => 'Схема',
301
+ 'Invalid schema.' => 'Невірна схема.',
302
+
303
+ // PostgreSQL sequences support
304
+ 'Sequences' => 'Послідовності',
305
+ 'Create sequence' => 'Створити послідовність',
306
+ 'Sequence has been dropped.' => 'Послідовність було видалено.',
307
+ 'Sequence has been created.' => 'Послідовність було створено.',
308
+ 'Sequence has been altered.' => 'Послідовність було змінено.',
309
+ 'Alter sequence' => 'Змінити послідовність',
310
+
311
+ // PostgreSQL user types support
312
+ 'User types' => 'Типи користувачів',
313
+ 'Create type' => 'Створити тип',
314
+ 'Type has been dropped.' => 'Тип було видалено.',
315
+ 'Type has been created.' => 'Тип було створено.',
316
+ 'Alter type' => 'Змінити тип',
317
+ );
adminer/adminer/adminer/lang/vi.inc.php ADDED
@@ -0,0 +1,329 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Hệ thống',
5
+ 'Server' => 'Máy chủ',
6
+ 'Username' => 'Tên người dùng',
7
+ 'Password' => 'Mật khẩu',
8
+ 'Permanent login' => 'Giữ đăng nhập một thời gian',
9
+ 'Login' => 'Đăng nhập',
10
+ 'Logout' => 'Thoát',
11
+ 'Logged as: %s' => 'Vào dưới tên: %s',
12
+ 'Logout successful.' => 'Đã thoát xong.',
13
+ 'Invalid credentials.' => 'Tài khoản sai.',
14
+ 'Too many unsuccessful logins, try again in %d minute(s).' => 'Bạn gõ sai tài khoản quá nhiều lần, hãy thử lại sau %d phút nữa.',
15
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Mật khẩu đã hết hạn. <a href="https://www.adminer.org/en/extension/" target="_blank">Thử cách làm</a> để giữ cố định.',
16
+ 'Language' => 'Ngôn ngữ',
17
+ 'Invalid CSRF token. Send the form again.' => 'Mã kiểm tra CSRF sai, hãy nhập lại biểu mẫu.',
18
+ 'No extension' => 'Không có phần mở rộng',
19
+ 'None of the supported PHP extensions (%s) are available.' => 'Bản cài đặt PHP thiếu hỗ trợ cho %s.',
20
+ 'Session support must be enabled.' => 'Cần phải bật session.',
21
+ 'Session expired, please login again.' => 'Phiên làm việc đã hết, hãy đăng nhập lại.',
22
+ '%s version: %s through PHP extension %s' => 'Phiên bản %s: %s (PHP extension: %s)',
23
+ 'Refresh' => 'Làm mới',
24
+
25
+ // text direction - 'ltr' or 'rtl'
26
+ 'ltr' => 'ltr',
27
+
28
+ 'Privileges' => 'Quyền truy cập',
29
+ 'Create user' => 'Tạo người dùng',
30
+ 'User has been dropped.' => 'Đã xoá người dùng.',
31
+ 'User has been altered.' => 'Đã sửa người dùng.',
32
+ 'User has been created.' => 'Đã tạo người dùng.',
33
+ 'Hashed' => 'Mã hoá',
34
+ 'Column' => 'Cột',
35
+ 'Routine' => 'Hàm tích hợp',
36
+ 'Grant' => 'Cấp quyền',
37
+ 'Revoke' => 'Tước quyền',
38
+
39
+ 'Process list' => 'Danh sách tiến trình',
40
+ '%d process(es) have been killed.' => '%d tiến trình đã dừng.',
41
+ 'Kill' => 'Dừng',
42
+
43
+ 'Variables' => 'Biến',
44
+ 'Status' => 'Trạng thái',
45
+
46
+ 'SQL command' => 'Câu lệnh SQL',
47
+ '%d query(s) executed OK.' => '%d câu lệnh đã chạy thành công.',
48
+ 'Query executed OK, %d row(s) affected.' => 'Đã thực hiện xong, ảnh hưởng đến %d dòng.',
49
+ 'No commands to execute.' => 'Chẳng có gì để thực hiện!.',
50
+ 'Error in query' => 'Có lỗi trong câu lệnh',
51
+ 'Execute' => 'Thực hiện',
52
+ 'Stop on error' => 'Dừng khi có lỗi',
53
+ 'Show only errors' => 'Chỉ hiện lỗi',
54
+ // sprintf() format for time of the command
55
+ '%.3f s' => '%.3f s',
56
+ 'History' => 'Lịch sử',
57
+ 'Clear' => 'Xoá',
58
+ 'Edit all' => 'Sửa tất cả',
59
+
60
+ 'File upload' => 'Tải tệp lên',
61
+ 'From server' => 'Dùng tệp trên máy chủ',
62
+ 'Webserver file %s' => 'Tệp trên máy chủ',
63
+ 'Run file' => 'Chạy tệp',
64
+ 'File does not exist.' => 'Tệp không tồn tại.',
65
+ 'File uploads are disabled.' => 'Chức năng tải tệp lên đã bị cấm.',
66
+ 'Unable to upload a file.' => 'Không thể tải tệp lên.',
67
+ 'Maximum allowed file size is %sB.' => 'Kích thước tệp tối đa là %sB.',
68
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Dữ liệu tải lên/POST quá lớn. Hãy giảm kích thước tệp hoặc tăng cấu hình (hiện tại %s).',
69
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Bạn có thể tải tệp lên dùng FTP và nhập vào cơ sở dữ liệu.',
70
+
71
+ 'Export' => 'Xuất',
72
+ 'Output' => 'Kết quả',
73
+ 'open' => 'xem',
74
+ 'save' => 'lưu',
75
+ 'Format' => 'Định dạng',
76
+ 'Data' => 'Dữ liệu',
77
+
78
+ 'Database' => 'Cơ sở dữ liệu',
79
+ 'database' => 'cơ sở dữ liệu',
80
+ 'Use' => 'Sử dụng',
81
+ 'Select database' => 'Chọn CSDL',
82
+ 'Invalid database.' => 'CSDL sai.',
83
+ 'Create new database' => 'Tạo CSDL',
84
+ 'Database has been dropped.' => 'CSDL đã bị xoá.',
85
+ 'Databases have been dropped.' => 'Các CSDL đã bị xoá.',
86
+ 'Database has been created.' => 'Đã tạo CSDL.',
87
+ 'Database has been renamed.' => 'Đã đổi tên CSDL.',
88
+ 'Database has been altered.' => 'Đã thay đổi CSDL.',
89
+ 'Alter database' => 'Thay đổi CSDL',
90
+ 'Create database' => 'Tạo CSDL',
91
+ 'Database schema' => 'Cấu trúc CSDL',
92
+
93
+ // link to current database schema layout
94
+ 'Permanent link' => 'Liên kết cố định',
95
+
96
+ // thousands separator - must contain single byte
97
+ ',' => ',',
98
+ '0123456789' => '0123456789',
99
+ 'Engine' => 'Cơ chế lưu trữ',
100
+ 'Collation' => 'Bộ mã',
101
+ 'Data Length' => 'Kích thước dữ liệu',
102
+ 'Index Length' => 'Kích thước chỉ mục',
103
+ 'Data Free' => 'Dữ liệu trống',
104
+ 'Rows' => 'Số dòng',
105
+ '%d in total' => '%s',
106
+ 'Analyze' => 'Phân tích',
107
+ 'Optimize' => 'Tối ưu',
108
+ 'Vacuum' => 'Dọn dẹp',
109
+ 'Check' => 'Kiểm tra',
110
+ 'Repair' => 'Sửa chữa',
111
+ 'Truncate' => 'Làm rỗng',
112
+ 'Tables have been truncated.' => 'Bảng đã bị làm rỗng.',
113
+ 'Move to other database' => 'Chuyển tới cơ sở dữ liệu khác',
114
+ 'Move' => 'Chuyển đi',
115
+ 'Tables have been moved.' => 'Bảng.',
116
+ 'Copy' => 'Sao chép',
117
+ 'Tables have been copied.' => 'Bảng đã được sao chép.',
118
+
119
+ 'Routines' => 'Routines',
120
+ 'Routine has been called, %d row(s) affected.' => 'Đã chạy routine, thay đổi %d dòng.',
121
+ 'Call' => 'Gọi',
122
+ 'Parameter name' => 'Tham số',
123
+ 'Create procedure' => 'Tạo lệnh',
124
+ 'Create function' => 'Tạo hàm',
125
+ 'Routine has been dropped.' => 'Đã xoá routine.',
126
+ 'Routine has been altered.' => 'Đã thay đổi routine.',
127
+ 'Routine has been created.' => 'Đã tạo routine.',
128
+ 'Alter function' => 'Thay đổi hàm',
129
+ 'Alter procedure' => 'Thay đổi thủ tục',
130
+ 'Return type' => 'Giá trị trả về',
131
+ 'Events' => 'Sự kiện',
132
+ 'Event has been dropped.' => 'Đã xoá sự kiện.',
133
+ 'Event has been altered.' => 'Đã thay đổi sự kiện.',
134
+ 'Event has been created.' => 'Đã tạo sự kiện.',
135
+ 'Alter event' => 'Sửa sự kiện',
136
+ 'Create event' => 'Tạo sự kiện',
137
+ 'At given time' => 'Vào thời gian xác định',
138
+ 'Every' => 'Mỗi',
139
+ 'Schedule' => 'Đặt lịch',
140
+ 'Start' => 'Bắt đầu',
141
+ 'End' => 'Kết thúc',
142
+ 'On completion preserve' => 'Khi kết thúc, duy trì',
143
+
144
+ 'Tables' => 'Các bảng',
145
+ 'Tables and views' => 'Bảng và khung nhìn',
146
+ 'Table' => 'Bảng',
147
+ 'No tables.' => 'Không có bảng nào.',
148
+ 'Alter table' => 'Sửa bảng',
149
+ 'Create table' => 'Tạo bảng',
150
+ 'Table has been dropped.' => 'Bảng đã bị xoá.',
151
+ 'Tables have been dropped.' => 'Các bảng đã bị xoá.',
152
+ 'Tables have been optimized.' => 'Bảng đã được tối ưu.',
153
+ 'Table has been altered.' => 'Bảng đã thay đổi.',
154
+ 'Table has been created.' => 'Bảng đã được tạo.',
155
+ 'Table name' => 'Tên bảng',
156
+ 'Show structure' => 'Hiện cấu trúc',
157
+ 'engine' => 'cơ chế lưu trữ',
158
+ 'collation' => 'bảng mã',
159
+ 'Column name' => 'Tên cột',
160
+ 'Type' => 'Loại',
161
+ 'Length' => 'Độ dài',
162
+ 'Auto Increment' => 'Tăng tự động',
163
+ 'Options' => 'Tuỳ chọn',
164
+ 'Comment' => 'Chú thích',
165
+ 'Default values' => 'Giá trị mặc định',
166
+ 'Drop' => 'Xoá',
167
+ 'Are you sure?' => 'Bạn có chắc',
168
+ 'Size' => 'Kích thước',
169
+ 'Compute' => 'Tính',
170
+ 'Move up' => 'Chuyển lên trên',
171
+ 'Move down' => 'Chuyển xuống dưới',
172
+ 'Remove' => 'Xoá',
173
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Thiết lập %s cần tăng thêm. (Đã vượt giới hạnố trường tối đa cho phép trong một biểu mẫu).',
174
+
175
+ 'Partition by' => 'Phân chia bằng',
176
+ 'Partitions' => 'Phân hoạch',
177
+ 'Partition name' => 'Tên phân hoạch',
178
+ 'Values' => 'Giá trị',
179
+
180
+ 'View' => 'Khung nhìn',
181
+ 'View has been dropped.' => 'Khung nhìn đã bị xoá.',
182
+ 'View has been altered.' => 'Khung nhìn đã được sửa.',
183
+ 'View has been created.' => 'Khung nhìn đã được tạo.',
184
+ 'Alter view' => 'Sửa khung nhìn',
185
+ 'Create view' => 'Tạo khung nhìn',
186
+
187
+ 'Indexes' => 'Chỉ mục',
188
+ 'Indexes have been altered.' => 'Chỉ mục đã được sửa.',
189
+ 'Alter indexes' => 'Sửa chỉ mục',
190
+ 'Add next' => 'Thêm tiếp',
191
+ 'Index Type' => 'Loại chỉ mục',
192
+ 'Column (length)' => 'Cột (độ dài)',
193
+
194
+ 'Foreign keys' => 'Các khoá ngoại',
195
+ 'Foreign key' => 'Khoá ngoại',
196
+ 'Foreign key has been dropped.' => 'Khoá ngoại đã bị xoá.',
197
+ 'Foreign key has been altered.' => 'Khoá ngoại đã được sửa.',
198
+ 'Foreign key has been created.' => 'Khoá ngoại đã được tạo.',
199
+ 'Target table' => 'Bảng đích',
200
+ 'Change' => 'Thay đổi',
201
+ 'Source' => 'Nguồn',
202
+ 'Target' => 'Đích',
203
+ 'Add column' => 'Thêm cột',
204
+ 'Alter' => 'Sửa',
205
+ 'Add foreign key' => 'Thêm khoá ngoại',
206
+ 'ON DELETE' => 'Khi xoá',
207
+ 'ON UPDATE' => 'Khi cập nhật',
208
+ '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.',
209
+
210
+ 'Triggers' => 'xx',
211
+ 'Add trigger' => 'xx',
212
+ 'Trigger has been dropped.' => 'Đã xoá phản xạ.',
213
+ 'Trigger has been altered.' => 'Đã sửa phản xạ.',
214
+ 'Trigger has been created.' => 'Đã tạo phản xạ.',
215
+ 'Alter trigger' => 'Sửa phản xạ',
216
+ 'Create trigger' => 'Tạo phản xạ',
217
+ 'Time' => 'Thời gian',
218
+ 'Event' => 'Sự kiện',
219
+ 'Name' => 'Tên',
220
+
221
+ 'select' => 'xem',
222
+ 'Select' => 'Xem',
223
+ 'Select data' => 'Xem dữ liệu',
224
+ 'Functions' => 'Các chức năng',
225
+ 'Aggregation' => 'Tổng hợp',
226
+ 'Search' => 'Tìm kiếm',
227
+ 'anywhere' => 'bất cứ đâu',
228
+ 'Search data in tables' => 'Tìm kiếm dữ liệu trong các bảng',
229
+ 'Sort' => 'Sắp xếp',
230
+ 'descending' => 'giảm dần',
231
+ 'Limit' => 'Giới hạn',
232
+ 'Text length' => 'Chiều dài văn bản',
233
+ 'Action' => 'Hành động',
234
+ 'Full table scan' => 'Quét toàn bộ bảng',
235
+ 'Unable to select the table' => 'Không thể xem dữ liệu',
236
+ 'No rows.' => 'Không có dòng dữ liệu nào.',
237
+ '%d row(s)' => '%s dòng',
238
+ 'Page' => 'trang',
239
+ 'last' => 'cuối',
240
+ 'Load more data' => 'Xem thêm dữ liệu',
241
+ 'Loading' => 'Đang nạp',
242
+ 'whole result' => 'toàn bộ kết quả',
243
+ '%d byte(s)' => '%d byte(s)',
244
+
245
+ 'Import' => 'Nhập khẩu',
246
+ '%d row(s) have been imported.' => 'Đã nhập % dòng dữ liệu.',
247
+ 'File must be in UTF-8 encoding.' => 'Tệp phải mã hoá bằng chuẩn UTF-8.',
248
+
249
+ // in-place editing in select
250
+ 'Modify' => 'Sửa',
251
+ 'Ctrl+click on a value to modify it.' => 'Nhấn Ctrl và bấm vào giá trị để sửa.',
252
+ 'Use edit link to modify this value.' => 'Dùng nút sửa để thay đổi giá trị này.',
253
+
254
+ // %s can contain auto-increment value
255
+ 'Item%s has been inserted.' => 'Đã thêm%s.',
256
+ 'Item has been deleted.' => 'Đã xoá.',
257
+ 'Item has been updated.' => 'Đã cập nhật.',
258
+ '%d item(s) have been affected.' => '%d phần đã thay đổi.',
259
+ 'New item' => 'Thêm',
260
+ 'original' => 'bản gốc',
261
+ // label for value '' in enum data type
262
+ 'empty' => 'trống',
263
+ 'edit' => 'sửa',
264
+ 'Edit' => 'Sửa',
265
+ 'Insert' => 'Thêm',
266
+ 'Save' => 'Lưu',
267
+ 'Save and continue edit' => 'Lưu và tiếp tục sửa',
268
+ 'Save and insert next' => 'Lưu và thêm tiếp',
269
+ 'Selected' => 'Chọn',
270
+ 'Clone' => 'Sao chép',
271
+ 'Delete' => 'Xoá',
272
+ 'You have no privileges to update this table.' => 'Bạn không có quyền sửa bảng này.',
273
+
274
+ 'E-mail' => 'Địa chỉ email',
275
+ 'From' => 'Người gửi',
276
+ 'Subject' => 'Chủ đề',
277
+ 'Attachments' => 'Đính kèm',
278
+ 'Send' => 'Gửi',
279
+ '%d e-mail(s) have been sent.' => '%d thư đã gửi.',
280
+
281
+ // data type descriptions
282
+ 'Numbers' => 'Số',
283
+ 'Date and time' => 'Ngày giờ',
284
+ 'Strings' => 'Chuỗi',
285
+ 'Binary' => 'Mã máy',
286
+ 'Lists' => 'Danh sách',
287
+ 'Network' => 'Mạng',
288
+ 'Geometry' => 'Toạ độ',
289
+ 'Relations' => 'Quan hệ',
290
+
291
+ 'Editor' => 'Biên tập',
292
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
293
+ '$1-$3-$5' => '$1-$3-$5',
294
+ // hint for date format - use language equivalents for day, month and year shortcuts
295
+ '[yyyy]-mm-dd' => '[yyyy]-mm-dd',
296
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
297
+ 'HH:MM:SS' => 'HH:MM:SS',
298
+ 'now' => 'hiện tại',
299
+ 'yes' => 'có',
300
+ 'no' => 'không',
301
+
302
+ // general SQLite error in create, drop or rename database
303
+ 'File exists.' => 'Tệp đã có rồi.',
304
+ 'Please use one of the extensions %s.' => 'Cần phải dùng một trong các phần mở rộng sau: %s.',
305
+
306
+ // PostgreSQL and MS SQL schema support
307
+ 'Alter schema' => 'Thay đổi schema',
308
+ 'Create schema' => 'Tạo schema',
309
+ 'Schema has been dropped.' => 'Đã xoá schema.',
310
+ 'Schema has been created.' => 'Đã tạo schema.',
311
+ 'Schema has been altered.' => 'Đã thay đổi schema.',
312
+ 'Schema' => 'schema',
313
+ 'Invalid schema.' => 'Schema khong hợp lệ.',
314
+
315
+ // PostgreSQL sequences support
316
+ 'Sequences' => 'Dãy số',
317
+ 'Create sequence' => 'Tạo đãy số',
318
+ 'Sequence has been dropped.' => 'Dãy số đã bị xoá.',
319
+ 'Sequence has been created.' => 'Đã tạo dãy số.',
320
+ 'Sequence has been altered.' => 'Đã sửa dãy số.',
321
+ 'Alter sequence' => 'Thay đổi dãy số',
322
+
323
+ // PostgreSQL user types support
324
+ 'User types' => 'Kiểu tự định nghĩa',
325
+ 'Create type' => 'Tạo kiểu',
326
+ 'Type has been dropped.' => 'Đã xoá kiểu.',
327
+ 'Type has been created.' => 'Đã tạo kiểu.',
328
+ 'Alter type' => 'Sửa kiểu dữ liệu',
329
+ );
adminer/adminer/adminer/lang/xx.inc.php ADDED
@@ -0,0 +1,340 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $translations = array(
3
+ // label for database system selection (MySQL, SQLite, ...)
4
+ 'System' => 'Xx',
5
+ 'Server' => 'Xx',
6
+ 'Username' => 'Xx',
7
+ 'Password' => 'Xx',
8
+ 'Permanent login' => 'Xx',
9
+ 'Login' => 'Xx',
10
+ 'Logout' => 'Xx',
11
+ 'Logged as: %s' => 'Xx',
12
+ 'Logout successful.' => 'Xx.',
13
+ 'Invalid credentials.' => 'Xx.',
14
+ 'Implement %s method to use SQLite.' => 'Xx.',
15
+ 'Too many unsuccessful logins, try again in %d minute(s).' => array('Xx.', 'Xx.'),
16
+ 'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Xx.',
17
+ 'Language' => 'Xx',
18
+ 'Invalid CSRF token. Send the form again.' => 'Xx.',
19
+ 'If you did not send this request from Adminer then close this page.' => 'Xx.',
20
+ 'No extension' => 'Xx',
21
+ 'None of the supported PHP extensions (%s) are available.' => 'Xx.',
22
+ 'Session support must be enabled.' => 'Xx.',
23
+ 'Session expired, please login again.' => 'Xx.',
24
+ '%s version: %s through PHP extension %s' => 'Xx',
25
+ 'Refresh' => 'Xx',
26
+
27
+ // text direction - 'ltr' or 'rtl'
28
+ 'ltr' => 'xx',
29
+
30
+ 'Privileges' => 'Xx',
31
+ 'Create user' => 'Xx',
32
+ 'User has been dropped.' => 'Xx.',
33
+ 'User has been altered.' => 'Xx.',
34
+ 'User has been created.' => 'Xx.',
35
+ 'Hashed' => 'Xx',
36
+ 'Column' => 'Xx',
37
+ 'Routine' => 'Xx',
38
+ 'Grant' => 'Xx',
39
+ 'Revoke' => 'Xx',
40
+
41
+ 'Process list' => 'Xx',
42
+ '%d process(es) have been killed.' => array('Xx.', 'Xx.'),
43
+ 'Kill' => 'Xx',
44
+
45
+ 'Variables' => 'Xx',
46
+ 'Status' => 'Xx',
47
+
48
+ 'SQL command' => 'Xx',
49
+ '%d query(s) executed OK.' => array('Xx.', 'Xx.'),
50
+ 'Query executed OK, %d row(s) affected.' => array('Xx.', 'Xx.'),
51
+ 'No commands to execute.' => 'Xx.',
52
+ 'Error in query' => 'Xx',
53
+ 'ATTACH queries are not supported.' => 'Xx.',
54
+ 'Execute' => 'Xx',
55
+ 'Stop on error' => 'Xx',
56
+ 'Show only errors' => 'Xx',
57
+ // sprintf() format for time of the command
58
+ '%.3f s' => 'xx',
59
+ 'History' => 'Xx',
60
+ 'Clear' => 'Xx',
61
+ 'Edit all' => 'Xx',
62
+
63
+ 'File upload' => 'Xx',
64
+ 'From server' => 'Xx',
65
+ 'Webserver file %s' => 'Xx',
66
+ 'Run file' => 'Xx',
67
+ 'File does not exist.' => 'Xx.',
68
+ 'File uploads are disabled.' => 'Xx.',
69
+ 'Unable to upload a file.' => 'Xx.',
70
+ 'Maximum allowed file size is %sB.' => 'Xx.',
71
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Xx.',
72
+ 'You can upload a big SQL file via FTP and import it from server.' => 'Xx.',
73
+ 'You are offline.' => 'Xx.',
74
+
75
+ 'Export' => 'Xx',
76
+ 'Output' => 'Xx',
77
+ 'open' => 'xx',
78
+ 'save' => 'xx',
79
+ 'Saving' => 'Xx',
80
+ 'Format' => 'Xx',
81
+ 'Data' => 'Xx',
82
+
83
+ 'Database' => 'Xx',
84
+ 'database' => 'xx',
85
+ 'Use' => 'Xx',
86
+ 'Select database' => 'Xx',
87
+ 'Invalid database.' => 'Xx.',
88
+ 'Create new database' => 'Xx',
89
+ 'Database has been dropped.' => 'Xx.',
90
+ 'Databases have been dropped.' => 'Xx.',
91
+ 'Database has been created.' => 'Xx.',
92
+ 'Database has been renamed.' => 'Xx.',
93
+ 'Database has been altered.' => 'Xx.',
94
+ 'Alter database' => 'Xx',
95
+ 'Create database' => 'Xx',
96
+ 'Database schema' => 'Xx',
97
+
98
+ // link to current database schema layout
99
+ 'Permanent link' => 'Xx',
100
+
101
+ // thousands separator - must contain single byte
102
+ ',' => 'x',
103
+ '0123456789' => 'xxxxxxxxxx',
104
+ 'Engine' => 'Xx',
105
+ 'Collation' => 'Xx',
106
+ 'Data Length' => 'Xx',
107
+ 'Index Length' => 'Xx',
108
+ 'Data Free' => 'Xx',
109
+ 'Rows' => 'Xx',
110
+ '%d in total' => 'xx',
111
+ 'Analyze' => 'Xx',
112
+ 'Optimize' => 'Xx',
113
+ 'Vacuum' => 'Xx',
114
+ 'Check' => 'Xx',
115
+ 'Repair' => 'Xx',
116
+ 'Truncate' => 'Xx',
117
+ 'Tables have been truncated.' => 'Xx.',
118
+ 'Move to other database' => 'Xx',
119
+ 'Move' => 'Xx',
120
+ 'Tables have been moved.' => 'Xx.',
121
+ 'Copy' => 'Xx',
122
+ 'Tables have been copied.' => 'Xx.',
123
+
124
+ 'Routines' => 'Xx',
125
+ 'Routine has been called, %d row(s) affected.' => array('Xx.', 'Xx.'),
126
+ 'Call' => 'Xx',
127
+ 'Parameter name' => 'Xx',
128
+ 'Create procedure' => 'Xx',
129
+ 'Create function' => 'Xx',
130
+ 'Routine has been dropped.' => 'Xx.',
131
+ 'Routine has been altered.' => 'Xx.',
132
+ 'Routine has been created.' => 'Xx.',
133
+ 'Alter function' => 'Xx',
134
+ 'Alter procedure' => 'Xx',
135
+ 'Return type' => 'Xx',
136
+
137
+ 'Events' => 'Xx',
138
+ 'Event has been dropped.' => 'Xx.',
139
+ 'Event has been altered.' => 'Xx.',
140
+ 'Event has been created.' => 'Xx.',
141
+ 'Alter event' => 'Xx',
142
+ 'Create event' => 'Xx',
143
+ 'At given time' => 'Xx',
144
+ 'Every' => 'Xx',
145
+ 'Schedule' => 'Xx',
146
+ 'Start' => 'Xx',
147
+ 'End' => 'Xx',
148
+ 'On completion preserve' => 'Xx',
149
+
150
+ 'Tables' => 'Xx',
151
+ 'Tables and views' => 'Xx',
152
+ 'Table' => 'Xx',
153
+ 'No tables.' => 'Xx.',
154
+ 'Alter table' => 'Xx',
155
+ 'Create table' => 'Xx',
156
+ 'Table has been dropped.' => 'Xx.',
157
+ 'Tables have been dropped.' => 'Xx.',
158
+ 'Tables have been optimized.' => 'Xx.',
159
+ 'Table has been altered.' => 'Xx.',
160
+ 'Table has been created.' => 'Xx.',
161
+ 'Table name' => 'Xx',
162
+ 'Show structure' => 'Xx',
163
+ 'engine' => 'xx',
164
+ 'collation' => 'xx',
165
+ 'Column name' => 'Xx',
166
+ 'Type' => 'Xx',
167
+ 'Length' => 'Xx',
168
+ 'Auto Increment' => 'Xx',
169
+ 'Options' => 'Xx',
170
+ 'Comment' => 'Xx',
171
+ 'Default value' => 'Xx',
172
+ 'Default values' => 'Xx',
173
+ 'Drop' => 'Xx',
174
+ 'Are you sure?' => 'Xx',
175
+ 'Size' => 'Xx',
176
+ 'Compute' => 'Xx',
177
+ 'Move up' => 'Xx',
178
+ 'Move down' => 'Xx',
179
+ 'Remove' => 'Xx',
180
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => 'Xx.',
181
+
182
+ 'Partition by' => 'Xx',
183
+ 'Partitions' => 'Xx',
184
+ 'Partition name' => 'Xx',
185
+ 'Values' => 'Xx',
186
+
187
+ 'View' => 'Xx',
188
+ 'Materialized View' => 'Xx',
189
+ 'View has been dropped.' => 'Xx.',
190
+ 'View has been altered.' => 'Xx.',
191
+ 'View has been created.' => 'Xx.',
192
+ 'Alter view' => 'Xx',
193
+ 'Create view' => 'Xx',
194
+ 'Create materialized view' => 'Xx',
195
+
196
+ 'Indexes' => 'Xx',
197
+ 'Indexes have been altered.' => 'Xx.',
198
+ 'Alter indexes' => 'Xx',
199
+ 'Add next' => 'Xx',
200
+ 'Index Type' => 'Xx',
201
+ 'Column (length)' => 'Xx',
202
+
203
+ 'Foreign keys' => 'Xx',
204
+ 'Foreign key' => 'Xx',
205
+ 'Foreign key has been dropped.' => 'Xx.',
206
+ 'Foreign key has been altered.' => 'Xx.',
207
+ 'Foreign key has been created.' => 'Xx.',
208
+ 'Target table' => 'Xx',
209
+ 'Change' => 'Xx',
210
+ 'Source' => 'Xx',
211
+ 'Target' => 'Xx',
212
+ 'Add column' => 'Xx',
213
+ 'Alter' => 'Xx',
214
+ 'Add foreign key' => 'Xx',
215
+ 'ON DELETE' => 'Xx',
216
+ 'ON UPDATE' => 'Xx',
217
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Xx.',
218
+
219
+ 'Triggers' => 'Xx',
220
+ 'Add trigger' => 'Xx',
221
+ 'Trigger has been dropped.' => 'Xx.',
222
+ 'Trigger has been altered.' => 'Xx.',
223
+ 'Trigger has been created.' => 'Xx.',
224
+ 'Alter trigger' => 'Xx',
225
+ 'Create trigger' => 'Xx',
226
+ 'Time' => 'Xx',
227
+ 'Event' => 'Xx',
228
+ 'Name' => 'Xx',
229
+
230
+ 'select' => 'xx',
231
+ 'Select' => 'Xx',
232
+ 'Select data' => 'Xx',
233
+ 'Functions' => 'Xx',
234
+ 'Aggregation' => 'Xx',
235
+ 'Search' => 'Xx',
236
+ 'anywhere' => 'xx',
237
+ 'Search data in tables' => 'Xx',
238
+ 'Sort' => 'Xx',
239
+ 'descending' => 'xx',
240
+ 'Limit' => 'Xx',
241
+ 'Limit rows' => 'Xx',
242
+ 'Text length' => 'Xx',
243
+ 'Action' => 'Xx',
244
+ 'Full table scan' => 'Xx',
245
+ 'Unable to select the table' => 'Xx',
246
+ 'No rows.' => 'Xx.',
247
+ '%d / ' => 'xx',
248
+ '%d row(s)' => array('xx', 'xx'),
249
+ 'Page' => 'Xx',
250
+ 'last' => 'xx',
251
+ 'Load more data' => 'Xx',
252
+ 'Loading' => 'Xx',
253
+ 'whole result' => 'xx',
254
+ '%d byte(s)' => array('xx', 'xx'),
255
+
256
+ 'Import' => 'Xx',
257
+ '%d row(s) have been imported.' => array('Xx.', 'Xx.'),
258
+ 'File must be in UTF-8 encoding.' => 'Xx.',
259
+
260
+ // in-place editing in select
261
+ 'Modify' => 'Xx',
262
+ 'Ctrl+click on a value to modify it.' => 'Xx.',
263
+ 'Use edit link to modify this value.' => 'Xx.',
264
+
265
+ // %s can contain auto-increment value
266
+ 'Item%s has been inserted.' => 'Xx.',
267
+ 'Item has been deleted.' => 'Xx.',
268
+ 'Item has been updated.' => 'Xx.',
269
+ '%d item(s) have been affected.' => array('Xx.', 'Xx.'),
270
+ 'New item' => 'Xx',
271
+ 'original' => 'xx',
272
+ // label for value '' in enum data type
273
+ 'empty' => 'xx',
274
+ 'edit' => 'xx',
275
+ 'Edit' => 'Xx',
276
+ 'Insert' => 'Xx',
277
+ 'Save' => 'Xx',
278
+ 'Save and continue edit' => 'Xx',
279
+ 'Save and insert next' => 'Xx',
280
+ 'Selected' => 'Xx',
281
+ 'Clone' => 'Xx',
282
+ 'Delete' => 'Xx',
283
+ 'You have no privileges to update this table.' => 'Xx.',
284
+
285
+ 'E-mail' => 'Xx',
286
+ 'From' => 'Xx',
287
+ 'Subject' => 'Xx',
288
+ 'Attachments' => 'Xx',
289
+ 'Send' => 'Xx',
290
+ '%d e-mail(s) have been sent.' => array('Xx.', 'Xx.'),
291
+
292
+ // data type descriptions
293
+ 'Numbers' => 'Xx',
294
+ 'Date and time' => 'Xx',
295
+ 'Strings' => 'Xx',
296
+ 'Binary' => 'Xx',
297
+ 'Lists' => 'Xx',
298
+ 'Network' => 'Xx',
299
+ 'Geometry' => 'Xx',
300
+ 'Relations' => 'Xx',
301
+
302
+ 'Editor' => 'Xx',
303
+ // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
304
+ '$1-$3-$5' => 'xx',
305
+ // hint for date format - use language equivalents for day, month and year shortcuts
306
+ '[yyyy]-mm-dd' => 'xx',
307
+ // hint for time format - use language equivalents for hour, minute and second shortcuts
308
+ 'HH:MM:SS' => 'Xx',
309
+ 'now' => 'xx',
310
+ 'yes' => 'xx',
311
+ 'no' => 'xx',
312
+
313
+ // general SQLite error in create, drop or rename database
314
+ 'File exists.' => 'Xx.',
315
+ 'Please use one of the extensions %s.' => 'Xx.',
316
+
317
+ // PostgreSQL and MS SQL schema support
318
+ 'Alter schema' => 'Xx',
319
+ 'Create schema' => 'Xx',
320
+ 'Schema has been dropped.' => 'Xx.',
321
+ 'Schema has been created.' => 'Xx.',
322
+ 'Schema has been altered.' => 'Xx.',
323
+ 'Schema' => 'Xx',
324
+ 'Invalid schema.' => 'Xx.',
325
+
326
+ // PostgreSQL sequences support
327
+ 'Sequences' => 'Xx',
328
+ 'Create sequence' => 'Xx',
329
+ 'Sequence has been dropped.' => 'Xx.',
330
+ 'Sequence has been created.' => 'Xx.',
331
+ 'Sequence has been altered.' => 'Xx.',
332
+ 'Alter sequence' => 'Xx',
333
+
334
+ // PostgreSQL user types support
335
+ 'User types' => 'Xx',
336
+ 'Create type' => 'Xx',
337
+ 'Type has been dropped.' => 'Xx.',
338
+ 'Type has been created.' => 'Xx.',
339
+ 'Alter type' => 'Xx',
340
+ );
adminer/adminer/adminer/lang/zh-tw.inc.php ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ 'Create new database' => '建立新資料庫',
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 updated.' => '已更新項目。',
39
+ 'Item%s has been inserted.' => '已新增項目%s。',
40
+ 'Edit' => '編輯',
41
+ 'Insert' => '新增',
42
+ 'Save and insert next' => '儲存並新增下一筆',
43
+ 'Delete' => '刪除',
44
+ 'Database' => '資料庫',
45
+ 'Routines' => '程序',
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.' => '執行查詢OK,%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 token。請重新發送表單。',
70
+ 'Comment' => '註解',
71
+ 'Default values' => '預設值',
72
+ '%d byte(s)' => '%d byte(s)',
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.' => '沒有任何支援的PHP擴充模組(%s)。',
81
+ 'Session support must be enabled.' => 'Session 必須被啟用。',
82
+ 'Session expired, please login again.' => 'Session 已過期,請重新登入。',
83
+ 'Text length' => 'Text 長度',
84
+ 'Foreign key has been dropped.' => '已刪除外來鍵。',
85
+ 'Foreign key has been altered.' => '已修改外來鍵。',
86
+ 'Foreign key has been created.' => '已建立外來鍵。',
87
+ 'Foreign key' => '外來鍵',
88
+ 'Target table' => '目標資料表',
89
+ 'Change' => '修改',
90
+ 'Source' => '來源',
91
+ 'Target' => '目標',
92
+ 'Add column' => '新增資料列',
93
+ 'Alter' => '修改',
94
+ 'Add foreign key' => '新增外來鍵',
95
+ 'ON DELETE' => 'ON DELETE',
96
+ 'ON UPDATE' => 'ON UPDATE',
97
+ 'Index Type' => '索引類型',
98
+ 'Column (length)' => '列(長度)',
99
+ 'View has been dropped.' => '已刪除檢視表。',
100
+ 'View has been altered.' => '已修改檢視表。',
101
+ 'View has been created.' => '已建立檢視表。',
102
+ 'Alter view' => '修改檢視表',
103
+ 'Create view' => '建立檢視表',
104
+ 'Name' => '名稱',
105
+ 'Process list' => '處理程序列表',
106
+ '%d process(es) have been killed.' => '%d 個 Process(es) 被終止',
107
+ 'Kill' => '終止',
108
+ 'Parameter name' => '參數名稱',
109
+ 'Database schema' => '資料庫架構',
110
+ 'Create procedure' => '建立預存程序',
111
+ 'Create function' => '建立函數',
112
+ 'Routine has been dropped.' => '已刪除程序。',
113
+ 'Routine has been altered.' => '已修改子程序。',
114
+ 'Routine has been created.' => '已建立子程序。',
115
+ 'Alter function' => '修改函數',
116
+ 'Alter procedure' => '修改過程',
117
+ 'Return type' => '回傳類型',
118
+ 'Add trigger' => '建立觸發器',
119
+ 'Trigger has been dropped.' => '已刪除觸發器。',
120
+ 'Trigger has been altered.' => '已修改觸發器。',
121
+ 'Trigger has been created.' => '已建立觸發器。',
122
+ 'Alter trigger' => '修改觸發器',
123
+ 'Create trigger' => '建立觸發器',
124
+ 'Time' => '時間',
125
+ 'Event' => '事件',
126
+ '%s version: %s through PHP extension %s' => '%s版本:%s 透過PHP擴充模組 %s',
127
+ '%d row(s)' => '%d行',
128
+ 'Remove' => '移除',
129
+ 'Are you sure?' => '你確定嗎?',
130
+ 'Privileges' => '權限',
131
+ 'Create user' => '建立使用者',
132
+ 'User has been dropped.' => '已刪除使用者。',
133
+ 'User has been altered.' => '已修改使用者。',
134
+ 'User has been created.' => '已建立使用者。',
135
+ 'Hashed' => 'Hashed',
136
+ 'Column' => '列',
137
+ 'Routine' => '程序',
138
+ 'Grant' => '授權',
139
+ 'Revoke' => '廢除',
140
+ 'Logged as: %s' => '登錄為:%s',
141
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 資料太大。減少資料或者增加 %s 的設定值。',
142
+ 'Move up' => '上移',
143
+ 'Move down' => '下移',
144
+ 'Export' => '匯出',
145
+ 'Tables' => '資料表',
146
+ 'Data' => '資料',
147
+ 'Output' => '輸出',
148
+ 'open' => '打開',
149
+ 'save' => '儲存',
150
+ 'Format' => '格式',
151
+ 'Functions' => '函數',
152
+ 'Aggregation' => '集合',
153
+ 'Event has been dropped.' => '已刪除事件。',
154
+ 'Event has been altered.' => '已修改事件。',
155
+ 'Event has been created.' => '已建立事件。',
156
+ 'Alter event' => '修改事件',
157
+ 'Create event' => '建立事件',
158
+ 'Start' => '開始',
159
+ 'End' => '結束',
160
+ 'Every' => '每',
161
+ 'Status' => '狀態',
162
+ 'On completion preserve' => '在完成後儲存',
163
+ 'Events' => '事件',
164
+ 'Schedule' => '排程',
165
+ 'At given time' => '在指定時間',
166
+ 'Tables have been truncated.' => '已清空資料表。',
167
+ 'Tables have been moved.' => '已轉移資料表。',
168
+ 'Tables and views' => '資料表和檢視表',
169
+ 'Engine' => '引擎',
170
+ 'Collation' => '校對',
171
+ 'Data Length' => '資料長度',
172
+ 'Index Length' => '索引長度',
173
+ 'Data Free' => '資料空閒',
174
+ 'Rows' => '行數',
175
+ ',' => ',',
176
+ '0123456789' => '0123456789',
177
+ 'Analyze' => '分析',
178
+ 'Optimize' => '最佳化',
179
+ 'Check' => '檢查',
180
+ 'Repair' => '修復',
181
+ 'Truncate' => '清空',
182
+ 'Move to other database' => '轉移到其它資料庫',
183
+ 'Move' => '轉移',
184
+ 'Save and continue edit' => '儲存並繼續編輯',
185
+ 'original' => '原始',
186
+ '%d item(s) have been affected.' => '%d個項目受到影響。',
187
+ 'whole result' => '所有結果',
188
+ 'Tables have been dropped.' => '已經將資料表刪除。',
189
+ 'Clone' => '複製',
190
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => '超過允許的字段數量的最大值。請增加%s。',
191
+ 'Partition by' => '分區類型',
192
+ 'Partitions' => '分區',
193
+ 'Partition name' => '分區名稱',
194
+ 'Values' => '值',
195
+ '%d row(s) have been imported.' => '已匯入%d行。',
196
+ 'anywhere' => '任意位置',
197
+ 'Import' => '匯入',
198
+ 'Stop on error' => '出錯時停止',
199
+ '%.3f s' => '%.3f秒',
200
+ '$1-$3-$5' => '$1.$3.$5',
201
+ '[yyyy]-mm-dd' => '[yyyy].mm.dd',
202
+ 'History' => '紀錄',
203
+ 'Variables' => '變數',
204
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '來源列和目標列必須具有相同的資料類型,在目標列上必須有一個索引並且引用的資料必須存在。',
205
+ 'Relations' => '關聯',
206
+ 'Run file' => '執行檔案',
207
+ 'Clear' => '清除',
208
+ 'Maximum allowed file size is %sB.' => '允許的檔案上限大小為%sB',
209
+ 'Numbers' => '數字',
210
+ 'Date and time' => '日期時間',
211
+ 'Strings' => '字串',
212
+ 'Binary' => '二進位',
213
+ 'Lists' => '列表',
214
+ 'Editor' => '編輯器',
215
+ 'E-mail' => '電子郵件',
216
+ 'From' => '來自',
217
+ 'Subject' => '主旨',
218
+ 'Send' => '寄出',
219
+ '%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。',
220
+ 'Webserver file %s' => '網頁伺服器檔案 %s',
221
+ 'File does not exist.' => '檔案不存在',
222
+ 'Item has been deleted.' => '該項目已被刪除',
223
+ '%d in total' => '總共 %d 個',
224
+ 'Permanent login' => '永久登入',
225
+ 'Table has been dropped.' => '已經刪除資料表。',
226
+ 'Databases have been dropped.' => '資料庫已刪除。',
227
+ 'Search data in tables' => '在資料庫搜尋',
228
+ 'Schema' => '資料表結構',
229
+ 'Alter schema' => '修改資料表結構',
230
+ 'Create schema' => '建立資料表結構',
231
+ 'Schema has been dropped.' => '已刪除資料表結構。',
232
+ 'Schema has been created.' => '已建立資料表結構。',
233
+ 'Schema has been altered.' => '已修改資料表結構。',
234
+ 'Sequences' => '序列',
235
+ 'Create sequence' => '建立序列',
236
+ 'Alter sequence' => '修改序列',
237
+ 'Sequence has been dropped.' => '已刪除序列。',
238
+ 'Sequence has been created.' => '已建立序列。',
239
+ 'Sequence has been altered.' => '已修改序列。',
240
+ 'User types' => '使用者類型',
241
+ 'Create type' => '建立類型',
242
+ 'Alter type' => '修改類型',
243
+ 'Type has been dropped.' => '已刪除類型。',
244
+ 'Type has been created.' => '已建立類型。',
245
+ 'Use edit link to modify this value.' => '使用編輯連結來修改。',
246
+ 'last' => '最後一頁',
247
+ 'From server' => '從伺服器',
248
+ 'System' => '資料庫系統',
249
+ 'Select data' => '選擇資料',
250
+ 'Show structure' => '顯示結構',
251
+ 'empty' => '空值',
252
+ 'Network' => '網路',
253
+ 'Geometry' => '幾何',
254
+ 'File exists.' => '檔案已存在。',
255
+ 'Attachments' => '附件',
256
+ '%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
257
+ 'Show only errors' => '僅顯示錯誤訊息',
258
+ 'Refresh' => '重新載入',
259
+ 'Invalid schema.' => '無效的資料表結構。',
260
+ 'Please use one of the extensions %s.' => '請使用下列其中一個擴充模組 %s。',
261
+ 'now' => '現在',
262
+ 'ltr' => 'ltr',
263
+ 'Tables have been copied.' => '資料表已經複製',
264
+ 'Copy' => '複製',
265
+ 'Permanent link' => '永久連結',
266
+ 'Edit all' => '編輯全部',
267
+ 'HH:MM:SS' => 'HH:MM:SS',
268
+ );
adminer/adminer/adminer/lang/zh.inc.php ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ 'Create new database' => '创建新数据库',
12
+ 'Table has been dropped.' => '已删除表。',
13
+ 'Table has been altered.' => '已修改表。',
14
+ 'Table has been created.' => '已创建表。',
15
+ 'Alter table' => '修改表',
16
+ 'Create table' => '创建表',
17
+ 'Table name' => '表名',
18
+ 'engine' => '引擎',
19
+ 'collation' => '校对',
20
+ 'Column name' => '字段名',
21
+ 'Type' => '类型',
22
+ 'Length' => '长度',
23
+ 'Auto Increment' => '自动增量',
24
+ 'Options' => '选项',
25
+ 'Save' => '保存',
26
+ 'Drop' => '删除',
27
+ 'Database has been dropped.' => '已删除数据库。',
28
+ 'Database has been created.' => '已创建数据库。',
29
+ 'Database has been renamed.' => '已重命名数据库。',
30
+ 'Database has been altered.' => '已修改数据库。',
31
+ 'Alter database' => '修改数据库',
32
+ 'Create database' => '创建数据库',
33
+ 'SQL command' => 'SQL命令',
34
+ 'Logout' => '注销',
35
+ 'database' => '数据库',
36
+ 'Use' => '使用',
37
+ 'No tables.' => '没有表。',
38
+ 'select' => '选择',
39
+ 'Item has been deleted.' => '已删除项目。',
40
+ 'Item has been updated.' => '已更新项目。',
41
+ 'Item%s has been inserted.' => '已插入项目%s。',
42
+ 'Edit' => '编辑',
43
+ 'Insert' => '插入',
44
+ 'Save and insert next' => '保存并插入下一个',
45
+ 'Delete' => '删除',
46
+ 'Database' => '数据库',
47
+ 'Routines' => '子程序',
48
+ 'Indexes have been altered.' => '已修改索引。',
49
+ 'Indexes' => '索引',
50
+ 'Alter indexes' => '修改索引',
51
+ 'Add next' => '下一行插入',
52
+ 'Language' => '语言',
53
+ 'Select' => '选择',
54
+ 'New item' => '新建数据',
55
+ 'Search' => '搜索',
56
+ 'Sort' => '排序',
57
+ 'descending' => '降序',
58
+ 'Limit' => '范围',
59
+ 'No rows.' => '无数据。',
60
+ 'Action' => '动作',
61
+ 'edit' => '编辑',
62
+ 'Page' => '页面',
63
+ 'Query executed OK, %d row(s) affected.' => '查询执行完毕,%d 行受影响。',
64
+ 'Error in query' => '查询出错',
65
+ 'Execute' => '执行',
66
+ 'Table' => '表',
67
+ 'Foreign keys' => '外键',
68
+ 'Triggers' => '触发器',
69
+ 'View' => '视图',
70
+ 'Unable to select the table' => '不能选择该表',
71
+ 'Invalid CSRF token. Send the form again.' => '无效 CSRF 令牌。重新发送表单。',
72
+ 'Comment' => '注释',
73
+ 'Default values' => '默认值',
74
+ '%d byte(s)' => '%d 字节',
75
+ 'No commands to execute.' => '没有命令被执行。',
76
+ 'Unable to upload a file.' => '不能上传文件。',
77
+ 'File upload' => '文件上传',
78
+ 'File uploads are disabled.' => '文件上传被禁用。',
79
+ 'Routine has been called, %d row(s) affected.' => '子程序被调用,%d 行被影响。',
80
+ 'Call' => '调用',
81
+ 'No extension' => '没有扩展',
82
+ 'None of the supported PHP extensions (%s) are available.' => '没有支持的 PHP 扩展可用(%s)。',
83
+ 'Session support must be enabled.' => 'Session 必须被启用。',
84
+ 'Session expired, please login again.' => 'Session 已过期,请重新登录。',
85
+ 'Text length' => '文本显示限制',
86
+ 'Foreign key has been dropped.' => '已删除外键。',
87
+ 'Foreign key has been altered.' => '已修改外键。',
88
+ 'Foreign key has been created.' => '已创建外键。',
89
+ 'Foreign key' => '外键',
90
+ 'Target table' => '目标表',
91
+ 'Change' => '修改',
92
+ 'Source' => '源',
93
+ 'Target' => '目标',
94
+ 'Add column' => '增加列',
95
+ 'Alter' => '修改',
96
+ 'Add foreign key' => '添加外键',
97
+ 'ON DELETE' => 'ON DELETE',
98
+ 'ON UPDATE' => 'ON UPDATE',
99
+ 'Index Type' => '索引类型',
100
+ 'Column (length)' => '列(长度)',
101
+ 'View has been dropped.' => '已删除视图。',
102
+ 'View has been altered.' => '已修改视图。',
103
+ 'View has been created.' => '已创建视图。',
104
+ 'Alter view' => '修改视图',
105
+ 'Create view' => '创建视图',
106
+ 'Name' => '名称',
107
+ 'Process list' => '进程列表',
108
+ '%d process(es) have been killed.' => '%d 个进程被终止',
109
+ 'Kill' => '终止',
110
+ 'Parameter name' => '参数名',
111
+ 'Database schema' => '数据库概要',
112
+ 'Create procedure' => '创建过程',
113
+ 'Create function' => '创建函数',
114
+ 'Routine has been dropped.' => '已删除子程序。',
115
+ 'Routine has been altered.' => '已修改子程序。',
116
+ 'Routine has been created.' => '已创建子程序。',
117
+ 'Alter function' => '修改函数',
118
+ 'Alter procedure' => '修改过程',
119
+ 'Return type' => '返回类型',
120
+ 'Add trigger' => '创建触发器',
121
+ 'Trigger has been dropped.' => '已删除触发器。',
122
+ 'Trigger has been altered.' => '已修改触发器。',
123
+ 'Trigger has been created.' => '已创建触发器。',
124
+ 'Alter trigger' => '修改触发器',
125
+ 'Create trigger' => '创建触发器',
126
+ 'Time' => '时间',
127
+ 'Event' => '事件',
128
+ '%s version: %s through PHP extension %s' => '%s 版本:%s, 使用PHP扩展 %s',
129
+ '%d row(s)' => '%d 行',
130
+ 'Remove' => '移除',
131
+ 'Are you sure?' => '你确定吗?',
132
+ 'Privileges' => '权限',
133
+ 'Create user' => '创建用户',
134
+ 'User has been dropped.' => '已删除用户。',
135
+ 'User has been altered.' => '已修改用户。',
136
+ 'User has been created.' => '已创建用户。',
137
+ 'Hashed' => 'Hashed',
138
+ 'Column' => '列',
139
+ 'Routine' => '子程序',
140
+ 'Grant' => '授权',
141
+ 'Revoke' => '废除',
142
+ 'Logged as: %s' => '登录用户:%s',
143
+ 'Too big POST data. Reduce the data or increase the %s configuration directive.' => '太大的 POST 数据。减少数据或者增加 %s 配置命令。',
144
+ 'Move up' => '上移',
145
+ 'Move down' => '下移',
146
+ 'Export' => '导出',
147
+ 'Tables' => '表',
148
+ 'Data' => '数据',
149
+ 'Output' => '输出',
150
+ 'open' => '打开',
151
+ 'save' => '保存',
152
+ 'Format' => '格式',
153
+ 'Functions' => '函数',
154
+ 'Aggregation' => '集合',
155
+ 'Event has been dropped.' => '已删除事件。',
156
+ 'Event has been altered.' => '已修改事件。',
157
+ 'Event has been created.' => '已创建事件。',
158
+ 'Alter event' => '修改事件',
159
+ 'Create event' => '创建事件',
160
+ 'Start' => '开始',
161
+ 'End' => '结束',
162
+ 'Every' => '每',
163
+ 'Status' => '状态',
164
+ 'On completion preserve' => '完成后保存',
165
+ 'Events' => '事件',
166
+ 'Schedule' => '调度',
167
+ 'At given time' => '在指定时间',
168
+ 'Tables have been truncated.' => '已清空表。',
169
+ 'Tables have been moved.' => '已转移表。',
170
+ 'Tables and views' => '表和视图',
171
+ 'Engine' => '引擎',
172
+ 'Collation' => '校对',
173
+ 'Data Length' => '数据长度',
174
+ 'Index Length' => '索引长度',
175
+ 'Data Free' => '数据空闲',
176
+ 'Rows' => '行数',
177
+ ',' => ',',
178
+ '0123456789' => '0123456789',
179
+ 'Analyze' => '分析',
180
+ 'Optimize' => '优化',
181
+ 'Check' => '检查',
182
+ 'Repair' => '修复',
183
+ 'Truncate' => '清空',
184
+ 'Move to other database' => '转移到其它数据库',
185
+ 'Move' => '转移',
186
+ 'Save and continue edit' => '保存并继续编辑',
187
+ 'original' => '原始',
188
+ '%d item(s) have been affected.' => '%d 个项目受到影响。',
189
+ 'whole result' => '所有结果',
190
+ 'Tables have been dropped.' => '已删除表。',
191
+ 'Clone' => '复制',
192
+ 'Maximum number of allowed fields exceeded. Please increase %s.' => '超过最多允许的字段数量。请增加 %s。',
193
+ 'Partition by' => '分区类型',
194
+ 'Partitions' => '分区',
195
+ 'Partition name' => '分区名',
196
+ 'Values' => '值',
197
+ '%d row(s) have been imported.' => '%d 行已导入。',
198
+ 'anywhere' => '任意位置',
199
+ 'Import' => '导入',
200
+ 'Stop on error' => '出错时停止',
201
+ '%.3f s' => '%.3f 秒',
202
+ '$1-$3-$5' => '$1.$3.$5',
203
+ '[yyyy]-mm-dd' => '[yyyy].mm.dd',
204
+ 'History' => '历史',
205
+ 'Variables' => '变量',
206
+ 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '源列和目标列必须具有相同的数据类型,在目标列上必须有一个索引并且引用的数据必须存在。',
207
+ 'Relations' => '关联信息',
208
+ 'Run file' => '运行文件',
209
+ 'Clear' => '清除',
210
+ 'Maximum allowed file size is %sB.' => '最多允许的文件大小为 %sB',
211
+ 'Numbers' => '数字',
212
+ 'Date and time' => '日期时间',
213
+ 'Strings' => '字符串',
214
+ 'Binary' => '二进制',
215
+ 'Lists' => '列表',
216
+ 'Editor' => '编辑器',
217
+ 'E-mail' => '电子邮件',
218
+ 'From' => '来自',
219
+ 'Subject' => '主题',
220
+ 'Send' => '发送',
221
+ '%d e-mail(s) have been sent.' => '%d 封邮件已发送。',
222
+ 'Webserver file %s' => 'Web服务器文件 %s',
223
+ 'File does not exist.' => '文件不存在。',
224
+ '%d in total' => '共计 %d',
225
+ 'Permanent login' => '保持登录',
226
+ 'Databases have been dropped.' => '已删除数据库。',
227
+ 'Search data in tables' => '在表中搜索数据',
228
+ 'Schema' => '模式',
229
+ 'Alter schema' => '修改模式',
230
+ 'Create schema' => '创建模式',
231
+ 'Schema has been dropped.' => '已删除模式。',
232
+ 'Schema has been created.' => '已创建模式。',
233
+ 'Schema has been altered.' => '已修改模式。',
234
+ 'Sequences' => '序列',
235
+ 'Create sequence' => '创建序列',
236
+ 'Alter sequence' => '修改序列',
237
+ 'Sequence has been dropped.' => '已删除序列。',
238
+ 'Sequence has been created.' => '已创建序列。',
239
+ 'Sequence has been altered.' => '已修改序列。',
240
+ 'User types' => '用户类型',
241
+ 'Create type' => '创建类型',
242
+ 'Alter type' => '修改类型',
243
+ 'Type has been dropped.' => '已删除类型。',
244
+ 'Type has been created.' => '已创建类型。',
245
+ 'Use edit link to modify this value.' => '使用编辑链接来修改该值。',
246
+ 'last' => '最后',
247
+ 'From server' => '来自服务器',
248
+ 'System' => '系统',
249
+ 'Select data' => '选择数据',
250
+ 'Show structure' => '显示结构',
251
+ 'empty' => '空',
252
+ 'Network' => '网络',
253
+ 'Geometry' => '几何图形',
254
+ 'File exists.' => '文件已存在。',
255
+ 'Attachments' => '附件',
256
+ '%d query(s) executed OK.' => '%d 条查询已成功执行。',
257
+ 'Show only errors' => '仅显示错误',
258
+ 'Refresh' => '刷新',
259
+ 'Invalid schema.' => '非法模式。',
260
+ 'Please use one of the extensions %s.' => '请使用这些扩展中的一个:%s。',
261
+ 'now' => '现在',
262
+ 'ltr' => 'ltr',
263
+ 'Tables have been copied.' => '表已复制。',
264
+ 'Copy' => '复制',
265
+ 'Permanent link' => '固定链接',
266
+ 'Edit all' => '编辑全部',
267
+ 'HH:MM:SS' => 'HH:MM:SS',
268
+ );
adminer/adminer/adminer/plugin.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ function adminer_object() {
3
+ // required to run any plugin
4
+ include_once "../plugins/plugin.php";
5
+
6
+ // autoloader
7
+ foreach (glob("../plugins/*.php") as $filename) {
8
+ include_once $filename;
9
+ }
10
+
11
+ $plugins = array(
12
+ // specify enabled plugins here
13
+ new AdminerDatabaseHide(array('information_schema')),
14
+ new AdminerDumpJson,
15
+ new AdminerDumpBz2,
16
+ new AdminerDumpZip,
17
+ new AdminerDumpXml,
18
+ new AdminerDumpAlter,
19
+ //~ new AdminerSqlLog("past-" . rtrim(`git describe --tags --abbrev=0`) . ".sql"),
20
+ //~ new AdminerEditCalendar("<script type='text/javascript' src='../externals/jquery-ui/jquery-1.4.4.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.core.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.widget.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.datepicker.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.mouse.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.slider.js'></script>\n<script type='text/javascript' src='../externals/jquery-timepicker/jquery-ui-timepicker-addon.js'></script>\n<link rel='stylesheet' href='../externals/jquery-ui/themes/base/jquery.ui.all.css'>\n<style type='text/css'>\n.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }\n.ui-timepicker-div dl { text-align: left; }\n.ui-timepicker-div dl dt { height: 25px; }\n.ui-timepicker-div dl dd { margin: -25px 0 10px 65px; }\n.ui-timepicker-div td { font-size: 90%; }\n</style>\n", "../externals/jquery-ui/ui/i18n/jquery.ui.datepicker-%s.js"),
21
+ //~ new AdminerTinymce("../externals/tinymce/jscripts/tiny_mce/tiny_mce_dev.js"),
22
+ //~ new AdminerWymeditor(array("../externals/wymeditor/src/jquery/jquery.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.explorer.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.mozilla.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.opera.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.safari.js")),
23
+ new AdminerFileUpload(""),
24
+ new AdminerJsonColumn,
25
+ new AdminerSlugify,
26
+ new AdminerTranslation,
27
+ new AdminerForeignSystem,
28
+ new AdminerEnumOption,
29
+ new AdminerTablesFilter,
30
+ new AdminerEditForeign,
31
+ );
32
+
33
+ /* It is possible to combine customization and plugins:
34
+ class AdminerCustomization extends AdminerPlugin {
35
+ }
36
+ return new AdminerCustomization($plugins);
37
+ */
38
+
39
+ return new AdminerPlugin($plugins);
40
+ }
41
+
42
+ // include original Adminer or Adminer Editor (usually named adminer.php)
43
+ include "./index.php";
adminer/adminer/adminer/privileges.inc.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ page_header(lang('Privileges'));
3
+
4
+ $result = $connection->query("SELECT User, Host FROM mysql." . (DB == "" ? "user" : "db WHERE " . q(DB) . " LIKE Db") . " ORDER BY Host, User");
5
+ $grant = $result;
6
+ if (!$result) {
7
+ // list logged user, information_schema.USER_PRIVILEGES lists just the current user too
8
+ $result = $connection->query("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1) AS User, SUBSTRING_INDEX(CURRENT_USER, '@', -1) AS Host");
9
+ }
10
+
11
+ echo "<form action=''><p>\n";
12
+ hidden_fields_get();
13
+ echo "<input type='hidden' name='db' value='" . h(DB) . "'>\n";
14
+ echo ($grant ? "" : "<input type='hidden' name='grant' value=''>\n");
15
+ echo "<table cellspacing='0'>\n";
16
+ echo "<thead><tr><th>" . lang('Username') . "<th>" . lang('Server') . "<th>&nbsp;</thead>\n";
17
+
18
+ while ($row = $result->fetch_assoc()) {
19
+ echo '<tr' . odd() . '><td>' . h($row["User"]) . "<td>" . h($row["Host"]) . '<td><a href="' . h(ME . 'user=' . urlencode($row["User"]) . '&host=' . urlencode($row["Host"])) . '">' . lang('Edit') . "</a>\n";
20
+ }
21
+
22
+ if (!$grant || DB != "") {
23
+ echo "<tr" . odd() . "><td><input name='user' autocapitalize='off'><td><input name='host' value='localhost' autocapitalize='off'><td><input type='submit' value='" . lang('Edit') . "'>\n";
24
+ }
25
+
26
+ echo "</table>\n";
27
+ echo "</form>\n";
28
+
29
+ echo '<p class="links"><a href="' . h(ME) . 'user=">' . lang('Create user') . "</a>";
adminer/adminer/adminer/procedure.inc.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $PROCEDURE = $_GET["procedure"];
3
+ $routine = (isset($_GET["function"]) ? "FUNCTION" : "PROCEDURE");
4
+ $row = $_POST;
5
+ $row["fields"] = (array) $row["fields"];
6
+
7
+ if ($_POST && !process_fields($row["fields"]) && !$error) {
8
+ $temp_name = "$row[name]_adminer_" . uniqid();
9
+ drop_create(
10
+ "DROP $routine " . idf_escape($PROCEDURE),
11
+ create_routine($routine, $row),
12
+ "DROP $routine " . idf_escape($row["name"]),
13
+ create_routine($routine, array("name" => $temp_name) + $row),
14
+ "DROP $routine " . idf_escape($temp_name),
15
+ substr(ME, 0, -1),
16
+ lang('Routine has been dropped.'),
17
+ lang('Routine has been altered.'),
18
+ lang('Routine has been created.'),
19
+ $PROCEDURE,
20
+ $row["name"]
21
+ );
22
+ }
23
+
24
+ page_header(($PROCEDURE != "" ? (isset($_GET["function"]) ? lang('Alter function') : lang('Alter procedure')) . ": " . h($PROCEDURE) : (isset($_GET["function"]) ? lang('Create function') : lang('Create procedure'))), $error);
25
+
26
+ if (!$_POST && $PROCEDURE != "") {
27
+ $row = routine($PROCEDURE, $routine);
28
+ $row["name"] = $PROCEDURE;
29
+ }
30
+
31
+ $collations = get_vals("SHOW CHARACTER SET");
32
+ sort($collations);
33
+ $routine_languages = routine_languages();
34
+ ?>
35
+
36
+ <form action="" method="post" id="form">
37
+ <p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64" autocapitalize="off">
38
+ <?php echo ($routine_languages ? lang('Language') . ": " . html_select("language", $routine_languages, $row["language"]) : ""); ?>
39
+ <input type="submit" value="<?php echo lang('Save'); ?>">
40
+ <table cellspacing="0" class="nowrap">
41
+ <?php
42
+ edit_fields($row["fields"], $collations, $routine);
43
+ if (isset($_GET["function"])) {
44
+ echo "<tr><td>" . lang('Return type');
45
+ edit_type("returns", $row["returns"], $collations);
46
+ }
47
+ ?>
48
+ </table>
49
+ <p><?php textarea("definition", $row["definition"]); ?>
50
+ <p>
51
+ <input type="submit" value="<?php echo lang('Save'); ?>">
52
+ <?php if ($PROCEDURE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
53
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
54
+ </form>
adminer/adminer/adminer/processlist.inc.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (support("kill") && $_POST && !$error) {
3
+ $killed = 0;
4
+ foreach ((array) $_POST["kill"] as $val) {
5
+ if (kill_process($val)) {
6
+ $killed++;
7
+ }
8
+ }
9
+ queries_redirect(ME . "processlist=", lang('%d process(es) have been killed.', $killed), $killed || !$_POST["kill"]);
10
+ }
11
+
12
+ page_header(lang('Process list'), $error);
13
+ ?>
14
+
15
+ <form action="" method="post">
16
+ <table cellspacing="0" onclick="tableClick(event);" ondblclick="tableClick(event, true);" class="nowrap checkable">
17
+ <?php
18
+ // HTML valid because there is always at least one process
19
+ $i = -1;
20
+ foreach (process_list() as $i => $row) {
21
+
22
+ if (!$i) {
23
+ echo "<thead><tr lang='en'>" . (support("kill") ? "<th>&nbsp;" : "");
24
+ foreach ($row as $key => $val) {
25
+ echo "<th>$key" . doc_link(array(
26
+ 'sql' => "show-processlist.html#processlist_" . strtolower($key),
27
+ 'pgsql' => "monitoring-stats.html#PG-STAT-ACTIVITY-VIEW",
28
+ 'oracle' => "../b14237/dynviews_2088.htm",
29
+ ));
30
+ }
31
+ echo "</thead>\n";
32
+ }
33
+ echo "<tr" . odd() . ">" . (support("kill") ? "<td>" . checkbox("kill[]", $row[$jush == "sql" ? "Id" : "pid"], 0) : "");
34
+ foreach ($row as $key => $val) {
35
+ echo "<td>" . (
36
+ ($jush == "sql" && $key == "Info" && preg_match("~Query|Killed~", $row["Command"]) && $val != "") ||
37
+ ($jush == "pgsql" && $key == "current_query" && $val != "<IDLE>") ||
38
+ ($jush == "oracle" && $key == "sql_text" && $val != "")
39
+ ? "<code class='jush-$jush'>" . shorten_utf8($val, 100, "</code>") . ' <a href="' . h(ME . ($row["db"] != "" ? "db=" . urlencode($row["db"]) . "&" : "") . "sql=" . urlencode($val)) . '">' . lang('Clone') . '</a>'
40
+ : nbsp($val)
41
+ );
42
+ }
43
+ echo "\n";
44
+ }
45
+ ?>
46
+ </table>
47
+ <script type='text/javascript'>tableCheck();</script>
48
+ <p>
49
+ <?php
50
+ if (support("kill")) {
51
+ echo ($i + 1) . "/" . lang('%d in total', max_connections());
52
+ echo "<p><input type='submit' value='" . lang('Kill') . "'>\n";
53
+ }
54
+ ?>
55
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
56
+ </form>
adminer/adminer/adminer/schema.inc.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ page_header(lang('Database schema'), "", array(), h(DB . ($_GET["ns"] ? ".$_GET[ns]" : "")));
3
+
4
+ $table_pos = array();
5
+ $table_pos_js = array();
6
+ $SCHEMA = ($_GET["schema"] ? $_GET["schema"] : $_COOKIE["adminer_schema-" . str_replace(".", "_", DB)]); // $_COOKIE["adminer_schema"] was used before 3.2.0 //! ':' in table name
7
+ preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~', $SCHEMA, $matches, PREG_SET_ORDER);
8
+ foreach ($matches as $i => $match) {
9
+ $table_pos[$match[1]] = array($match[2], $match[3]);
10
+ $table_pos_js[] = "\n\t'" . js_escape($match[1]) . "': [ $match[2], $match[3] ]";
11
+ }
12
+
13
+ $top = 0;
14
+ $base_left = -1;
15
+ $schema = array(); // table => array("fields" => array(name => field), "pos" => array(top, left), "references" => array(table => array(left => array(source, target))))
16
+ $referenced = array(); // target_table => array(table => array(left => target_column))
17
+ $lefts = array(); // float => bool
18
+ foreach (table_status('', true) as $table => $table_status) {
19
+ if (is_view($table_status)) {
20
+ continue;
21
+ }
22
+ $pos = 0;
23
+ $schema[$table]["fields"] = array();
24
+ foreach (fields($table) as $name => $field) {
25
+ $pos += 1.25;
26
+ $field["pos"] = $pos;
27
+ $schema[$table]["fields"][$name] = $field;
28
+ }
29
+ $schema[$table]["pos"] = ($table_pos[$table] ? $table_pos[$table] : array($top, 0));
30
+ foreach ($adminer->foreignKeys($table) as $val) {
31
+ if (!$val["db"]) {
32
+ $left = $base_left;
33
+ if ($table_pos[$table][1] || $table_pos[$val["table"]][1]) {
34
+ $left = min(floatval($table_pos[$table][1]), floatval($table_pos[$val["table"]][1])) - 1;
35
+ } else {
36
+ $base_left -= .1;
37
+ }
38
+ while ($lefts[(string) $left]) {
39
+ // find free $left
40
+ $left -= .0001;
41
+ }
42
+ $schema[$table]["references"][$val["table"]][(string) $left] = array($val["source"], $val["target"]);
43
+ $referenced[$val["table"]][$table][(string) $left] = $val["target"];
44
+ $lefts[(string) $left] = true;
45
+ }
46
+ }
47
+ $top = max($top, $schema[$table]["pos"][0] + 2.5 + $pos);
48
+ }
49
+
50
+ ?>
51
+ <div id="schema" style="height: <?php echo $top; ?>em;" onselectstart="return false;">
52
+ <script type="text/javascript">
53
+ var tablePos = {<?php echo implode(",", $table_pos_js) . "\n"; ?>};
54
+ var em = document.getElementById('schema').offsetHeight / <?php echo $top; ?>;
55
+ document.onmousemove = schemaMousemove;
56
+ document.onmouseup = function (ev) {
57
+ schemaMouseup(ev, '<?php echo js_escape(DB); ?>');
58
+ };
59
+ </script>
60
+ <?php
61
+ foreach ($schema as $name => $table) {
62
+ echo "<div class='table' style='top: " . $table["pos"][0] . "em; left: " . $table["pos"][1] . "em;' onmousedown='schemaMousedown(this, event);'>";
63
+ echo '<a href="' . h(ME) . 'table=' . urlencode($name) . '"><b>' . h($name) . "</b></a>";
64
+
65
+ foreach ($table["fields"] as $field) {
66
+ $val = '<span' . type_class($field["type"]) . ' title="' . h($field["full_type"] . ($field["null"] ? " NULL" : '')) . '">' . h($field["field"]) . '</span>';
67
+ echo "<br>" . ($field["primary"] ? "<i>$val</i>" : $val);
68
+ }
69
+
70
+ foreach ((array) $table["references"] as $target_name => $refs) {
71
+ foreach ($refs as $left => $ref) {
72
+ $left1 = $left - $table_pos[$name][1];
73
+ $i = 0;
74
+ foreach ($ref[0] as $source) {
75
+ echo "\n<div class='references' title='" . h($target_name) . "' id='refs$left-" . ($i++) . "' style='left: $left1" . "em; top: " . $table["fields"][$source]["pos"] . "em; padding-top: .5em;'><div style='border-top: 1px solid Gray; width: " . (-$left1) . "em;'></div></div>";
76
+ }
77
+ }
78
+ }
79
+
80
+ foreach ((array) $referenced[$name] as $target_name => $refs) {
81
+ foreach ($refs as $left => $columns) {
82
+ $left1 = $left - $table_pos[$name][1];
83
+ $i = 0;
84
+ foreach ($columns as $target) {
85
+ echo "\n<div class='references' title='" . h($target_name) . "' id='refd$left-" . ($i++) . "' style='left: $left1" . "em; top: " . $table["fields"][$target]["pos"] . "em; height: 1.25em; background: url(../adminer/static/arrow.gif) no-repeat right center;'><div style='height: .5em; border-bottom: 1px solid Gray; width: " . (-$left1) . "em;'></div></div>";
86
+ }
87
+ }
88
+ }
89
+
90
+ echo "\n</div>\n";
91
+ }
92
+
93
+ foreach ($schema as $name => $table) {
94
+ foreach ((array) $table["references"] as $target_name => $refs) {
95
+ foreach ($refs as $left => $ref) {
96
+ $min_pos = $top;
97
+ $max_pos = -10;
98
+ foreach ($ref[0] as $key => $source) {
99
+ $pos1 = $table["pos"][0] + $table["fields"][$source]["pos"];
100
+ $pos2 = $schema[$target_name]["pos"][0] + $schema[$target_name]["fields"][$ref[1][$key]]["pos"];
101
+ $min_pos = min($min_pos, $pos1, $pos2);
102
+ $max_pos = max($max_pos, $pos1, $pos2);
103
+ }
104
+ echo "<div class='references' id='refl$left' style='left: $left" . "em; top: $min_pos" . "em; padding: .5em 0;'><div style='border-right: 1px solid Gray; margin-top: 1px; height: " . ($max_pos - $min_pos) . "em;'></div></div>\n";
105
+ }
106
+ }
107
+ }
108
+ ?>
109
+ </div>
110
+ <p class="links"><a href="<?php echo h(ME . "schema=" . urlencode($SCHEMA)); ?>" id="schema-link"><?php echo lang('Permanent link'); ?></a>
adminer/adminer/adminer/scheme.inc.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $row = $_POST;
3
+
4
+ if ($_POST && !$error) {
5
+ $link = preg_replace('~ns=[^&]*&~', '', ME) . "ns=";
6
+ if ($_POST["drop"]) {
7
+ query_redirect("DROP SCHEMA " . idf_escape($_GET["ns"]), $link, lang('Schema has been dropped.'));
8
+ } else {
9
+ $name = trim($row["name"]);
10
+ $link .= urlencode($name);
11
+ if ($_GET["ns"] == "") {
12
+ query_redirect("CREATE SCHEMA " . idf_escape($name), $link, lang('Schema has been created.'));
13
+ } elseif ($_GET["ns"] != $name) {
14
+ query_redirect("ALTER SCHEMA " . idf_escape($_GET["ns"]) . " RENAME TO " . idf_escape($name), $link, lang('Schema has been altered.')); //! sp_rename in MS SQL
15
+ } else {
16
+ redirect($link);
17
+ }
18
+ }
19
+ }
20
+
21
+ page_header($_GET["ns"] != "" ? lang('Alter schema') : lang('Create schema'), $error);
22
+
23
+ if (!$row) {
24
+ $row["name"] = $_GET["ns"];
25
+ }
26
+ ?>
27
+
28
+ <form action="" method="post">
29
+ <p><input name="name" id="name" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
30
+ <script type='text/javascript'>focus(document.getElementById('name'));</script>
31
+ <input type="submit" value="<?php echo lang('Save'); ?>">
32
+ <?php
33
+ if ($_GET["ns"] != "") {
34
+ echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
35
+ }
36
+ ?>
37
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
38
+ </form>
adminer/adminer/adminer/script.inc.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ header("Content-Type: text/javascript; charset=utf-8");
3
+
4
+ if ($_GET["script"] == "db") {
5
+ $sums = array("Data_length" => 0, "Index_length" => 0, "Data_free" => 0);
6
+ foreach (table_status() as $name => $table_status) {
7
+ json_row("Comment-$name", nbsp($table_status["Comment"]));
8
+ if (!is_view($table_status)) {
9
+ foreach (array("Engine", "Collation") as $key) {
10
+ json_row("$key-$name", nbsp($table_status[$key]));
11
+ }
12
+ foreach ($sums + array("Auto_increment" => 0, "Rows" => 0) as $key => $val) {
13
+ if ($table_status[$key] != "") {
14
+ $val = format_number($table_status[$key]);
15
+ json_row("$key-$name", ($key == "Rows" && $val && $table_status["Engine"] == ($sql == "pgsql" ? "table" : "InnoDB")
16
+ ? "~ $val"
17
+ : $val
18
+ ));
19
+ if (isset($sums[$key])) {
20
+ // ignore innodb_file_per_table because it is not active for tables created before it was enabled
21
+ $sums[$key] += ($table_status["Engine"] != "InnoDB" || $key != "Data_free" ? $table_status[$key] : 0);
22
+ }
23
+ } elseif (array_key_exists($key, $table_status)) {
24
+ json_row("$key-$name");
25
+ }
26
+ }
27
+ }
28
+ }
29
+ foreach ($sums as $key => $val) {
30
+ json_row("sum-$key", format_number($val));
31
+ }
32
+ json_row("");
33
+
34
+ } elseif ($_GET["script"] == "kill") {
35
+ $connection->query("KILL " . number($_POST["kill"]));
36
+
37
+ } else { // connect
38
+ foreach (count_tables($adminer->databases()) as $db => $val) {
39
+ json_row("tables-$db", $val);
40
+ json_row("size-$db", db_size($db));
41
+ }
42
+ json_row("");
43
+ }
44
+
45
+ exit; // don't print footer
adminer/adminer/adminer/select.inc.php ADDED
@@ -0,0 +1,540 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $TABLE = $_GET["select"];
3
+ $table_status = table_status1($TABLE);
4
+ $indexes = indexes($TABLE);
5
+ $fields = fields($TABLE);
6
+ $foreign_keys = column_foreign_keys($TABLE);
7
+ $oid = "";
8
+ if ($table_status["Oid"]) {
9
+ $oid = ($jush == "sqlite" ? "rowid" : "oid");
10
+ $indexes[] = array("type" => "PRIMARY", "columns" => array($oid));
11
+ }
12
+ parse_str($_COOKIE["adminer_import"], $adminer_import);
13
+
14
+ $rights = array(); // privilege => 0
15
+ $columns = array(); // selectable columns
16
+ $text_length = null;
17
+ foreach ($fields as $key => $field) {
18
+ $name = $adminer->fieldName($field);
19
+ if (isset($field["privileges"]["select"]) && $name != "") {
20
+ $columns[$key] = html_entity_decode(strip_tags($name), ENT_QUOTES);
21
+ if (is_shortable($field)) {
22
+ $text_length = $adminer->selectLengthProcess();
23
+ }
24
+ }
25
+ $rights += $field["privileges"];
26
+ }
27
+
28
+ list($select, $group) = $adminer->selectColumnsProcess($columns, $indexes);
29
+ $is_group = count($group) < count($select);
30
+ $where = $adminer->selectSearchProcess($fields, $indexes);
31
+ $order = $adminer->selectOrderProcess($fields, $indexes);
32
+ $limit = $adminer->selectLimitProcess();
33
+ $from = ($select ? implode(", ", $select) : "*" . ($oid ? ", $oid" : ""))
34
+ . convert_fields($columns, $fields, $select)
35
+ . "\nFROM " . table($TABLE);
36
+ $group_by = ($group && $is_group ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : "");
37
+
38
+ if ($_GET["val"] && is_ajax()) {
39
+ header("Content-Type: text/plain; charset=utf-8");
40
+ foreach ($_GET["val"] as $unique_idf => $row) {
41
+ $as = convert_field($fields[key($row)]);
42
+ $select = array($as ? $as : idf_escape(key($row)));
43
+ $where[] = where_check($unique_idf, $fields);
44
+ $return = $driver->select($TABLE, $select, $where, $select);
45
+ if ($return) {
46
+ echo reset($return->fetch_row());
47
+ }
48
+ }
49
+ exit;
50
+ }
51
+
52
+ if ($_POST && !$error) {
53
+ $where_check = $where;
54
+ if (!$_POST["all"] && is_array($_POST["check"])) {
55
+ $checks = array();
56
+ foreach ($_POST["check"] as $check) {
57
+ $checks[] = where_check($check, $fields);
58
+ }
59
+ $where_check[] = "((" . implode(") OR (", $checks) . "))";
60
+ }
61
+ $where_check = ($where_check ? "\nWHERE " . implode(" AND ", $where_check) : "");
62
+ $primary = $unselected = null;
63
+ foreach ($indexes as $index) {
64
+ if ($index["type"] == "PRIMARY") {
65
+ $primary = array_flip($index["columns"]);
66
+ $unselected = ($select ? $primary : array());
67
+ break;
68
+ }
69
+ }
70
+ foreach ((array) $unselected as $key => $val) {
71
+ if (in_array(idf_escape($key), $select)) {
72
+ unset($unselected[$key]);
73
+ }
74
+ }
75
+
76
+ if ($_POST["export"]) {
77
+ cookie("adminer_import", "output=" . urlencode($_POST["output"]) . "&format=" . urlencode($_POST["format"]));
78
+ dump_headers($TABLE);
79
+ $adminer->dumpTable($TABLE, "");
80
+ if (!is_array($_POST["check"]) || $unselected === array()) {
81
+ $query = "SELECT $from$where_check$group_by";
82
+ } else {
83
+ $union = array();
84
+ foreach ($_POST["check"] as $val) {
85
+ // where is not unique so OR can't be used
86
+ $union[] = "(SELECT" . limit($from, "\nWHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($val, $fields) . $group_by, 1) . ")";
87
+ }
88
+ $query = implode(" UNION ALL ", $union);
89
+ }
90
+ $adminer->dumpData($TABLE, "table", $query);
91
+ exit;
92
+ }
93
+
94
+ if (!$adminer->selectEmailProcess($where, $foreign_keys)) {
95
+ if ($_POST["save"] || $_POST["delete"]) { // edit
96
+ $result = true;
97
+ $affected = 0;
98
+ $set = array();
99
+ if (!$_POST["delete"]) {
100
+ foreach ($columns as $name => $val) { //! should check also for edit or insert privileges
101
+ $val = process_input($fields[$name]);
102
+ if ($val !== null && ($_POST["clone"] || $val !== false)) {
103
+ $set[idf_escape($name)] = ($val !== false ? $val : idf_escape($name));
104
+ }
105
+ }
106
+ }
107
+ if ($_POST["delete"] || $set) {
108
+ if ($_POST["clone"]) {
109
+ $query = "INTO " . table($TABLE) . " (" . implode(", ", array_keys($set)) . ")\nSELECT " . implode(", ", $set) . "\nFROM " . table($TABLE);
110
+ }
111
+ if ($_POST["all"] || ($unselected === array() && is_array($_POST["check"])) || $is_group) {
112
+ $result = ($_POST["delete"]
113
+ ? $driver->delete($TABLE, $where_check)
114
+ : ($_POST["clone"]
115
+ ? queries("INSERT $query$where_check")
116
+ : $driver->update($TABLE, $set, $where_check)
117
+ )
118
+ );
119
+ $affected = $connection->affected_rows;
120
+ } else {
121
+ foreach ((array) $_POST["check"] as $val) {
122
+ // where is not unique so OR can't be used
123
+ $where2 = "\nWHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($val, $fields);
124
+ $result = ($_POST["delete"]
125
+ ? $driver->delete($TABLE, $where2, 1)
126
+ : ($_POST["clone"]
127
+ ? queries("INSERT" . limit1($query, $where2))
128
+ : $driver->update($TABLE, $set, $where2)
129
+ )
130
+ );
131
+ if (!$result) {
132
+ break;
133
+ }
134
+ $affected += $connection->affected_rows;
135
+ }
136
+ }
137
+ }
138
+ $message = lang('%d item(s) have been affected.', $affected);
139
+ if ($_POST["clone"] && $result && $affected == 1) {
140
+ $last_id = last_id();
141
+ if ($last_id) {
142
+ $message = lang('Item%s has been inserted.', " $last_id");
143
+ }
144
+ }
145
+ queries_redirect(remove_from_uri($_POST["all"] && $_POST["delete"] ? "page" : ""), $message, $result);
146
+ if (!$_POST["delete"]) {
147
+ edit_form($TABLE, $fields, (array) $_POST["fields"], !$_POST["clone"]);
148
+ page_footer();
149
+ exit;
150
+ }
151
+
152
+ } elseif (!$_POST["import"]) { // modify
153
+ if (!$_POST["val"]) {
154
+ $error = lang('Ctrl+click on a value to modify it.');
155
+ } else {
156
+ $result = true;
157
+ $affected = 0;
158
+ foreach ($_POST["val"] as $unique_idf => $row) {
159
+ $set = array();
160
+ foreach ($row as $key => $val) {
161
+ $key = bracket_escape($key, 1); // 1 - back
162
+ $set[idf_escape($key)] = (preg_match('~char|text~', $fields[$key]["type"]) || $val != "" ? $adminer->processInput($fields[$key], $val) : "NULL");
163
+ }
164
+ $result = $driver->update(
165
+ $TABLE,
166
+ $set,
167
+ " WHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($unique_idf, $fields),
168
+ !($is_group || $unselected === array()),
169
+ " "
170
+ );
171
+ if (!$result) {
172
+ break;
173
+ }
174
+ $affected += $connection->affected_rows;
175
+ }
176
+ queries_redirect(remove_from_uri(), lang('%d item(s) have been affected.', $affected), $result);
177
+ }
178
+
179
+ } elseif (!is_string($file = get_file("csv_file", true))) {
180
+ $error = upload_error($file);
181
+ } elseif (!preg_match('~~u', $file)) {
182
+ $error = lang('File must be in UTF-8 encoding.');
183
+ } else {
184
+ cookie("adminer_import", "output=" . urlencode($adminer_import["output"]) . "&format=" . urlencode($_POST["separator"]));
185
+ $result = true;
186
+ $cols = array_keys($fields);
187
+ preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~', $file, $matches);
188
+ $affected = count($matches[0]);
189
+ $driver->begin();
190
+ $separator = ($_POST["separator"] == "csv" ? "," : ($_POST["separator"] == "tsv" ? "\t" : ";"));
191
+ $rows = array();
192
+ foreach ($matches[0] as $key => $val) {
193
+ preg_match_all("~((?>\"[^\"]*\")+|[^$separator]*)$separator~", $val . $separator, $matches2);
194
+ if (!$key && !array_diff($matches2[1], $cols)) { //! doesn't work with column names containing ",\n
195
+ // first row corresponds to column names - use it for table structure
196
+ $cols = $matches2[1];
197
+ $affected--;
198
+ } else {
199
+ $set = array();
200
+ foreach ($matches2[1] as $i => $col) {
201
+ $set[idf_escape($cols[$i])] = ($col == "" && $fields[$cols[$i]]["null"] ? "NULL" : q(str_replace('""', '"', preg_replace('~^"|"$~', '', $col))));
202
+ }
203
+ $rows[] = $set;
204
+ }
205
+ }
206
+ $result = (!$rows || $driver->insertUpdate($TABLE, $rows, $primary));
207
+ if ($result) {
208
+ $driver->commit();
209
+ }
210
+ queries_redirect(remove_from_uri("page"), lang('%d row(s) have been imported.', $affected), $result);
211
+ $driver->rollback(); // after queries_redirect() to not overwrite error
212
+
213
+ }
214
+ }
215
+ }
216
+
217
+ $table_name = $adminer->tableName($table_status);
218
+ if (is_ajax()) {
219
+ page_headers();
220
+ ob_start();
221
+ } else {
222
+ page_header(lang('Select') . ": $table_name", $error);
223
+ }
224
+
225
+ $set = null;
226
+ if (isset($rights["insert"]) || !support("table")) {
227
+ $set = "";
228
+ foreach ((array) $_GET["where"] as $val) {
229
+ if (count($foreign_keys[$val["col"]]) == 1 && ($val["op"] == "="
230
+ || (!$val["op"] && !preg_match('~[_%]~', $val["val"])) // LIKE in Editor
231
+ )) {
232
+ $set .= "&set" . urlencode("[" . bracket_escape($val["col"]) . "]") . "=" . urlencode($val["val"]);
233
+ }
234
+ }
235
+ }
236
+ $adminer->selectLinks($table_status, $set);
237
+
238
+ if (!$columns && support("table")) {
239
+ echo "<p class='error'>" . lang('Unable to select the table') . ($fields ? "." : ": " . error()) . "\n";
240
+ } else {
241
+ echo "<form action='' id='form'>\n";
242
+ echo "<div style='display: none;'>";
243
+ hidden_fields_get();
244
+ echo (DB != "" ? '<input type="hidden" name="db" value="' . h(DB) . '">' . (isset($_GET["ns"]) ? '<input type="hidden" name="ns" value="' . h($_GET["ns"]) . '">' : "") : ""); // not used in Editor
245
+ echo '<input type="hidden" name="select" value="' . h($TABLE) . '">';
246
+ echo "</div>\n";
247
+ $adminer->selectColumnsPrint($select, $columns);
248
+ $adminer->selectSearchPrint($where, $columns, $indexes);
249
+ $adminer->selectOrderPrint($order, $columns, $indexes);
250
+ $adminer->selectLimitPrint($limit);
251
+ $adminer->selectLengthPrint($text_length);
252
+ $adminer->selectActionPrint($indexes);
253
+ echo "</form>\n";
254
+
255
+ $page = $_GET["page"];
256
+ if ($page == "last") {
257
+ $found_rows = $connection->result(count_rows($TABLE, $where, $is_group, $group));
258
+ $page = floor(max(0, $found_rows - 1) / $limit);
259
+ }
260
+
261
+ $select2 = $select;
262
+ if (!$select2) {
263
+ $select2[] = "*";
264
+ if ($oid) {
265
+ $select2[] = $oid;
266
+ }
267
+ }
268
+ $convert_fields = convert_fields($columns, $fields, $select);
269
+ if ($convert_fields) {
270
+ $select2[] = substr($convert_fields, 2);
271
+ }
272
+ $result = $driver->select($TABLE, $select2, $where, $group, $order, $limit, $page, true);
273
+
274
+ if (!$result) {
275
+ echo "<p class='error'>" . error() . "\n";
276
+ } else {
277
+ if ($jush == "mssql" && $page) {
278
+ $result->seek($limit * $page);
279
+ }
280
+ $email_fields = array();
281
+ echo "<form action='' method='post' enctype='multipart/form-data'>\n";
282
+ $rows = array();
283
+ while ($row = $result->fetch_assoc()) {
284
+ if ($page && $jush == "oracle") {
285
+ unset($row["RNUM"]);
286
+ }
287
+ $rows[] = $row;
288
+ }
289
+
290
+ // use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest)
291
+ if ($_GET["page"] != "last" && +$limit && $group && $is_group && $jush == "sql") {
292
+ $found_rows = $connection->result(" SELECT FOUND_ROWS()"); // space to allow mysql.trace_mode
293
+ }
294
+
295
+ if (!$rows) {
296
+ echo "<p class='message'>" . lang('No rows.') . "\n";
297
+ } else {
298
+ $backward_keys = $adminer->backwardKeys($TABLE, $table_name);
299
+
300
+ echo "<table id='table' cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);' onkeydown='return editingKeydown(event);'>\n";
301
+ echo "<thead><tr>" . (!$group && $select ? "" : "<td><input type='checkbox' id='all-page' onclick='formCheck(this, /check/);'> <a href='" . h($_GET["modify"] ? remove_from_uri("modify") : $_SERVER["REQUEST_URI"] . "&modify=1") . "'>" . lang('Modify') . "</a>");
302
+ $names = array();
303
+ $functions = array();
304
+ reset($select);
305
+ $rank = 1;
306
+ foreach ($rows[0] as $key => $val) {
307
+ if ($key != $oid) {
308
+ $val = $_GET["columns"][key($select)];
309
+ $field = $fields[$select ? ($val ? $val["col"] : current($select)) : $key];
310
+ $name = ($field ? $adminer->fieldName($field, $rank) : ($val["fun"] ? "*" : $key));
311
+ if ($name != "") {
312
+ $rank++;
313
+ $names[$key] = $name;
314
+ $column = idf_escape($key);
315
+ $href = remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key);
316
+ $desc = "&desc%5B0%5D=1";
317
+ echo '<th onmouseover="columnMouse(this);" onmouseout="columnMouse(this, \' hidden\');">';
318
+ echo '<a href="' . h($href . ($order[0] == $column || $order[0] == $key || (!$order && $is_group && $group[0] == $column) ? $desc : '')) . '">'; // $order[0] == $key - COUNT(*)
319
+ echo apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions
320
+ echo "<span class='column hidden'>";
321
+ echo "<a href='" . h($href . $desc) . "' title='" . lang('descending') . "' class='text'> ↓</a>";
322
+ if (!$val["fun"]) {
323
+ echo '<a href="#fieldset-search" onclick="selectSearch(\'' . h(js_escape($key)) . '\'); return false;" title="' . lang('Search') . '" class="text jsonly"> =</a>';
324
+ }
325
+ echo "</span>";
326
+ }
327
+ $functions[$key] = $val["fun"];
328
+ next($select);
329
+ }
330
+ }
331
+
332
+ $lengths = array();
333
+ if ($_GET["modify"]) {
334
+ foreach ($rows as $row) {
335
+ foreach ($row as $key => $val) {
336
+ $lengths[$key] = max($lengths[$key], min(40, strlen(utf8_decode($val))));
337
+ }
338
+ }
339
+ }
340
+
341
+ echo ($backward_keys ? "<th>" . lang('Relations') : "") . "</thead>\n";
342
+
343
+ if (is_ajax()) {
344
+ if ($limit % 2 == 1 && $page % 2 == 1) {
345
+ odd();
346
+ }
347
+ ob_end_clean();
348
+ }
349
+
350
+ foreach ($adminer->rowDescriptions($rows, $foreign_keys) as $n => $row) {
351
+ $unique_array = unique_array($rows[$n], $indexes);
352
+ if (!$unique_array) {
353
+ $unique_array = array();
354
+ foreach ($rows[$n] as $key => $val) {
355
+ if (!preg_match('~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~', $key)) { //! columns looking like functions
356
+ $unique_array[$key] = $val;
357
+ }
358
+ }
359
+ }
360
+ $unique_idf = "";
361
+ foreach ($unique_array as $key => $val) {
362
+ if (($jush == "sql" || $jush == "pgsql") && strlen($val) > 64) {
363
+ $key = (strpos($key, '(') ? $key : idf_escape($key)); //! columns looking like functions
364
+ $key = "MD5(" . ($jush == 'sql' && preg_match("~^utf8_~", $fields[$key]["collation"]) ? $key : "CONVERT($key USING " . charset($connection) . ")") . ")";
365
+ $val = md5($val);
366
+ }
367
+ $unique_idf .= "&" . ($val !== null ? urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($val) : "null%5B%5D=" . urlencode($key));
368
+ }
369
+ echo "<tr" . odd() . ">" . (!$group && $select ? "" : "<td>" . checkbox("check[]", substr($unique_idf, 1), in_array(substr($unique_idf, 1), (array) $_POST["check"]), "", "this.form['all'].checked = false; formUncheck('all-page');") . ($is_group || information_schema(DB) ? "" : " <a href='" . h(ME . "edit=" . urlencode($TABLE) . $unique_idf) . "'>" . lang('edit') . "</a>"));
370
+
371
+ foreach ($row as $key => $val) {
372
+ if (isset($names[$key])) {
373
+ $field = $fields[$key];
374
+ if ($val != "" && (!isset($email_fields[$key]) || $email_fields[$key] != "")) {
375
+ $email_fields[$key] = (is_mail($val) ? $names[$key] : ""); //! filled e-mails can be contained on other pages
376
+ }
377
+
378
+ $link = "";
379
+ if (preg_match('~blob|bytea|raw|file~', $field["type"]) && $val != "") {
380
+ $link = ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf;
381
+ }
382
+ if (!$link && $val !== null) { // link related items
383
+ foreach ((array) $foreign_keys[$key] as $foreign_key) {
384
+ if (count($foreign_keys[$key]) == 1 || end($foreign_key["source"]) == $key) {
385
+ $link = "";
386
+ foreach ($foreign_key["source"] as $i => $source) {
387
+ $link .= where_link($i, $foreign_key["target"][$i], $rows[$n][$source]);
388
+ }
389
+ $link = ($foreign_key["db"] != "" ? preg_replace('~([?&]db=)[^&]+~', '\\1' . urlencode($foreign_key["db"]), ME) : ME) . 'select=' . urlencode($foreign_key["table"]) . $link; // InnoDB supports non-UNIQUE keys
390
+ if (count($foreign_key["source"]) == 1) {
391
+ break;
392
+ }
393
+ }
394
+ }
395
+ }
396
+ if ($key == "COUNT(*)") { //! columns looking like functions
397
+ $link = ME . "select=" . urlencode($TABLE);
398
+ $i = 0;
399
+ foreach ((array) $_GET["where"] as $v) {
400
+ if (!array_key_exists($v["col"], $unique_array)) {
401
+ $link .= where_link($i++, $v["col"], $v["val"], $v["op"]);
402
+ }
403
+ }
404
+ foreach ($unique_array as $k => $v) {
405
+ $link .= where_link($i++, $k, $v);
406
+ }
407
+ }
408
+
409
+ $val = select_value($val, $link, $field, $text_length);
410
+ $id = h("val[$unique_idf][" . bracket_escape($key) . "]");
411
+ $value = $_POST["val"][$unique_idf][bracket_escape($key)];
412
+ $editable = !is_array($row[$key]) && is_utf8($val) && $rows[$n][$key] == $row[$key] && !$functions[$key];
413
+ $text = preg_match('~text|lob~', $field["type"]);
414
+ if (($_GET["modify"] && $editable) || $value !== null) {
415
+ $h_value = h($value !== null ? $value : $row[$key]);
416
+ echo "<td>" . ($text ? "<textarea name='$id' cols='30' rows='" . (substr_count($row[$key], "\n") + 1) . "'>$h_value</textarea>" : "<input name='$id' value='$h_value' size='$lengths[$key]'>");
417
+ } else {
418
+ $long = strpos($val, "<i>...</i>");
419
+ echo "<td id='$id' onclick=\"selectClick(this, event, " . ($long ? 2 : ($text ? 1 : 0)) . ($editable ? "" : ", '" . h(lang('Use edit link to modify this value.')) . "'") . ");\">$val";
420
+ }
421
+ }
422
+ }
423
+
424
+ if ($backward_keys) {
425
+ echo "<td>";
426
+ }
427
+ $adminer->backwardKeysPrint($backward_keys, $rows[$n]);
428
+ echo "</tr>\n"; // close to allow white-space: pre
429
+ }
430
+
431
+ if (is_ajax()) {
432
+ exit;
433
+ }
434
+ echo "</table>\n";
435
+ }
436
+
437
+ if (($rows || $page) && !is_ajax()) {
438
+ $exact_count = true;
439
+ if ($_GET["page"] != "last") {
440
+ if (!+$limit) {
441
+ $found_rows = count($rows);
442
+ } elseif ($jush != "sql" || !$is_group) {
443
+ $found_rows = ($is_group ? false : found_rows($table_status, $where));
444
+ if ($found_rows < max(1e4, 2 * ($page + 1) * $limit)) {
445
+ // slow with big tables
446
+ $found_rows = reset(slow_query(count_rows($TABLE, $where, $is_group, $group)));
447
+ } else {
448
+ $exact_count = false;
449
+ }
450
+ }
451
+ }
452
+
453
+ if (+$limit && ($found_rows === false || $found_rows > $limit || $page)) {
454
+ echo "<p class='pages'>";
455
+ // display first, previous 4, next 4 and last page
456
+ $max_page = ($found_rows === false
457
+ ? $page + (count($rows) >= $limit ? 2 : 1)
458
+ : floor(($found_rows - 1) / $limit)
459
+ );
460
+ if ($jush != "simpledb") {
461
+ echo '<a href="' . h(remove_from_uri("page")) . "\" onclick=\"pageClick(this.href, +prompt('" . lang('Page') . "', '" . ($page + 1) . "'), event); return false;\">" . lang('Page') . "</a>:";
462
+ echo pagination(0, $page) . ($page > 5 ? " ..." : "");
463
+ for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
464
+ echo pagination($i, $page);
465
+ }
466
+ if ($max_page > 0) {
467
+ echo ($page + 5 < $max_page ? " ..." : "");
468
+ echo ($exact_count && $found_rows !== false
469
+ ? pagination($max_page, $page)
470
+ : " <a href='" . h(remove_from_uri("page") . "&page=last") . "' title='~$max_page'>" . lang('last') . "</a>"
471
+ );
472
+ }
473
+ echo (($found_rows === false ? count($rows) + 1 : $found_rows - $page * $limit) > $limit
474
+ ? ' <a href="' . h(remove_from_uri("page") . "&page=" . ($page + 1)) . '" onclick="return !selectLoadMore(this, ' . (+$limit) . ', \'' . lang('Loading') . '...\');" class="loadmore">' . lang('Load more data') . '</a>'
475
+ : ''
476
+ );
477
+ } else {
478
+ echo lang('Page') . ":";
479
+ echo pagination(0, $page) . ($page > 1 ? " ..." : "");
480
+ echo ($page ? pagination($page, $page) : "");
481
+ echo ($max_page > $page ? pagination($page + 1, $page) . ($max_page > $page + 1 ? " ..." : "") : "");
482
+ }
483
+ }
484
+
485
+ echo "<p class='count'>\n";
486
+ echo ($found_rows !== false ? "(" . ($exact_count ? "" : "~ ") . lang('%d row(s)', $found_rows) . ") " : "");
487
+ $display_rows = ($exact_count ? "" : "~ ") . $found_rows;
488
+ echo checkbox("all", 1, 0, lang('whole result'), "var checked = formChecked(this, /check/); selectCount('selected', this.checked ? '$display_rows' : checked); selectCount('selected2', this.checked || !checked ? '$display_rows' : checked);") . "\n";
489
+
490
+ if ($adminer->selectCommandPrint()) {
491
+ ?>
492
+ <fieldset<?php echo ($_GET["modify"] ? '' : ' class="jsonly"'); ?>><legend><?php echo lang('Modify'); ?></legend><div>
493
+ <input type="submit" value="<?php echo lang('Save'); ?>"<?php echo ($_GET["modify"] ? '' : ' title="' . lang('Ctrl+click on a value to modify it.') . '"'); ?>>
494
+ </div></fieldset>
495
+ <fieldset><legend><?php echo lang('Selected'); ?> <span id="selected"></span></legend><div>
496
+ <input type="submit" name="edit" value="<?php echo lang('Edit'); ?>">
497
+ <input type="submit" name="clone" value="<?php echo lang('Clone'); ?>">
498
+ <input type="submit" name="delete" value="<?php echo lang('Delete'); ?>"<?php echo confirm(); ?>>
499
+ </div></fieldset>
500
+ <?php
501
+ }
502
+
503
+ $format = $adminer->dumpFormat();
504
+ foreach ((array) $_GET["columns"] as $column) {
505
+ if ($column["fun"]) {
506
+ unset($format['sql']);
507
+ break;
508
+ }
509
+ }
510
+ if ($format) {
511
+ print_fieldset("export", lang('Export') . " <span id='selected2'></span>");
512
+ $output = $adminer->dumpOutput();
513
+ echo ($output ? html_select("output", $output, $adminer_import["output"]) . " " : "");
514
+ echo html_select("format", $format, $adminer_import["format"]);
515
+ echo " <input type='submit' name='export' value='" . lang('Export') . "'>\n";
516
+ echo "</div></fieldset>\n";
517
+ }
518
+
519
+ echo (!$group && $select ? "" : "<script type='text/javascript'>tableCheck();</script>\n");
520
+ }
521
+
522
+ if ($adminer->selectImportPrint()) {
523
+ print_fieldset("import", lang('Import'), !$rows);
524
+ echo "<input type='file' name='csv_file'> ";
525
+ echo html_select("separator", array("csv" => "CSV,", "csv;" => "CSV;", "tsv" => "TSV"), $adminer_import["format"], 1); // 1 - select
526
+ echo " <input type='submit' name='import' value='" . lang('Import') . "'>";
527
+ echo "</div></fieldset>\n";
528
+ }
529
+
530
+ $adminer->selectEmailPrint(array_filter($email_fields, 'strlen'), $columns);
531
+
532
+ echo "<p><input type='hidden' name='token' value='$token'></p>\n";
533
+ echo "</form>\n";
534
+ }
535
+ }
536
+
537
+ if (is_ajax()) {
538
+ ob_end_clean();
539
+ exit;
540
+ }
adminer/adminer/adminer/sequence.inc.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $SEQUENCE = $_GET["sequence"];
3
+ $row = $_POST;
4
+
5
+ if ($_POST && !$error) {
6
+ $link = substr(ME, 0, -1);
7
+ $name = trim($row["name"]);
8
+ if ($_POST["drop"]) {
9
+ query_redirect("DROP SEQUENCE " . idf_escape($SEQUENCE), $link, lang('Sequence has been dropped.'));
10
+ } elseif ($SEQUENCE == "") {
11
+ query_redirect("CREATE SEQUENCE " . idf_escape($name), $link, lang('Sequence has been created.'));
12
+ } elseif ($SEQUENCE != $name) {
13
+ query_redirect("ALTER SEQUENCE " . idf_escape($SEQUENCE) . " RENAME TO " . idf_escape($name), $link, lang('Sequence has been altered.'));
14
+ } else {
15
+ redirect($link);
16
+ }
17
+ }
18
+
19
+ page_header($SEQUENCE != "" ? lang('Alter sequence') . ": " . h($SEQUENCE) : lang('Create sequence'), $error);
20
+
21
+ if (!$row) {
22
+ $row["name"] = $SEQUENCE;
23
+ }
24
+ ?>
25
+
26
+ <form action="" method="post">
27
+ <p><input name="name" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
28
+ <input type="submit" value="<?php echo lang('Save'); ?>">
29
+ <?php
30
+ if ($SEQUENCE != "") {
31
+ echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
32
+ }
33
+ ?>
34
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
35
+ </form>
adminer/adminer/adminer/sql.inc.php ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!$error && $_POST["export"]) {
3
+ dump_headers("sql");
4
+ $adminer->dumpTable("", "");
5
+ $adminer->dumpData("", "table", $_POST["query"]);
6
+ exit;
7
+ }
8
+
9
+ restart_session();
10
+ $history_all = &get_session("queries");
11
+ $history = &$history_all[DB];
12
+ if (!$error && $_POST["clear"]) {
13
+ $history = array();
14
+ redirect(remove_from_uri("history"));
15
+ }
16
+
17
+ page_header((isset($_GET["import"]) ? lang('Import') : lang('SQL command')), $error);
18
+
19
+ if (!$error && $_POST) {
20
+ $fp = false;
21
+ if (!isset($_GET["import"])) {
22
+ $query = $_POST["query"];
23
+ } elseif ($_POST["webfile"]) {
24
+ $fp = @fopen((file_exists("adminer.sql")
25
+ ? "adminer.sql"
26
+ : "compress.zlib://adminer.sql.gz"
27
+ ), "rb");
28
+ $query = ($fp ? fread($fp, 1e6) : false);
29
+ } else {
30
+ $query = get_file("sql_file", true);
31
+ }
32
+
33
+ if (is_string($query)) { // get_file() returns error as number, fread() as false
34
+ if (function_exists('memory_get_usage')) {
35
+ @ini_set("memory_limit", max(ini_bytes("memory_limit"), 2 * strlen($query) + memory_get_usage() + 8e6)); // @ - may be disabled, 2 - substr and trim, 8e6 - other variables
36
+ }
37
+
38
+ if ($query != "" && strlen($query) < 1e6) { // don't add big queries
39
+ $q = $query . (preg_match("~;[ \t\r\n]*\$~", $query) ? "" : ";"); //! doesn't work with DELIMITER |
40
+ if (!$history || reset(end($history)) != $q) { // no repeated queries
41
+ restart_session();
42
+ $history[] = array($q, time()); //! add elapsed time
43
+ set_session("queries", $history_all); // required because reference is unlinked by stop_session()
44
+ stop_session();
45
+ }
46
+ }
47
+
48
+ $space = "(?:\\s|/\\*[\s\S]*?\\*/|(?:#|-- )[^\n]*\n?|--\r?\n)";
49
+ $delimiter = ";";
50
+ $offset = 0;
51
+ $empty = true;
52
+ $connection2 = connect(); // connection for exploring indexes and EXPLAIN (to not replace FOUND_ROWS()) //! PDO - silent error
53
+ if (is_object($connection2) && DB != "") {
54
+ $connection2->select_db(DB);
55
+ }
56
+ $commands = 0;
57
+ $errors = array();
58
+ $parse = '[\'"' . ($jush == "sql" ? '`#' : ($jush == "sqlite" ? '`[' : ($jush == "mssql" ? '[' : ''))) . ']|/\\*|-- |$' . ($jush == "pgsql" ? '|\\$[^$]*\\$' : '');
59
+ $total_start = microtime(true);
60
+ parse_str($_COOKIE["adminer_export"], $adminer_export);
61
+ $dump_format = $adminer->dumpFormat();
62
+ unset($dump_format["sql"]);
63
+
64
+ while ($query != "") {
65
+ if (!$offset && preg_match("~^$space*+DELIMITER\\s+(\\S+)~i", $query, $match)) {
66
+ $delimiter = $match[1];
67
+ $query = substr($query, strlen($match[0]));
68
+ } else {
69
+ preg_match('(' . preg_quote($delimiter) . "\\s*|$parse)", $query, $match, PREG_OFFSET_CAPTURE, $offset); // should always match
70
+ list($found, $pos) = $match[0];
71
+ if (!$found && $fp && !feof($fp)) {
72
+ $query .= fread($fp, 1e5);
73
+ } else {
74
+ if (!$found && rtrim($query) == "") {
75
+ break;
76
+ }
77
+ $offset = $pos + strlen($found);
78
+
79
+ if ($found && rtrim($found) != $delimiter) { // find matching quote or comment end
80
+ while (preg_match('(' . ($found == '/*' ? '\\*/' : ($found == '[' ? ']' : (preg_match('~^-- |^#~', $found) ? "\n" : preg_quote($found) . "|\\\\."))) . '|$)s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES
81
+ $s = $match[0][0];
82
+ if (!$s && $fp && !feof($fp)) {
83
+ $query .= fread($fp, 1e5);
84
+ } else {
85
+ $offset = $match[0][1] + strlen($s);
86
+ if ($s[0] != "\\") {
87
+ break;
88
+ }
89
+ }
90
+ }
91
+
92
+ } else { // end of a query
93
+ $empty = false;
94
+ $q = substr($query, 0, $pos);
95
+ $commands++;
96
+ $print = "<pre id='sql-$commands'><code class='jush-$jush'>" . shorten_utf8(trim($q), 1000) . "</code></pre>\n";
97
+ if ($jush == "sqlite" && preg_match("~^$space*+ATTACH\\b~i", $q, $match)) {
98
+ // PHP doesn't support setting SQLITE_LIMIT_ATTACHED
99
+ echo $print;
100
+ echo "<p class='error'>" . lang('ATTACH queries are not supported.') . "\n";
101
+ $errors[] = " <a href='#sql-$commands'>$commands</a>";
102
+ if ($_POST["error_stops"]) {
103
+ break;
104
+ }
105
+ } else {
106
+ if (!$_POST["only_errors"]) {
107
+ echo $print;
108
+ ob_flush();
109
+ flush(); // can take a long time - show the running query
110
+ }
111
+ $start = microtime(true);
112
+ //! don't allow changing of character_set_results, convert encoding of displayed query
113
+ if ($connection->multi_query($q) && is_object($connection2) && preg_match("~^$space*+USE\\b~i", $q)) {
114
+ $connection2->query($q);
115
+ }
116
+
117
+ do {
118
+ $result = $connection->store_result();
119
+ $time = " <span class='time'>(" . format_time($start) . ")</span>"
120
+ . (strlen($q) < 1000 ? " <a href='" . h(ME) . "sql=" . urlencode(trim($q)) . "'>" . lang('Edit') . "</a>" : "") // 1000 - maximum length of encoded URL in IE is 2083 characters
121
+ ;
122
+
123
+ if ($connection->error) {
124
+ echo ($_POST["only_errors"] ? $print : "");
125
+ echo "<p class='error'>" . lang('Error in query') . ($connection->errno ? " ($connection->errno)" : "") . ": " . error() . "\n";
126
+ $errors[] = " <a href='#sql-$commands'>$commands</a>";
127
+ if ($_POST["error_stops"]) {
128
+ break 2;
129
+ }
130
+
131
+ } elseif (is_object($result)) {
132
+ $limit = $_POST["limit"];
133
+ $orgtables = select($result, $connection2, array(), $limit);
134
+ if (!$_POST["only_errors"]) {
135
+ echo "<form action='' method='post'>\n";
136
+ $num_rows = $result->num_rows;
137
+ echo "<p>" . ($num_rows ? ($limit && $num_rows > $limit ? lang('%d / ', $limit) : "") . lang('%d row(s)', $num_rows) : "");
138
+ echo $time;
139
+ $id = "export-$commands";
140
+ $export = ", <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('Export') . "</a><span id='$id' class='hidden'>: "
141
+ . html_select("output", $adminer->dumpOutput(), $adminer_export["output"]) . " "
142
+ . html_select("format", $dump_format, $adminer_export["format"])
143
+ . "<input type='hidden' name='query' value='" . h($q) . "'>"
144
+ . " <input type='submit' name='export' value='" . lang('Export') . "'><input type='hidden' name='token' value='$token'></span>\n"
145
+ ;
146
+ if ($connection2 && preg_match("~^($space|\\()*+SELECT\\b~i", $q) && ($explain = explain($connection2, $q))) {
147
+ $id = "explain-$commands";
148
+ echo ", <a href='#$id' onclick=\"return !toggle('$id');\">EXPLAIN</a>$export";
149
+ echo "<div id='$id' class='hidden'>\n";
150
+ select($explain, $connection2, $orgtables);
151
+ echo "</div>\n";
152
+ } else {
153
+ echo $export;
154
+ }
155
+ echo "</form>\n";
156
+ }
157
+
158
+ } else {
159
+ if (preg_match("~^$space*+(CREATE|DROP|ALTER)$space++(DATABASE|SCHEMA)\\b~i", $q)) {
160
+ restart_session();
161
+ set_session("dbs", null); // clear cache
162
+ stop_session();
163
+ }
164
+ if (!$_POST["only_errors"]) {
165
+ echo "<p class='message' title='" . h($connection->info) . "'>" . lang('Query executed OK, %d row(s) affected.', $connection->affected_rows) . "$time\n";
166
+ }
167
+ }
168
+
169
+ $start = microtime(true);
170
+ } while ($connection->next_result());
171
+ }
172
+
173
+ $query = substr($query, $offset);
174
+ $offset = 0;
175
+ }
176
+
177
+ }
178
+ }
179
+ }
180
+
181
+ if ($empty) {
182
+ echo "<p class='message'>" . lang('No commands to execute.') . "\n";
183
+ } elseif ($_POST["only_errors"]) {
184
+ echo "<p class='message'>" . lang('%d query(s) executed OK.', $commands - count($errors));
185
+ echo " <span class='time'>(" . format_time($total_start) . ")</span>\n";
186
+ } elseif ($errors && $commands > 1) {
187
+ echo "<p class='error'>" . lang('Error in query') . ": " . implode("", $errors) . "\n";
188
+ }
189
+ //! MS SQL - SET SHOWPLAN_ALL OFF
190
+
191
+ } else {
192
+ echo "<p class='error'>" . upload_error($query) . "\n";
193
+ }
194
+ }
195
+ ?>
196
+
197
+ <form action="" method="post" enctype="multipart/form-data" id="form">
198
+ <?php
199
+ $execute = "<input type='submit' value='" . lang('Execute') . "' title='Ctrl+Enter'>";
200
+ if (!isset($_GET["import"])) {
201
+ $q = $_GET["sql"]; // overwrite $q from if ($_POST) to save memory
202
+ if ($_POST) {
203
+ $q = $_POST["query"];
204
+ } elseif ($_GET["history"] == "all") {
205
+ $q = $history;
206
+ } elseif ($_GET["history"] != "") {
207
+ $q = $history[$_GET["history"]][0];
208
+ }
209
+ echo "<p>";
210
+ textarea("query", $q, 20);
211
+ echo ($_POST ? "" : "<script type='text/javascript'>focus(document.getElementsByTagName('textarea')[0]);</script>\n");
212
+ echo "<p>$execute\n";
213
+ echo lang('Limit rows') . ": <input type='number' name='limit' class='size' value='" . h($_POST ? $_POST["limit"] : $_GET["limit"]) . "'>\n";
214
+
215
+ } else {
216
+ echo "<fieldset><legend>" . lang('File upload') . "</legend><div>";
217
+ echo (ini_bool("file_uploads")
218
+ ? "SQL (&lt; " . ini_get("upload_max_filesize") . "B): <input type='file' name='sql_file[]' multiple>\n$execute" // ignore post_max_size because it is for all form fields together and bytes computing would be necessary
219
+ : lang('File uploads are disabled.')
220
+ );
221
+ echo "</div></fieldset>\n";
222
+ echo "<fieldset><legend>" . lang('From server') . "</legend><div>";
223
+ echo lang('Webserver file %s', "<code>adminer.sql" . (extension_loaded("zlib") ? "[.gz]" : "") . "</code>");
224
+ echo ' <input type="submit" name="webfile" value="' . lang('Run file') . '">';
225
+ echo "</div></fieldset>\n";
226
+ echo "<p>";
227
+ }
228
+
229
+ echo checkbox("error_stops", 1, ($_POST ? $_POST["error_stops"] : isset($_GET["import"])), lang('Stop on error')) . "\n";
230
+ echo checkbox("only_errors", 1, ($_POST ? $_POST["only_errors"] : isset($_GET["import"])), lang('Show only errors')) . "\n";
231
+ echo "<input type='hidden' name='token' value='$token'>\n";
232
+
233
+ if (!isset($_GET["import"]) && $history) {
234
+ print_fieldset("history", lang('History'), $_GET["history"] != "");
235
+ for ($val = end($history); $val; $val = prev($history)) { // not array_reverse() to save memory
236
+ $key = key($history);
237
+ list($q, $time, $elapsed) = $val;
238
+ echo '<a href="' . h(ME . "sql=&history=$key") . '">' . lang('Edit') . "</a>"
239
+ . " <span class='time' title='" . @date('Y-m-d', $time) . "'>" . @date("H:i:s", $time) . "</span>" // @ - time zone may be not set
240
+ . " <code class='jush-$jush'>" . shorten_utf8(ltrim(str_replace("\n", " ", str_replace("\r", "", preg_replace('~^(#|-- ).*~m', '', $q)))), 80, "</code>")
241
+ . ($elapsed ? " <span class='time'>($elapsed)</span>" : "")
242
+ . "<br>\n"
243
+ ;
244
+ }
245
+ echo "<input type='submit' name='clear' value='" . lang('Clear') . "'>\n";
246
+ echo "<a href='" . h(ME . "sql=&history=all") . "'>" . lang('Edit all') . "</a>\n";
247
+ echo "</div></fieldset>\n";
248
+ }
249
+ ?>
250
+ </form>
adminer/adminer/adminer/static/arrow.gif ADDED
Binary file
adminer/adminer/adminer/static/cross.gif ADDED
Binary file
adminer/adminer/adminer/static/default.css ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @author Ondrej Valka, http://valka.info */
2
+ body { color: #000; background: #fff; font: 90%/1.25 Verdana, Arial, Helvetica, sans-serif; margin: 0; }
3
+ a { color: blue; text-decoration: none; }
4
+ a:visited { color: navy; }
5
+ a:link:hover, a:visited:hover { color: red; text-decoration: underline; }
6
+ a.text:hover { text-decoration: none; }
7
+ a.jush-help:hover { color: inherit; }
8
+ h1 { font-size: 150%; margin: 0; padding: .8em 1em; border-bottom: 1px solid #999; font-weight: normal; color: #777; background: #eee; }
9
+ h2 { font-size: 150%; margin: 0 0 20px -18px; padding: .8em 1em; border-bottom: 1px solid #000; color: #000; font-weight: normal; background: #ddf; }
10
+ h3 { font-weight: normal; font-size: 130%; margin: 1em 0 0; }
11
+ form { margin: 0; }
12
+ td table { width: 100%; margin: 0; }
13
+ table { margin: 1em 20px 0 0; border: 0; border-top: 1px solid #999; border-left: 1px solid #999; font-size: 90%; }
14
+ td, th { border: 0; border-right: 1px solid #999; border-bottom: 1px solid #999; padding: .2em .3em; }
15
+ th { background: #eee; text-align: left; }
16
+ thead th { text-align: center; padding: .2em .5em; }
17
+ thead td, thead th { background: #ddf; }
18
+ fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: .8em .5em 0 0; border: 1px solid #999; }
19
+ p { margin: .8em 20px 0 0; }
20
+ img { vertical-align: middle; border: 0; }
21
+ td img { max-width: 200px; max-height: 200px; }
22
+ code { background: #eee; }
23
+ tbody tr:hover td, tbody tr:hover th { background: #eee; }
24
+ pre { margin: 1em 0 0; }
25
+ pre, textarea { font: 100%/1.25 monospace; }
26
+ input[type=image] { vertical-align: middle; }
27
+ input.default { box-shadow: 1px 1px 1px #777; }
28
+ input.required { box-shadow: 1px 1px 1px red; }
29
+ .block { display: block; }
30
+ .version { color: #777; font-size: 67%; }
31
+ .js .hidden, .nojs .jsonly { display: none; }
32
+ .js .column { position: absolute; background: #ddf; padding: .27em 1ex .3em 0; margin-top: -.27em; }
33
+ .nowrap td, .nowrap th, td.nowrap { white-space: pre; }
34
+ .wrap td { white-space: normal; }
35
+ .error { color: red; background: #fee; }
36
+ .error b { background: #fff; font-weight: normal; }
37
+ .message { color: green; background: #efe; }
38
+ .error, .message { padding: .5em .8em; margin: 1em 20px 0 0; }
39
+ .char { color: #007F00; }
40
+ .date { color: #7F007F; }
41
+ .enum { color: #007F7F; }
42
+ .binary { color: red; }
43
+ .odd td { background: #F5F5F5; }
44
+ .js .checkable .checked td, .js .checkable .checked th { background: #ddf; }
45
+ .time { color: silver; font-size: 70%; }
46
+ .function { text-align: right; }
47
+ .number { text-align: right; }
48
+ .datetime { text-align: right; }
49
+ .type { width: 15ex; width: auto\9; }
50
+ .options select { width: 20ex; width: auto\9; }
51
+ .view { font-style: italic; }
52
+ .active { font-weight: bold; }
53
+ .sqlarea { width: 98%; }
54
+ .icon { width: 18px; height: 18px; background-color: navy; }
55
+ .icon:hover { background-color: red; }
56
+ .size { width: 6ex; }
57
+ .help { cursor: help; }
58
+ .pages { position: fixed; bottom: 0; left: 21em; padding: 5px; background: #ddf; border: 1px solid #999; }
59
+ .links a { white-space: nowrap; margin-right: 20px; }
60
+ .logout { margin-top: .5em; position: absolute; top: 0; right: 0; }
61
+ .loadmore { margin-left: 1ex; }
62
+ #menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; }
63
+ #menu p { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
64
+ #dbs { overflow: hidden; }
65
+ #logins, #tables { white-space: nowrap; overflow: auto; }
66
+ #logins a, #tables a, #tables span { background: #fff; }
67
+ #content { margin: 2em 0 0 21em; padding: 10px 20px 20px 0; }
68
+ #lang { position: absolute; top: 0; left: 0; line-height: 1.8em; padding: .3em 1em; }
69
+ #breadcrumb { white-space: nowrap; position: absolute; top: 0; left: 21em; background: #eee; height: 2em; line-height: 1.8em; padding: 0 1em; margin: 0 0 0 -18px; }
70
+ #h1 { color: #777; text-decoration: none; font-style: italic; }
71
+ #version { font-size: 67%; color: red; }
72
+ #schema { margin-left: 60px; position: relative; -moz-user-select: none; -webkit-user-select: none; }
73
+ #schema .table { border: 1px solid silver; padding: 0 2px; cursor: move; position: absolute; }
74
+ #schema .references { position: absolute; }
75
+ #help { position: absolute; border: 1px solid #999; background: #eee; padding: 5px; font-family: monospace; z-index: 1; }
76
+
77
+ .rtl h2 { margin: 0 -18px 20px 0; }
78
+ .rtl p, .rtl table, .rtl .error, .rtl .message { margin: 1em 0 0 20px; }
79
+ .rtl .logout { left: 0; right: auto; }
80
+ .rtl #content { margin: 2em 21em 0 0; padding: 10px 0 20px 20px; }
81
+ .rtl #breadcrumb { left: auto; right: 21em; margin: 0 -18px 0 0; }
82
+ .rtl #lang, .rtl #menu { left: auto; right: 0; }
83
+
84
+ @media all and (max-device-width: 880px) {
85
+ .pages { left: auto; }
86
+ #menu { position: static; width: auto; }
87
+ #content { margin-left: 10px; }
88
+ #lang { position: static; border-top: 1px solid #999; }
89
+ #breadcrumb { left: auto; }
90
+ .rtl #content { margin-right: 10px; }
91
+ .rtl #breadcrumb { right: auto; }
92
+ }
93
+
94
+ @media print {
95
+ #lang, #menu { display: none; }
96
+ #content { margin-left: 1em; }
97
+ #breadcrumb { left: 1em; }
98
+ .nowrap td, .nowrap th, td.nowrap { white-space: normal; }
99
+ }
adminer/adminer/adminer/static/down.gif ADDED
Binary file
adminer/adminer/adminer/static/editing.js ADDED
@@ -0,0 +1,616 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Adminer specific functions
2
+
3
+ /** Load syntax highlighting
4
+ * @param string first three characters of database system version
5
+ */
6
+ function bodyLoad(version) {
7
+ if (window.jush) {
8
+ jush.create_links = ' target="_blank" rel="noreferrer"';
9
+ if (version) {
10
+ for (var key in jush.urls) {
11
+ var obj = jush.urls;
12
+ if (typeof obj[key] != 'string') {
13
+ obj = obj[key];
14
+ key = 0;
15
+ }
16
+ obj[key] = obj[key]
17
+ .replace(/\/doc\/mysql/, '/doc/refman/' + version) // MySQL
18
+ .replace(/\/docs\/current/, '/docs/' + version) // PostgreSQL
19
+ ;
20
+ }
21
+ }
22
+ if (window.jushLinks) {
23
+ jush.custom_links = jushLinks;
24
+ }
25
+ jush.highlight_tag('code', 0);
26
+ var tags = document.getElementsByTagName('textarea');
27
+ for (var i = 0; i < tags.length; i++) {
28
+ if (/(^|\s)jush-/.test(tags[i].className)) {
29
+ var pre = jush.textarea(tags[i]);
30
+ if (pre) {
31
+ setupSubmitHighlightInput(pre);
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
37
+
38
+ /** Get value of dynamically created form field
39
+ * @param HTMLFormElement
40
+ * @param string
41
+ * @return HTMLElement
42
+ */
43
+ function formField(form, name) {
44
+ // required in IE < 8, form.elements[name] doesn't work
45
+ for (var i=0; i < form.length; i++) {
46
+ if (form[i].name == name) {
47
+ return form[i];
48
+ }
49
+ }
50
+ }
51
+
52
+ /** Try to change input type to password or to text
53
+ * @param HTMLInputElement
54
+ * @param boolean
55
+ */
56
+ function typePassword(el, disable) {
57
+ try {
58
+ el.type = (disable ? 'text' : 'password');
59
+ } catch (e) {
60
+ }
61
+ }
62
+
63
+
64
+
65
+ var dbCtrl;
66
+ var dbPrevious = {};
67
+
68
+ /** Check if database should be opened to a new window
69
+ * @param MouseEvent
70
+ * @param HTMLSelectElement
71
+ */
72
+ function dbMouseDown(event, el) {
73
+ dbCtrl = isCtrl(event);
74
+ if (dbPrevious[el.name] == undefined) {
75
+ dbPrevious[el.name] = el.value;
76
+ }
77
+ }
78
+
79
+ /** Load database after selecting it
80
+ * @param HTMLSelectElement
81
+ */
82
+ function dbChange(el) {
83
+ if (dbCtrl) {
84
+ el.form.target = '_blank';
85
+ }
86
+ el.form.submit();
87
+ el.form.target = '';
88
+ if (dbCtrl && dbPrevious[el.name] != undefined) {
89
+ el.value = dbPrevious[el.name];
90
+ dbPrevious[el.name] = undefined;
91
+ }
92
+ }
93
+
94
+
95
+
96
+ /** Check whether the query will be executed with index
97
+ * @param HTMLFormElement
98
+ */
99
+ function selectFieldChange(form) {
100
+ var ok = (function () {
101
+ var inputs = form.getElementsByTagName('input');
102
+ for (var i=0; i < inputs.length; i++) {
103
+ if (inputs[i].value && /^fulltext/.test(inputs[i].name)) {
104
+ return true;
105
+ }
106
+ }
107
+ var ok = form.limit.value;
108
+ var selects = form.getElementsByTagName('select');
109
+ var group = false;
110
+ var columns = {};
111
+ for (var i=0; i < selects.length; i++) {
112
+ var select = selects[i];
113
+ var col = selectValue(select);
114
+ var match = /^(where.+)col\]/.exec(select.name);
115
+ if (match) {
116
+ var op = selectValue(form[match[1] + 'op]']);
117
+ var val = form[match[1] + 'val]'].value;
118
+ if (col in indexColumns && (!/LIKE|REGEXP/.test(op) || (op == 'LIKE' && val.charAt(0) != '%'))) {
119
+ return true;
120
+ } else if (col || val) {
121
+ ok = false;
122
+ }
123
+ }
124
+ if ((match = /^(columns.+)fun\]/.exec(select.name))) {
125
+ if (/^(avg|count|count distinct|group_concat|max|min|sum)$/.test(col)) {
126
+ group = true;
127
+ }
128
+ var val = selectValue(form[match[1] + 'col]']);
129
+ if (val) {
130
+ columns[col && col != 'count' ? '' : val] = 1;
131
+ }
132
+ }
133
+ if (col && /^order/.test(select.name)) {
134
+ if (!(col in indexColumns)) {
135
+ ok = false;
136
+ }
137
+ break;
138
+ }
139
+ }
140
+ if (group) {
141
+ for (var col in columns) {
142
+ if (!(col in indexColumns)) {
143
+ ok = false;
144
+ }
145
+ }
146
+ }
147
+ return ok;
148
+ })();
149
+ setHtml('noindex', (ok ? '' : '!'));
150
+ }
151
+
152
+
153
+
154
+ var added = '.', rowCount;
155
+
156
+ /** Check if val is equal to a-delimiter-b where delimiter is '_', '' or big letter
157
+ * @param string
158
+ * @param string
159
+ * @param string
160
+ * @return boolean
161
+ */
162
+ function delimiterEqual(val, a, b) {
163
+ return (val == a + '_' + b || val == a + b || val == a + b.charAt(0).toUpperCase() + b.substr(1));
164
+ }
165
+
166
+ /** Escape string to use as identifier
167
+ * @param string
168
+ * @return string
169
+ */
170
+ function idfEscape(s) {
171
+ return s.replace(/`/, '``');
172
+ }
173
+
174
+ /** Detect foreign key
175
+ * @param HTMLInputElement
176
+ */
177
+ function editingNameChange(field) {
178
+ var name = field.name.substr(0, field.name.length - 7);
179
+ var type = formField(field.form, name + '[type]');
180
+ var opts = type.options;
181
+ var candidate; // don't select anything with ambiguous match (like column `id`)
182
+ var val = field.value;
183
+ for (var i = opts.length; i--; ) {
184
+ var match = /(.+)`(.+)/.exec(opts[i].value);
185
+ if (!match) { // common type
186
+ if (candidate && i == opts.length - 2 && val == opts[candidate].value.replace(/.+`/, '') && name == 'fields[1]') { // single target table, link to column, first field - probably `id`
187
+ return;
188
+ }
189
+ break;
190
+ }
191
+ var table = match[1];
192
+ var column = match[2];
193
+ var tables = [ table, table.replace(/s$/, ''), table.replace(/es$/, '') ];
194
+ for (var j=0; j < tables.length; j++) {
195
+ table = tables[j];
196
+ if (val == column || val == table || delimiterEqual(val, table, column) || delimiterEqual(val, column, table)) {
197
+ if (candidate) {
198
+ return;
199
+ }
200
+ candidate = i;
201
+ break;
202
+ }
203
+ }
204
+ }
205
+ if (candidate) {
206
+ type.selectedIndex = candidate;
207
+ type.onchange();
208
+ }
209
+ }
210
+
211
+ /** Add table row for next field
212
+ * @param HTMLInputElement
213
+ * @param boolean
214
+ * @return boolean
215
+ */
216
+ function editingAddRow(button, focus) {
217
+ var match = /(\d+)(\.\d+)?/.exec(button.name);
218
+ var x = match[0] + (match[2] ? added.substr(match[2].length) : added) + '1';
219
+ var row = parentTag(button, 'tr');
220
+ var row2 = cloneNode(row);
221
+ var tags = row.getElementsByTagName('select');
222
+ var tags2 = row2.getElementsByTagName('select');
223
+ for (var i=0; i < tags.length; i++) {
224
+ tags2[i].name = tags[i].name.replace(/[0-9.]+/, x);
225
+ tags2[i].selectedIndex = tags[i].selectedIndex;
226
+ }
227
+ tags = row.getElementsByTagName('input');
228
+ tags2 = row2.getElementsByTagName('input');
229
+ var input = tags2[0]; // IE loose tags2 after insertBefore()
230
+ for (var i=0; i < tags.length; i++) {
231
+ if (tags[i].name == 'auto_increment_col') {
232
+ tags2[i].value = x;
233
+ tags2[i].checked = false;
234
+ }
235
+ tags2[i].name = tags[i].name.replace(/([0-9.]+)/, x);
236
+ if (/\[(orig|field|comment|default)/.test(tags[i].name)) {
237
+ tags2[i].value = '';
238
+ }
239
+ if (/\[(has_default)/.test(tags[i].name)) {
240
+ tags2[i].checked = false;
241
+ }
242
+ }
243
+ tags[0].onchange = function () {
244
+ editingNameChange(tags[0]);
245
+ };
246
+ tags[0].onkeyup = function () {
247
+ };
248
+ row.parentNode.insertBefore(row2, row.nextSibling);
249
+ if (focus) {
250
+ input.onchange = function () {
251
+ editingNameChange(input);
252
+ };
253
+ input.onkeyup = function () {
254
+ };
255
+ input.focus();
256
+ }
257
+ added += '0';
258
+ rowCount++;
259
+ return true;
260
+ }
261
+
262
+ /** Remove table row for field
263
+ * @param HTMLInputElement
264
+ * @param string
265
+ * @return boolean
266
+ */
267
+ function editingRemoveRow(button, name) {
268
+ var field = formField(button.form, button.name.replace(/[^\[]+(.+)/, name));
269
+ field.parentNode.removeChild(field);
270
+ parentTag(button, 'tr').style.display = 'none';
271
+ return true;
272
+ }
273
+
274
+ var lastType = '';
275
+
276
+ /** Clear length and hide collation or unsigned
277
+ * @param HTMLSelectElement
278
+ */
279
+ function editingTypeChange(type) {
280
+ var name = type.name.substr(0, type.name.length - 6);
281
+ var text = selectValue(type);
282
+ for (var i=0; i < type.form.elements.length; i++) {
283
+ var el = type.form.elements[i];
284
+ if (el.name == name + '[length]') {
285
+ if (!(
286
+ (/(char|binary)$/.test(lastType) && /(char|binary)$/.test(text))
287
+ || (/(enum|set)$/.test(lastType) && /(enum|set)$/.test(text))
288
+ )) {
289
+ el.value = '';
290
+ }
291
+ el.onchange.apply(el);
292
+ }
293
+ if (lastType == 'timestamp' && el.name == name + '[has_default]' && /timestamp/i.test(formField(type.form, name + '[default]').value)) {
294
+ el.checked = false;
295
+ }
296
+ if (el.name == name + '[collation]') {
297
+ alterClass(el, 'hidden', !/(char|text|enum|set)$/.test(text));
298
+ }
299
+ if (el.name == name + '[unsigned]') {
300
+ alterClass(el, 'hidden', !/((^|[^o])int|float|double|decimal)$/.test(text));
301
+ }
302
+ if (el.name == name + '[on_update]') {
303
+ alterClass(el, 'hidden', !/timestamp|datetime/.test(text)); // MySQL supports datetime since 5.6.5
304
+ }
305
+ if (el.name == name + '[on_delete]') {
306
+ alterClass(el, 'hidden', !/`/.test(text));
307
+ }
308
+ }
309
+ helpClose();
310
+ }
311
+
312
+ /** Mark length as required
313
+ * @param HTMLInputElement
314
+ */
315
+ function editingLengthChange(el) {
316
+ alterClass(el, 'required', !el.value.length && /var(char|binary)$/.test(selectValue(el.parentNode.previousSibling.firstChild)));
317
+ }
318
+
319
+ /** Edit enum or set
320
+ * @param HTMLInputElement
321
+ */
322
+ function editingLengthFocus(field) {
323
+ var td = field.parentNode;
324
+ if (/(enum|set)$/.test(selectValue(td.previousSibling.firstChild))) {
325
+ var edit = document.getElementById('enum-edit');
326
+ var val = field.value;
327
+ edit.value = (/^'.+'$/.test(val) ? val.substr(1, val.length - 2).replace(/','/g, "\n").replace(/''/g, "'") : val); //! doesn't handle 'a'',''b' correctly
328
+ td.appendChild(edit);
329
+ field.style.display = 'none';
330
+ edit.style.display = 'inline';
331
+ edit.focus();
332
+ }
333
+ }
334
+
335
+ /** Finish editing of enum or set
336
+ * @param HTMLTextAreaElement
337
+ */
338
+ function editingLengthBlur(edit) {
339
+ var field = edit.parentNode.firstChild;
340
+ var val = edit.value;
341
+ field.value = (/^'[^\n]+'$/.test(val) ? val : "'" + val.replace(/\n+$/, '').replace(/'/g, "''").replace(/\n/g, "','") + "'");
342
+ field.style.display = 'inline';
343
+ edit.style.display = 'none';
344
+ }
345
+
346
+ /** Show or hide selected table column
347
+ * @param boolean
348
+ * @param number
349
+ */
350
+ function columnShow(checked, column) {
351
+ var trs = document.getElementById('edit-fields').getElementsByTagName('tr');
352
+ for (var i=0; i < trs.length; i++) {
353
+ alterClass(trs[i].getElementsByTagName('td')[column], 'hidden', !checked);
354
+ }
355
+ }
356
+
357
+ /** Hide column with default values in narrow window
358
+ */
359
+ function editingHideDefaults() {
360
+ if (innerWidth < document.documentElement.scrollWidth) {
361
+ document.getElementById('form')['defaults'].checked = false;
362
+ columnShow(false, 5);
363
+ }
364
+ }
365
+
366
+ /** Display partition options
367
+ * @param HTMLSelectElement
368
+ */
369
+ function partitionByChange(el) {
370
+ var partitionTable = /RANGE|LIST/.test(selectValue(el));
371
+ alterClass(el.form['partitions'], 'hidden', partitionTable || !el.selectedIndex);
372
+ alterClass(document.getElementById('partition-table'), 'hidden', !partitionTable);
373
+ helpClose();
374
+ }
375
+
376
+ /** Add next partition row
377
+ * @param HTMLInputElement
378
+ */
379
+ function partitionNameChange(el) {
380
+ var row = cloneNode(parentTag(el, 'tr'));
381
+ row.firstChild.firstChild.value = '';
382
+ parentTag(el, 'table').appendChild(row);
383
+ el.onchange = function () {};
384
+ }
385
+
386
+
387
+
388
+ /** Add row for foreign key
389
+ * @param HTMLSelectElement
390
+ */
391
+ function foreignAddRow(field) {
392
+ field.onchange = function () { };
393
+ var row = cloneNode(parentTag(field, 'tr'));
394
+ var selects = row.getElementsByTagName('select');
395
+ for (var i=0; i < selects.length; i++) {
396
+ selects[i].name = selects[i].name.replace(/\]/, '1$&');
397
+ selects[i].selectedIndex = 0;
398
+ }
399
+ parentTag(field, 'table').appendChild(row);
400
+ }
401
+
402
+
403
+
404
+ /** Add row for indexes
405
+ * @param HTMLSelectElement
406
+ */
407
+ function indexesAddRow(field) {
408
+ field.onchange = function () { };
409
+ var row = cloneNode(parentTag(field, 'tr'));
410
+ var selects = row.getElementsByTagName('select');
411
+ for (var i=0; i < selects.length; i++) {
412
+ selects[i].name = selects[i].name.replace(/indexes\[\d+/, '$&1');
413
+ selects[i].selectedIndex = 0;
414
+ }
415
+ var inputs = row.getElementsByTagName('input');
416
+ for (var i=0; i < inputs.length; i++) {
417
+ inputs[i].name = inputs[i].name.replace(/indexes\[\d+/, '$&1');
418
+ inputs[i].value = '';
419
+ }
420
+ parentTag(field, 'table').appendChild(row);
421
+ }
422
+
423
+ /** Change column in index
424
+ * @param HTMLSelectElement
425
+ * @param string name prefix
426
+ */
427
+ function indexesChangeColumn(field, prefix) {
428
+ var names = [];
429
+ for (var tag in { 'select': 1, 'input': 1 }) {
430
+ var columns = parentTag(field, 'td').getElementsByTagName(tag);
431
+ for (var i=0; i < columns.length; i++) {
432
+ if (/\[columns\]/.test(columns[i].name)) {
433
+ var value = selectValue(columns[i]);
434
+ if (value) {
435
+ names.push(value);
436
+ }
437
+ }
438
+ }
439
+ }
440
+ field.form[field.name.replace(/\].*/, '][name]')].value = prefix + names.join('_');
441
+ }
442
+
443
+ /** Add column for index
444
+ * @param HTMLSelectElement
445
+ * @param string name prefix
446
+ */
447
+ function indexesAddColumn(field, prefix) {
448
+ field.onchange = function () {
449
+ indexesChangeColumn(field, prefix);
450
+ };
451
+ var select = field.form[field.name.replace(/\].*/, '][type]')];
452
+ if (!select.selectedIndex) {
453
+ while (selectValue(select) != "INDEX" && select.selectedIndex < select.options.length) {
454
+ select.selectedIndex++;
455
+ }
456
+ select.onchange();
457
+ }
458
+ var column = cloneNode(field.parentNode);
459
+ var selects = column.getElementsByTagName('select');
460
+ for (var i = 0; i < selects.length; i++) {
461
+ select = selects[i];
462
+ select.name = select.name.replace(/\]\[\d+/, '$&1');
463
+ select.selectedIndex = 0;
464
+ }
465
+ var inputs = column.getElementsByTagName('input');
466
+ for (var i = 0; i < inputs.length; i++) {
467
+ var input = inputs[i];
468
+ input.name = input.name.replace(/\]\[\d+/, '$&1');
469
+ if (input.type != 'checkbox') {
470
+ input.value = '';
471
+ }
472
+ }
473
+ parentTag(field, 'td').appendChild(column);
474
+ field.onchange();
475
+ }
476
+
477
+
478
+
479
+ /** Handle changing trigger time or event
480
+ * @param RegExp
481
+ * @param string
482
+ * @param HTMLFormElement
483
+ */
484
+ function triggerChange(tableRe, table, form) {
485
+ var formEvent = selectValue(form['Event']);
486
+ if (tableRe.test(form['Trigger'].value)) {
487
+ form['Trigger'].value = table + '_' + (selectValue(form['Timing']).charAt(0) + formEvent.charAt(0)).toLowerCase();
488
+ }
489
+ alterClass(form['Of'], 'hidden', formEvent != 'UPDATE OF');
490
+ }
491
+
492
+
493
+
494
+ var that, x, y; // em and tablePos defined in schema.inc.php
495
+
496
+ /** Get mouse position
497
+ * @param HTMLElement
498
+ * @param MouseEvent
499
+ */
500
+ function schemaMousedown(el, event) {
501
+ if ((event.which ? event.which : event.button) == 1) {
502
+ that = el;
503
+ x = event.clientX - el.offsetLeft;
504
+ y = event.clientY - el.offsetTop;
505
+ }
506
+ }
507
+
508
+ /** Move object
509
+ * @param MouseEvent
510
+ */
511
+ function schemaMousemove(ev) {
512
+ if (that !== undefined) {
513
+ ev = ev || event;
514
+ var left = (ev.clientX - x) / em;
515
+ var top = (ev.clientY - y) / em;
516
+ var divs = that.getElementsByTagName('div');
517
+ var lineSet = { };
518
+ for (var i=0; i < divs.length; i++) {
519
+ if (divs[i].className == 'references') {
520
+ var div2 = document.getElementById((/^refs/.test(divs[i].id) ? 'refd' : 'refs') + divs[i].id.substr(4));
521
+ var ref = (tablePos[divs[i].title] ? tablePos[divs[i].title] : [ div2.parentNode.offsetTop / em, 0 ]);
522
+ var left1 = -1;
523
+ var id = divs[i].id.replace(/^ref.(.+)-.+/, '$1');
524
+ if (divs[i].parentNode != div2.parentNode) {
525
+ left1 = Math.min(0, ref[1] - left) - 1;
526
+ divs[i].style.left = left1 + 'em';
527
+ divs[i].getElementsByTagName('div')[0].style.width = -left1 + 'em';
528
+ var left2 = Math.min(0, left - ref[1]) - 1;
529
+ div2.style.left = left2 + 'em';
530
+ div2.getElementsByTagName('div')[0].style.width = -left2 + 'em';
531
+ }
532
+ if (!lineSet[id]) {
533
+ var line = document.getElementById(divs[i].id.replace(/^....(.+)-.+$/, 'refl$1'));
534
+ var top1 = top + divs[i].offsetTop / em;
535
+ var top2 = top + div2.offsetTop / em;
536
+ if (divs[i].parentNode != div2.parentNode) {
537
+ top2 += ref[0] - top;
538
+ line.getElementsByTagName('div')[0].style.height = Math.abs(top1 - top2) + 'em';
539
+ }
540
+ line.style.left = (left + left1) + 'em';
541
+ line.style.top = Math.min(top1, top2) + 'em';
542
+ lineSet[id] = true;
543
+ }
544
+ }
545
+ }
546
+ that.style.left = left + 'em';
547
+ that.style.top = top + 'em';
548
+ }
549
+ }
550
+
551
+ /** Finish move
552
+ * @param MouseEvent
553
+ * @param string
554
+ */
555
+ function schemaMouseup(ev, db) {
556
+ if (that !== undefined) {
557
+ ev = ev || event;
558
+ tablePos[that.firstChild.firstChild.firstChild.data] = [ (ev.clientY - y) / em, (ev.clientX - x) / em ];
559
+ that = undefined;
560
+ var s = '';
561
+ for (var key in tablePos) {
562
+ s += '_' + key + ':' + Math.round(tablePos[key][0] * 10000) / 10000 + 'x' + Math.round(tablePos[key][1] * 10000) / 10000;
563
+ }
564
+ s = encodeURIComponent(s.substr(1));
565
+ var link = document.getElementById('schema-link');
566
+ link.href = link.href.replace(/[^=]+$/, '') + s;
567
+ cookie('adminer_schema-' + db + '=' + s, 30); //! special chars in db
568
+ }
569
+ }
570
+
571
+
572
+
573
+ var helpOpen, helpIgnore; // when mouse outs <option> then it mouse overs border of <select> - ignore it
574
+
575
+ /** Display help
576
+ * @param HTMLElement
577
+ * @param MouseEvent
578
+ * @param string
579
+ * @param bool display on left side (otherwise on top)
580
+ */
581
+ function helpMouseover(el, event, text, side) {
582
+ var target = getTarget(event);
583
+ if (!text) {
584
+ helpClose();
585
+ } else if (window.jush && (!helpIgnore || el != target)) {
586
+ helpOpen = 1;
587
+ var help = document.getElementById('help');
588
+ help.innerHTML = text;
589
+ jush.highlight_tag([ help ]);
590
+ alterClass(help, 'hidden');
591
+ var rect = target.getBoundingClientRect();
592
+ var body = document.documentElement;
593
+ help.style.top = (body.scrollTop + rect.top - (side ? (help.offsetHeight - target.offsetHeight) / 2 : help.offsetHeight)) + 'px';
594
+ help.style.left = (body.scrollLeft + rect.left - (side ? help.offsetWidth : (help.offsetWidth - target.offsetWidth) / 2)) + 'px';
595
+ }
596
+ }
597
+
598
+ /** Close help after timeout
599
+ * @param HTMLElement
600
+ * @param MouseEvent
601
+ */
602
+ function helpMouseout(el, event) {
603
+ helpOpen = 0;
604
+ helpIgnore = (el != getTarget(event));
605
+ setTimeout(function () {
606
+ if (!helpOpen) {
607
+ helpClose();
608
+ }
609
+ }, 200);
610
+ }
611
+
612
+ /** Close help
613
+ */
614
+ function helpClose() {
615
+ alterClass(document.getElementById('help'), 'hidden', true);
616
+ }
adminer/adminer/adminer/static/favicon.ico ADDED
Binary file
adminer/adminer/adminer/static/functions.js ADDED
@@ -0,0 +1,795 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ /** Add or remove CSS class
3
+ * @param HTMLElement
4
+ * @param string
5
+ * @param [bool]
6
+ */
7
+ function alterClass(el, className, enable) {
8
+ if (el) {
9
+ el.className = el.className.replace(RegExp('(^|\\s)' + className + '(\\s|$)'), '$2') + (enable ? ' ' + className : '');
10
+ }
11
+ }
12
+
13
+ /** Toggle visibility
14
+ * @param string
15
+ * @return boolean
16
+ */
17
+ function toggle(id) {
18
+ var el = document.getElementById(id);
19
+ el.className = (el.className == 'hidden' ? '' : 'hidden');
20
+ return true;
21
+ }
22
+
23
+ /** Set permanent cookie
24
+ * @param string
25
+ * @param number
26
+ * @param string optional
27
+ */
28
+ function cookie(assign, days) {
29
+ var date = new Date();
30
+ date.setDate(date.getDate() + days);
31
+ document.cookie = assign + '; expires=' + date;
32
+ }
33
+
34
+ /** Verify current Adminer version
35
+ * @param string
36
+ */
37
+ function verifyVersion(current) {
38
+ cookie('adminer_version=0', 1);
39
+ var iframe = document.createElement('iframe');
40
+ iframe.src = 'https://www.adminer.org/version/?current=' + current;
41
+ iframe.frameBorder = 0;
42
+ iframe.marginHeight = 0;
43
+ iframe.scrolling = 'no';
44
+ iframe.style.width = '7ex';
45
+ iframe.style.height = '1.25em';
46
+ if (window.postMessage && window.addEventListener) {
47
+ iframe.style.display = 'none';
48
+ addEventListener('message', function (event) {
49
+ if (event.origin == 'https://www.adminer.org') {
50
+ var match = /version=(.+)/.exec(event.data);
51
+ if (match) {
52
+ cookie('adminer_version=' + match[1], 1);
53
+ }
54
+ }
55
+ }, false);
56
+ }
57
+ document.getElementById('version').appendChild(iframe);
58
+ }
59
+
60
+ /** Get value of select
61
+ * @param HTMLElement <select> or <input>
62
+ * @return string
63
+ */
64
+ function selectValue(select) {
65
+ if (!select.selectedIndex) {
66
+ return select.value;
67
+ }
68
+ var selected = select.options[select.selectedIndex];
69
+ return ((selected.attributes.value || {}).specified ? selected.value : selected.text);
70
+ }
71
+
72
+ /** Verify if element has a specified tag name
73
+ * @param HTMLElement
74
+ * @param string regular expression
75
+ * @return bool
76
+ */
77
+ function isTag(el, tag) {
78
+ var re = new RegExp('^(' + tag + ')$', 'i');
79
+ return re.test(el.tagName);
80
+ }
81
+
82
+ /** Get parent node with specified tag name
83
+ * @param HTMLElement
84
+ * @param string regular expression
85
+ * @return HTMLElement
86
+ */
87
+ function parentTag(el, tag) {
88
+ while (el && !isTag(el, tag)) {
89
+ el = el.parentNode;
90
+ }
91
+ return el;
92
+ }
93
+
94
+ /** Set checked class
95
+ * @param HTMLInputElement
96
+ */
97
+ function trCheck(el) {
98
+ var tr = parentTag(el, 'tr');
99
+ alterClass(tr, 'checked', el.checked);
100
+ if (el.form && el.form['all'] && el.form['all'].onclick) { // Opera treats form.all as document.all
101
+ el.form['all'].onclick();
102
+ }
103
+ }
104
+
105
+ /** Fill number of selected items
106
+ * @param string
107
+ * @param string
108
+ */
109
+ function selectCount(id, count) {
110
+ setHtml(id, (count === '' ? '' : '(' + (count + '').replace(/\B(?=(\d{3})+$)/g, ' ') + ')'));
111
+ var inputs = document.getElementById(id).parentNode.parentNode.getElementsByTagName('input');
112
+ for (var i = 0; i < inputs.length; i++) {
113
+ var input = inputs[i];
114
+ if (input.type == 'submit') {
115
+ input.disabled = (count == '0');
116
+ }
117
+ }
118
+ }
119
+
120
+ /** Check all elements matching given name
121
+ * @param HTMLInputElement
122
+ * @param RegExp
123
+ */
124
+ function formCheck(el, name) {
125
+ var elems = el.form.elements;
126
+ for (var i=0; i < elems.length; i++) {
127
+ if (name.test(elems[i].name)) {
128
+ elems[i].checked = el.checked;
129
+ trCheck(elems[i]);
130
+ }
131
+ }
132
+ }
133
+
134
+ /** Check all rows in <table class="checkable">
135
+ */
136
+ function tableCheck() {
137
+ var tables = document.getElementsByTagName('table');
138
+ for (var i=0; i < tables.length; i++) {
139
+ if (/(^|\s)checkable(\s|$)/.test(tables[i].className)) {
140
+ var trs = tables[i].getElementsByTagName('tr');
141
+ for (var j=0; j < trs.length; j++) {
142
+ trCheck(trs[j].firstChild.firstChild);
143
+ }
144
+ }
145
+ }
146
+ }
147
+
148
+ /** Uncheck single element
149
+ * @param string
150
+ */
151
+ function formUncheck(id) {
152
+ var el = document.getElementById(id);
153
+ el.checked = false;
154
+ trCheck(el);
155
+ }
156
+
157
+ /** Get number of checked elements matching given name
158
+ * @param HTMLInputElement
159
+ * @param RegExp
160
+ * @return number
161
+ */
162
+ function formChecked(el, name) {
163
+ var checked = 0;
164
+ var elems = el.form.elements;
165
+ for (var i=0; i < elems.length; i++) {
166
+ if (name.test(elems[i].name) && elems[i].checked) {
167
+ checked++;
168
+ }
169
+ }
170
+ return checked;
171
+ }
172
+
173
+ /** Select clicked row
174
+ * @param MouseEvent
175
+ * @param [boolean] force click
176
+ */
177
+ function tableClick(event, click) {
178
+ click = (click || !window.getSelection || getSelection().isCollapsed);
179
+ var el = getTarget(event);
180
+ while (!isTag(el, 'tr')) {
181
+ if (isTag(el, 'table|a|input|textarea')) {
182
+ if (el.type != 'checkbox') {
183
+ return;
184
+ }
185
+ checkboxClick(event, el);
186
+ click = false;
187
+ }
188
+ el = el.parentNode;
189
+ if (!el) { // Ctrl+click on text fields hides the element
190
+ return;
191
+ }
192
+ }
193
+ el = el.firstChild.firstChild;
194
+ if (click) {
195
+ el.checked = !el.checked;
196
+ el.onclick && el.onclick();
197
+ }
198
+ trCheck(el);
199
+ }
200
+
201
+ var lastChecked;
202
+
203
+ /** Shift-click on checkbox for multiple selection.
204
+ * @param MouseEvent
205
+ * @param HTMLInputElement
206
+ */
207
+ function checkboxClick(event, el) {
208
+ if (!el.name) {
209
+ return;
210
+ }
211
+ if (event.shiftKey && (!lastChecked || lastChecked.name == el.name)) {
212
+ var checked = (lastChecked ? lastChecked.checked : true);
213
+ var inputs = parentTag(el, 'table').getElementsByTagName('input');
214
+ var checking = !lastChecked;
215
+ for (var i=0; i < inputs.length; i++) {
216
+ var input = inputs[i];
217
+ if (input.name === el.name) {
218
+ if (checking) {
219
+ input.checked = checked;
220
+ trCheck(input);
221
+ }
222
+ if (input === el || input === lastChecked) {
223
+ if (checking) {
224
+ break;
225
+ }
226
+ checking = true;
227
+ }
228
+ }
229
+ }
230
+ } else {
231
+ lastChecked = el;
232
+ }
233
+ }
234
+
235
+ /** Set HTML code of an element
236
+ * @param string
237
+ * @param string undefined to set parentNode to &nbsp;
238
+ */
239
+ function setHtml(id, html) {
240
+ var el = document.getElementById(id);
241
+ if (el) {
242
+ if (html == undefined) {
243
+ el.parentNode.innerHTML = '&nbsp;';
244
+ } else {
245
+ el.innerHTML = html;
246
+ }
247
+ }
248
+ }
249
+
250
+ /** Find node position
251
+ * @param Node
252
+ * @return number
253
+ */
254
+ function nodePosition(el) {
255
+ var pos = 0;
256
+ while (el = el.previousSibling) {
257
+ pos++;
258
+ }
259
+ return pos;
260
+ }
261
+
262
+ /** Go to the specified page
263
+ * @param string
264
+ * @param string
265
+ * @param [MouseEvent]
266
+ */
267
+ function pageClick(href, page, event) {
268
+ if (!isNaN(page) && page) {
269
+ href += (page != 1 ? '&page=' + (page - 1) : '');
270
+ location.href = href;
271
+ }
272
+ }
273
+
274
+
275
+
276
+ /** Display items in menu
277
+ * @param HTMLElement
278
+ * @param MouseEvent
279
+ */
280
+ function menuOver(el, event) {
281
+ var a = getTarget(event);
282
+ if (isTag(a, 'a|span') && a.offsetLeft + a.offsetWidth > a.parentNode.offsetWidth - 15) { // 15 - ellipsis
283
+ el.style.overflow = 'visible';
284
+ }
285
+ }
286
+
287
+ /** Hide items in menu
288
+ * @param HTMLElement
289
+ */
290
+ function menuOut(el) {
291
+ el.style.overflow = 'auto';
292
+ }
293
+
294
+
295
+
296
+ /** Add row in select fieldset
297
+ * @param HTMLSelectElement
298
+ */
299
+ function selectAddRow(field) {
300
+ field.onchange = function () {
301
+ selectFieldChange(field.form);
302
+ };
303
+ field.onchange();
304
+ var row = cloneNode(field.parentNode);
305
+ var selects = row.getElementsByTagName('select');
306
+ for (var i=0; i < selects.length; i++) {
307
+ selects[i].name = selects[i].name.replace(/[a-z]\[\d+/, '$&1');
308
+ selects[i].selectedIndex = 0;
309
+ }
310
+ var inputs = row.getElementsByTagName('input');
311
+ for (var i=0; i < inputs.length; i++) {
312
+ inputs[i].name = inputs[i].name.replace(/[a-z]\[\d+/, '$&1');
313
+ inputs[i].value = '';
314
+ inputs[i].className = '';
315
+ }
316
+ field.parentNode.parentNode.appendChild(row);
317
+ }
318
+
319
+ /** Prevent onsearch handler on Enter
320
+ * @param HTMLInputElement
321
+ * @param KeyboardEvent
322
+ */
323
+ function selectSearchKeydown(el, event) {
324
+ if (event.keyCode == 13 || event.keyCode == 10) {
325
+ el.onsearch = function () {
326
+ };
327
+ }
328
+ }
329
+
330
+ /** Clear column name after resetting search
331
+ * @param HTMLInputElement
332
+ */
333
+ function selectSearchSearch(el) {
334
+ if (!el.value) {
335
+ el.parentNode.firstChild.selectedIndex = 0;
336
+ }
337
+ }
338
+
339
+
340
+
341
+ /** Toggles column context menu
342
+ * @param HTMLElement
343
+ * @param [string] extra class name
344
+ */
345
+ function columnMouse(el, className) {
346
+ var spans = el.getElementsByTagName('span');
347
+ for (var i=0; i < spans.length; i++) {
348
+ if (/column/.test(spans[i].className)) {
349
+ spans[i].className = 'column' + (className || '');
350
+ }
351
+ }
352
+ }
353
+
354
+
355
+
356
+ /** Fill column in search field
357
+ * @param string
358
+ */
359
+ function selectSearch(name) {
360
+ var el = document.getElementById('fieldset-search');
361
+ el.className = '';
362
+ var divs = el.getElementsByTagName('div');
363
+ for (var i=0; i < divs.length; i++) {
364
+ var div = divs[i];
365
+ if (isTag(div.firstChild, 'select') && selectValue(div.firstChild) == name) {
366
+ break;
367
+ }
368
+ }
369
+ if (i == divs.length) {
370
+ div.firstChild.value = name;
371
+ div.firstChild.onchange();
372
+ }
373
+ div.lastChild.focus();
374
+ }
375
+
376
+
377
+ /** Check if Ctrl key (Command key on Mac) was pressed
378
+ * @param KeyboardEvent|MouseEvent
379
+ * @return boolean
380
+ */
381
+ function isCtrl(event) {
382
+ return (event.ctrlKey || event.metaKey) && !event.altKey; // shiftKey allowed
383
+ }
384
+
385
+ /** Return event target
386
+ * @param Event
387
+ * @return HTMLElement
388
+ */
389
+ function getTarget(event) {
390
+ return event.target || event.srcElement;
391
+ }
392
+
393
+
394
+
395
+ /** Send form by Ctrl+Enter on <select> and <textarea>
396
+ * @param KeyboardEvent
397
+ * @param [string]
398
+ * @return boolean
399
+ */
400
+ function bodyKeydown(event, button) {
401
+ var target = getTarget(event);
402
+ if (target.jushTextarea) {
403
+ target = target.jushTextarea;
404
+ }
405
+ if (isCtrl(event) && (event.keyCode == 13 || event.keyCode == 10) && isTag(target, 'select|textarea|input')) { // 13|10 - Enter
406
+ target.blur();
407
+ if (button) {
408
+ target.form[button].click();
409
+ } else {
410
+ target.form.submit();
411
+ }
412
+ target.focus();
413
+ return false;
414
+ }
415
+ return true;
416
+ }
417
+
418
+ /** Open form to a new window on Ctrl+click or Shift+click
419
+ * @param MouseEvent
420
+ */
421
+ function bodyClick(event) {
422
+ var target = getTarget(event);
423
+ if ((isCtrl(event) || event.shiftKey) && target.type == 'submit' && isTag(target, 'input')) {
424
+ target.form.target = '_blank';
425
+ setTimeout(function () {
426
+ // if (isCtrl(event)) { focus(); } doesn't work
427
+ target.form.target = '';
428
+ }, 0);
429
+ }
430
+ }
431
+
432
+
433
+
434
+ /** Change focus by Ctrl+Up or Ctrl+Down
435
+ * @param KeyboardEvent
436
+ * @return boolean
437
+ */
438
+ function editingKeydown(event) {
439
+ if ((event.keyCode == 40 || event.keyCode == 38) && isCtrl(event)) { // 40 - Down, 38 - Up
440
+ var target = getTarget(event);
441
+ var sibling = (event.keyCode == 40 ? 'nextSibling' : 'previousSibling');
442
+ var el = target.parentNode.parentNode[sibling];
443
+ if (el && (isTag(el, 'tr') || (el = el[sibling])) && isTag(el, 'tr') && (el = el.childNodes[nodePosition(target.parentNode)]) && (el = el.childNodes[nodePosition(target)])) {
444
+ el.focus();
445
+ }
446
+ return false;
447
+ }
448
+ if (event.shiftKey && !bodyKeydown(event, 'insert')) {
449
+ eventStop(event);
450
+ return false;
451
+ }
452
+ return true;
453
+ }
454
+
455
+ /** Disable maxlength for functions
456
+ * @param HTMLSelectElement
457
+ */
458
+ function functionChange(select) {
459
+ var input = select.form[select.name.replace(/^function/, 'fields')];
460
+ if (selectValue(select)) {
461
+ if (input.origType === undefined) {
462
+ input.origType = input.type;
463
+ input.origMaxLength = input.maxLength;
464
+ }
465
+ input.removeAttribute('maxlength');
466
+ input.type = 'text';
467
+ } else if (input.origType) {
468
+ input.type = input.origType;
469
+ if (input.origMaxLength >= 0) {
470
+ input.maxLength = input.origMaxLength;
471
+ }
472
+ }
473
+ helpClose();
474
+ }
475
+
476
+ /** Call this.onchange() if value changes
477
+ * @this HTMLInputElement
478
+ */
479
+ function keyupChange() {
480
+ if (this.value != this.getAttribute('value')) {
481
+ this.onchange();
482
+ this.setAttribute('value', this.value);
483
+ }
484
+ }
485
+
486
+ /** Add new field in schema-less edit
487
+ * @param HTMLInputElement
488
+ */
489
+ function fieldChange(field) {
490
+ var row = cloneNode(parentTag(field, 'tr'));
491
+ var inputs = row.getElementsByTagName('input');
492
+ for (var i = 0; i < inputs.length; i++) {
493
+ inputs[i].value = '';
494
+ }
495
+ // keep value in <select> (function)
496
+ parentTag(field, 'table').appendChild(row);
497
+ field.onchange = function () { };
498
+ }
499
+
500
+
501
+
502
+ /** Create AJAX request
503
+ * @param string
504
+ * @param function (XMLHttpRequest)
505
+ * @param [string]
506
+ * @param [string]
507
+ * @return XMLHttpRequest or false in case of an error
508
+ */
509
+ function ajax(url, callback, data, message) {
510
+ var request = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : false));
511
+ if (request) {
512
+ var ajaxStatus = document.getElementById('ajaxstatus');
513
+ if (message) {
514
+ ajaxStatus.innerHTML = '<div class="message">' + message + '</div>';
515
+ ajaxStatus.className = ajaxStatus.className.replace(/ hidden/g, '');
516
+ } else {
517
+ ajaxStatus.className += ' hidden';
518
+ }
519
+ request.open((data ? 'POST' : 'GET'), url);
520
+ if (data) {
521
+ request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
522
+ }
523
+ request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
524
+ request.onreadystatechange = function () {
525
+ if (request.readyState == 4) {
526
+ if (/^2/.test(request.status)) {
527
+ callback(request);
528
+ } else {
529
+ ajaxStatus.innerHTML = (request.status ? request.responseText : '<div class="error">' + offlineMessage + '</div>');
530
+ ajaxStatus.className = ajaxStatus.className.replace(/ hidden/g, '');
531
+ }
532
+ }
533
+ };
534
+ request.send(data);
535
+ }
536
+ return request;
537
+ }
538
+
539
+ /** Use setHtml(key, value) for JSON response
540
+ * @param string
541
+ * @return XMLHttpRequest or false in case of an error
542
+ */
543
+ function ajaxSetHtml(url) {
544
+ return ajax(url, function (request) {
545
+ var data = eval('(' + request.responseText + ')');
546
+ for (var key in data) {
547
+ setHtml(key, data[key]);
548
+ }
549
+ });
550
+ }
551
+
552
+ /** Save form contents through AJAX
553
+ * @param HTMLFormElement
554
+ * @param string
555
+ * @param [HTMLInputElement]
556
+ * @return boolean
557
+ */
558
+ function ajaxForm(form, message, button) {
559
+ var data = [];
560
+ var els = form.elements;
561
+ for (var i = 0; i < els.length; i++) {
562
+ var el = els[i];
563
+ if (el.name && !el.disabled) {
564
+ if (/^file$/i.test(el.type) && el.value) {
565
+ return false;
566
+ }
567
+ if (!/^(checkbox|radio|submit|file)$/i.test(el.type) || el.checked || el == button) {
568
+ data.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(isTag(el, 'select') ? selectValue(el) : el.value));
569
+ }
570
+ }
571
+ }
572
+ data = data.join('&');
573
+
574
+ var url = form.action;
575
+ if (!/post/i.test(form.method)) {
576
+ url = url.replace(/\?.*/, '') + '?' + data;
577
+ data = '';
578
+ }
579
+ return ajax(url, function (request) {
580
+ setHtml('ajaxstatus', request.responseText);
581
+ if (window.jush) {
582
+ jush.highlight_tag(document.getElementById('ajaxstatus').getElementsByTagName('code'), 0);
583
+ }
584
+ }, data, message);
585
+ }
586
+
587
+
588
+
589
+ /** Display edit field
590
+ * @param HTMLElement
591
+ * @param MouseEvent
592
+ * @param number display textarea instead of input, 2 - load long text
593
+ * @param string warning to display
594
+ */
595
+ function selectClick(td, event, text, warning) {
596
+ var target = getTarget(event);
597
+ if (!isCtrl(event) || isTag(td.firstChild, 'input|textarea') || isTag(target, 'a')) {
598
+ return;
599
+ }
600
+ if (warning) {
601
+ return alert(warning);
602
+ }
603
+ var original = td.innerHTML;
604
+ text = text || /\n/.test(original);
605
+ var input = document.createElement(text ? 'textarea' : 'input');
606
+ input.onkeydown = function (event) {
607
+ if (!event) {
608
+ event = window.event;
609
+ }
610
+ if (event.keyCode == 27 && !event.shiftKey && !event.altKey && !isCtrl(event)) { // 27 - Esc
611
+ inputBlur.apply(input);
612
+ td.innerHTML = original;
613
+ }
614
+ };
615
+ var pos = event.rangeOffset;
616
+ var value = td.firstChild.alt || td.textContent || td.innerText;
617
+ input.style.width = Math.max(td.clientWidth - 14, 20) + 'px'; // 14 = 2 * (td.border + td.padding + input.border)
618
+ if (text) {
619
+ var rows = 1;
620
+ value.replace(/\n/g, function () {
621
+ rows++;
622
+ });
623
+ input.rows = rows;
624
+ }
625
+ if (value == '\u00A0' || td.getElementsByTagName('i').length) { // &nbsp; or i - NULL
626
+ value = '';
627
+ }
628
+ if (document.selection) {
629
+ var range = document.selection.createRange();
630
+ range.moveToPoint(event.clientX, event.clientY);
631
+ var range2 = range.duplicate();
632
+ range2.moveToElementText(td);
633
+ range2.setEndPoint('EndToEnd', range);
634
+ pos = range2.text.length;
635
+ }
636
+ td.innerHTML = '';
637
+ td.appendChild(input);
638
+ setupSubmitHighlight(td);
639
+ input.focus();
640
+ if (text == 2) { // long text
641
+ return ajax(location.href + '&' + encodeURIComponent(td.id) + '=', function (request) {
642
+ if (request.responseText) {
643
+ input.value = request.responseText;
644
+ input.name = td.id;
645
+ }
646
+ });
647
+ }
648
+ input.value = value;
649
+ input.name = td.id;
650
+ input.selectionStart = pos;
651
+ input.selectionEnd = pos;
652
+ if (document.selection) {
653
+ var range = document.selection.createRange();
654
+ range.moveEnd('character', -input.value.length + pos);
655
+ range.select();
656
+ }
657
+ }
658
+
659
+
660
+
661
+ /** Load and display next page in select
662
+ * @param HTMLLinkElement
663
+ * @param number
664
+ * @param string
665
+ * @return boolean
666
+ */
667
+ function selectLoadMore(a, limit, loading) {
668
+ var title = a.innerHTML;
669
+ var href = a.href;
670
+ a.innerHTML = loading;
671
+ if (href) {
672
+ a.removeAttribute('href');
673
+ return ajax(href, function (request) {
674
+ var tbody = document.createElement('tbody');
675
+ tbody.innerHTML = request.responseText;
676
+ document.getElementById('table').appendChild(tbody);
677
+ if (tbody.children.length < limit) {
678
+ a.parentNode.removeChild(a);
679
+ } else {
680
+ a.href = href.replace(/\d+$/, function (page) {
681
+ return +page + 1;
682
+ });
683
+ a.innerHTML = title;
684
+ }
685
+ });
686
+ }
687
+ }
688
+
689
+
690
+
691
+ /** Stop event propagation
692
+ * @param Event
693
+ */
694
+ function eventStop(event) {
695
+ if (event.stopPropagation) {
696
+ event.stopPropagation();
697
+ } else {
698
+ event.cancelBubble = true;
699
+ }
700
+ }
701
+
702
+
703
+
704
+ /** Setup highlighting of default submit button on form field focus
705
+ * @param HTMLElement
706
+ */
707
+ function setupSubmitHighlight(parent) {
708
+ for (var key in { input: 1, select: 1, textarea: 1 }) {
709
+ var inputs = parent.getElementsByTagName(key);
710
+ for (var i = 0; i < inputs.length; i++) {
711
+ setupSubmitHighlightInput(inputs[i])
712
+ }
713
+ }
714
+ }
715
+
716
+ /** Setup submit highlighting for single element
717
+ * @param HTMLElement
718
+ */
719
+ function setupSubmitHighlightInput(input) {
720
+ if (!/submit|image|file/.test(input.type)) {
721
+ addEvent(input, 'focus', inputFocus);
722
+ addEvent(input, 'blur', inputBlur);
723
+ }
724
+ }
725
+
726
+ /** Highlight default submit button
727
+ * @this HTMLInputElement
728
+ */
729
+ function inputFocus() {
730
+ var submit = findDefaultSubmit(this);
731
+ if (submit) {
732
+ alterClass(submit, 'default', true);
733
+ }
734
+ }
735
+
736
+ /** Unhighlight default submit button
737
+ * @this HTMLInputElement
738
+ */
739
+ function inputBlur() {
740
+ var submit = findDefaultSubmit(this);
741
+ if (submit) {
742
+ alterClass(submit, 'default');
743
+ }
744
+ }
745
+
746
+ /** Find submit button used by Enter
747
+ * @param HTMLElement
748
+ * @return HTMLInputElement
749
+ */
750
+ function findDefaultSubmit(el) {
751
+ if (el.jushTextarea) {
752
+ el = el.jushTextarea;
753
+ }
754
+ var inputs = el.form.getElementsByTagName('input');
755
+ for (var i = 0; i < inputs.length; i++) {
756
+ var input = inputs[i];
757
+ if (input.type == 'submit' && !input.style.zIndex) {
758
+ return input;
759
+ }
760
+ }
761
+ }
762
+
763
+
764
+
765
+ /** Add event listener
766
+ * @param HTMLElement
767
+ * @param string without 'on'
768
+ * @param function
769
+ */
770
+ function addEvent(el, action, handler) {
771
+ if (el.addEventListener) {
772
+ el.addEventListener(action, handler, false);
773
+ } else {
774
+ el.attachEvent('on' + action, handler);
775
+ }
776
+ }
777
+
778
+ /** Defer focusing element
779
+ * @param HTMLElement
780
+ */
781
+ function focus(el) {
782
+ setTimeout(function () { // this has to be an anonymous function because Firefox passes some arguments to setTimeout callback
783
+ el.focus();
784
+ }, 0);
785
+ }
786
+
787
+ /** Clone node and setup submit highlighting
788
+ * @param HTMLElement
789
+ * @return HTMLElement
790
+ */
791
+ function cloneNode(el) {
792
+ var el2 = el.cloneNode(true);
793
+ setupSubmitHighlight(el2);
794
+ return el2;
795
+ }
adminer/adminer/adminer/static/plus.gif ADDED
Binary file
adminer/adminer/adminer/static/up.gif ADDED
Binary file
adminer/adminer/adminer/table.inc.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $TABLE = $_GET["table"];
3
+ $fields = fields($TABLE);
4
+ if (!$fields) {
5
+ $error = error();
6
+ }
7
+ $table_status = table_status1($TABLE, true);
8
+
9
+ page_header(($fields && is_view($table_status) ? lang('View') : lang('Table')) . ": " . h($TABLE), $error);
10
+
11
+ $adminer->selectLinks($table_status);
12
+ $comment = $table_status["Comment"];
13
+ if ($comment != "") {
14
+ echo "<p>" . lang('Comment') . ": " . h($comment) . "\n";
15
+ }
16
+
17
+ if ($fields) {
18
+ echo "<table cellspacing='0'>\n";
19
+ echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . (support("comment") ? "<td>" . lang('Comment') : "") . "</thead>\n";
20
+ foreach ($fields as $field) {
21
+ echo "<tr" . odd() . "><th>" . h($field["field"]);
22
+ echo "<td><span title='" . h($field["collation"]) . "'>" . h($field["full_type"]) . "</span>";
23
+ echo ($field["null"] ? " <i>NULL</i>" : "");
24
+ echo ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : "");
25
+ echo (isset($field["default"]) ? " <span title='" . lang('Default value') . "'>[<b>" . h($field["default"]) . "</b>]</span>" : "");
26
+ echo (support("comment") ? "<td>" . nbsp($field["comment"]) : "");
27
+ echo "\n";
28
+ }
29
+ echo "</table>\n";
30
+ }
31
+
32
+ if (!is_view($table_status)) {
33
+ if (support("indexes")) {
34
+ echo "<h3 id='indexes'>" . lang('Indexes') . "</h3>\n";
35
+ $indexes = indexes($TABLE);
36
+ if ($indexes) {
37
+ echo "<table cellspacing='0'>\n";
38
+ foreach ($indexes as $name => $index) {
39
+ ksort($index["columns"]); // enforce correct columns order
40
+ $print = array();
41
+ foreach ($index["columns"] as $key => $val) {
42
+ $print[] = "<i>" . h($val) . "</i>"
43
+ . ($index["lengths"][$key] ? "(" . $index["lengths"][$key] . ")" : "")
44
+ . ($index["descs"][$key] ? " DESC" : "")
45
+ ;
46
+ }
47
+ echo "<tr title='" . h($name) . "'><th>$index[type]<td>" . implode(", ", $print) . "\n";
48
+ }
49
+ echo "</table>\n";
50
+ }
51
+ echo '<p class="links"><a href="' . h(ME) . 'indexes=' . urlencode($TABLE) . '">' . lang('Alter indexes') . "</a>\n";
52
+ }
53
+
54
+ if (fk_support($table_status)) {
55
+ echo "<h3 id='foreign-keys'>" . lang('Foreign keys') . "</h3>\n";
56
+ $foreign_keys = foreign_keys($TABLE);
57
+ if ($foreign_keys) {
58
+ echo "<table cellspacing='0'>\n";
59
+ echo "<thead><tr><th>" . lang('Source') . "<td>" . lang('Target') . "<td>" . lang('ON DELETE') . "<td>" . lang('ON UPDATE') . "<td>&nbsp;</thead>\n";
60
+ foreach ($foreign_keys as $name => $foreign_key) {
61
+ echo "<tr title='" . h($name) . "'>";
62
+ echo "<th><i>" . implode("</i>, <i>", array_map('h', $foreign_key["source"])) . "</i>";
63
+ echo "<td><a href='" . h($foreign_key["db"] != "" ? preg_replace('~db=[^&]*~', "db=" . urlencode($foreign_key["db"]), ME) : ($foreign_key["ns"] != "" ? preg_replace('~ns=[^&]*~', "ns=" . urlencode($foreign_key["ns"]), ME) : ME)) . "table=" . urlencode($foreign_key["table"]) . "'>"
64
+ . ($foreign_key["db"] != "" ? "<b>" . h($foreign_key["db"]) . "</b>." : "") . ($foreign_key["ns"] != "" ? "<b>" . h($foreign_key["ns"]) . "</b>." : "") . h($foreign_key["table"])
65
+ . "</a>"
66
+ ;
67
+ echo "(<i>" . implode("</i>, <i>", array_map('h', $foreign_key["target"])) . "</i>)";
68
+ echo "<td>" . nbsp($foreign_key["on_delete"]) . "\n";
69
+ echo "<td>" . nbsp($foreign_key["on_update"]) . "\n";
70
+ echo '<td><a href="' . h(ME . 'foreign=' . urlencode($TABLE) . '&name=' . urlencode($name)) . '">' . lang('Alter') . '</a>';
71
+ }
72
+ echo "</table>\n";
73
+ }
74
+ echo '<p class="links"><a href="' . h(ME) . 'foreign=' . urlencode($TABLE) . '">' . lang('Add foreign key') . "</a>\n";
75
+ }
76
+ }
77
+
78
+ if (support(is_view($table_status) ? "view_trigger" : "trigger")) {
79
+ echo "<h3 id='triggers'>" . lang('Triggers') . "</h3>\n";
80
+ $triggers = triggers($TABLE);
81
+ if ($triggers) {
82
+ echo "<table cellspacing='0'>\n";
83
+ foreach ($triggers as $key => $val) {
84
+ echo "<tr valign='top'><td>" . h($val[0]) . "<td>" . h($val[1]) . "<th>" . h($key) . "<td><a href='" . h(ME . 'trigger=' . urlencode($TABLE) . '&name=' . urlencode($key)) . "'>" . lang('Alter') . "</a>\n";
85
+ }
86
+ echo "</table>\n";
87
+ }
88
+ echo '<p class="links"><a href="' . h(ME) . 'trigger=' . urlencode($TABLE) . '">' . lang('Add trigger') . "</a>\n";
89
+ }
adminer/adminer/adminer/trigger.inc.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $TABLE = $_GET["trigger"];
3
+ $name = $_GET["name"];
4
+ $trigger_options = trigger_options();
5
+ $row = (array) trigger($name) + array("Trigger" => $TABLE . "_bi");
6
+
7
+ if ($_POST) {
8
+ if (!$error && in_array($_POST["Timing"], $trigger_options["Timing"]) && in_array($_POST["Event"], $trigger_options["Event"]) && in_array($_POST["Type"], $trigger_options["Type"])) {
9
+ // don't use drop_create() because there may not be more triggers for the same action
10
+ $on = " ON " . table($TABLE);
11
+ $drop = "DROP TRIGGER " . idf_escape($name) . ($jush == "pgsql" ? $on : "");
12
+ $location = ME . "table=" . urlencode($TABLE);
13
+ if ($_POST["drop"]) {
14
+ query_redirect($drop, $location, lang('Trigger has been dropped.'));
15
+ } else {
16
+ if ($name != "") {
17
+ queries($drop);
18
+ }
19
+ queries_redirect(
20
+ $location,
21
+ ($name != "" ? lang('Trigger has been altered.') : lang('Trigger has been created.')),
22
+ queries(create_trigger($on, $_POST))
23
+ );
24
+ if ($name != "") {
25
+ queries(create_trigger($on, $row + array("Type" => reset($trigger_options["Type"]))));
26
+ }
27
+ }
28
+ }
29
+ $row = $_POST;
30
+ }
31
+
32
+ page_header(($name != "" ? lang('Alter trigger') . ": " . h($name) : lang('Create trigger')), $error, array("table" => $TABLE));
33
+ ?>
34
+
35
+ <form action="" method="post" id="form">
36
+ <table cellspacing="0">
37
+ <tr><th><?php echo lang('Time'); ?><td><?php echo html_select("Timing", $trigger_options["Timing"], $row["Timing"], "triggerChange(/^" . preg_quote($TABLE, "/") . "_[ba][iud]$/, '" . js_escape($TABLE) . "', this.form);"); ?>
38
+ <tr><th><?php echo lang('Event'); ?><td><?php echo html_select("Event", $trigger_options["Event"], $row["Event"], "this.form['Timing'].onchange();"); ?>
39
+ <?php echo (in_array("UPDATE OF", $trigger_options["Event"]) ? " <input name='Of' value='" . h($row["Of"]) . "' class='hidden'>": ""); ?>
40
+ <tr><th><?php echo lang('Type'); ?><td><?php echo html_select("Type", $trigger_options["Type"], $row["Type"]); ?>
41
+ </table>
42
+ <p><?php echo lang('Name'); ?>: <input name="Trigger" value="<?php echo h($row["Trigger"]); ?>" maxlength="64" autocapitalize="off">
43
+ <script type="text/javascript">document.getElementById('form')['Timing'].onchange();</script>
44
+ <p><?php textarea("Statement", $row["Statement"]); ?>
45
+ <p>
46
+ <input type="submit" value="<?php echo lang('Save'); ?>">
47
+ <?php if ($name != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
48
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
49
+ </form>
adminer/adminer/adminer/type.inc.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $TYPE = $_GET["type"];
3
+ $row = $_POST;
4
+
5
+ if ($_POST && !$error) {
6
+ $link = substr(ME, 0, -1);
7
+ if ($_POST["drop"]) {
8
+ query_redirect("DROP TYPE " . idf_escape($TYPE), $link, lang('Type has been dropped.'));
9
+ } else {
10
+ query_redirect("CREATE TYPE " . idf_escape(trim($row["name"])) . " $row[as]", $link, lang('Type has been created.'));
11
+ }
12
+ }
13
+
14
+ page_header($TYPE != "" ? lang('Alter type') . ": " . h($TYPE) : lang('Create type'), $error);
15
+
16
+ if (!$row) {
17
+ $row["as"] = "AS ";
18
+ }
19
+ ?>
20
+
21
+ <form action="" method="post">
22
+ <p>
23
+ <?php
24
+ if ($TYPE != "") {
25
+ echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
26
+ } else {
27
+ echo "<input name='name' value='" . h($row['name']) . "' autocapitalize='off'>\n";
28
+ textarea("as", $row["as"]);
29
+ echo "<p><input type='submit' value='" . lang('Save') . "'>\n";
30
+ }
31
+ ?>
32
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
33
+ </form>
adminer/adminer/adminer/user.inc.php ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $USER = $_GET["user"];
3
+ $privileges = array("" => array("All privileges" => ""));
4
+ foreach (get_rows("SHOW PRIVILEGES") as $row) {
5
+ foreach (explode(",", ($row["Privilege"] == "Grant option" ? "" : $row["Context"])) as $context) {
6
+ $privileges[$context][$row["Privilege"]] = $row["Comment"];
7
+ }
8
+ }
9
+ $privileges["Server Admin"] += $privileges["File access on server"];
10
+ $privileges["Databases"]["Create routine"] = $privileges["Procedures"]["Create routine"]; // MySQL bug #30305
11
+ unset($privileges["Procedures"]["Create routine"]);
12
+ $privileges["Columns"] = array();
13
+ foreach (array("Select", "Insert", "Update", "References") as $val) {
14
+ $privileges["Columns"][$val] = $privileges["Tables"][$val];
15
+ }
16
+ unset($privileges["Server Admin"]["Usage"]);
17
+ foreach ($privileges["Tables"] as $key => $val) {
18
+ unset($privileges["Databases"][$key]);
19
+ }
20
+
21
+ $new_grants = array();
22
+ if ($_POST) {
23
+ foreach ($_POST["objects"] as $key => $val) {
24
+ $new_grants[$val] = (array) $new_grants[$val] + (array) $_POST["grants"][$key];
25
+ }
26
+ }
27
+ $grants = array();
28
+ $old_pass = "";
29
+
30
+ if (isset($_GET["host"]) && ($result = $connection->query("SHOW GRANTS FOR " . q($USER) . "@" . q($_GET["host"])))) { //! use information_schema for MySQL 5 - column names in column privileges are not escaped
31
+ while ($row = $result->fetch_row()) {
32
+ if (preg_match('~GRANT (.*) ON (.*) TO ~', $row[0], $match) && preg_match_all('~ *([^(,]*[^ ,(])( *\\([^)]+\\))?~', $match[1], $matches, PREG_SET_ORDER)) { //! escape the part between ON and TO
33
+ foreach ($matches as $val) {
34
+ if ($val[1] != "USAGE") {
35
+ $grants["$match[2]$val[2]"][$val[1]] = true;
36
+ }
37
+ if (preg_match('~ WITH GRANT OPTION~', $row[0])) { //! don't check inside strings and identifiers
38
+ $grants["$match[2]$val[2]"]["GRANT OPTION"] = true;
39
+ }
40
+ }
41
+ }
42
+ if (preg_match("~ IDENTIFIED BY PASSWORD '([^']+)~", $row[0], $match)) {
43
+ $old_pass = $match[1];
44
+ }
45
+ }
46
+ }
47
+
48
+ if ($_POST && !$error) {
49
+ $old_user = (isset($_GET["host"]) ? q($USER) . "@" . q($_GET["host"]) : "''");
50
+ if ($_POST["drop"]) {
51
+ query_redirect("DROP USER $old_user", ME . "privileges=", lang('User has been dropped.'));
52
+ } else {
53
+ $new_user = q($_POST["user"]) . "@" . q($_POST["host"]); // if $_GET["host"] is not set then $new_user is always different
54
+ $pass = $_POST["pass"];
55
+ if ($pass != '' && !$_POST["hashed"]) {
56
+ // compute hash in a separate query so that plain text password is not saved to history
57
+ $pass = $connection->result("SELECT PASSWORD(" . q($pass) . ")");
58
+ $error = !$pass;
59
+ }
60
+
61
+ $created = false;
62
+ if (!$error) {
63
+ if ($old_user != $new_user) {
64
+ $created = queries(($connection->server_info < 5 ? "GRANT USAGE ON *.* TO" : "CREATE USER") . " $new_user IDENTIFIED BY PASSWORD " . q($pass));
65
+ $error = !$created;
66
+ } elseif ($pass != $old_pass) {
67
+ queries("SET PASSWORD FOR $new_user = " . q($pass));
68
+ }
69
+ }
70
+
71
+ if (!$error) {
72
+ $revoke = array();
73
+ foreach ($new_grants as $object => $grant) {
74
+ if (isset($_GET["grant"])) {
75
+ $grant = array_filter($grant);
76
+ }
77
+ $grant = array_keys($grant);
78
+ if (isset($_GET["grant"])) {
79
+ // no rights to mysql.user table
80
+ $revoke = array_diff(array_keys(array_filter($new_grants[$object], 'strlen')), $grant);
81
+ } elseif ($old_user == $new_user) {
82
+ $old_grant = array_keys((array) $grants[$object]);
83
+ $revoke = array_diff($old_grant, $grant);
84
+ $grant = array_diff($grant, $old_grant);
85
+ unset($grants[$object]);
86
+ }
87
+ if (preg_match('~^(.+)\\s*(\\(.*\\))?$~U', $object, $match) && (
88
+ !grant("REVOKE", $revoke, $match[2], " ON $match[1] FROM $new_user") //! SQL injection
89
+ || !grant("GRANT", $grant, $match[2], " ON $match[1] TO $new_user")
90
+ )) {
91
+ $error = true;
92
+ break;
93
+ }
94
+ }
95
+ }
96
+
97
+ if (!$error && isset($_GET["host"])) {
98
+ if ($old_user != $new_user) {
99
+ queries("DROP USER $old_user");
100
+ } elseif (!isset($_GET["grant"])) {
101
+ foreach ($grants as $object => $revoke) {
102
+ if (preg_match('~^(.+)(\\(.*\\))?$~U', $object, $match)) {
103
+ grant("REVOKE", array_keys($revoke), $match[2], " ON $match[1] FROM $new_user");
104
+ }
105
+ }
106
+ }
107
+ }
108
+
109
+ queries_redirect(ME . "privileges=", (isset($_GET["host"]) ? lang('User has been altered.') : lang('User has been created.')), !$error);
110
+
111
+ if ($created) {
112
+ // delete new user in case of an error
113
+ $connection->query("DROP USER $new_user");
114
+ }
115
+ }
116
+ }
117
+
118
+ page_header((isset($_GET["host"]) ? lang('Username') . ": " . h("$USER@$_GET[host]") : lang('Create user')), $error, array("privileges" => array('', lang('Privileges'))));
119
+
120
+ if ($_POST) {
121
+ $row = $_POST;
122
+ $grants = $new_grants;
123
+ } else {
124
+ $row = $_GET + array("host" => $connection->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', -1)")); // create user on the same domain by default
125
+ $row["pass"] = $old_pass;
126
+ if ($old_pass != "") {
127
+ $row["hashed"] = true;
128
+ }
129
+ $grants[(DB == "" || $grants ? "" : idf_escape(addcslashes(DB, "%_\\"))) . ".*"] = array();
130
+ }
131
+
132
+ ?>
133
+ <form action="" method="post">
134
+ <table cellspacing="0">
135
+ <tr><th><?php echo lang('Server'); ?><td><input name="host" maxlength="60" value="<?php echo h($row["host"]); ?>" autocapitalize="off">
136
+ <tr><th><?php echo lang('Username'); ?><td><input name="user" maxlength="16" value="<?php echo h($row["user"]); ?>" autocapitalize="off">
137
+ <tr><th><?php echo lang('Password'); ?><td><input name="pass" id="pass" value="<?php echo h($row["pass"]); ?>">
138
+ <?php if (!$row["hashed"]) { ?><script type="text/javascript">typePassword(document.getElementById('pass'));</script><?php } ?>
139
+ <?php echo checkbox("hashed", 1, $row["hashed"], lang('Hashed'), "typePassword(this.form['pass'], this.checked);"); ?>
140
+ </table>
141
+
142
+ <?php
143
+ //! MAX_* limits, REQUIRE
144
+ echo "<table cellspacing='0'>\n";
145
+ echo "<thead><tr><th colspan='2'>" . lang('Privileges') . doc_link(array('sql' => "grant.html#priv_level"));
146
+ $i = 0;
147
+ foreach ($grants as $object => $grant) {
148
+ echo '<th>' . ($object != "*.*" ? "<input name='objects[$i]' value='" . h($object) . "' size='10' autocapitalize='off'>" : "<input type='hidden' name='objects[$i]' value='*.*' size='10'>*.*"); //! separate db, table, columns, PROCEDURE|FUNCTION, routine
149
+ $i++;
150
+ }
151
+ echo "</thead>\n";
152
+
153
+ foreach (array(
154
+ "" => "",
155
+ "Server Admin" => lang('Server'),
156
+ "Databases" => lang('Database'),
157
+ "Tables" => lang('Table'),
158
+ "Columns" => lang('Column'),
159
+ "Procedures" => lang('Routine'),
160
+ ) as $context => $desc) {
161
+ foreach ((array) $privileges[$context] as $privilege => $comment) {
162
+ echo "<tr" . odd() . "><td" . ($desc ? ">$desc<td" : " colspan='2'") . ' lang="en" title="' . h($comment) . '">' . h($privilege);
163
+ $i = 0;
164
+ foreach ($grants as $object => $grant) {
165
+ $name = "'grants[$i][" . h(strtoupper($privilege)) . "]'";
166
+ $value = $grant[strtoupper($privilege)];
167
+ if ($context == "Server Admin" && $object != (isset($grants["*.*"]) ? "*.*" : ".*")) {
168
+ echo "<td>&nbsp;";
169
+ } elseif (isset($_GET["grant"])) {
170
+ echo "<td><select name=$name><option><option value='1'" . ($value ? " selected" : "") . ">" . lang('Grant') . "<option value='0'" . ($value == "0" ? " selected" : "") . ">" . lang('Revoke') . "</select>";
171
+ } else {
172
+ echo "<td align='center'><label class='block'><input type='checkbox' name=$name value='1'" . ($value ? " checked" : "") . ($privilege == "All privileges" ? " id='grants-$i-all'" : ($privilege == "Grant option" ? "" : " onclick=\"if (this.checked) formUncheck('grants-$i-all');\"")) . "></label>"; //! uncheck all except grant if all is checked
173
+ }
174
+ $i++;
175
+ }
176
+ }
177
+ }
178
+
179
+ echo "</table>\n";
180
+ ?>
181
+ <p>
182
+ <input type="submit" value="<?php echo lang('Save'); ?>">
183
+ <?php if (isset($_GET["host"])) { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
184
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
185
+ </form>
adminer/adminer/adminer/variables.inc.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $status = isset($_GET["status"]);
3
+ page_header($status ? lang('Status') : lang('Variables'));
4
+
5
+ $variables = ($status ? show_status() : show_variables());
6
+ if (!$variables) {
7
+ echo "<p class='message'>" . lang('No rows.') . "\n";
8
+ } else {
9
+ echo "<table cellspacing='0'>\n";
10
+ foreach ($variables as $key => $val) {
11
+ echo "<tr>";
12
+ echo "<th><code class='jush-" . $jush . ($status ? "status" : "set") . "'>" . h($key) . "</code>";
13
+ echo "<td>" . nbsp($val);
14
+ }
15
+ echo "</table>\n";
16
+ }
adminer/adminer/adminer/view.inc.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $TABLE = $_GET["view"];
3
+ $row = $_POST;
4
+
5
+ if ($_POST && !$error) {
6
+ $name = trim($row["name"]);
7
+ $as = " AS\n$row[select]";
8
+ $location = ME . "table=" . urlencode($name);
9
+ $message = lang('View has been altered.');
10
+
11
+ if ($_GET["materialized"]) {
12
+ $type = "MATERIALIZED VIEW";
13
+ } else {
14
+ $type = "VIEW";
15
+ if ($jush == "pgsql") {
16
+ $status = table_status($name);
17
+ $type = ($status ? strtoupper($status["Engine"]) : $type);
18
+ }
19
+ }
20
+
21
+ if (!$_POST["drop"] && $TABLE == $name && $jush != "sqlite" && $type != "MATERIALIZED VIEW") {
22
+ query_redirect(($jush == "mssql" ? "ALTER" : "CREATE OR REPLACE") . " VIEW " . table($name) . $as, $location, $message);
23
+ } else {
24
+ $temp_name = $name . "_adminer_" . uniqid();
25
+ drop_create(
26
+ "DROP $type " . table($TABLE),
27
+ "CREATE $type " . table($name) . $as,
28
+ "DROP $type " . table($name),
29
+ "CREATE $type " . table($temp_name) . $as,
30
+ "DROP $type " . table($temp_name),
31
+ ($_POST["drop"] ? substr(ME, 0, -1) : $location),
32
+ lang('View has been dropped.'),
33
+ $message,
34
+ lang('View has been created.'),
35
+ $TABLE,
36
+ $name
37
+ );
38
+ }
39
+ }
40
+
41
+ if (!$_POST && $TABLE != "") {
42
+ $row = view($TABLE);
43
+ $row["name"] = $TABLE;
44
+ if (!$error) {
45
+ $error = error();
46
+ }
47
+ }
48
+
49
+ page_header(($TABLE != "" ? lang('Alter view') : lang('Create view')), $error, array("table" => $TABLE), h($TABLE));
50
+ ?>
51
+
52
+ <form action="" method="post">
53
+ <p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64" autocapitalize="off">
54
+ <p><?php textarea("select", $row["select"]); ?>
55
+ <p>
56
+ <input type="submit" value="<?php echo lang('Save'); ?>">
57
+ <?php if ($_GET["view"] != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
58
+ <input type="hidden" name="token" value="<?php echo $token; ?>">
59
+ </form>
adminer/adminer/editor/db.inc.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ page_header(lang('Server'), "", false);
3
+
4
+ if ($adminer->homepage()) {
5
+ echo "<form action='' method='post'>\n";
6
+ echo "<p>" . lang('Search data in tables') . ": <input name='query' value='" . h($_POST["query"]) . "'> <input type='submit' value='" . lang('Search') . "'>\n";
7
+ if ($_POST["query"] != "") {
8
+ search_tables();
9
+ }
10
+ echo "<table cellspacing='0' class='nowrap checkable' onclick='tableClick(event);'>\n";
11
+ echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^tables\[/);"><th>' . lang('Table') . '<td>' . lang('Rows') . "</thead>\n";
12
+
13
+ foreach (table_status() as $table => $row) {
14
+ $name = $adminer->tableName($row);
15
+ if (isset($row["Engine"]) && $name != "") {
16
+ echo '<tr' . odd() . '><td>' . checkbox("tables[]", $table, in_array($table, (array) $_POST["tables"], true), "", "formUncheck('check-all');");
17
+ echo "<th><a href='" . h(ME) . 'select=' . urlencode($table) . "'>$name</a>";
18
+ $val = format_number($row["Rows"]);
19
+ echo "<td align='right'><a href='" . h(ME . "edit=") . urlencode($table) . "'>" . ($row["Engine"] == "InnoDB" && $val ? "~ $val" : $val) . "</a>";
20
+ }
21
+ }
22
+
23
+ echo "</table>\n";
24
+ echo "<script type='text/javascript'>tableCheck();</script>\n";
25
+ echo "</form>\n";
26
+ }
adminer/adminer/editor/include/adminer.inc.php ADDED
@@ -0,0 +1,625 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Adminer {
3
+ var $operators = array("<=", ">=");
4
+ var $_values = array();
5
+
6
+ function name() {
7
+ return "<a href='https://www.adminer.org/editor/' target='_blank' id='h1'>" . lang('Editor') . "</a>";
8
+ }
9
+
10
+ //! driver, ns
11
+
12
+ function credentials() {
13
+ return array(SERVER, $_GET["username"], get_password());
14
+ }
15
+
16
+ function permanentLogin($create = false) {
17
+ return password_file($create);
18
+ }
19
+
20
+ function bruteForceKey() {
21
+ return $_SERVER["REMOTE_ADDR"];
22
+ }
23
+
24
+ function database() {
25
+ global $connection;
26
+ if ($connection) {
27
+ $databases = $this->databases(false);
28
+ return (!$databases
29
+ ? $connection->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1)") // username without the database list
30
+ : $databases[(information_schema($databases[0]) ? 1 : 0)] // first available database
31
+ );
32
+ }
33
+ }
34
+
35
+ function schemas() {
36
+ return schemas();
37
+ }
38
+
39
+ function databases($flush = true) {
40
+ return get_databases($flush);
41
+ }
42
+
43
+ function queryTimeout() {
44
+ return 5;
45
+ }
46
+
47
+ function headers() {
48
+ return true;
49
+ }
50
+
51
+ function head() {
52
+ return true;
53
+ }
54
+
55
+ function loginForm() {
56
+ ?>
57
+ <table cellspacing="0">
58
+ <tr><th><?php echo lang('Username'); ?><td><input type="hidden" name="auth[driver]" value="server"><input name="auth[username]" id="username" value="<?php echo h($_GET["username"]); ?>" autocapitalize="off">
59
+ <tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
60
+ </table>
61
+ <script type="text/javascript">
62
+ focus(document.getElementById('username'));
63
+ </script>
64
+ <?php
65
+ echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
66
+ echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
67
+ }
68
+
69
+ function login($login, $password) {
70
+ global $connection;
71
+ $connection->query("SET time_zone = " . q(substr_replace(@date("O"), ":", -2, 0))); // date("P") available since PHP 5.1.3, @ - requires date.timezone since PHP 5.3.0
72
+ return true;
73
+ }
74
+
75
+ function tableName($tableStatus) {
76
+ return h($tableStatus["Comment"] != "" ? $tableStatus["Comment"] : $tableStatus["Name"]);
77
+ }
78
+
79
+ function fieldName($field, $order = 0) {
80
+ return h($field["comment"] != "" ? $field["comment"] : $field["field"]);
81
+ }
82
+
83
+ function selectLinks($tableStatus, $set = "") {
84
+ $TABLE = $tableStatus["Name"];
85
+ if ($set !== null) {
86
+ echo '<p class="tabs"><a href="' . h(ME . 'edit=' . urlencode($TABLE) . $set) . '">' . lang('New item') . "</a>\n";
87
+ }
88
+ }
89
+
90
+ function foreignKeys($table) {
91
+ return foreign_keys($table);
92
+ }
93
+
94
+ function backwardKeys($table, $tableName) {
95
+ $return = array();
96
+ foreach (get_rows("SELECT TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_COLUMN_NAME
97
+ FROM information_schema.KEY_COLUMN_USAGE
98
+ WHERE TABLE_SCHEMA = " . q($this->database()) . "
99
+ AND REFERENCED_TABLE_SCHEMA = " . q($this->database()) . "
100
+ AND REFERENCED_TABLE_NAME = " . q($table) . "
101
+ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
102
+ $return[$row["TABLE_NAME"]]["keys"][$row["CONSTRAINT_NAME"]][$row["COLUMN_NAME"]] = $row["REFERENCED_COLUMN_NAME"];
103
+ }
104
+ foreach ($return as $key => $val) {
105
+ $name = $this->tableName(table_status($key, true));
106
+ if ($name != "") {
107
+ $search = preg_quote($tableName);
108
+ $separator = "(:|\\s*-)?\\s+";
109
+ $return[$key]["name"] = (preg_match("(^$search$separator(.+)|^(.+?)$separator$search\$)iu", $name, $match) ? $match[2] . $match[3] : $name);
110
+ } else {
111
+ unset($return[$key]);
112
+ }
113
+ }
114
+ return $return;
115
+ }
116
+
117
+ function backwardKeysPrint($backwardKeys, $row) {
118
+ foreach ($backwardKeys as $table => $backwardKey) {
119
+ foreach ($backwardKey["keys"] as $cols) {
120
+ $link = ME . 'select=' . urlencode($table);
121
+ $i = 0;
122
+ foreach ($cols as $column => $val) {
123
+ $link .= where_link($i++, $column, $row[$val]);
124
+ }
125
+ echo "<a href='" . h($link) . "'>" . h($backwardKey["name"]) . "</a>";
126
+ $link = ME . 'edit=' . urlencode($table);
127
+ foreach ($cols as $column => $val) {
128
+ $link .= "&set" . urlencode("[" . bracket_escape($column) . "]") . "=" . urlencode($row[$val]);
129
+ }
130
+ echo "<a href='" . h($link) . "' title='" . lang('New item') . "'>+</a> ";
131
+ }
132
+ }
133
+ }
134
+
135
+ function selectQuery($query, $time) {
136
+ return "<!--\n" . str_replace("--", "--><!-- ", $query) . "\n($time)\n-->\n";
137
+ }
138
+
139
+ function rowDescription($table) {
140
+ // first varchar column
141
+ foreach (fields($table) as $field) {
142
+ if (preg_match("~varchar|character varying~", $field["type"])) {
143
+ return idf_escape($field["field"]);
144
+ }
145
+ }
146
+ return "";
147
+ }
148
+
149
+ function rowDescriptions($rows, $foreignKeys) {
150
+ $return = $rows;
151
+ foreach ($rows[0] as $key => $val) {
152
+ if (list($table, $id, $name) = $this->_foreignColumn($foreignKeys, $key)) {
153
+ // find all used ids
154
+ $ids = array();
155
+ foreach ($rows as $row) {
156
+ $ids[$row[$key]] = q($row[$key]);
157
+ }
158
+ // uses constant number of queries to get the descriptions, join would be complex, multiple queries would be slow
159
+ $descriptions = $this->_values[$table];
160
+ if (!$descriptions) {
161
+ $descriptions = get_key_vals("SELECT $id, $name FROM " . table($table) . " WHERE $id IN (" . implode(", ", $ids) . ")");
162
+ }
163
+ // use the descriptions
164
+ foreach ($rows as $n => $row) {
165
+ if (isset($row[$key])) {
166
+ $return[$n][$key] = (string) $descriptions[$row[$key]];
167
+ }
168
+ }
169
+ }
170
+ }
171
+ return $return;
172
+ }
173
+
174
+ function selectLink($val, $field) {
175
+ }
176
+
177
+ function selectVal($val, $link, $field, $original) {
178
+ $return = ($val === null ? "&nbsp;" : $val);
179
+ $link = h($link);
180
+ if (preg_match('~blob|bytea~', $field["type"]) && !is_utf8($val)) {
181
+ $return = lang('%d byte(s)', strlen($original));
182
+ if (preg_match("~^(GIF|\xFF\xD8\xFF|\x89PNG\x0D\x0A\x1A\x0A)~", $original)) { // GIF|JPG|PNG, getimagetype() works with filename
183
+ $return = "<img src='$link' alt='$return'>";
184
+ }
185
+ }
186
+ if (like_bool($field) && $return != "&nbsp;") { // bool
187
+ $return = ($val ? lang('yes') : lang('no'));
188
+ }
189
+ if ($link) {
190
+ $return = "<a href='$link'" . (is_url($link) ? " rel='noreferrer'" : "") . ">$return</a>";
191
+ }
192
+ if (!$link && !like_bool($field) && preg_match('~int|float|double|decimal~', $field["type"])) {
193
+ $return = "<div class='number'>$return</div>"; // Firefox doesn't support <colgroup>
194
+ } elseif (preg_match('~date~', $field["type"])) {
195
+ $return = "<div class='datetime'>$return</div>";
196
+ }
197
+ return $return;
198
+ }
199
+
200
+ function editVal($val, $field) {
201
+ if (preg_match('~date|timestamp~', $field["type"]) && $val !== null) {
202
+ return preg_replace('~^(\\d{2}(\\d+))-(0?(\\d+))-(0?(\\d+))~', lang('$1-$3-$5'), $val);
203
+ }
204
+ return $val;
205
+ }
206
+
207
+ function selectColumnsPrint($select, $columns) {
208
+ // can allow grouping functions by indexes
209
+ }
210
+
211
+ function selectSearchPrint($where, $columns, $indexes) {
212
+ $where = (array) $_GET["where"];
213
+ echo '<fieldset id="fieldset-search"><legend>' . lang('Search') . "</legend><div>\n";
214
+ $keys = array();
215
+ foreach ($where as $key => $val) {
216
+ $keys[$val["col"]] = $key;
217
+ }
218
+ $i = 0;
219
+ $fields = fields($_GET["select"]);
220
+ foreach ($columns as $name => $desc) {
221
+ $field = $fields[$name];
222
+ if (preg_match("~enum~", $field["type"]) || like_bool($field)) { //! set - uses 1 << $i and FIND_IN_SET()
223
+ $key = $keys[$name];
224
+ $i--;
225
+ echo "<div>" . h($desc) . "<input type='hidden' name='where[$i][col]' value='" . h($name) . "'>:";
226
+ echo (like_bool($field)
227
+ ? " <select name='where[$i][val]'>" . optionlist(array("" => "", lang('no'), lang('yes')), $where[$key]["val"], true) . "</select>"
228
+ : enum_input("checkbox", " name='where[$i][val][]'", $field, (array) $where[$key]["val"], ($field["null"] ? 0 : null))
229
+ );
230
+ echo "</div>\n";
231
+ unset($columns[$name]);
232
+ } elseif (is_array($options = $this->_foreignKeyOptions($_GET["select"], $name))) {
233
+ if ($fields[$name]["null"]) {
234
+ $options[0] = '(' . lang('empty') . ')';
235
+ }
236
+ $key = $keys[$name];
237
+ $i--;
238
+ echo "<div>" . h($desc) . "<input type='hidden' name='where[$i][col]' value='" . h($name) . "'><input type='hidden' name='where[$i][op]' value='='>: <select name='where[$i][val]'>" . optionlist($options, $where[$key]["val"], true) . "</select></div>\n";
239
+ unset($columns[$name]);
240
+ }
241
+ }
242
+ $i = 0;
243
+ foreach ($where as $val) {
244
+ if (($val["col"] == "" || $columns[$val["col"]]) && "$val[col]$val[val]" != "") {
245
+ echo "<div><select name='where[$i][col]'><option value=''>(" . lang('anywhere') . ")" . optionlist($columns, $val["col"], true) . "</select>";
246
+ echo html_select("where[$i][op]", array(-1 => "") + $this->operators, $val["op"]);
247
+ echo "<input type='search' name='where[$i][val]' value='" . h($val["val"]) . "' onkeydown='selectSearchKeydown(this, event);' onsearch='selectSearchSearch(this);'></div>\n";
248
+ $i++;
249
+ }
250
+ }
251
+ echo "<div><select name='where[$i][col]' onchange='this.nextSibling.nextSibling.onchange();'><option value=''>(" . lang('anywhere') . ")" . optionlist($columns, null, true) . "</select>";
252
+ echo html_select("where[$i][op]", array(-1 => "") + $this->operators);
253
+ echo "<input type='search' name='where[$i][val]' onchange='selectAddRow(this);' onsearch='selectSearch(this);'></div>\n";
254
+ echo "</div></fieldset>\n";
255
+ }
256
+
257
+ function selectOrderPrint($order, $columns, $indexes) {
258
+ //! desc
259
+ $orders = array();
260
+ foreach ($indexes as $key => $index) {
261
+ $order = array();
262
+ foreach ($index["columns"] as $val) {
263
+ $order[] = $columns[$val];
264
+ }
265
+ if (count(array_filter($order, 'strlen')) > 1 && $key != "PRIMARY") {
266
+ $orders[$key] = implode(", ", $order);
267
+ }
268
+ }
269
+ if ($orders) {
270
+ echo '<fieldset><legend>' . lang('Sort') . "</legend><div>";
271
+ echo "<select name='index_order'>" . optionlist(array("" => "") + $orders, ($_GET["order"][0] != "" ? "" : $_GET["index_order"]), true) . "</select>";
272
+ echo "</div></fieldset>\n";
273
+ }
274
+ if ($_GET["order"]) {
275
+ echo "<div style='display: none;'>" . hidden_fields(array(
276
+ "order" => array(1 => reset($_GET["order"])),
277
+ "desc" => ($_GET["desc"] ? array(1 => 1) : array()),
278
+ )) . "</div>\n";
279
+ }
280
+ }
281
+
282
+ function selectLimitPrint($limit) {
283
+ echo "<fieldset><legend>" . lang('Limit') . "</legend><div>"; // <div> for easy styling
284
+ echo html_select("limit", array("", "50", "100"), $limit);
285
+ echo "</div></fieldset>\n";
286
+ }
287
+
288
+ function selectLengthPrint($text_length) {
289
+ }
290
+
291
+ function selectActionPrint($indexes) {
292
+ echo "<fieldset><legend>" . lang('Action') . "</legend><div>";
293
+ echo "<input type='submit' value='" . lang('Select') . "'>";
294
+ echo "</div></fieldset>\n";
295
+ }
296
+
297
+ function selectCommandPrint() {
298
+ return true;
299
+ }
300
+
301
+ function selectImportPrint() {
302
+ return true;
303
+ }
304
+
305
+ function selectEmailPrint($emailFields, $columns) {
306
+ if ($emailFields) {
307
+ print_fieldset("email", lang('E-mail'), $_POST["email_append"]);
308
+ echo "<div onkeydown=\"eventStop(event); return bodyKeydown(event, 'email');\">\n";
309
+ echo "<p>" . lang('From') . ": <input name='email_from' value='" . h($_POST ? $_POST["email_from"] : $_COOKIE["adminer_email"]) . "'>\n";
310
+ echo lang('Subject') . ": <input name='email_subject' value='" . h($_POST["email_subject"]) . "'>\n";
311
+ echo "<p><textarea name='email_message' rows='15' cols='75'>" . h($_POST["email_message"] . ($_POST["email_append"] ? '{$' . "$_POST[email_addition]}" : "")) . "</textarea>\n";
312
+ echo "<p onkeydown=\"eventStop(event); return bodyKeydown(event, 'email_append');\">" . html_select("email_addition", $columns, $_POST["email_addition"]) . "<input type='submit' name='email_append' value='" . lang('Insert') . "'>\n"; //! JavaScript
313
+ echo "<p>" . lang('Attachments') . ": <input type='file' name='email_files[]' onchange=\"this.onchange = function () { }; var el = this.cloneNode(true); el.value = ''; this.parentNode.appendChild(el);\">";
314
+ echo "<p>" . (count($emailFields) == 1 ? '<input type="hidden" name="email_field" value="' . h(key($emailFields)) . '">' : html_select("email_field", $emailFields));
315
+ echo "<input type='submit' name='email' value='" . lang('Send') . "' onclick=\"return this.form['delete'].onclick();\">\n";
316
+ echo "</div>\n";
317
+ echo "</div></fieldset>\n";
318
+ }
319
+ }
320
+
321
+ function selectColumnsProcess($columns, $indexes) {
322
+ return array(array(), array());
323
+ }
324
+
325
+ function selectSearchProcess($fields, $indexes) {
326
+ $return = array();
327
+ foreach ((array) $_GET["where"] as $key => $where) {
328
+ $col = $where["col"];
329
+ $op = $where["op"];
330
+ $val = $where["val"];
331
+ if (($key < 0 ? "" : $col) . $val != "") {
332
+ $conds = array();
333
+ foreach (($col != "" ? array($col => $fields[$col]) : $fields) as $name => $field) {
334
+ if ($col != "" || is_numeric($val) || !preg_match('~int|float|double|decimal~', $field["type"])) {
335
+ $name = idf_escape($name);
336
+ if ($col != "" && $field["type"] == "enum") {
337
+ $conds[] = (in_array(0, $val) ? "$name IS NULL OR " : "") . "$name IN (" . implode(", ", array_map('intval', $val)) . ")";
338
+ } else {
339
+ $text_type = preg_match('~char|text|enum|set~', $field["type"]);
340
+ $value = $this->processInput($field, (!$op && $text_type && preg_match('~^[^%]+$~', $val) ? "%$val%" : $val));
341
+ $conds[] = $name . ($value == "NULL" ? " IS" . ($op == ">=" ? " NOT" : "") . " $value"
342
+ : (in_array($op, $this->operators) || $op == "=" ? " $op $value"
343
+ : ($text_type ? " LIKE $value"
344
+ : " IN (" . str_replace(",", "', '", $value) . ")"
345
+ ))); //! can issue "Illegal mix of collations" for columns in other character sets - solve by CONVERT($name using utf8)
346
+ if ($key < 0 && $val == "0") {
347
+ $conds[] = "$name IS NULL";
348
+ }
349
+ }
350
+ }
351
+ }
352
+ $return[] = ($conds ? "(" . implode(" OR ", $conds) . ")" : "0");
353
+ }
354
+ }
355
+ return $return;
356
+ }
357
+
358
+ function selectOrderProcess($fields, $indexes) {
359
+ $index_order = $_GET["index_order"];
360
+ if ($index_order != "") {
361
+ unset($_GET["order"][1]);
362
+ }
363
+ if ($_GET["order"]) {
364
+ return array(idf_escape(reset($_GET["order"])) . ($_GET["desc"] ? " DESC" : ""));
365
+ }
366
+ foreach (($index_order != "" ? array($indexes[$index_order]) : $indexes) as $index) {
367
+ if ($index_order != "" || $index["type"] == "INDEX") {
368
+ $has_desc = array_filter($index["descs"]);
369
+ $desc = false;
370
+ foreach ($index["columns"] as $val) {
371
+ if (preg_match('~date|timestamp~', $fields[$val]["type"])) {
372
+ $desc = true;
373
+ break;
374
+ }
375
+ }
376
+ $return = array();
377
+ foreach ($index["columns"] as $key => $val) {
378
+ $return[] = idf_escape($val) . (($has_desc ? $index["descs"][$key] : $desc) ? " DESC" : "");
379
+ }
380
+ return $return;
381
+ }
382
+ }
383
+ return array();
384
+ }
385
+
386
+ function selectLimitProcess() {
387
+ return (isset($_GET["limit"]) ? $_GET["limit"] : "50");
388
+ }
389
+
390
+ function selectLengthProcess() {
391
+ return "100";
392
+ }
393
+
394
+ function selectEmailProcess($where, $foreignKeys) {
395
+ if ($_POST["email_append"]) {
396
+ return true;
397
+ }
398
+ if ($_POST["email"]) {
399
+ $sent = 0;
400
+ if ($_POST["all"] || $_POST["check"]) {
401
+ $field = idf_escape($_POST["email_field"]);
402
+ $subject = $_POST["email_subject"];
403
+ $message = $_POST["email_message"];
404
+ preg_match_all('~\\{\\$([a-z0-9_]+)\\}~i', "$subject.$message", $matches); // allows {$name} in subject or message
405
+ $rows = get_rows("SELECT DISTINCT $field" . ($matches[1] ? ", " . implode(", ", array_map('idf_escape', array_unique($matches[1]))) : "") . " FROM " . table($_GET["select"])
406
+ . " WHERE $field IS NOT NULL AND $field != ''"
407
+ . ($where ? " AND " . implode(" AND ", $where) : "")
408
+ . ($_POST["all"] ? "" : " AND ((" . implode(") OR (", array_map('where_check', (array) $_POST["check"])) . "))")
409
+ );
410
+ $fields = fields($_GET["select"]);
411
+ foreach ($this->rowDescriptions($rows, $foreignKeys) as $row) {
412
+ $replace = array('{\\' => '{'); // allow literal {$name}
413
+ foreach ($matches[1] as $val) {
414
+ $replace['{$' . "$val}"] = $this->editVal($row[$val], $fields[$val]);
415
+ }
416
+ $email = $row[$_POST["email_field"]];
417
+ if (is_mail($email) && send_mail($email, strtr($subject, $replace), strtr($message, $replace), $_POST["email_from"], $_FILES["email_files"])) {
418
+ $sent++;
419
+ }
420
+ }
421
+ }
422
+ cookie("adminer_email", $_POST["email_from"]);
423
+ redirect(remove_from_uri(), lang('%d e-mail(s) have been sent.', $sent));
424
+ }
425
+ return false;
426
+ }
427
+
428
+ function selectQueryBuild($select, $where, $group, $order, $limit, $page) {
429
+ return "";
430
+ }
431
+
432
+ function messageQuery($query, $time) {
433
+ return " <span class='time'>" . @date("H:i:s") . "</span><!--\n" . str_replace("--", "--><!-- ", $query) . "\n" . ($time ? "($time)\n" : "") . "-->";
434
+ }
435
+
436
+ function editFunctions($field) {
437
+ $return = array();
438
+ if ($field["null"] && preg_match('~blob~', $field["type"])) {
439
+ $return["NULL"] = lang('empty');
440
+ }
441
+ $return[""] = ($field["null"] || $field["auto_increment"] || like_bool($field) ? "" : "*");
442
+ //! respect driver
443
+ if (preg_match('~date|time~', $field["type"])) {
444
+ $return["now"] = lang('now');
445
+ }
446
+ if (preg_match('~_(md5|sha1)$~i', $field["field"], $match)) {
447
+ $return[] = strtolower($match[1]);
448
+ }
449
+ return $return;
450
+ }
451
+
452
+ function editInput($table, $field, $attrs, $value) {
453
+ if ($field["type"] == "enum") {
454
+ return (isset($_GET["select"]) ? "<label><input type='radio'$attrs value='-1' checked><i>" . lang('original') . "</i></label> " : "")
455
+ . enum_input("radio", $attrs, $field, ($value || isset($_GET["select"]) ? $value : 0), ($field["null"] ? "" : null))
456
+ ;
457
+ }
458
+ $options = $this->_foreignKeyOptions($table, $field["field"], $value);
459
+ if ($options !== null) {
460
+ return (is_array($options)
461
+ ? "<select$attrs>" . optionlist($options, $value, true) . "</select>"
462
+ : "<input value='" . h($value) . "'$attrs class='hidden'><input value='" . h($options) . "' class='jsonly' onkeyup=\"whisper('" . h(ME . "script=complete&source=" . urlencode($table) . "&field=" . urlencode($field["field"])) . "&value=', this);\"><div onclick='return whisperClick(event, this.previousSibling);'></div>"
463
+ );
464
+ }
465
+ if (like_bool($field)) {
466
+ return '<input type="checkbox" value="' . h($value ? $value : 1) . '"' . ($value ? ' checked' : '') . "$attrs>";
467
+ }
468
+ $hint = "";
469
+ if (preg_match('~time~', $field["type"])) {
470
+ $hint = lang('HH:MM:SS');
471
+ }
472
+ if (preg_match('~date|timestamp~', $field["type"])) {
473
+ $hint = lang('[yyyy]-mm-dd') . ($hint ? " [$hint]" : "");
474
+ }
475
+ if ($hint) {
476
+ return "<input value='" . h($value) . "'$attrs> ($hint)"; //! maxlength
477
+ }
478
+ if (preg_match('~_(md5|sha1)$~i', $field["field"])) {
479
+ return "<input type='password' value='" . h($value) . "'$attrs>";
480
+ }
481
+ return '';
482
+ }
483
+
484
+ function processInput($field, $value, $function = "") {
485
+ if ($function == "now") {
486
+ return "$function()";
487
+ }
488
+ $return = $value;
489
+ if (preg_match('~date|timestamp~', $field["type"]) && preg_match('(^' . str_replace('\\$1', '(?P<p1>\\d*)', preg_replace('~(\\\\\\$([2-6]))~', '(?P<p\\2>\\d{1,2})', preg_quote(lang('$1-$3-$5')))) . '(.*))', $value, $match)) {
490
+ $return = ($match["p1"] != "" ? $match["p1"] : ($match["p2"] != "" ? ($match["p2"] < 70 ? 20 : 19) . $match["p2"] : gmdate("Y"))) . "-$match[p3]$match[p4]-$match[p5]$match[p6]" . end($match);
491
+ }
492
+ $return = ($field["type"] == "bit" && preg_match('~^[0-9]+$~', $value) ? $return : q($return));
493
+ if ($value == "" && like_bool($field)) {
494
+ $return = "0";
495
+ } elseif ($value == "" && ($field["null"] || !preg_match('~char|text~', $field["type"]))) {
496
+ $return = "NULL";
497
+ } elseif (preg_match('~^(md5|sha1)$~', $function)) {
498
+ $return = "$function($return)";
499
+ }
500
+ return unconvert_field($field, $return);
501
+ }
502
+
503
+ function dumpOutput() {
504
+ return array();
505
+ }
506
+
507
+ function dumpFormat() {
508
+ return array('csv' => 'CSV,', 'csv;' => 'CSV;', 'tsv' => 'TSV');
509
+ }
510
+
511
+ function dumpDatabase($db) {
512
+ }
513
+
514
+ function dumpTable() {
515
+ echo "\xef\xbb\xbf"; // UTF-8 byte order mark
516
+ }
517
+
518
+ function dumpData($table, $style, $query) {
519
+ global $connection;
520
+ $result = $connection->query($query, 1); // 1 - MYSQLI_USE_RESULT
521
+ if ($result) {
522
+ while ($row = $result->fetch_assoc()) {
523
+ if ($style == "table") {
524
+ dump_csv(array_keys($row));
525
+ $style = "INSERT";
526
+ }
527
+ dump_csv($row);
528
+ }
529
+ }
530
+ }
531
+
532
+ function dumpFilename($identifier) {
533
+ return friendly_url($identifier);
534
+ }
535
+
536
+ function dumpHeaders($identifier, $multi_table = false) {
537
+ $ext = "csv";
538
+ header("Content-Type: text/csv; charset=utf-8");
539
+ return $ext;
540
+ }
541
+
542
+ function homepage() {
543
+ return true;
544
+ }
545
+
546
+ function navigation($missing) {
547
+ global $VERSION;
548
+ ?>
549
+ <h1>
550
+ <?php echo $this->name(); ?> <span class="version"><?php echo $VERSION; ?></span>
551
+ <a href="https://www.adminer.org/editor/#download" target="_blank" id="version"><?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?></a>
552
+ </h1>
553
+ <?php
554
+ if ($missing == "auth") {
555
+ $first = true;
556
+ foreach ((array) $_SESSION["pwds"] as $vendor => $servers) {
557
+ foreach ($servers[""] as $username => $password) {
558
+ if ($password !== null) {
559
+ if ($first) {
560
+ echo "<p id='logins' onmouseover='menuOver(this, event);' onmouseout='menuOut(this);'>\n";
561
+ $first = false;
562
+ }
563
+ echo "<a href='" . h(auth_url($vendor, "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a><br>\n";
564
+ }
565
+ }
566
+ }
567
+ } else {
568
+ $this->databasesPrint($missing);
569
+ if ($missing != "db" && $missing != "ns") {
570
+ $table_status = table_status('', true);
571
+ if (!$table_status) {
572
+ echo "<p class='message'>" . lang('No tables.') . "\n";
573
+ } else {
574
+ $this->tablesPrint($table_status);
575
+ }
576
+ }
577
+ }
578
+ }
579
+
580
+ function databasesPrint($missing) {
581
+ }
582
+
583
+ function tablesPrint($tables) {
584
+ echo "<p id='tables' onmouseover='menuOver(this, event);' onmouseout='menuOut(this);'>\n";
585
+ foreach ($tables as $row) {
586
+ $name = $this->tableName($row);
587
+ if (isset($row["Engine"]) && $name != "") { // ignore views and tables without name
588
+ echo "<a href='" . h(ME) . 'select=' . urlencode($row["Name"]) . "'"
589
+ . bold($_GET["select"] == $row["Name"] || $_GET["edit"] == $row["Name"], "select")
590
+ . " title='" . lang('Select data') . "'>$name</a><br>\n"
591
+ ;
592
+ }
593
+ }
594
+ }
595
+
596
+ function _foreignColumn($foreignKeys, $column) {
597
+ foreach ((array) $foreignKeys[$column] as $foreignKey) {
598
+ if (count($foreignKey["source"]) == 1) {
599
+ $name = $this->rowDescription($foreignKey["table"]);
600
+ if ($name != "") {
601
+ $id = idf_escape($foreignKey["target"][0]);
602
+ return array($foreignKey["table"], $id, $name);
603
+ }
604
+ }
605
+ }
606
+ }
607
+
608
+ function _foreignKeyOptions($table, $column, $value = null) {
609
+ global $connection;
610
+ if (list($target, $id, $name) = $this->_foreignColumn(column_foreign_keys($table), $column)) {
611
+ $return = &$this->_values[$target];
612
+ if ($return === null) {
613
+ $table_status = table_status($target);
614
+ $return = ($table_status["Rows"] > 1000 ? "" : array("" => "") + get_key_vals("SELECT $id, $name FROM " . table($target) . " ORDER BY 2"));
615
+ }
616
+ if (!$return && $value !== null) {
617
+ return $connection->result("SELECT $name FROM " . table($target) . " WHERE $id = " . q($value));
618
+ }
619
+ return $return;
620
+ }
621
+ }
622
+
623
+ }
624
+
625
+ $adminer = (function_exists('adminer_object') ? adminer_object() : new Adminer);
adminer/adminer/editor/include/connect.inc.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <?php
2
+ $connection->select_db($adminer->database());
adminer/adminer/editor/include/editing.inc.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** Encode e-mail header in UTF-8
3
+ * @param string
4
+ * @return string
5
+ */
6
+ function email_header($header) {
7
+ // iconv_mime_encode requires iconv, imap_8bit requires IMAP extension
8
+ return "=?UTF-8?B?" . base64_encode($header) . "?="; //! split long lines
9
+ }
10
+
11
+ /** Send e-mail in UTF-8
12
+ * @param string
13
+ * @param string
14
+ * @param string
15
+ * @param string
16
+ * @param array
17
+ * @return bool
18
+ */
19
+ function send_mail($email, $subject, $message, $from = "", $files = array()) {
20
+ $eol = (DIRECTORY_SEPARATOR == "/" ? "\n" : "\r\n"); // PHP_EOL available since PHP 5.0.2
21
+ $message = str_replace("\n", $eol, wordwrap(str_replace("\r", "", "$message\n")));
22
+ $boundary = uniqid("boundary");
23
+ $attachments = "";
24
+ foreach ((array) $files["error"] as $key => $val) {
25
+ if (!$val) {
26
+ $attachments .= "--$boundary$eol"
27
+ . "Content-Type: " . str_replace("\n", "", $files["type"][$key]) . $eol
28
+ . "Content-Disposition: attachment; filename=\"" . preg_replace('~["\\n]~', '', $files["name"][$key]) . "\"$eol"
29
+ . "Content-Transfer-Encoding: base64$eol$eol"
30
+ . chunk_split(base64_encode(file_get_contents($files["tmp_name"][$key])), 76, $eol) . $eol
31
+ ;
32
+ }
33
+ }
34
+ $beginning = "";
35
+ $headers = "Content-Type: text/plain; charset=utf-8$eol" . "Content-Transfer-Encoding: 8bit";
36
+ if ($attachments) {
37
+ $attachments .= "--$boundary--$eol";
38
+ $beginning = "--$boundary$eol$headers$eol$eol";
39
+ $headers = "Content-Type: multipart/mixed; boundary=\"$boundary\"";
40
+ }
41
+ $headers .= $eol . "MIME-Version: 1.0$eol" . "X-Mailer: Adminer Editor"
42
+ . ($from ? $eol . "From: " . str_replace("\n", "", $from) : "") //! should escape display name
43
+ ;
44
+ return mail($email, email_header($subject), $beginning . $message . $attachments, $headers);
45
+ }
46
+
47
+ /** Check whether the column looks like boolean
48
+ * @param array single field returned from fields()
49
+ * @return bool
50
+ */
51
+ function like_bool($field) {
52
+ return preg_match("~bool|(tinyint|bit)\\(1\\)~", $field["full_type"]);
53
+ }
adminer/adminer/editor/index.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** Adminer Editor - Compact database editor
3
+ * @link https://www.adminer.org/
4
+ * @author Jakub Vrana, http://www.vrana.cz/
5
+ * @copyright 2009 Jakub Vrana
6
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
7
+ * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
8
+ */
9
+
10
+ include "../adminer/include/bootstrap.inc.php";
11
+ $drivers[DRIVER] = lang('Login');
12
+
13
+ if (isset($_GET["select"]) && ($_POST["edit"] || $_POST["clone"]) && !$_POST["save"]) {
14
+ $_GET["edit"] = $_GET["select"];
15
+ }
16
+
17
+ if (isset($_GET["download"])) {
18
+ include "../adminer/download.inc.php";
19
+ } elseif (isset($_GET["edit"])) {
20
+ include "../adminer/edit.inc.php";
21
+ } elseif (isset($_GET["select"])) {
22
+ include "../adminer/select.inc.php";
23
+ } elseif (isset($_GET["script"])) {
24
+ include "./script.inc.php";
25
+ } else {
26
+ include "./db.inc.php";
27
+ }
28
+
29
+ // each page calls its own page_header(), if the footer should not be called then the page exits
30
+ page_footer();
adminer/adminer/editor/script.inc.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ($_GET["script"] == "kill") {
3
+ $connection->query("KILL " . number($_POST["kill"]));
4
+
5
+ } elseif (list($table, $id, $name) = $adminer->_foreignColumn(column_foreign_keys($_GET["source"]), $_GET["field"])) {
6
+ $limit = 11;
7
+ $result = $connection->query("SELECT $id, $name FROM " . table($table) . " WHERE " . (preg_match('~^[0-9]+$~', $_GET["value"]) ? "$id = $_GET[value] OR " : "") . "$name LIKE " . q("$_GET[value]%") . " ORDER BY 2 LIMIT $limit");
8
+ for ($i=1; ($row = $result->fetch_row()) && $i < $limit; $i++) {
9
+ echo "<a href='" . h(ME . "edit=" . urlencode($table) . "&where" . urlencode("[" . bracket_escape(idf_unescape($id)) . "]") . "=" . urlencode($row[0])) . "'>" . h($row[1]) . "</a><br>\n";
10
+ }
11
+ if ($row) {
12
+ echo "...\n";
13
+ }
14
+ }
15
+
16
+ exit; // don't print footer
adminer/adminer/editor/static/editing.js ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Editor specific functions
2
+
3
+ function selectFieldChange() {
4
+ }
5
+
6
+ var helpOpen;
7
+
8
+ function helpMouseover() {
9
+ }
10
+
11
+ function helpMouseout() {
12
+ }
13
+
14
+ function whisperClick(event, field) {
15
+ var el = getTarget(event);
16
+ if (isTag(el, 'a') && !(event.button || event.shiftKey || event.altKey || isCtrl(event))) {
17
+ field.value = el.firstChild.data;
18
+ field.previousSibling.value = decodeURIComponent(el.href.replace(/.*=/, ''));
19
+ field.nextSibling.style.display = 'none';
20
+ return false;
21
+ }
22
+ }
23
+
24
+ function whisper(url, field) {
25
+ if (field.orig != field.value) { // ignore arrows, Shift, ...
26
+ field.orig = field.value;
27
+ field.previousSibling.value = field.value; // accept number, reject string
28
+ return ajax(url + encodeURIComponent(field.value), function (xmlhttp) {
29
+ if (xmlhttp.status && field.orig == field.value) { // ignore old responses
30
+ field.nextSibling.innerHTML = xmlhttp.responseText;
31
+ field.nextSibling.style.display = '';
32
+ var a = field.nextSibling.firstChild;
33
+ if (a && a.firstChild.data == field.value) {
34
+ field.previousSibling.value = decodeURIComponent(a.href.replace(/.*=/, ''));
35
+ a.className = 'active';
36
+ }
37
+ }
38
+ });
39
+ }
40
+ }
adminer/adminer/externals/JsShrink/jsShrink.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** Remove spaces and comments from JavaScript code
3
+ * @param string code with commands terminated by semicolon
4
+ * @return string shrinked code
5
+ * @link http://vrana.github.com/JsShrink/
6
+ * @author Jakub Vrana, http://www.vrana.cz/
7
+ * @copyright 2007 Jakub Vrana
8
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
9
+ * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
10
+ */
11
+ function jsShrink($input) {
12
+ return preg_replace_callback('(
13
+ (?:
14
+ (^|[-+\([{}=,:;!%^&*|?~]|/(?![/*])|return|throw) # context before regexp
15
+ (?:\s|//[^\n]*+\n|/\*(?:[^*]|\*(?!/))*+\*/)* # optional space
16
+ (/(?![/*])(?:
17
+ \\\\[^\n]
18
+ |[^[\n/\\\\]++
19
+ |\[(?:\\\\[^\n]|[^]])++
20
+ )+/) # regexp
21
+ |(^
22
+ |\'(?:\\\\.|[^\n\'\\\\])*\'
23
+ |"(?:\\\\.|[^\n"\\\\])*"
24
+ |([0-9A-Za-z_$]+)
25
+ |([-+]+)
26
+ |.
27
+ )
28
+ )(?:\s|//[^\n]*+\n|/\*(?:[^*]|\*(?!/))*+\*/)* # optional space
29
+ )sx', 'jsShrinkCallback', "$input\n");
30
+ }
31
+
32
+ function jsShrinkCallback($match) {
33
+ static $last = '';
34
+ $match += array_fill(1, 5, null); // avoid E_NOTICE
35
+ list(, $context, $regexp, $result, $word, $operator) = $match;
36
+ if ($word != '') {
37
+ $result = ($last == 'word' ? "\n" : ($last == 'return' ? " " : "")) . $result;
38
+ $last = ($word == 'return' || $word == 'throw' || $word == 'break' ? 'return' : 'word');
39
+ } elseif ($operator) {
40
+ $result = ($last == $operator[0] ? "\n" : "") . $result;
41
+ $last = $operator[0];
42
+ } else {
43
+ if ($regexp) {
44
+ $result = $context . ($context == '/' ? "\n" : "") . $regexp;
45
+ }
46
+ $last = '';
47
+ }
48
+ return $result;
49
+ }
adminer/adminer/externals/jush/jush.css ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .jush { color: black; }
2
+ .jush-htm_com, .jush-com, .jush-com_code, .jush-one, .jush-php_doc, .jush-php_com, .jush-php_one, .jush-js_one, .jush-js_doc { color: gray; }
3
+ .jush-php, .jush-php_new, .jush-php_fun { color: #000033; background-color: #FFF0F0; }
4
+ .jush-php_quo, .jush-quo, .jush-quo_one, .jush-php_eot, .jush-apo, .jush-sql_apo, .jush-sqlite_apo, .jush-sql_quo, .jush-sql_eot { color: green; }
5
+ .jush-php_apo { color: #009F00; }
6
+ .jush-php_quo_var, .jush-php_var, .jush-sql_var { font-style: italic; }
7
+ .jush-php_apo .jush-php_quo_var, .jush-php_apo .jush-php_var { font-style: normal; }
8
+ .jush-php_halt2 { background-color: white; color: black; }
9
+ .jush-tag_css, .jush-att_css .jush-att_quo, .jush-att_css .jush-att_apo, .jush-att_css .jush-att_val { color: black; background-color: #FFFFE0; }
10
+ .jush-tag_js, .jush-att_js .jush-att_quo, .jush-att_js .jush-att_apo, .jush-att_js .jush-att_val, .jush-css_js { color: black; background-color: #F0F0FF; }
11
+ .jush-tag, .jush-xml_tag { color: navy; }
12
+ .jush-att, .jush-xml_att, .jush-att_js, .jush-att_css, .jush-att_http { color: teal; }
13
+ .jush-att_quo, .jush-att_apo, .jush-att_val { color: purple; }
14
+ .jush-ent { color: purple; }
15
+ .jush-js_key, .jush-js_key .jush-quo, .jush-js_key .jush-apo { color: purple; }
16
+ .jush-js_reg { color: navy; }
17
+ .jush-php_sql .jush-php_quo, .jush-php_sql .jush-php_apo,
18
+ .jush-php_sqlite .jush-php_quo, .jush-php_sqlite .jush-php_apo,
19
+ .jush-php_pgsql .jush-php_quo, .jush-php_pgsql .jush-php_apo,
20
+ .jush-php_mssql .jush-php_quo, .jush-php_mssql .jush-php_apo,
21
+ .jush-php_oracle .jush-php_quo, .jush-php_oracle .jush-php_apo
22
+ { background-color: #FFBBB0; }
23
+ .jush-bac, .jush-php_bac, .jush-bra, .jush-mssql_bra, .jush-sqlite_quo { color: red; }
24
+ .jush-num, .jush-clr { color: #007F7F; }
25
+
26
+ .jush a { color: navy; }
27
+ .jush a.jush-help { cursor: help; }
28
+ .jush-sql a, .jush-sql_code a, .jush-sqlite a, .jush-pgsql a, .jush-mssql a, .jush-oracle a, .jush-simpledb a { font-weight: bold; }
29
+ .jush-php_sql .jush-php_quo a, .jush-php_sql .jush-php_apo a { font-weight: normal; }
30
+ .jush-tag a, .jush-att a, .jush-apo a, .jush-quo a, .jush-php_apo a, .jush-php_quo a, .jush-php_eot2 a { color: inherit; color: expression(parentNode.currentStyle.color); }
31
+ a.jush-custom:link, a.jush-custom:visited { font-weight: normal; color: inherit; color: expression(parentNode.currentStyle.color); }
32
+
33
+ .jush p { margin: 0; }
adminer/adminer/externals/jush/modules/jush-cnf.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jush.tr.cnf = { quo_one: /"/, one: /#/, cnf_http: /((?:^|\n)\s*)(RequestHeader|Header|CacheIgnoreHeaders)([ \t]+|$)/i, cnf_php: /((?:^|\n)\s*)(PHPIniDir)([ \t]+|$)/i, cnf_phpini: /((?:^|\n)\s*)(php_value|php_flag|php_admin_value|php_admin_flag)([ \t]+|$)/i };
2
+ jush.tr.quo_one = { esc: /\\/, _1: /"|(?=\n)/ };
3
+ jush.tr.cnf_http = { apo: /'/, quo: /"/, _1: /(?=\n)/ };
4
+ jush.tr.cnf_php = { _1: /()/ };
5
+ jush.tr.cnf_phpini = { cnf_phpini_val: /[ \t]/ };
6
+ jush.tr.cnf_phpini_val = { apo: /'/, quo: /"/, _2: /(?=\n)/ };
7
+
8
+ jush.urls.cnf_http = 'http://httpd.apache.org/docs/current/mod/$key.html#$val';
9
+ jush.urls.cnf_php = 'http://www.php.net/$key';
10
+ jush.urls.cnf_phpini = 'http://www.php.net/configuration.changes#$key';
11
+ jush.urls.cnf = ['http://httpd.apache.org/docs/current/mod/$key.html#$1',
12
+ 'beos', 'core', 'mod_actions', 'mod_alias', 'mod_auth_basic', 'mod_auth_digest', 'mod_authn_alias', 'mod_authn_anon', 'mod_authn_dbd', 'mod_authn_dbm', 'mod_authn_default', 'mod_authn_file', 'mod_authnz_ldap', 'mod_authz_dbm', 'mod_authz_default', 'mod_authz_groupfile', 'mod_authz_host', 'mod_authz_owner', 'mod_authz_user', 'mod_autoindex', 'mod_cache', 'mod_cern_meta', 'mod_cgi', 'mod_cgid', 'mod_dav', 'mod_dav_fs', 'mod_dav_lock', 'mod_dbd', 'mod_deflate', 'mod_dir', 'mod_disk_cache', 'mod_dumpio', 'mod_echo', 'mod_env', 'mod_example', 'mod_expires', 'mod_ext_filter', 'mod_file_cache', 'mod_filter', 'mod_charset_lite', 'mod_ident', 'mod_imagemap', 'mod_include', 'mod_info', 'mod_isapi', 'mod_ldap', 'mod_log_config', 'mod_log_forensic', 'mod_mem_cache', 'mod_mime', 'mod_mime_magic', 'mod_negotiation', 'mod_nw_ssl', 'mod_proxy', 'mod_rewrite', 'mod_setenvif', 'mod_so', 'mod_speling', 'mod_ssl', 'mod_status', 'mod_substitute', 'mod_suexec', 'mod_userdir', 'mod_usertrack', 'mod_version', 'mod_vhost_alias', 'mpm_common', 'mpm_netware', 'mpm_winnt', 'prefork'
13
+ ];
14
+
15
+ jush.links.cnf_http = { 'mod_cache': /CacheIgnoreHeaders/i, 'mod_headers': /.+/ };
16
+ jush.links.cnf_php = { 'configuration.file': /.+/ };
17
+ jush.links.cnf_phpini = { 'configuration.changes.apache': /.+/ };
18
+
19
+ jush.links2.cnf = /((?:^|\n)\s*(?:&lt;)?)(MaxRequestsPerThread|(AcceptFilter|AcceptPathInfo|AccessFileName|AddDefaultCharset|AddOutputFilterByType|AllowEncodedSlashes|AllowOverride|AuthName|AuthType|CGIMapExtension|ContentDigest|DefaultType|Directory|DirectoryMatch|DocumentRoot|EnableMMAP|EnableSendfile|ErrorDocument|ErrorLog|FileETag|Files|FilesMatch|ForceType|HostnameLookups|IfDefine|IfModule|Include|KeepAlive|KeepAliveTimeout|Limit|LimitExcept|LimitInternalRecursion|LimitRequestBody|LimitRequestFields|LimitRequestFieldSize|LimitRequestLine|LimitXMLRequestBody|Location|LocationMatch|LogLevel|MaxKeepAliveRequests|NameVirtualHost|Options|Require|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScriptInterpreterSource|ServerAdmin|ServerAlias|ServerName|ServerPath|ServerRoot|ServerSignature|ServerTokens|SetHandler|SetInputFilter|SetOutputFilter|TimeOut|TraceEnable|UseCanonicalName|UseCanonicalPhysicalPort|VirtualHost)|(Action|Script)|(Alias|AliasMatch|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ScriptAlias|ScriptAliasMatch)|(AuthBasicAuthoritative|AuthBasicProvider)|(AuthDigestAlgorithm|AuthDigestDomain|AuthDigestNcCheck|AuthDigestNonceFormat|AuthDigestNonceLifetime|AuthDigestProvider|AuthDigestQop|AuthDigestShmemSize)|(AuthnProviderAlias)|(Anonymous|Anonymous_LogEmail|Anonymous_MustGiveEmail|Anonymous_NoUserID|Anonymous_VerifyEmail)|(AuthDBDUserPWQuery|AuthDBDUserRealmQuery)|(AuthDBMType|AuthDBMUserFile)|(AuthDefaultAuthoritative)|(AuthUserFile)|(AuthLDAPBindDN|AuthLDAPBindPassword|AuthLDAPCharsetConfig|AuthLDAPCompareDNOnServer|AuthLDAPDereferenceAliases|AuthLDAPGroupAttribute|AuthLDAPGroupAttributeIsDN|AuthLDAPRemoteUserAttribute|AuthLDAPRemoteUserIsDN|AuthLDAPUrl|AuthzLDAPAuthoritative)|(AuthDBMGroupFile|AuthzDBMAuthoritative|AuthzDBMType)|(AuthzDefaultAuthoritative)|(AuthGroupFile|AuthzGroupFileAuthoritative)|(Allow|Deny|Order)|(AuthzOwnerAuthoritative)|(AuthzUserAuthoritative)|(AddAlt|AddAltByEncoding|AddAltByType|AddDescription|AddIcon|AddIconByEncoding|AddIconByType|DefaultIcon|HeaderName|IndexHeadInsert|IndexIgnore|IndexOptions|IndexOrderDefault|IndexStyleSheet|ReadmeName)|(CacheDefaultExpire|CacheDisable|CacheEnable|CacheIgnoreCacheControl|CacheIgnoreNoLastMod|CacheIgnoreQueryString|CacheLastModifiedFactor|CacheMaxExpire|CacheStoreNoStore|CacheStorePrivate)|(MetaDir|MetaFiles|MetaSuffix)|(ScriptLog|ScriptLogBuffer|ScriptLogLength)|(ScriptSock)|(Dav|DavDepthInfinity|DavMinTimeout)|(DavLockDB)|(DavGenericLockDB)|(DBDExptime|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver)|(DeflateBufferSize|DeflateCompressionLevel|DeflateFilterNote|DeflateMemLevel|DeflateWindowSize)|(DirectoryIndex|DirectorySlash)|(CacheDirLength|CacheDirLevels|CacheMaxFileSize|CacheMinFileSize|CacheRoot)|(DumpIOInput|DumpIOLogLevel|DumpIOOutput)|(ProtocolEcho)|(PassEnv|Set