mirror of
https://github.com/vrana/adminer.git
synced 2025-09-01 10:23:28 +02:00
Compare commits
197 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
187dd56b1c | ||
|
ba9099f084 | ||
|
16e05167a4 | ||
|
756e304c92 | ||
|
e762a6aa95 | ||
|
b3d5c9affe | ||
|
0268aba85a | ||
|
9ca92309a1 | ||
|
0fae40fb61 | ||
|
0e5df34ea8 | ||
|
f3938c1a66 | ||
|
07aa80048a | ||
|
c57e7ac3e3 | ||
|
6d14b47d02 | ||
|
ef3b468626 | ||
|
4d38c09db5 | ||
|
3ba99a1c2a | ||
|
9cbdb6262b | ||
|
cc268428b8 | ||
|
80d030f51a | ||
|
e23da5da0e | ||
|
9d532fc0a1 | ||
|
144c7de27f | ||
|
b7fcebfba8 | ||
|
d39a6e59c7 | ||
|
fc559a1cf6 | ||
|
f457053d85 | ||
|
e255ba9aa4 | ||
|
3fe0d88f98 | ||
|
68c6b1c942 | ||
|
001c37e240 | ||
|
b6cc584f48 | ||
|
af1ad47a64 | ||
|
2eaac2e94e | ||
|
40abffe8de | ||
|
259a465125 | ||
|
6c1fbf13c6 | ||
|
6353a89816 | ||
|
38aac7ada2 | ||
|
24245867d7 | ||
|
1459df56bc | ||
|
dc3a0e1a32 | ||
|
0411495d20 | ||
|
3d69fbf5f7 | ||
|
5e9df49fd1 | ||
|
565a5ca0eb | ||
|
9061583538 | ||
|
35b1db6974 | ||
|
068ee71bf7 | ||
|
efcf37d162 | ||
|
e645693147 | ||
|
12fbfc9847 | ||
|
6b2ba65084 | ||
|
a5ee3451ac | ||
|
da671df728 | ||
|
650221357d | ||
|
d996b48cfa | ||
|
22b4322710 | ||
|
36edd445a6 | ||
|
7305783c21 | ||
|
ee3a88d574 | ||
|
e5c52589ec | ||
|
3b0e1cf289 | ||
|
767fc0e47e | ||
|
63581af0f6 | ||
|
813ada6661 | ||
|
4be72a2a0d | ||
|
541c3c1fed | ||
|
3408d4ad78 | ||
|
e614ae08c4 | ||
|
552d2a6be4 | ||
|
415253b1b1 | ||
|
d07b7e3773 | ||
|
3de101dff4 | ||
|
48dacd1e97 | ||
|
14778165a8 | ||
|
72b199378a | ||
|
329fa55af5 | ||
|
ecf34769ad | ||
|
dc85ba2d86 | ||
|
741b76fbd4 | ||
|
58b2904d62 | ||
|
9cb281868f | ||
|
67f6aea77f | ||
|
7bcba262df | ||
|
75c0786d2e | ||
|
c4f6cbb32e | ||
|
b10e9e127e | ||
|
32f1e856ad | ||
|
17e45e9a9c | ||
|
e1f43da8df | ||
|
70aef8a55a | ||
|
0b824dad29 | ||
|
65fa4b4e31 | ||
|
c0a3f30060 | ||
|
7af1ee3702 | ||
|
3cbece1ec0 | ||
|
0d73372c50 | ||
|
fb7bd02713 | ||
|
fb71941daa | ||
|
504c56216c | ||
|
88803c6d0e | ||
|
b585ee8261 | ||
|
f4817e8568 | ||
|
105aca9b04 | ||
|
f556f6acb1 | ||
|
22d0cf4171 | ||
|
fa0963f370 | ||
|
ba28845651 | ||
|
8fd7ff0187 | ||
|
e040b296c5 | ||
|
b616c57352 | ||
|
50390ea38c | ||
|
9d7d30891e | ||
|
4cf73abccd | ||
|
2d6451b99a | ||
|
40d1feec9f | ||
|
e40d9692c7 | ||
|
770fc9673c | ||
|
56b6590a4f | ||
|
f8fd4dd6e3 | ||
|
d8c28d1c91 | ||
|
46f39f3cdb | ||
|
8a9df8ede1 | ||
|
e4d35f9591 | ||
|
346353153d | ||
|
9df33e82e6 | ||
|
fa09eba15e | ||
|
d5b329a1a4 | ||
|
0cd02bb98a | ||
|
a7cbf66347 | ||
|
fa6865da6a | ||
|
63b6b99365 | ||
|
a0a1476e5b | ||
|
8a9d803137 | ||
|
4588af77ac | ||
|
91bd2e84f5 | ||
|
2a534798fa | ||
|
a062e9cc58 | ||
|
6c84764334 | ||
|
a01ca3ade4 | ||
|
6ee4692afd | ||
|
b8cd3b317d | ||
|
64a49e95e8 | ||
|
8dd971ca5e | ||
|
c9801e2e24 | ||
|
4578d47409 | ||
|
12aaf506b8 | ||
|
4cfe6263d9 | ||
|
b8bea7fc56 | ||
|
cd8ff96a09 | ||
|
4a69059e1b | ||
|
842ea0bd46 | ||
|
1d0607177d | ||
|
9e4d9fda65 | ||
|
47c582acb3 | ||
|
32334f1106 | ||
|
a10238516c | ||
|
4801da091b | ||
|
76612b1e8a | ||
|
eb8c9929d3 | ||
|
cf10398104 | ||
|
d00927ce66 | ||
|
28a84fec18 | ||
|
2c8eff9b53 | ||
|
5f26d3a1b8 | ||
|
3344fae96e | ||
|
dedbd01f64 | ||
|
4c78976cba | ||
|
1a6186648c | ||
|
36f42d0fda | ||
|
45712a5d4c | ||
|
73690164b7 | ||
|
3fa1eadf2c | ||
|
3a1c251065 | ||
|
d0268c69da | ||
|
fd3d1c7e2e | ||
|
cbd3adc564 | ||
|
86e26846a8 | ||
|
6860478950 | ||
|
dc9ae77e2f | ||
|
8f60870d9a | ||
|
d6c3430607 | ||
|
2cee788ad3 | ||
|
647cab7c69 | ||
|
9bb75e1230 | ||
|
7099560add | ||
|
14cb9ca1ef | ||
|
31057f0ef2 | ||
|
fa09962ab1 | ||
|
bad3c6b086 | ||
|
0922b312d3 | ||
|
949b913d4f | ||
|
af25827ff4 | ||
|
9872229e11 | ||
|
682e86d236 | ||
|
f0a5fb56a5 |
4
.travis.yml
Normal file
4
.travis.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
language: php
|
||||
php:
|
||||
- '7.1'
|
||||
script: git diff --name-only $TRAVIS_COMMIT_RANGE | grep '\.php$' | xargs -n1 -P8 php -l | grep -v 'No syntax errors'; test $? -eq 1
|
@@ -29,7 +29,7 @@ if (!$error && $_POST) {
|
||||
$call[] = (isset($out[$key]) ? "@" . idf_escape($field["field"]) : $val);
|
||||
}
|
||||
|
||||
$query = (isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . idf_escape($PROCEDURE) . "(" . implode(", ", $call) . ")";
|
||||
$query = (isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . table($PROCEDURE) . "(" . implode(", ", $call) . ")";
|
||||
echo "<p><code class='jush-$jush'>" . h($query) . "</code> <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a>\n";
|
||||
|
||||
if (!$connection->multi_query($query)) {
|
||||
|
@@ -35,7 +35,6 @@ if ($_POST && !process_fields($row["fields"]) && !$error) {
|
||||
$all_fields = array();
|
||||
$use_all_fields = false;
|
||||
$foreign = array();
|
||||
ksort($row["fields"]);
|
||||
$orig_field = reset($orig_fields);
|
||||
$after = " FIRST";
|
||||
|
||||
@@ -164,8 +163,8 @@ foreach ($engines as $engine) {
|
||||
<p>
|
||||
<?php if (support("columns") || $TABLE == "") { ?>
|
||||
<?php echo lang('Table name'); ?>: <input name="name" maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
|
||||
<?php if ($TABLE == "" && !$_POST) { ?><script type='text/javascript'>focus(document.getElementById('form')['name']);</script><?php } ?>
|
||||
<?php echo ($engines ? "<select name='Engine' onchange='helpClose();'" . on_help("getTarget(event).value", 1) . ">" . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "</select>" : ""); ?>
|
||||
<?php if ($TABLE == "" && !$_POST) { echo script("focus(qs('#form')['name']);"); } ?>
|
||||
<?php echo ($engines ? "<select name='Engine'>" . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "</select>" . on_help("getTarget(event).value", 1) . script("qsl('select').onchange = helpClose;") : ""); ?>
|
||||
<?php echo ($collations && !preg_match("~sqlite|mssql~", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php } ?>
|
||||
@@ -188,9 +187,10 @@ edit_fields($row["fields"], $collations, "TABLE", $foreign_keys, $comments);
|
||||
<p>
|
||||
<?php echo lang('Auto Increment'); ?>: <input type="number" name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
|
||||
<?php echo checkbox("defaults", 1, true, lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
|
||||
<?php if (!$_POST["defaults"]) { ?><script type="text/javascript">editingHideDefaults()</script><?php } ?>
|
||||
<?php if (!$_POST["defaults"]) { echo script("editingHideDefaults();"); } ?>
|
||||
<?php echo (support("comment")
|
||||
? "<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>"
|
||||
? "<label><input type='checkbox' name='comments' value='1' class='jsonly'" . ($comments ? " checked" : "") . ">" . lang('Comment') . "</label>"
|
||||
. script("qsl('input').onclick = function () { columnShow(this.checked, 6); toggle('Comment'); if (this.checked) this.form['Comment'].focus(); };")
|
||||
. ' <input name="Comment" id="Comment" value="' . h($row["Comment"]) . '" maxlength="' . ($connection->server_info >= 5.5 ? 2048 : 60) . '"' . ($comments ? '' : ' class="hidden"') . '>'
|
||||
: '')
|
||||
; ?>
|
||||
@@ -198,14 +198,14 @@ edit_fields($row["fields"], $collations, "TABLE", $foreign_keys, $comments);
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php } ?>
|
||||
|
||||
<?php if ($TABLE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<?php if ($TABLE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(); ?><?php } ?>
|
||||
<?php
|
||||
if (support("partitioning")) {
|
||||
$partition_table = preg_match('~RANGE|LIST~', $row["partition_by"]);
|
||||
print_fieldset("partition", lang('Partition by'), $row["partition_by"]);
|
||||
?>
|
||||
<p>
|
||||
<?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>"; ?>
|
||||
<?php echo "<select name='partition_by'>" . optionlist(array("" => "") + $partition_by, $row["partition_by"]) . "</select>" . on_help("getTarget(event).value.replace(/./, 'PARTITION BY \$&')", 1) . script("qsl('select').onchange = partitionByChange;"); ?>
|
||||
(<input name="partition" value="<?php echo h($row["partition"]); ?>">)
|
||||
<?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"]); ?>">
|
||||
<table cellspacing="0" id="partition-table"<?php echo ($partition_table ? "" : " class='hidden'"); ?>>
|
||||
@@ -213,7 +213,8 @@ if (support("partitioning")) {
|
||||
<?php
|
||||
foreach ($row["partition_names"] as $key => $val) {
|
||||
echo '<tr>';
|
||||
echo '<td><input name="partition_names[]" value="' . h($val) . '"' . ($key == count($row["partition_names"]) - 1 ? ' onchange="partitionNameChange(this);"' : '') . ' autocapitalize="off">';
|
||||
echo '<td><input name="partition_names[]" value="' . h($val) . '" autocapitalize="off">';
|
||||
echo ($key == count($row["partition_names"]) - 1 ? script("qsl('input').oninput = partitionNameChange;") : '');
|
||||
echo '<td><input name="partition_values[]" value="' . h($row["partition_values"][$key]) . '">';
|
||||
}
|
||||
?>
|
||||
|
@@ -65,12 +65,12 @@ echo ($_POST["add_x"] || strpos($name, "\n")
|
||||
'sql' => "charset-charsets.html",
|
||||
'mssql' => "ms187963.aspx",
|
||||
)) : "");
|
||||
echo script("focus(qs('#name'));");
|
||||
?>
|
||||
<script type='text/javascript'>focus(document.getElementById('name'));</script>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php
|
||||
if (DB != "") {
|
||||
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
|
||||
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . confirm() . "\n";
|
||||
} elseif (!$_POST["add_x"] && $_GET["db"] == "") {
|
||||
echo "<input type='image' class='icon' name='add' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>\n";
|
||||
}
|
||||
|
@@ -4,7 +4,7 @@ $tables_views = array_merge((array) $_POST["tables"], (array) $_POST["views"]);
|
||||
if ($tables_views && !$error && !$_POST["search"]) {
|
||||
$result = true;
|
||||
$message = "";
|
||||
if ($jush == "sql" && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"] || $_POST["copy"])) {
|
||||
if ($jush == "sql" && $_POST["tables"] && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"] || $_POST["copy"])) {
|
||||
queries("SET foreign_key_checks = 0"); // allows to truncate or drop several tables at once
|
||||
}
|
||||
|
||||
@@ -56,16 +56,19 @@ if ($adminer->homepage()) {
|
||||
echo "<form action='' method='post'>\n";
|
||||
if (support("table")) {
|
||||
echo "<fieldset><legend>" . lang('Search data in tables') . " <span id='selected2'></span></legend><div>";
|
||||
echo "<input type='search' name='query' value='" . h($_POST["query"]) . "'> <input type='submit' name='search' value='" . lang('Search') . "'>\n";
|
||||
echo "<input type='search' name='query' value='" . h($_POST["query"]) . "'>";
|
||||
echo script("qsl('input').onkeydown = partialArg(bodyKeydown, 'search');", "");
|
||||
echo " <input type='submit' name='search' value='" . lang('Search') . "'>\n";
|
||||
echo "</div></fieldset>\n";
|
||||
if ($_POST["search"] && $_POST["query"] != "") {
|
||||
search_tables();
|
||||
}
|
||||
}
|
||||
echo "<table cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
|
||||
|
||||
echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);">';
|
||||
$doc_link = doc_link(array('sql' => 'show-table-status.html'));
|
||||
echo "<table cellspacing='0' class='nowrap checkable'>\n";
|
||||
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
|
||||
echo '<thead><tr class="wrap">';
|
||||
echo '<td><input id="check-all" type="checkbox" class="jsonly">' . script("qs('#check-all').onclick = partial(formCheck, /^(tables|views)\[/);", "");
|
||||
echo '<th>' . lang('Table');
|
||||
echo '<td>' . lang('Engine') . doc_link(array('sql' => 'storage-engines.html'));
|
||||
echo '<td>' . lang('Collation') . doc_link(array('sql' => 'charset-mysql.html'));
|
||||
@@ -80,10 +83,11 @@ if ($adminer->homepage()) {
|
||||
$tables = 0;
|
||||
foreach ($tables_list as $name => $type) {
|
||||
$view = ($type !== null && !preg_match('~table~i', $type));
|
||||
echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');");
|
||||
echo '<th>' . (support("table") || support("indexes") ? '<a href="' . h(ME) . 'table=' . urlencode($name) . '" title="' . lang('Show structure') . '">' . h($name) . '</a>' : h($name));
|
||||
$id = h("Table-" . $name);
|
||||
echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');", "", $id);
|
||||
echo '<th>' . (support("table") || support("indexes") ? "<a href='" . h(ME) . "table=" . urlencode($name) . "' title='" . lang('Show structure') . "' id='$id'>" . h($name) . '</a>' : h($name));
|
||||
if ($view) {
|
||||
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>';
|
||||
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>';
|
||||
echo '<td align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '" title="' . lang('Select data') . '">?</a>';
|
||||
} else {
|
||||
foreach (array(
|
||||
@@ -115,17 +119,17 @@ if ($adminer->homepage()) {
|
||||
|
||||
echo "</table>\n";
|
||||
if (!information_schema(DB)) {
|
||||
$vacuum = "<input type='submit' value='" . lang('Vacuum') . "'" . on_help("'VACUUM'") . "> ";
|
||||
$optimize = "<input type='submit' name='optimize' value='" . lang('Optimize') . "'" . on_help($jush == "sql" ? "'OPTIMIZE TABLE'" : "'VACUUM OPTIMIZE'") . "> ";
|
||||
$vacuum = "<input type='submit' value='" . lang('Vacuum') . "'> " . on_help("'VACUUM'");
|
||||
$optimize = "<input type='submit' name='optimize' value='" . lang('Optimize') . "'> " . on_help($jush == "sql" ? "'OPTIMIZE TABLE'" : "'VACUUM OPTIMIZE'");
|
||||
echo "<fieldset><legend>" . lang('Selected') . " <span id='selected'></span></legend><div>"
|
||||
. ($jush == "sqlite" ? $vacuum
|
||||
: ($jush == "pgsql" ? $vacuum . $optimize
|
||||
: ($jush == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'" . on_help("'ANALYZE TABLE'") . "> " . $optimize
|
||||
. "<input type='submit' name='check' value='" . lang('Check') . "'" . on_help("'CHECK TABLE'") . "> "
|
||||
. "<input type='submit' name='repair' value='" . lang('Repair') . "'" . on_help("'REPAIR TABLE'") . "> "
|
||||
: ($jush == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'> " . on_help("'ANALYZE TABLE'") . $optimize
|
||||
. "<input type='submit' name='check' value='" . lang('Check') . "'> " . on_help("'CHECK TABLE'")
|
||||
. "<input type='submit' name='repair' value='" . lang('Repair') . "'> " . on_help("'REPAIR TABLE'")
|
||||
: "")))
|
||||
. "<input type='submit' name='truncate' value='" . lang('Truncate') . "'" . confirm() . on_help($jush == "sqlite" ? "'DELETE'" : "'TRUNCATE" . ($jush == "pgsql" ? "'" : " TABLE'")) . "> "
|
||||
. "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . on_help("'DROP TABLE'") . ">\n";
|
||||
. "<input type='submit' name='truncate' value='" . lang('Truncate') . "'> " . on_help($jush == "sqlite" ? "'DELETE'" : "'TRUNCATE" . ($jush == "pgsql" ? "'" : " TABLE'")) . confirm()
|
||||
. "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . on_help("'DROP TABLE'") . confirm() . "\n";
|
||||
$databases = (support("scheme") ? $adminer->schemas() : $adminer->databases());
|
||||
if (count($databases) != 1 && $jush != "sqlite") {
|
||||
$db = (isset($_POST["target"]) ? $_POST["target"] : (support("scheme") ? $_GET["ns"] : DB));
|
||||
@@ -135,17 +139,17 @@ if ($adminer->homepage()) {
|
||||
echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'>" : "");
|
||||
echo "\n";
|
||||
}
|
||||
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()
|
||||
echo "<input type='hidden' name='all' value=''>"; // used by trCheck()
|
||||
echo script("qsl('input').onclick = function () { selectCount('selected', formChecked(this, /^(tables|views)\[/));" . (support("table") ? " selectCount('selected2', formChecked(this, /^tables\[/) || $tables);" : "") . " }");
|
||||
echo "<input type='hidden' name='token' value='$token'>\n";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
echo "</form>\n";
|
||||
echo "<script type='text/javascript'>tableCheck();</script>\n";
|
||||
echo script("tableCheck();");
|
||||
}
|
||||
|
||||
echo '<p class="links"><a href="' . h(ME) . 'create=">' . lang('Create table') . "</a>\n";
|
||||
echo (support("view") ? '<a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n" : "");
|
||||
echo (support("materializedview") ? '<a href="' . h(ME) . 'view=&materialized=1">' . lang('Create materialized view') . "</a>\n" : "");
|
||||
|
||||
if (support("routine")) {
|
||||
echo "<h3 id='routines'>" . lang('Routines') . "</h3>\n";
|
||||
@@ -222,7 +226,7 @@ if ($adminer->homepage()) {
|
||||
}
|
||||
|
||||
if ($tables_list) {
|
||||
echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=db');</script>\n";
|
||||
echo script("ajaxSetHtml('" . js_escape(ME) . "script=db');");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -59,7 +59,8 @@ if (isset($_GET["elastic"])) {
|
||||
}
|
||||
|
||||
function connect($server, $username, $password) {
|
||||
$this->_url = "http://$username:$password@$server/";
|
||||
preg_match('~^(https?://)?(.*)~', $server, $match);
|
||||
$this->_url = ($match[1] ? $match[1] : "http://") . "$username:$password@$match[2]/";
|
||||
$return = $this->query('');
|
||||
if ($return) {
|
||||
$this->server_info = $return['version']['number'];
|
||||
@@ -257,9 +258,9 @@ if (isset($_GET["elastic"])) {
|
||||
"Engine" => "table",
|
||||
"Rows" => $table["count"],
|
||||
);
|
||||
}
|
||||
if ($name != "" && $name == $table["term"]) {
|
||||
return $return[$name];
|
||||
if ($name != "" && $name == $table["term"]) {
|
||||
return $return[$name];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
|
@@ -129,7 +129,7 @@ if (isset($_GET["mongo"])) {
|
||||
return new Min_Result($this->_conn->_db->selectCollection($table)
|
||||
->find(array(), $select)
|
||||
->sort($sort)
|
||||
->limit(+$limit)
|
||||
->limit($limit != "" ? +$limit : 0)
|
||||
->skip($page * $limit)
|
||||
);
|
||||
}
|
||||
|
@@ -8,7 +8,7 @@
|
||||
$drivers["mssql"] = "MS SQL";
|
||||
|
||||
if (isset($_GET["mssql"])) {
|
||||
$possible_drivers = array("SQLSRV", "MSSQL");
|
||||
$possible_drivers = array("SQLSRV", "MSSQL", "PDO_DBLIB");
|
||||
define("DRIVER", "mssql");
|
||||
if (extension_loaded("sqlsrv")) {
|
||||
class Min_DB {
|
||||
@@ -109,11 +109,11 @@ if (isset($_GET["mssql"])) {
|
||||
}
|
||||
|
||||
function fetch_assoc() {
|
||||
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_NEXT));
|
||||
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_ASSOC));
|
||||
}
|
||||
|
||||
function fetch_row() {
|
||||
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_NUMERIC, SQLSRV_SCROLL_NEXT));
|
||||
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_NUMERIC));
|
||||
}
|
||||
|
||||
function fetch_field() {
|
||||
@@ -164,7 +164,7 @@ if (isset($_GET["mssql"])) {
|
||||
}
|
||||
|
||||
function query($query, $unbuffered = false) {
|
||||
$result = mssql_query($query, $this->_link); //! $unbuffered
|
||||
$result = @mssql_query($query, $this->_link); //! $unbuffered
|
||||
$this->error = "";
|
||||
if (!$result) {
|
||||
$this->error = mssql_get_last_message();
|
||||
@@ -186,7 +186,7 @@ if (isset($_GET["mssql"])) {
|
||||
}
|
||||
|
||||
function next_result() {
|
||||
return mssql_next_result($this->_result);
|
||||
return mssql_next_result($this->_result->_result);
|
||||
}
|
||||
|
||||
function result($query, $field = 0) {
|
||||
@@ -234,8 +234,21 @@ if (isset($_GET["mssql"])) {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
} elseif (extension_loaded("pdo_dblib")) {
|
||||
class Min_DB extends Min_PDO {
|
||||
var $extension = "PDO_DBLIB";
|
||||
|
||||
function connect($server, $username, $password) {
|
||||
$this->dsn("dblib:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\\d)~', ';port=\\1', $server)), $username, $password);
|
||||
return true;
|
||||
}
|
||||
|
||||
function select_db($database) {
|
||||
// database selection is separated from the connection so dbname in DSN can't be used
|
||||
return $this->query("USE " . idf_escape($database));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Min_Driver extends Min_SQL {
|
||||
@@ -288,7 +301,7 @@ if (isset($_GET["mssql"])) {
|
||||
}
|
||||
|
||||
function get_databases() {
|
||||
return get_vals("EXEC sp_databases");
|
||||
return get_vals("SELECT name FROM sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')");
|
||||
}
|
||||
|
||||
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
|
||||
|
@@ -301,12 +301,16 @@ if (!defined("DRIVER")) {
|
||||
* @return mixed Min_DB or string for error
|
||||
*/
|
||||
function connect() {
|
||||
global $adminer;
|
||||
global $adminer, $types, $structured_types;
|
||||
$connection = new Min_DB;
|
||||
$credentials = $adminer->credentials();
|
||||
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
|
||||
$connection->set_charset(charset($connection)); // available in MySQLi since PHP 5.0.5
|
||||
$connection->query("SET sql_quote_show_create = 1, autocommit = 1");
|
||||
if (version_compare($connection->server_info, '5.7.8') >= 0) {
|
||||
$structured_types[lang('Strings')][] = "json";
|
||||
$types["json"] = 4294967295;
|
||||
}
|
||||
return $connection;
|
||||
}
|
||||
$return = $connection->error;
|
||||
@@ -429,7 +433,7 @@ if (!defined("DRIVER")) {
|
||||
global $connection;
|
||||
$return = array();
|
||||
foreach (get_rows($fast && $connection->server_info >= 5
|
||||
? "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")
|
||||
? "SELECT TABLE_NAME AS Name, ENGINE AS Engine, TABLE_COMMENT AS Comment FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() " . ($name != "" ? "AND TABLE_NAME = " . q($name) : "ORDER BY Name")
|
||||
: "SHOW TABLE STATUS" . ($name != "" ? " LIKE " . q(addcslashes($name, "%_\\")) : "")
|
||||
) as $row) {
|
||||
if ($row["Engine"] == "InnoDB") {
|
||||
@@ -500,10 +504,11 @@ if (!defined("DRIVER")) {
|
||||
function indexes($table, $connection2 = null) {
|
||||
$return = array();
|
||||
foreach (get_rows("SHOW INDEX FROM " . table($table), $connection2) as $row) {
|
||||
$return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE")));
|
||||
$return[$row["Key_name"]]["columns"][] = $row["Column_name"];
|
||||
$return[$row["Key_name"]]["lengths"][] = $row["Sub_part"];
|
||||
$return[$row["Key_name"]]["descs"][] = null;
|
||||
$name = $row["Key_name"];
|
||||
$return[$name]["type"] = ($name == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? ($row["Index_type"] == "SPATIAL" ? "SPATIAL" : "INDEX") : "UNIQUE")));
|
||||
$return[$name]["columns"][] = $row["Column_name"];
|
||||
$return[$name]["lengths"][] = ($row["Index_type"] == "SPATIAL" ? null : $row["Sub_part"]);
|
||||
$return[$name]["descs"][] = null;
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
@@ -1012,13 +1017,17 @@ if (!defined("DRIVER")) {
|
||||
*/
|
||||
function support($feature) {
|
||||
global $connection;
|
||||
return !preg_match("~scheme|sequence|type|view_trigger" . ($connection->server_info < 5.1 ? "|event|partitioning" . ($connection->server_info < 5 ? "|routine|trigger|view" : "") : "") . "~", $feature);
|
||||
return !preg_match("~scheme|sequence|type|view_trigger|materializedview" . ($connection->server_info < 5.1 ? "|event|partitioning" . ($connection->server_info < 5 ? "|routine|trigger|view" : "") : "") . "~", $feature);
|
||||
}
|
||||
|
||||
function kill_process($val) {
|
||||
return queries("KILL " . number($val));
|
||||
}
|
||||
|
||||
function connection_id(){
|
||||
return "SELECT CONNECTION_ID()";
|
||||
}
|
||||
|
||||
function max_connections() {
|
||||
global $connection;
|
||||
return $connection->result("SELECT @@max_connections");
|
||||
|
@@ -186,12 +186,20 @@ if (isset($_GET["pgsql"])) {
|
||||
}
|
||||
|
||||
function connect() {
|
||||
global $adminer;
|
||||
global $adminer, $types, $structured_types;
|
||||
$connection = new Min_DB;
|
||||
$credentials = $adminer->credentials();
|
||||
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
|
||||
if ($connection->server_info >= 9) {
|
||||
$connection->query("SET application_name = 'Adminer'");
|
||||
if ($connection->server_info >= 9.2) {
|
||||
$structured_types[lang('Strings')][] = "json";
|
||||
$types["json"] = 4294967295;
|
||||
if ($connection->server_info >= 9.4) {
|
||||
$structured_types[lang('Strings')][] = "jsonb";
|
||||
$types["jsonb"] = 4294967295;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $connection;
|
||||
}
|
||||
@@ -199,7 +207,7 @@ if (isset($_GET["pgsql"])) {
|
||||
}
|
||||
|
||||
function get_databases() {
|
||||
return get_vals("SELECT datname FROM pg_database ORDER BY datname");
|
||||
return get_vals("SELECT datname FROM pg_database WHERE has_database_privilege(datname, 'CONNECT') ORDER BY datname");
|
||||
}
|
||||
|
||||
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
|
||||
@@ -244,10 +252,10 @@ ORDER BY 1";
|
||||
|
||||
function table_status($name = "") {
|
||||
$return = array();
|
||||
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\"
|
||||
FROM pg_class
|
||||
WHERE relkind IN ('r','v','mv','f')
|
||||
AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())
|
||||
foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_total_relation_size(c.oid) - pg_relation_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", c.relhasoids::int AS \"Oid\", c.reltuples as \"Rows\", n.nspname
|
||||
FROM pg_class c
|
||||
JOIN pg_namespace n ON(n.nspname = current_schema() AND n.oid = c.relnamespace)
|
||||
WHERE relkind IN ('r', 'm', 'v')
|
||||
" . ($name != "" ? "AND relname = " . q($name) : "ORDER BY relname")
|
||||
) as $row) { //! Index_length, Auto_increment
|
||||
$return[$row["Name"]] = $row;
|
||||
@@ -311,9 +319,9 @@ ORDER BY a.attnum"
|
||||
$return = array();
|
||||
$table_oid = $connection2->result("SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) AND relname = " . q($table));
|
||||
$columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = $table_oid AND attnum > 0", $connection2);
|
||||
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) {
|
||||
foreach (get_rows("SELECT relname, indisunique::int, indisprimary::int, indkey, indoption , (indpred IS NOT NULL)::int as indispartial FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid", $connection2) as $row) {
|
||||
$relname = $row["relname"];
|
||||
$return[$relname]["type"] = ($row["indisprimary"] ? "PRIMARY" : ($row["indisunique"] ? "UNIQUE" : "INDEX"));
|
||||
$return[$relname]["type"] = ($row["indispartial"] ? "INDEX" : ($row["indisprimary"] ? "PRIMARY" : ($row["indisunique"] ? "UNIQUE" : "INDEX")));
|
||||
$return[$relname]["columns"] = array();
|
||||
foreach (explode(" ", $row["indkey"]) as $indkey) {
|
||||
$return[$relname]["columns"][] = $columns[$indkey];
|
||||
@@ -330,7 +338,7 @@ ORDER BY a.attnum"
|
||||
function foreign_keys($table) {
|
||||
global $on_actions;
|
||||
$return = array();
|
||||
foreach (get_rows("SELECT conname, pg_get_constraintdef(oid) AS definition
|
||||
foreach (get_rows("SELECT conname, condeferrable::int AS deferrable, pg_get_constraintdef(oid) AS definition
|
||||
FROM pg_constraint
|
||||
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())
|
||||
AND contype = 'f'::char
|
||||
@@ -352,7 +360,7 @@ ORDER BY conkey, conname") as $row) {
|
||||
|
||||
function view($name) {
|
||||
global $connection;
|
||||
return array("select" => $connection->result("SELECT pg_get_viewdef(" . q($name) . ")"));
|
||||
return array("select" => trim($connection->result("SELECT pg_get_viewdef(" . q($name) . ")")));
|
||||
}
|
||||
|
||||
function collations() {
|
||||
@@ -488,7 +496,7 @@ ORDER BY conkey, conname") as $row) {
|
||||
|
||||
function drop_tables($tables) {
|
||||
foreach ($tables as $table) {
|
||||
$status = table_status($table);
|
||||
$status = table_status($table);
|
||||
if (!queries("DROP " . strtoupper($status["Engine"]) . " " . table($table))) {
|
||||
return false;
|
||||
}
|
||||
@@ -506,18 +514,21 @@ ORDER BY conkey, conname") as $row) {
|
||||
return true;
|
||||
}
|
||||
|
||||
function trigger($name) {
|
||||
function trigger($name, $table = null) {
|
||||
if ($name == "") {
|
||||
return array("Statement" => "EXECUTE PROCEDURE ()");
|
||||
}
|
||||
$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));
|
||||
if ($table === null) {
|
||||
$table = $_GET['trigger'];
|
||||
}
|
||||
$rows = get_rows('SELECT t.trigger_name AS "Trigger", t.action_timing AS "Timing", (SELECT STRING_AGG(event_manipulation, \' OR \') FROM information_schema.triggers WHERE event_object_table = t.event_object_table AND trigger_name = t.trigger_name ) AS "Events", t.event_manipulation AS "Event", \'FOR EACH \' || t.action_orientation AS "Type", t.action_statement AS "Statement" FROM information_schema.triggers t WHERE t.event_object_table = ' . q($table) . ' AND t.trigger_name = ' . q($name));
|
||||
return reset($rows);
|
||||
}
|
||||
|
||||
function triggers($table) {
|
||||
$return = array();
|
||||
foreach (get_rows("SELECT * FROM information_schema.triggers WHERE event_object_table = " . q($table)) as $row) {
|
||||
$return[$row["trigger_name"]] = array($row["condition_timing"], $row["event_manipulation"]);
|
||||
$return[$row["trigger_name"]] = array($row["action_timing"], $row["event_manipulation"]);
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
@@ -606,6 +617,111 @@ AND typelem = 0"
|
||||
return $return;
|
||||
}
|
||||
|
||||
/** Get SQL command to create table
|
||||
* @param string
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
function create_sql($table, $auto_increment) {
|
||||
global $connection;
|
||||
$return = '';
|
||||
$return_parts = array();
|
||||
$sequences = array();
|
||||
|
||||
$status = table_status($table);
|
||||
$fields = fields($table);
|
||||
$indexes = indexes($table);
|
||||
ksort($indexes);
|
||||
$fkeys = foreign_keys($table);
|
||||
ksort($fkeys);
|
||||
$triggers = triggers($table);
|
||||
|
||||
if (!$status || empty($fields)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$return = "CREATE TABLE " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " (\n ";
|
||||
|
||||
// fields' definitions
|
||||
foreach ($fields as $field_name => $field) {
|
||||
$part = idf_escape($field['field']) . ' ' . $field['full_type']
|
||||
. (is_null($field['default']) ? "" : " DEFAULT $field[default]")
|
||||
. ($field['attnotnull'] ? " NOT NULL" : "");
|
||||
$return_parts[] = $part;
|
||||
|
||||
// sequences for fields
|
||||
if (preg_match('~nextval\(\'([^\']+)\'\)~', $field['default'], $matches)) {
|
||||
$sequence_name = $matches[1];
|
||||
$sq = reset(get_rows("SELECT * FROM $sequence_name"));
|
||||
$sequences[] = "CREATE SEQUENCE $sequence_name INCREMENT $sq[increment_by] MINVALUE $sq[min_value] MAXVALUE $sq[max_value] START " . ($auto_increment ? $sq['last_value'] : 1) . " CACHE $sq[cache_value];";
|
||||
}
|
||||
}
|
||||
|
||||
// adding sequences before table definition
|
||||
if (!empty($sequences)) {
|
||||
$return = implode("\n\n", $sequences) . "\n\n$return";
|
||||
}
|
||||
|
||||
// primary + unique keys
|
||||
foreach ($indexes as $index_name => $index) {
|
||||
switch($index['type']) {
|
||||
case 'UNIQUE': $return_parts[] = "CONSTRAINT " . idf_escape($index_name) . " UNIQUE (" . implode(', ', array_map('idf_escape', $index['columns'])) . ")"; break;
|
||||
case 'PRIMARY': $return_parts[] = "CONSTRAINT " . idf_escape($index_name) . " PRIMARY KEY (" . implode(', ', array_map('idf_escape', $index['columns'])) . ")"; break;
|
||||
}
|
||||
}
|
||||
|
||||
// foreign keys
|
||||
foreach ($fkeys as $fkey_name => $fkey) {
|
||||
$return_parts[] = "CONSTRAINT " . idf_escape($fkey_name) . " $fkey[definition] " . ($fkey['deferrable'] ? 'DEFERRABLE' : 'NOT DEFERRABLE');
|
||||
}
|
||||
|
||||
$return .= implode(",\n ", $return_parts) . "\n) WITH (oids = " . ($status['Oid'] ? 'true' : 'false') . ");";
|
||||
|
||||
// "basic" indexes after table definition
|
||||
foreach ($indexes as $index_name => $index) {
|
||||
if ($index['type'] == 'INDEX') {
|
||||
$return .= "\n\nCREATE INDEX " . idf_escape($index_name) . " ON " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " USING btree (" . implode(', ', array_map('idf_escape', $index['columns'])) . ");";
|
||||
}
|
||||
}
|
||||
|
||||
// coments for table & fields
|
||||
if ($status['Comment']) {
|
||||
$return .= "\n\nCOMMENT ON TABLE " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " IS " . q($status['Comment']) . ";";
|
||||
}
|
||||
|
||||
foreach ($fields as $field_name => $field) {
|
||||
if ($field['comment']) {
|
||||
$return .= "\n\nCOMMENT ON COLUMN " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . "." . idf_escape($field_name) . " IS " . q($field['comment']) . ";";
|
||||
}
|
||||
}
|
||||
|
||||
// triggers
|
||||
foreach ($triggers as $trg_id => $trg) {
|
||||
$trigger = trigger($trg_id, $status['Name']);
|
||||
$return .= "\n\nCREATE TRIGGER " . idf_escape($trigger['Trigger']) . " $trigger[Timing] $trigger[Events] ON " . idf_escape($status["nspname"]) . "." . idf_escape($status['Name']) . " $trigger[Type] $trigger[Statement];";
|
||||
}
|
||||
|
||||
return rtrim($return, ';');
|
||||
}
|
||||
|
||||
/** Get SQL commands to create triggers
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
//@TODO
|
||||
function trigger_sql($table, $style) {
|
||||
$return = "";
|
||||
//foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_\\")), null, "-- ") as $row) {
|
||||
// $return .= "\n" . ($style == 'CREATE+ALTER' ? "DROP TRIGGER IF EXISTS " . idf_escape($row["Trigger"]) . ";;\n" : "")
|
||||
// . "CREATE TRIGGER " . idf_escape($row["Trigger"]) . " $row[Timing] $row[Event] ON " . table($row["Table"]) . " FOR EACH ROW\n$row[Statement];;\n";
|
||||
//}
|
||||
//return $return;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
function use_sql($database) {
|
||||
return "\connect " . idf_escape($database);
|
||||
}
|
||||
@@ -631,11 +747,15 @@ AND typelem = 0"
|
||||
|
||||
function support($feature) {
|
||||
global $connection;
|
||||
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|
|
||||
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|dump)$~', $feature); //! routine|
|
||||
}
|
||||
|
||||
function kill_process($val) {
|
||||
return queries("SELECT pg_terminate_backend(" . number($val).")");
|
||||
return queries("SELECT pg_terminate_backend(" . number($val) . ")");
|
||||
}
|
||||
|
||||
function connection_id(){
|
||||
return "SELECT pg_backend_pid()";
|
||||
}
|
||||
|
||||
function max_connections() {
|
||||
|
@@ -169,8 +169,8 @@ $prefixes = array();
|
||||
if (DB != "") {
|
||||
$checked = ($TABLE != "" ? "" : " checked");
|
||||
echo "<thead><tr>";
|
||||
echo "<th style='text-align: left;'><label class='block'><input type='checkbox' id='check-tables'$checked onclick='formCheck(this, /^tables\\[/);'>" . lang('Tables') . "</label>";
|
||||
echo "<th style='text-align: right;'><label class='block'>" . lang('Data') . "<input type='checkbox' id='check-data'$checked onclick='formCheck(this, /^data\\[/);'></label>";
|
||||
echo "<th style='text-align: left;'><label class='block'><input type='checkbox' id='check-tables'$checked>" . lang('Tables') . "</label>" . script("qs('#check-tables').onclick = partial(formCheck, /^tables\\[/);", "");
|
||||
echo "<th style='text-align: right;'><label class='block'>" . lang('Data') . "<input type='checkbox' id='check-data'$checked></label>" . script("qs('#check-data').onclick = partial(formCheck, /^data\\[/);", "");
|
||||
echo "</thead>\n";
|
||||
|
||||
$views = "";
|
||||
@@ -178,22 +178,25 @@ if (DB != "") {
|
||||
foreach ($tables_list as $name => $type) {
|
||||
$prefix = preg_replace('~_.*~', '', $name);
|
||||
$checked = ($TABLE == "" || $TABLE == (substr($TABLE, -1) == "%" ? "$prefix%" : $name)); //! % may be part of table name
|
||||
$print = "<tr><td>" . checkbox("tables[]", $name, $checked, $name, "checkboxClick(event, this); formUncheck('check-tables');", "block");
|
||||
$print = "<tr><td>" . checkbox("tables[]", $name, $checked, $name, "checkboxClick.call(this, event); formUncheck('check-tables');", "block");
|
||||
if ($type !== null && !preg_match('~table~i', $type)) {
|
||||
$views .= "$print\n";
|
||||
} else {
|
||||
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";
|
||||
echo "$print<td align='right'><label class='block'><span id='Rows-" . h($name) . "'></span>" . checkbox("data[]", $name, $checked, "", "checkboxClick.call(this, event); formUncheck('check-data');") . "</label>\n";
|
||||
}
|
||||
$prefixes[$prefix]++;
|
||||
}
|
||||
echo $views;
|
||||
|
||||
if ($tables_list) {
|
||||
echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=db');</script>\n";
|
||||
echo script("ajaxSetHtml('" . js_escape(ME) . "script=db');");
|
||||
}
|
||||
|
||||
} else {
|
||||
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";
|
||||
echo "<thead><tr><th style='text-align: left;'>";
|
||||
echo "<label class='block'><input type='checkbox' id='check-databases'" . ($TABLE == "" ? " checked" : "") . ">" . lang('Database') . "</label>";
|
||||
echo script("qs('#check-databases').onclick = partial(formCheck, /^databases\\[/);", "");
|
||||
echo "</thead>\n";
|
||||
$databases = $adminer->databases();
|
||||
if ($databases) {
|
||||
foreach ($databases as $db) {
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
$TABLE = $_GET["edit"];
|
||||
$fields = fields($TABLE);
|
||||
$where = (isset($_GET["select"]) ? (count($_POST["check"]) == 1 ? where_check($_POST["check"][0], $fields) : "") : where($_GET, $fields));
|
||||
$where = (isset($_GET["select"]) ? ($_POST["check"] && count($_POST["check"]) == 1 ? where_check($_POST["check"][0], $fields) : "") : where($_GET, $fields));
|
||||
$update = (isset($_GET["select"]) ? $_POST["edit"] : $where);
|
||||
foreach ($fields as $name => $field) {
|
||||
if (!isset($field["privileges"][$update ? "update" : "insert"]) || $adminer->fieldName($field) == "") {
|
||||
|
@@ -47,6 +47,6 @@ if (!$row && $EVENT != "") {
|
||||
<p><?php textarea("EVENT_DEFINITION", $row["EVENT_DEFINITION"]); ?>
|
||||
<p>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php if ($EVENT != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<?php if ($EVENT != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(); ?><?php } ?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
|
@@ -6,6 +6,7 @@ if ($_SERVER["HTTP_IF_MODIFIED_SINCE"]) {
|
||||
|
||||
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 365*24*60*60) . " GMT");
|
||||
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
|
||||
header("Cache-Control: immutable");
|
||||
|
||||
if ($_GET["file"] == "favicon.ico") {
|
||||
header("Content-Type: image/x-icon");
|
||||
@@ -18,7 +19,7 @@ if ($_GET["file"] == "favicon.ico") {
|
||||
echo lzw_decompress(compile_file('../adminer/static/functions.js;static/editing.js', 'minify_js'));
|
||||
} elseif ($_GET["file"] == "jush.js") {
|
||||
header("Content-Type: text/javascript; charset=utf-8");
|
||||
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'));
|
||||
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-js.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'));
|
||||
} else {
|
||||
header("Content-Type: image/gif");
|
||||
switch ($_GET["file"]) {
|
||||
|
@@ -7,13 +7,15 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["change"] && !$_POST["change-
|
||||
$message = ($_POST["drop"] ? lang('Foreign key has been dropped.') : ($name != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.')));
|
||||
$location = ME . "table=" . urlencode($TABLE);
|
||||
|
||||
$row["source"] = array_filter($row["source"], 'strlen');
|
||||
ksort($row["source"]); // enforce input order
|
||||
$target = array();
|
||||
foreach ($row["source"] as $key => $val) {
|
||||
$target[$key] = $row["target"][$key];
|
||||
if (!$_POST["drop"]) {
|
||||
$row["source"] = array_filter($row["source"], 'strlen');
|
||||
ksort($row["source"]); // enforce input order
|
||||
$target = array();
|
||||
foreach ($row["source"] as $key => $val) {
|
||||
$target[$key] = $row["target"][$key];
|
||||
}
|
||||
$row["target"] = $target;
|
||||
}
|
||||
$row["target"] = $target;
|
||||
|
||||
if ($jush == "sqlite") {
|
||||
queries_redirect($location, $message, recreate_table($TABLE, $TABLE, array(), array(), array(" $name" => ($_POST["drop"] ? "" : " " . format_foreign_key($row)))));
|
||||
@@ -60,13 +62,13 @@ $referencable = array_keys(array_filter(table_status('', true), 'fk_support'));
|
||||
<input type="hidden" name="change-js" value="">
|
||||
<noscript><p><input type="submit" name="change" value="<?php echo lang('Change'); ?>"></noscript>
|
||||
<table cellspacing="0">
|
||||
<thead><tr><th><?php echo lang('Source'); ?><th><?php echo lang('Target'); ?></thead>
|
||||
<thead><tr><th id="label-source"><?php echo lang('Source'); ?><th id="label-target"><?php echo lang('Target'); ?></thead>
|
||||
<?php
|
||||
$j = 0;
|
||||
foreach ($row["source"] as $key => $val) {
|
||||
echo "<tr>";
|
||||
echo "<td>" . html_select("source[" . (+$key) . "]", array(-1 => "") + $source, $val, ($j == count($row["source"]) - 1 ? "foreignAddRow(this);" : 1));
|
||||
echo "<td>" . html_select("target[" . (+$key) . "]", $target, $row["target"][$key]);
|
||||
echo "<td>" . html_select("source[" . (+$key) . "]", array(-1 => "") + $source, $val, ($j == count($row["source"]) - 1 ? "foreignAddRow.call(this);" : 1), "label-source");
|
||||
echo "<td>" . html_select("target[" . (+$key) . "]", $target, $row["target"][$key], 1, "label-target");
|
||||
$j++;
|
||||
}
|
||||
?>
|
||||
@@ -84,6 +86,6 @@ foreach ($row["source"] as $key => $val) {
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<noscript><p><input type="submit" name="add" value="<?php echo lang('Add column'); ?>"></noscript>
|
||||
<?php } ?>
|
||||
<?php if ($name != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<?php if ($name != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(); ?><?php } ?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
|
@@ -65,10 +65,16 @@ class Adminer {
|
||||
}
|
||||
|
||||
/** Headers to send before HTML output
|
||||
* @return bool true to send security headers
|
||||
* @return null
|
||||
*/
|
||||
function headers() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Get Content Security Policy headers
|
||||
* @return array of arrays with directive name in key, allowed sources in value
|
||||
*/
|
||||
function csp() {
|
||||
return csp();
|
||||
}
|
||||
|
||||
/** Print HTML code inside <head>
|
||||
@@ -88,16 +94,14 @@ class Adminer {
|
||||
global $drivers;
|
||||
?>
|
||||
<table cellspacing="0">
|
||||
<tr><th><?php echo lang('System'); ?><td><?php echo html_select("auth[driver]", $drivers, DRIVER); ?>
|
||||
<tr><th><?php echo lang('System'); ?><td><?php echo html_select("auth[driver]", $drivers, DRIVER) . "\n"; ?>
|
||||
<tr><th><?php echo lang('Server'); ?><td><input name="auth[server]" value="<?php echo h(SERVER); ?>" title="hostname[:port]" placeholder="localhost" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Username'); ?><td><input name="auth[username]" id="username" value="<?php echo h($_GET["username"]); ?>" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
|
||||
<tr><th><?php echo lang('Database'); ?><td><input name="auth[db]" value="<?php echo h($_GET["db"]); ?>" autocapitalize="off">
|
||||
</table>
|
||||
<script type="text/javascript">
|
||||
focus(document.getElementById('username'));
|
||||
</script>
|
||||
<?php
|
||||
echo script("focus(qs('#username'));");
|
||||
echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
|
||||
echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
|
||||
}
|
||||
@@ -110,7 +114,7 @@ focus(document.getElementById('username'));
|
||||
function login($login, $password) {
|
||||
global $jush;
|
||||
if ($jush == "sqlite") {
|
||||
return lang('Implement %s method to use SQLite.', 'login()');
|
||||
return lang('<a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to use SQLite.', '<code>login()</code>');
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -197,6 +201,15 @@ focus(document.getElementById('username'));
|
||||
;
|
||||
}
|
||||
|
||||
/** Query printed in SQL command before execution
|
||||
* @param string query to be executed
|
||||
* @return string escaped query to be printed
|
||||
*/
|
||||
function sqlCommandQuery($query)
|
||||
{
|
||||
return shorten_utf8(trim($query), 1000);
|
||||
}
|
||||
|
||||
/** Description of a row in a table
|
||||
* @param string
|
||||
* @return string SQL expression, empty string for no description
|
||||
@@ -232,7 +245,10 @@ focus(document.getElementById('username'));
|
||||
function selectVal($val, $link, $field, $original) {
|
||||
$return = ($val === null ? "<i>NULL</i>" : (preg_match("~char|binary~", $field["type"]) && !preg_match("~var~", $field["type"]) ? "<code>$val</code>" : $val));
|
||||
if (preg_match('~blob|bytea|raw|file~', $field["type"]) && !is_utf8($val)) {
|
||||
$return = lang('%d byte(s)', strlen($original));
|
||||
$return = "<i>" . lang('%d byte(s)', strlen($original)) . "</i>";
|
||||
}
|
||||
if (preg_match('~json~', $field["type"])) {
|
||||
$return = "<code class='jush-js'>$return</code>";
|
||||
}
|
||||
return ($link ? "<a href='" . h($link) . "'" . (is_url($link) ? " rel='noreferrer'" : "") . ">$return</a>" : $return);
|
||||
}
|
||||
@@ -246,6 +262,45 @@ focus(document.getElementById('username'));
|
||||
return $val;
|
||||
}
|
||||
|
||||
/** Print table structure in tabular format
|
||||
* @param array data about individual fields
|
||||
* @return null
|
||||
*/
|
||||
function tableStructurePrint($fields) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . (support("comment") ? "<td>" . lang('Comment') : "") . "</thead>\n";
|
||||
foreach ($fields as $field) {
|
||||
echo "<tr" . odd() . "><th>" . h($field["field"]);
|
||||
echo "<td><span title='" . h($field["collation"]) . "'>" . h($field["full_type"]) . "</span>";
|
||||
echo ($field["null"] ? " <i>NULL</i>" : "");
|
||||
echo ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : "");
|
||||
echo (isset($field["default"]) ? " <span title='" . lang('Default value') . "'>[<b>" . h($field["default"]) . "</b>]</span>" : "");
|
||||
echo (support("comment") ? "<td>" . nbsp($field["comment"]) : "");
|
||||
echo "\n";
|
||||
}
|
||||
echo "</table>\n";
|
||||
}
|
||||
|
||||
/** Print list of indexes on table in tabular format
|
||||
* @param array data about all indexes on a table
|
||||
* @return null
|
||||
*/
|
||||
function tableIndexesPrint($indexes) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
foreach ($indexes as $name => $index) {
|
||||
ksort($index["columns"]); // enforce correct columns order
|
||||
$print = array();
|
||||
foreach ($index["columns"] as $key => $val) {
|
||||
$print[] = "<i>" . h($val) . "</i>"
|
||||
. ($index["lengths"][$key] ? "(" . $index["lengths"][$key] . ")" : "")
|
||||
. ($index["descs"][$key] ? " DESC" : "")
|
||||
;
|
||||
}
|
||||
echo "<tr title='" . h($name) . "'><th>$index[type]<td>" . implode(", ", $print) . "\n";
|
||||
}
|
||||
echo "</table>\n";
|
||||
}
|
||||
|
||||
/** Print columns box in select
|
||||
* @param array result of selectColumnsProcess()[0]
|
||||
* @param array selectable columns
|
||||
@@ -258,9 +313,16 @@ focus(document.getElementById('username'));
|
||||
$select[""] = array();
|
||||
foreach ($select as $key => $val) {
|
||||
$val = $_GET["columns"][$key];
|
||||
$column = select_input(" name='columns[$i][col]' onchange='" . ($key !== "" ? "selectFieldChange(this.form)" : "selectAddRow(this)") . ";'", $columns, $val["col"]);
|
||||
echo "<div>" . ($functions || $grouping ? "<select name='columns[$i][fun]' onchange='helpClose();" . ($key !== "" ? "" : " this.nextSibling.nextSibling.onchange();") . "'"
|
||||
. 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>"
|
||||
$column = select_input(
|
||||
" name='columns[$i][col]'",
|
||||
$columns,
|
||||
$val["col"],
|
||||
($key !== "" ? "selectFieldChange" : "selectAddRow")
|
||||
);
|
||||
echo "<div>" . ($functions || $grouping ? "<select name='columns[$i][fun]'>"
|
||||
. optionlist(array(-1 => "") + array_filter(array(lang('Functions') => $functions, lang('Aggregation') => $grouping)), $val["fun"]) . "</select>"
|
||||
. on_help("getTarget(event).value && getTarget(event).value.replace(/ |\$/, '(') + ')'", 1)
|
||||
. script("qsl('select').onchange = function () { helpClose();" . ($key !== "" ? "" : " qsl('select, input', this.parentNode).onchange();") . " };", "")
|
||||
. "($column)" : $column) . "</div>\n";
|
||||
$i++;
|
||||
}
|
||||
@@ -278,20 +340,29 @@ focus(document.getElementById('username'));
|
||||
foreach ($indexes as $i => $index) {
|
||||
if ($index["type"] == "FULLTEXT") {
|
||||
echo "(<i>" . implode("</i>, <i>", array_map('h', $index["columns"])) . "</i>) AGAINST";
|
||||
echo " <input type='search' name='fulltext[$i]' value='" . h($_GET["fulltext"][$i]) . "' onchange='selectFieldChange(this.form);'>";
|
||||
echo " <input type='search' name='fulltext[$i]' value='" . h($_GET["fulltext"][$i]) . "'>";
|
||||
echo script("qsl('input').oninput = selectFieldChange;", "");
|
||||
echo checkbox("boolean[$i]", 1, isset($_GET["boolean"][$i]), "BOOL");
|
||||
echo "<br>\n";
|
||||
}
|
||||
}
|
||||
$_GET["where"] = (array) $_GET["where"];
|
||||
reset($_GET["where"]);
|
||||
$change_next = "this.nextSibling.onchange();";
|
||||
$change_next = "this.parentNode.firstChild.onchange();";
|
||||
for ($i = 0; $i <= count($_GET["where"]); $i++) {
|
||||
list(, $val) = each($_GET["where"]);
|
||||
if (!$val || ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators))) {
|
||||
echo "<div>" . select_input(" name='where[$i][col]' onchange='$change_next'", $columns, $val["col"], "(" . lang('anywhere') . ")");
|
||||
echo "<div>" . select_input(
|
||||
" name='where[$i][col]'",
|
||||
$columns,
|
||||
$val["col"],
|
||||
($val ? "selectFieldChange" : "selectAddRow"),
|
||||
"(" . lang('anywhere') . ")"
|
||||
);
|
||||
echo html_select("where[$i][op]", $this->operators, $val["op"], $change_next);
|
||||
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";
|
||||
echo "<input type='search' name='where[$i][val]' value='" . h($val["val"]) . "'>";
|
||||
echo script("mixin(qsl('input'), {oninput: function () { $change_next }, onkeydown: selectSearchKeydown, onsearch: selectSearchSearch});", "");
|
||||
echo "</div>\n";
|
||||
}
|
||||
}
|
||||
echo "</div></fieldset>\n";
|
||||
@@ -308,12 +379,12 @@ focus(document.getElementById('username'));
|
||||
$i = 0;
|
||||
foreach ((array) $_GET["order"] as $key => $val) {
|
||||
if ($val != "") {
|
||||
echo "<div>" . select_input(" name='order[$i]' onchange='selectFieldChange(this.form);'", $columns, $val);
|
||||
echo "<div>" . select_input(" name='order[$i]'", $columns, $val, "selectFieldChange");
|
||||
echo checkbox("desc[$i]", 1, isset($_GET["desc"][$key]), lang('descending')) . "</div>\n";
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
echo "<div>" . select_input(" name='order[$i]' onchange='selectAddRow(this);'", $columns);
|
||||
echo "<div>" . select_input(" name='order[$i]'", $columns, "", "selectAddRow");
|
||||
echo checkbox("desc[$i]", 1, false, lang('descending')) . "</div>\n";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
@@ -324,7 +395,8 @@ focus(document.getElementById('username'));
|
||||
*/
|
||||
function selectLimitPrint($limit) {
|
||||
echo "<fieldset><legend>" . lang('Limit') . "</legend><div>"; // <div> for easy styling
|
||||
echo "<input type='number' name='limit' class='size' value='" . h($limit) . "' onchange='selectFieldChange(this.form);'>";
|
||||
echo "<input type='number' name='limit' class='size' value='" . h($limit) . "'>";
|
||||
echo script("qsl('input').oninput = selectFieldChange;", "");
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
|
||||
@@ -348,12 +420,13 @@ focus(document.getElementById('username'));
|
||||
echo "<fieldset><legend>" . lang('Action') . "</legend><div>";
|
||||
echo "<input type='submit' value='" . lang('Select') . "'>";
|
||||
echo " <span id='noindex' title='" . lang('Full table scan') . "'></span>";
|
||||
echo "<script type='text/javascript'>\n";
|
||||
echo "<script" . nonce() . ">\n";
|
||||
echo "var indexColumns = ";
|
||||
$columns = array();
|
||||
foreach ($indexes as $index) {
|
||||
if ($index["type"] != "FULLTEXT") {
|
||||
$columns[reset($index["columns"])] = 1;
|
||||
$current_key = reset($index["columns"]);
|
||||
if ($index["type"] != "FULLTEXT" && $current_key) {
|
||||
$columns[$current_key] = 1;
|
||||
}
|
||||
}
|
||||
$columns[""] = 1;
|
||||
@@ -361,7 +434,7 @@ focus(document.getElementById('username'));
|
||||
json_row($key);
|
||||
}
|
||||
echo ";\n";
|
||||
echo "selectFieldChange(document.getElementById('form'));\n";
|
||||
echo "selectFieldChange.call(qs('#form')['select']);\n";
|
||||
echo "</script>\n";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
@@ -519,12 +592,16 @@ focus(document.getElementById('username'));
|
||||
global $jush;
|
||||
restart_session();
|
||||
$history = &get_session("queries");
|
||||
if (!$history[$_GET["db"]]) {
|
||||
$history[$_GET["db"]] = array();
|
||||
}
|
||||
$id = "sql-" . count($history[$_GET["db"]]);
|
||||
if (strlen($query) > 1e6) {
|
||||
$query = preg_replace('~[\x80-\xFF]+$~', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
|
||||
}
|
||||
$history[$_GET["db"]][] = array($query, time(), $time); // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"]
|
||||
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
|
||||
return " <span class='time'>" . @date("H:i:s") . "</span>" // @ - time zone may be not set
|
||||
. " <a href='#$id' class='toggle'>" . lang('SQL command') . "</a>"
|
||||
. "<div id='$id' class='hidden'><pre><code class='jush-$jush'>" . shorten_utf8($query, 1000) . '</code></pre>'
|
||||
. ($time ? " <span class='time'>($time)</span>" : '')
|
||||
. (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>' : '')
|
||||
@@ -574,6 +651,16 @@ focus(document.getElementById('username'));
|
||||
return "";
|
||||
}
|
||||
|
||||
/** Get hint for edit field
|
||||
* @param string table name
|
||||
* @param array single field from fields()
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function editHint($table, $field, $value) {
|
||||
return "";
|
||||
}
|
||||
|
||||
/** Process sent input
|
||||
* @param array single field from fields()
|
||||
* @param string
|
||||
@@ -593,7 +680,7 @@ focus(document.getElementById('username'));
|
||||
} elseif (preg_match('~^([+-]|\\|\\|)$~', $function)) {
|
||||
$return = idf_escape($name) . " $function $return";
|
||||
} elseif (preg_match('~^[+-] interval$~', $function)) {
|
||||
$return = idf_escape($name) . " $function " . (preg_match("~^(\\d+|'[0-9.: -]') [A-Z_]+$~i", $value) ? $value : $return);
|
||||
$return = idf_escape($name) . " $function " . (preg_match("~^(\\d+|'[0-9.: -]') [A-Z_]+\$~i", $value) ? $value : $return);
|
||||
} elseif (preg_match('~^(addtime|subtime|concat)$~', $function)) {
|
||||
$return = "$function(" . idf_escape($name) . ", $return)";
|
||||
} elseif (preg_match('~^(md5|sha1|password|encrypt)$~', $function)) {
|
||||
@@ -790,7 +877,7 @@ focus(document.getElementById('username'));
|
||||
foreach ($usernames as $username => $password) {
|
||||
if ($password !== null) {
|
||||
if ($first) {
|
||||
echo "<p id='logins' onmouseover='menuOver(this, event);' onmouseout='menuOut(this);'>\n";
|
||||
echo "<p id='logins'>" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
$first = false;
|
||||
}
|
||||
$dbs = $_SESSION["db"][$vendor][$server][$username];
|
||||
@@ -806,13 +893,14 @@ focus(document.getElementById('username'));
|
||||
$connection->select_db(DB);
|
||||
$tables = table_status('', true);
|
||||
}
|
||||
echo script_src("../externals/jush/modules/jush.js");
|
||||
echo script_src("../externals/jush/modules/jush-textarea.js");
|
||||
echo script_src("../externals/jush/modules/jush-txt.js");
|
||||
echo script_src("../externals/jush/modules/jush-js.js");
|
||||
if (support("sql")) {
|
||||
echo script_src("../externals/jush/modules/jush-$jush.js");
|
||||
?>
|
||||
<script type="text/javascript" src="../externals/jush/modules/jush.js"></script>
|
||||
<script type="text/javascript" src="../externals/jush/modules/jush-textarea.js"></script>
|
||||
<script type="text/javascript" src="../externals/jush/modules/jush-txt.js"></script>
|
||||
<script type="text/javascript" src="../externals/jush/modules/jush-<?php echo $jush; ?>.js"></script>
|
||||
<script type="text/javascript">
|
||||
<script<?php echo nonce(); ?>>
|
||||
<?php
|
||||
if ($tables) {
|
||||
$links = array();
|
||||
@@ -859,15 +947,15 @@ bodyLoad('<?php echo (is_object($connection) ? substr($connection->server_info,
|
||||
<p id="dbs">
|
||||
<?php
|
||||
hidden_fields_get();
|
||||
$db_events = " onmousedown='dbMouseDown(event, this);' onchange='dbChange(this);'";
|
||||
$db_events = script("mixin(qsl('select'), {onmousedown: dbMouseDown, onchange: dbChange});", "");
|
||||
echo "<span title='" . lang('database') . "'>DB</span>: " . ($databases
|
||||
? "<select name='db'$db_events>" . optionlist(array("" => "") + $databases, DB) . "</select>"
|
||||
? "<select name='db'>" . optionlist(array("" => "") + $databases, DB) . "</select>$db_events"
|
||||
: '<input name="db" value="' . h(DB) . '" autocapitalize="off">'
|
||||
);
|
||||
echo "<input type='submit' value='" . lang('Use') . "'" . ($databases ? " class='hidden'" : "") . ">\n";
|
||||
if ($missing != "db" && DB != "" && $connection->select_db(DB)) {
|
||||
if (support("scheme")) {
|
||||
echo "<br>" . lang('Schema') . ": <select name='ns'$db_events>" . optionlist(array("" => "") + $adminer->schemas(), $_GET["ns"]) . "</select>";
|
||||
echo "<br>" . lang('Schema') . ": <select name='ns'>" . optionlist(array("" => "") + $adminer->schemas(), $_GET["ns"]) . "</select>$db_events";
|
||||
if ($_GET["ns"] != "") {
|
||||
set_schema($_GET["ns"]);
|
||||
}
|
||||
@@ -886,17 +974,18 @@ bodyLoad('<?php echo (is_object($connection) ? substr($connection->server_info,
|
||||
* @return null
|
||||
*/
|
||||
function tablesPrint($tables) {
|
||||
echo "<p id='tables' onmouseover='menuOver(this, event);' onmouseout='menuOut(this);'>\n";
|
||||
echo "<ul id='tables'>" . script("mixin(qs('#tables'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
foreach ($tables as $table => $status) {
|
||||
echo '<a href="' . h(ME) . 'select=' . urlencode($table) . '"' . bold($_GET["select"] == $table || $_GET["edit"] == $table, "select") . ">" . lang('select') . "</a> ";
|
||||
echo '<li><a href="' . h(ME) . 'select=' . urlencode($table) . '"' . bold($_GET["select"] == $table || $_GET["edit"] == $table, "select") . ">" . lang('select') . "</a> ";
|
||||
$name = $this->tableName($status);
|
||||
echo (support("table") || support("indexes")
|
||||
? '<a href="' . h(ME) . 'table=' . urlencode($table) . '"'
|
||||
. bold(in_array($table, array($_GET["table"], $_GET["create"], $_GET["indexes"], $_GET["foreign"], $_GET["trigger"])), (is_view($status) ? "view" : ""), "structure")
|
||||
. bold(in_array($table, array($_GET["table"], $_GET["create"], $_GET["indexes"], $_GET["foreign"], $_GET["trigger"])), (is_view($status) ? "view" : "structure"))
|
||||
. " title='" . lang('Show structure') . "'>$name</a>"
|
||||
: "<span>$name</span>"
|
||||
) . "<br>\n";
|
||||
) . "\n";
|
||||
}
|
||||
echo "</ul>\n";
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -48,14 +48,18 @@ function add_invalid_login() {
|
||||
fclose($fp);
|
||||
}
|
||||
|
||||
$auth = $_POST["auth"];
|
||||
if ($auth) {
|
||||
function check_invalid_login() {
|
||||
global $adminer;
|
||||
$invalids = unserialize(@file_get_contents(get_temp_dir() . "/adminer.invalid")); // @ - may not exist
|
||||
$invalid = $invalids[$adminer->bruteForceKey()];
|
||||
$next_attempt = ($invalid[1] > 30 ? $invalid[0] - time() : 0); // allow 30 invalid attempts
|
||||
if ($next_attempt > 0) { //! do the same with permanent login
|
||||
auth_error(lang('Too many unsuccessful logins, try again in %d minute(s).', ceil($next_attempt / 60)));
|
||||
}
|
||||
}
|
||||
|
||||
$auth = $_POST["auth"];
|
||||
if ($auth) {
|
||||
session_regenerate_id(); // defense against session fixation
|
||||
$vendor = $auth["driver"];
|
||||
$server = $auth["server"];
|
||||
@@ -89,7 +93,7 @@ if ($auth) {
|
||||
set_session($key, null);
|
||||
}
|
||||
unset_permanent();
|
||||
redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.'));
|
||||
redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.') . ' ' . lang('Thanks for using Adminer, consider <a href="%s">donating</a>.', 'https://sourceforge.net/donate/index.php?group_id=264133'));
|
||||
}
|
||||
|
||||
} elseif ($permanent && !$_SESSION["pwds"]) {
|
||||
@@ -120,7 +124,6 @@ function unset_permanent() {
|
||||
*/
|
||||
function auth_error($error) {
|
||||
global $adminer, $has_token;
|
||||
$error = h($error);
|
||||
$session_name = session_name();
|
||||
if (isset($_GET["username"])) {
|
||||
header("HTTP/1.1 403 Forbidden"); // 401 requires sending WWW-Authenticate header
|
||||
@@ -162,13 +165,18 @@ if (isset($_GET["username"])) {
|
||||
page_footer("auth");
|
||||
exit;
|
||||
}
|
||||
list($host, $port) = explode(":", SERVER, 2);
|
||||
if (is_numeric($port) && $port < 1024) {
|
||||
auth_error('Connecting to privileged ports is not allowed.');
|
||||
}
|
||||
check_invalid_login();
|
||||
$connection = connect();
|
||||
}
|
||||
|
||||
$driver = new Min_Driver($connection);
|
||||
|
||||
if (!is_object($connection) || ($login = $adminer->login($_GET["username"], get_password())) !== true) {
|
||||
auth_error((is_string($connection) ? $connection : (is_string($login) ? $login : lang('Invalid credentials.'))));
|
||||
auth_error((is_string($connection) ? h($connection) : (is_string($login) ? $login : lang('Invalid credentials.'))));
|
||||
}
|
||||
|
||||
if ($auth && $_POST["token"]) {
|
||||
|
@@ -36,8 +36,8 @@ if (!strpos($_SERVER["REQUEST_URI"], '?') && $_SERVER["QUERY_STRING"] != "") { /
|
||||
$HTTPS = $_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off");
|
||||
|
||||
@ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled
|
||||
session_cache_limiter(""); // to allow restarting session and to not send Cache-Control: no-store
|
||||
if (!defined("SID")) {
|
||||
session_cache_limiter(""); // to allow restarting session
|
||||
session_name("adminer_sid"); // use specific session name to get own namespace
|
||||
$params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $HTTPS);
|
||||
if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
|
||||
|
@@ -12,7 +12,7 @@ function connect_error() {
|
||||
page_header(lang('Select database'), $error, false);
|
||||
echo "<p class='links'>\n";
|
||||
foreach (array(
|
||||
'database' => lang('Create new database'),
|
||||
'database' => lang('Create database'),
|
||||
'privileges' => lang('Privileges'),
|
||||
'processlist' => lang('Process list'),
|
||||
'variables' => lang('Variables'),
|
||||
@@ -29,13 +29,14 @@ function connect_error() {
|
||||
$scheme = support("scheme");
|
||||
$collations = collations();
|
||||
echo "<form action='' method='post'>\n";
|
||||
echo "<table cellspacing='0' class='checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
|
||||
echo "<table cellspacing='0' class='checkable'>\n";
|
||||
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
|
||||
echo "<thead><tr>"
|
||||
. (support("database") ? "<td> " : "")
|
||||
. "<th>" . lang('Database') . " - <a href='" . h(ME) . "refresh=1'>" . lang('Refresh') . "</a>"
|
||||
. "<td>" . lang('Collation')
|
||||
. "<td>" . lang('Tables')
|
||||
. "<td>" . lang('Size') . " - <a href='" . h(ME) . "dbsize=1' onclick=\"return !ajaxSetHtml('" . h(js_escape(ME)) . "script=connect');\">" . lang('Compute') . "</a>"
|
||||
. "<td>" . lang('Size') . " - <a href='" . h(ME) . "dbsize=1'>" . lang('Compute') . "</a>" . script("qsl('a').onclick = partial(ajaxSetHtml, '" . js_escape(ME) . "script=connect');", "")
|
||||
. "</thead>\n"
|
||||
;
|
||||
|
||||
@@ -43,8 +44,9 @@ function connect_error() {
|
||||
|
||||
foreach ($databases as $db => $tables) {
|
||||
$root = h(ME) . "db=" . urlencode($db);
|
||||
echo "<tr" . odd() . ">" . (support("database") ? "<td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"])) : "");
|
||||
echo "<th><a href='$root'>" . h($db) . "</a>";
|
||||
$id = h("Db-" . $db);
|
||||
echo "<tr" . odd() . ">" . (support("database") ? "<td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"]), "", "", "", $id) : "");
|
||||
echo "<th><a href='$root' id='$db'>" . h($db) . "</a>";
|
||||
$collation = nbsp(db_collation($db, $collations));
|
||||
echo "<td>" . (support("database") ? "<a href='$root" . ($scheme ? "&ns=" : "") . "&database=' title='" . lang('Alter database') . "'>$collation</a>" : $collation);
|
||||
echo "<td align='right'><a href='$root&schema=' id='tables-" . h($db) . "' title='" . lang('Database schema') . "'>" . ($_GET["dbsize"] ? $tables : "?") . "</a>";
|
||||
@@ -55,12 +57,12 @@ function connect_error() {
|
||||
echo "</table>\n";
|
||||
echo (support("database")
|
||||
? "<fieldset><legend>" . lang('Selected') . " <span id='selected'></span></legend><div>\n"
|
||||
. "<input type='hidden' name='all' value='' onclick=\"selectCount('selected', formChecked(this, /^db/));\">\n" // used by trCheck()
|
||||
. "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n"
|
||||
. "<input type='hidden' name='all' value=''>" . script("qsl('input').onclick = function () { selectCount('selected', formChecked(this, /^db/)); };") // used by trCheck()
|
||||
. "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . confirm() . "\n"
|
||||
. "</div></fieldset>\n"
|
||||
: ""
|
||||
);
|
||||
echo "<script type='text/javascript'>tableCheck();</script>\n";
|
||||
echo script("tableCheck();");
|
||||
echo "<input type='hidden' name='token' value='$token'>\n";
|
||||
echo "</form>\n";
|
||||
}
|
||||
|
@@ -19,13 +19,11 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
|
||||
<!DOCTYPE html>
|
||||
<html lang="<?php echo $LANG; ?>" dir="<?php echo lang('ltr'); ?>">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta http-equiv="Content-Script-Type" content="text/javascript">
|
||||
<meta name="robots" content="noindex">
|
||||
<meta name="referrer" content="origin-when-crossorigin">
|
||||
<title><?php echo $title_page; ?></title>
|
||||
<link rel="stylesheet" type="text/css" href="../adminer/static/default.css">
|
||||
<script type="text/javascript" src="../adminer/static/functions.js"></script>
|
||||
<script type="text/javascript" src="static/editing.js"></script>
|
||||
<?php echo script_src("../adminer/static/functions.js"); ?>
|
||||
<?php echo script_src("static/editing.js"); ?>
|
||||
<?php if ($adminer->head()) { ?>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="../adminer/static/favicon.ico">
|
||||
<link rel="apple-touch-icon" href="../adminer/static/favicon.ico">
|
||||
@@ -34,13 +32,15 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
|
||||
<?php } ?>
|
||||
<?php } ?>
|
||||
|
||||
<body class="<?php echo lang('ltr'); ?> nojs" onkeydown="bodyKeydown(event);" onclick="bodyClick(event);"<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " onload=\"verifyVersion('$VERSION');\""); ?>>
|
||||
<script type="text/javascript">
|
||||
<body class="<?php echo lang('ltr'); ?> nojs">
|
||||
<script<?php echo nonce(); ?>>
|
||||
mixin(document.body, {onkeydown: bodyKeydown, onclick: bodyClick<?php echo (isset($_COOKIE["adminer_version"]) ? "" : ", onload: partial(verifyVersion, '$VERSION')"); ?>});
|
||||
document.body.className = document.body.className.replace(/ nojs/, ' js');
|
||||
var offlineMessage = '<?php echo js_escape(lang('You are offline.')); ?>';
|
||||
</script>
|
||||
|
||||
<div id="help" class="jush-<?php echo $jush; ?> jsonly hidden" onmouseover="helpOpen = 1;" onmouseout="helpMouseout(this, event);"></div>
|
||||
<div id="help" class="jush-<?php echo $jush; ?> jsonly hidden"></div>
|
||||
<?php echo script("mixin(qs('#help'), {onmouseover: function () { helpOpen = 1; }, onmouseout: helpMouseout});"); ?>
|
||||
|
||||
<div id="content">
|
||||
<?php
|
||||
@@ -89,10 +89,46 @@ function page_headers() {
|
||||
global $adminer;
|
||||
header("Content-Type: text/html; charset=utf-8");
|
||||
header("Cache-Control: no-cache");
|
||||
if ($adminer->headers()) {
|
||||
header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, Firefox 3.6.9
|
||||
header("X-XSS-Protection: 0"); // prevents introducing XSS in IE8 by removing safe parts of the page
|
||||
header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, Firefox 3.6.9
|
||||
header("X-XSS-Protection: 0"); // prevents introducing XSS in IE8 by removing safe parts of the page
|
||||
header("X-Content-Type-Options: nosniff");
|
||||
header("Referrer-Policy: origin-when-cross-origin");
|
||||
foreach ($adminer->csp() as $csp) {
|
||||
$header = array();
|
||||
foreach ($csp as $key => $val) {
|
||||
$header[] = "$key $val";
|
||||
}
|
||||
header("Content-Security-Policy: " . implode("; ", $header));
|
||||
}
|
||||
$adminer->headers();
|
||||
}
|
||||
|
||||
/** Get Content Security Policy headers
|
||||
* @return array of arrays with directive name in key, allowed sources in value
|
||||
*/
|
||||
function csp() {
|
||||
return array(
|
||||
array(
|
||||
"default-src" => "'none'",
|
||||
"script-src" => "'self' 'unsafe-inline' 'nonce-" . get_nonce() . "' 'strict-dynamic'", // 'self' is a fallback for browsers not supporting 'strict-dynamic', 'unsafe-inline' is a fallback for browsers not supporting 'nonce-'
|
||||
"style-src" => "'self' 'unsafe-inline'",
|
||||
"connect-src" => "'self'",
|
||||
"img-src" => "'self' data:",
|
||||
"frame-src" => "https://www.adminer.org",
|
||||
"form-action" => "'self'",
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/** Get a CSP nonce
|
||||
* @return string Base64 value
|
||||
*/
|
||||
function get_nonce() {
|
||||
static $nonce;
|
||||
if (!$nonce) {
|
||||
$nonce = base64_encode(rand_string());
|
||||
}
|
||||
return $nonce;
|
||||
}
|
||||
|
||||
/** Print flash and error messages
|
||||
@@ -103,7 +139,7 @@ function page_messages($error) {
|
||||
$uri = preg_replace('~^[^?]*~', '', $_SERVER["REQUEST_URI"]);
|
||||
$messages = $_SESSION["messages"][$uri];
|
||||
if ($messages) {
|
||||
echo "<div class='message'>" . implode("</div>\n<div class='message'>", $messages) . "</div>\n";
|
||||
echo "<div class='message'>" . implode("</div>\n<div class='message'>", $messages) . "</div>" . script("messagesPrint();");
|
||||
unset($_SESSION["messages"][$uri]);
|
||||
}
|
||||
if ($error) {
|
||||
@@ -132,6 +168,6 @@ function page_footer($missing = "") {
|
||||
<div id="menu">
|
||||
<?php $adminer->navigation($missing); ?>
|
||||
</div>
|
||||
<script type="text/javascript">setupSubmitHighlight(document);</script>
|
||||
<?php
|
||||
echo script("setupSubmitHighlight(document);");
|
||||
}
|
||||
|
@@ -27,7 +27,7 @@
|
||||
$query = $adminer->selectQueryBuild($select, $where, $group, $order, $limit, $page);
|
||||
if (!$query) {
|
||||
$query = "SELECT" . limit(
|
||||
($_GET["page"] != "last" && +$limit && $group && $is_group && $jush == "sql" ? "SQL_CALC_FOUND_ROWS " : "") . implode(", ", $select) . "\nFROM " . table($table),
|
||||
($_GET["page"] != "last" && $limit != "" && $group && $is_group && $jush == "sql" ? "SQL_CALC_FOUND_ROWS " : "") . implode(", ", $select) . "\nFROM " . table($table),
|
||||
($where ? "\nWHERE " . implode(" AND ", $where) : "") . ($group && $is_group ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : ""),
|
||||
($limit != "" ? +$limit : null),
|
||||
($page ? $limit * $page : 0),
|
||||
|
@@ -141,7 +141,7 @@ function edit_type($key, $field, $collations, $foreign_keys = array()) {
|
||||
global $structured_types, $types, $unsigned, $on_actions;
|
||||
$type = $field["type"];
|
||||
?>
|
||||
<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
|
||||
<td><select name="<?php echo h($key); ?>[type]" class="type" aria-labelledby="label-type"><?php
|
||||
if ($type && !isset($types[$type]) && !isset($foreign_keys[$type])) {
|
||||
array_unshift($structured_types, $type);
|
||||
}
|
||||
@@ -150,7 +150,9 @@ if ($foreign_keys) {
|
||||
}
|
||||
echo optionlist($structured_types, $type);
|
||||
?></select>
|
||||
<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
|
||||
<?php echo on_help("getTarget(event).value", 1); ?>
|
||||
<?php echo script("mixin(qsl('select'), {onfocus: function () { lastType = selectValue(this); }, onchange: editingTypeChange});", ""); ?>
|
||||
<td><input name="<?php echo h($key); ?>[length]" value="<?php echo h($field["length"]); ?>" size="3"<?php echo (!$field["length"] && preg_match('~var(char|binary)$~', $type) ? " class='required'" : ""); ?> aria-labelledby="label-length"><?php echo script("mixin(qsl('input'), {onfocus: editingLengthFocus, oninput: editingLengthChange});", ""); ?><td class="options"><?php //! type="number" with enabled JavaScript
|
||||
echo "<select name='" . h($key) . "[collation]'" . (preg_match('~(char|text|enum|set)$~', $type) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
|
||||
echo ($unsigned ? "<select name='" . h($key) . "[unsigned]'" . (!$type || preg_match('~((^|[^o])int|float|double|decimal)$~', $type) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
|
||||
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>' : '');
|
||||
@@ -238,25 +240,26 @@ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = arra
|
||||
?>
|
||||
<thead><tr class="wrap">
|
||||
<?php if ($type == "PROCEDURE") { ?><td> <?php } ?>
|
||||
<th><?php echo ($type == "TABLE" ? lang('Column name') : lang('Parameter name')); ?>
|
||||
<td><?php echo lang('Type'); ?><textarea id="enum-edit" rows="4" cols="12" wrap="off" style="display: none;" onblur="editingLengthBlur(this);"></textarea>
|
||||
<td><?php echo lang('Length'); ?>
|
||||
<td><?php echo lang('Options'); ?>
|
||||
<th id="label-name"><?php echo ($type == "TABLE" ? lang('Column name') : lang('Parameter name')); ?>
|
||||
<td id="label-type"><?php echo lang('Type'); ?><textarea id="enum-edit" rows="4" cols="12" wrap="off" style="display: none;"></textarea><?php echo script("qs('#enum-edit').onblur = editingLengthBlur;"); ?>
|
||||
<td id="label-length"><?php echo lang('Length'); ?>
|
||||
<td><?php echo lang('Options'); /* no label required, options have their own label */ ?>
|
||||
<?php if ($type == "TABLE") { ?>
|
||||
<td>NULL
|
||||
<td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">AI</acronym><?php echo doc_link(array(
|
||||
<td id="label-null">NULL
|
||||
<td><input type="radio" name="auto_increment_col" value=""><acronym id="label-ai" title="<?php echo lang('Auto Increment'); ?>">AI</acronym><?php echo doc_link(array(
|
||||
'sql' => "example-auto-increment.html",
|
||||
'sqlite' => "autoinc.html",
|
||||
'pgsql' => "datatype.html#DATATYPE-SERIAL",
|
||||
'mssql' => "ms186775.aspx",
|
||||
)); ?>
|
||||
<td><?php echo lang('Default value'); ?>
|
||||
<?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
|
||||
<td id="label-default"><?php echo lang('Default value'); ?>
|
||||
<?php echo (support("comment") ? "<td id='label-comment'" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
|
||||
<?php } ?>
|
||||
<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>
|
||||
<td><?php echo "<input type='image' class='icon' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>" . script("row_count = " . count($fields) . ";"); ?>
|
||||
</thead>
|
||||
<tbody onkeydown="return editingKeydown(event);">
|
||||
<tbody>
|
||||
<?php
|
||||
echo script("qsl('tbody').onkeydown = editingKeydown;");
|
||||
foreach ($fields as $i => $field) {
|
||||
$i++;
|
||||
$orig = $field[($_POST ? "orig" : "field")];
|
||||
@@ -264,24 +267,23 @@ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = arra
|
||||
?>
|
||||
<tr<?php echo ($display ? "" : " style='display: none;'"); ?>>
|
||||
<?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", explode("|", $inout), $field["inout"]) : ""); ?>
|
||||
<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 } ?>
|
||||
<th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" maxlength="64" autocapitalize="off" aria-labelledby="label-name"><?php echo script("qsl('input').oninput = function () { editingNameChange.call(this);" . ($field["field"] != "" || count($fields) > 1 ? "" : " editingAddRow.call(this);") . " };", ""); ?><?php } ?>
|
||||
<input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($orig); ?>">
|
||||
<?php edit_type("fields[$i]", $field, $collations, $foreign_keys); ?>
|
||||
<?php if ($type == "TABLE") { ?>
|
||||
<td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block"); ?>
|
||||
<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
|
||||
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;">
|
||||
<?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) . "'>" : ""); ?>
|
||||
<td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block", "label-null"); ?>
|
||||
<td><label class="block"><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> aria-labelledby="label-ai"><?php echo script("qsl('input').onclick = function () { var field = this.form['fields[' + this.value + '][field]']; if (!field.value) { field.value = 'id'; field.oninput(); } }"); ?></label><td><?php
|
||||
echo checkbox("fields[$i][has_default]", 1, $field["has_default"], "", "", "", "label-default"); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" aria-labelledby="label-default"><?php echo script("qsl('input').oninput = function () { this.previousSibling.checked = true; }", ""); ?>
|
||||
<?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) . "' aria-labelledby='label-comment'>" : ""); ?>
|
||||
<?php } ?>
|
||||
<?php
|
||||
echo "<td>";
|
||||
echo (support("move_col") ?
|
||||
"<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, 1);'> "
|
||||
. "<input type='image' class='icon' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "'> "
|
||||
. "<input type='image' class='icon' name='down[$i]' src='../adminer/static/down.gif' alt='v' title='" . lang('Move down') . "'> "
|
||||
"<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'> " . script("qsl('input').onclick = partial(editingAddRow, 1);", "")
|
||||
. "<input type='image' class='icon' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "'> " . script("qsl('input').onclick = partial(editingMoveRow, 1);", "")
|
||||
. "<input type='image' class='icon' name='down[$i]' src='../adminer/static/down.gif' alt='v' title='" . lang('Move down') . "'> " . script("qsl('input').onclick = partial(editingMoveRow, 0);", "")
|
||||
: "");
|
||||
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]');\">" : "");
|
||||
echo "\n";
|
||||
echo ($orig == "" || support("drop_col") ? "<input type='image' class='icon' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "'>" . script("qsl('input').onclick = partial(editingRemoveRow, 'fields\$1[field]');") : "");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -290,7 +292,6 @@ echo checkbox("fields[$i][has_default]", 1, $field["has_default"]); ?><input nam
|
||||
* @return bool
|
||||
*/
|
||||
function process_fields(&$fields) {
|
||||
ksort($fields);
|
||||
$offset = 0;
|
||||
if ($_POST["up"]) {
|
||||
$last = 0;
|
||||
@@ -432,9 +433,9 @@ function create_routine($routine, $row) {
|
||||
}
|
||||
|
||||
/** Remove current user definer from SQL command
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function remove_definer($query) {
|
||||
return preg_replace('~^([A-Z =]+) DEFINER=`' . preg_replace('~@(.*)~', '`@`(%|\\1)', logged_user()) . '`~', '\\1', $query); //! proper escaping of user
|
||||
}
|
||||
@@ -491,11 +492,11 @@ function ini_bytes($ini) {
|
||||
function doc_link($paths) {
|
||||
global $jush, $connection;
|
||||
$urls = array(
|
||||
'sql' => "http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/",
|
||||
'sqlite' => "http://www.sqlite.org/",
|
||||
'pgsql' => "http://www.postgresql.org/docs/" . substr($connection->server_info, 0, 3) . "/static/",
|
||||
'mssql' => "http://msdn.microsoft.com/library/",
|
||||
'oracle' => "http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/",
|
||||
'sql' => "https://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/",
|
||||
'sqlite' => "https://www.sqlite.org/",
|
||||
'pgsql' => "https://www.postgresql.org/docs/" . substr($connection->server_info, 0, 3) . "/static/",
|
||||
'mssql' => "https://msdn.microsoft.com/library/",
|
||||
'oracle' => "https://download.oracle.com/docs/cd/B19306_01/server.102/b14200/",
|
||||
);
|
||||
return ($paths[$jush] ? "<a href='$urls[$jush]$paths[$jush]' target='_blank' rel='noreferrer'><sup>?</sup></a>" : "");
|
||||
}
|
||||
|
@@ -69,7 +69,7 @@ function remove_slashes($process, $filter = false) {
|
||||
*/
|
||||
function bracket_escape($idf, $back = false) {
|
||||
// escape brackets inside name="x[]"
|
||||
static $trans = array(':' => ':1', ']' => ':2', '[' => ':3');
|
||||
static $trans = array(':' => ':1', ']' => ':2', '[' => ':3', '"' => ':4');
|
||||
return strtr($idf, ($back ? array_flip($trans) : $trans));
|
||||
}
|
||||
|
||||
@@ -81,6 +81,30 @@ function charset($connection) {
|
||||
return (version_compare($connection->server_info, "5.5.3") >= 0 ? "utf8mb4" : "utf8"); // SHOW CHARSET would require an extra query
|
||||
}
|
||||
|
||||
/** Return <script> element
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function script($source, $trailing = "\n") {
|
||||
return "<script" . nonce() . ">$source</script>$trailing";
|
||||
}
|
||||
|
||||
/** Return <script src> element
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function script_src($url) {
|
||||
return "<script src='" . h($url) . "'" . nonce() . "></script>\n";
|
||||
}
|
||||
|
||||
/** Get a nonce="" attribute with CSP nonce
|
||||
* @return string
|
||||
*/
|
||||
function nonce() {
|
||||
return ' nonce="' . get_nonce() . '"';
|
||||
}
|
||||
|
||||
/** Escape for HTML
|
||||
* @param string
|
||||
* @return string
|
||||
@@ -112,13 +136,15 @@ function nl_br($string) {
|
||||
* @param string
|
||||
* @param string
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function checkbox($name, $value, $checked, $label = "", $onclick = "", $class = "") {
|
||||
function checkbox($name, $value, $checked, $label = "", $onclick = "", $class = "", $labelled_by = "") {
|
||||
$return = "<input type='checkbox' name='$name' value='" . h($value) . "'"
|
||||
. ($checked ? " checked" : "")
|
||||
. ($onclick ? ' onclick="' . h($onclick) . '"' : '')
|
||||
. ($labelled_by ? " aria-labelledby='$labelled_by'" : "")
|
||||
. ">"
|
||||
. ($onclick ? script("qsl('input').onclick = function () { $onclick };", "") : "")
|
||||
;
|
||||
return ($label != "" || $class ? "<label" . ($class ? " class='$class'" : "") . ">$return" . h($label) . "</label>" : $return);
|
||||
}
|
||||
@@ -152,11 +178,16 @@ function optionlist($options, $selected = null, $use_keys = false) {
|
||||
* @param array
|
||||
* @param string
|
||||
* @param string true for no onchange, false for radio
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function html_select($name, $options, $value = "", $onchange = true) {
|
||||
function html_select($name, $options, $value = "", $onchange = true, $labelled_by = "") {
|
||||
if ($onchange) {
|
||||
return "<select name='" . h($name) . "'" . (is_string($onchange) ? ' onchange="' . h($onchange) . '"' : "") . ">" . optionlist($options, $value) . "</select>";
|
||||
return "<select name='" . h($name) . "'"
|
||||
. ($labelled_by ? " aria-labelledby='$labelled_by'" : "")
|
||||
. ">" . optionlist($options, $value) . "</select>"
|
||||
. (is_string($onchange) ? script("qsl('select').onchange = function () { $onchange };", "") : "")
|
||||
;
|
||||
}
|
||||
$return = "";
|
||||
foreach ($options as $key => $val) {
|
||||
@@ -166,35 +197,41 @@ function html_select($name, $options, $value = "", $onchange = true) {
|
||||
}
|
||||
|
||||
/** Generate HTML <select> or <input> if $options are empty
|
||||
* @param string
|
||||
* @param array
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function select_input($attrs, $options, $value = "", $placeholder = "") {
|
||||
return ($options
|
||||
? "<select$attrs><option value=''>$placeholder" . optionlist($options, $value, true) . "</select>"
|
||||
: "<input$attrs size='10' value='" . h($value) . "' placeholder='$placeholder'>"
|
||||
);
|
||||
* @param string
|
||||
* @param array
|
||||
* @param string
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function select_input($attrs, $options, $value = "", $onchange = "", $placeholder = "") {
|
||||
$tag = ($options ? "select" : "input");
|
||||
return "<$tag$attrs" . ($options
|
||||
? "><option value=''>$placeholder" . optionlist($options, $value, true) . "</select>"
|
||||
: " size='10' value='" . h($value) . "' placeholder='$placeholder'>"
|
||||
) . ($onchange ? script("qsl('$tag').onchange = $onchange;", "") : ""); //! use oninput for input
|
||||
}
|
||||
|
||||
/** Get onclick confirmation
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function confirm() {
|
||||
return " onclick=\"return confirm('" . lang('Are you sure?') . "');\"";
|
||||
function confirm($selector = "qsl('input')") {
|
||||
return script("$selector.onclick = function () { return confirm('" . lang('Are you sure?') . "'); };", "");
|
||||
}
|
||||
|
||||
/** Print header for hidden fieldset (close by </div></fieldset>)
|
||||
* @param string
|
||||
* @param string
|
||||
* @param bool
|
||||
* @param string
|
||||
* @return null
|
||||
*/
|
||||
function print_fieldset($id, $legend, $visible = false, $onclick = "") {
|
||||
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";
|
||||
function print_fieldset($id, $legend, $visible = false) {
|
||||
echo "<fieldset><legend>";
|
||||
echo "<a href='#fieldset-$id'>$legend</a>";
|
||||
echo script("qsl('a').onclick = partial(toggle, 'fieldset-$id');", "");
|
||||
echo "</legend>";
|
||||
echo "<div id='fieldset-$id'" . ($visible ? "" : " class='hidden'") . ">\n";
|
||||
}
|
||||
|
||||
/** Return class='active' if $bold is true
|
||||
@@ -237,7 +274,7 @@ function json_row($key, $val = null) {
|
||||
echo "{";
|
||||
}
|
||||
if ($key != "") {
|
||||
echo ($first ? "" : ",") . "\n\t\"" . addcslashes($key, "\r\n\"\\/") . '": ' . ($val !== null ? '"' . addcslashes($val, "\r\n\"\\/") . '"' : 'undefined');
|
||||
echo ($first ? "" : ",") . "\n\t\"" . addcslashes($key, "\r\n\t\"\\/") . '": ' . ($val !== null ? '"' . addcslashes($val, "\r\n\"\\/") . '"' : 'null');
|
||||
$first = false;
|
||||
} else {
|
||||
echo "\n}\n";
|
||||
@@ -406,10 +443,10 @@ function where($where, $fields = array()) {
|
||||
$key = bracket_escape($key, 1); // 1 - back
|
||||
$column = escape_key($key);
|
||||
$return[] = $column
|
||||
. (($jush == "sql" && preg_match('~^[0-9]*\\.[0-9]*$~', $val)) || $jush == "mssql"
|
||||
? " LIKE " . q(addcslashes($val, "%_\\"))
|
||||
. ($jush == "sql" && preg_match('~^[0-9]*\\.[0-9]*$~', $val) ? " LIKE " . q(addcslashes($val, "%_\\"))
|
||||
: ($jush == "mssql" ? " LIKE " . q(preg_replace('~[_%[]~', '[\0]', $val))
|
||||
: " = " . unconvert_field($fields[$key], q($val))
|
||||
) // LIKE because of floats but slow with ints, in MS SQL because of text
|
||||
)) // LIKE because of floats but slow with ints, in MS SQL because of text
|
||||
; //! enum and set
|
||||
if ($jush == "sql" && preg_match('~char|text~', $fields[$key]["type"]) && preg_match("~[^ -@]~", $val)) { // not just [a-z] to catch non-ASCII characters
|
||||
$return[] = "$column = " . q($val) . " COLLATE " . charset($connection) . "_bin";
|
||||
@@ -471,18 +508,12 @@ function convert_fields($columns, $fields, $select = array()) {
|
||||
*/
|
||||
function cookie($name, $value, $lifetime = 2592000) { // 2592000 - 30 days
|
||||
global $HTTPS;
|
||||
$params = array(
|
||||
$name,
|
||||
(preg_match("~\n~", $value) ? "" : $value), // HTTP Response Splitting protection in PHP < 5.1.2
|
||||
($lifetime ? time() + $lifetime : 0),
|
||||
preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]),
|
||||
"",
|
||||
$HTTPS
|
||||
);
|
||||
if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
|
||||
$params[] = true; // HttpOnly
|
||||
}
|
||||
return call_user_func_array('setcookie', $params);
|
||||
return header("Set-Cookie: $name=" . urlencode($value)
|
||||
. ($lifetime ? "; expires=" . gmdate("D, d M Y H:i:s", time() + $lifetime) . " GMT" : "")
|
||||
. "; path=" . preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"])
|
||||
. ($HTTPS ? "; secure" : "")
|
||||
. "; HttpOnly; SameSite=lax",
|
||||
false);
|
||||
}
|
||||
|
||||
/** Restart stopped session
|
||||
@@ -587,7 +618,7 @@ function query_redirect($query, $location, $message, $redirect = true, $execute
|
||||
$sql = $adminer->messageQuery($query, $time);
|
||||
}
|
||||
if ($failed) {
|
||||
$error = error() . $sql;
|
||||
$error = error() . $sql . script("messagesPrint();");
|
||||
return false;
|
||||
}
|
||||
if ($redirect) {
|
||||
@@ -744,7 +775,7 @@ function is_utf8($val) {
|
||||
* @return string escaped string with appended ...
|
||||
*/
|
||||
function shorten_utf8($string, $length = 80, $suffix = "") {
|
||||
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
|
||||
if (!preg_match("(^(" . repeat_pattern("[\t\r\n -\x{10FFFF}]", $length) . ")($)?)u", $string, $match)) { // ~s causes trash in $match[2] under some PHP versions, (.|\n) is slow
|
||||
preg_match("(^(" . repeat_pattern("[\t\r\n -~]", $length) . ")($)?)", $string, $match);
|
||||
}
|
||||
return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i>...</i>");
|
||||
@@ -867,32 +898,28 @@ function input($field, $value, $function) {
|
||||
if ($field["type"] == "enum") {
|
||||
echo nbsp($functions[""]) . "<td>" . $adminer->editInput($_GET["edit"], $field, $attrs, $value);
|
||||
} else {
|
||||
$first = 0;
|
||||
foreach ($functions as $key => $val) {
|
||||
if ($key === "" || !$val) {
|
||||
break;
|
||||
}
|
||||
$first++;
|
||||
}
|
||||
$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);'" : "");
|
||||
$attrs .= $onchange;
|
||||
$has_function = (in_array($function, $functions) || isset($functions[$function]));
|
||||
echo (count($functions) > 1
|
||||
? "<select name='function[$name]' onchange='functionChange(this);'" . on_help("getTarget(event).value.replace(/^SQL\$/, '')", 1) . ">" . optionlist($functions, $function === null || $has_function ? $function : "") . "</select>"
|
||||
? "<select name='function[$name]'>" . optionlist($functions, $function === null || $has_function ? $function : "") . "</select>"
|
||||
. on_help("getTarget(event).value.replace(/^SQL\$/, '')", 1)
|
||||
. script("qsl('select').onchange = functionChange;", "")
|
||||
: nbsp(reset($functions))
|
||||
) . '<td>';
|
||||
$input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table
|
||||
if ($input != "") {
|
||||
echo $input;
|
||||
} elseif (preg_match('~bool~', $field["type"])) {
|
||||
echo "<input type='hidden'$attrs value='0'>" .
|
||||
"<input type='checkbox'" . (in_array(strtolower($value), array('1', 't', 'true', 'y', 'yes', 'on')) ? " checked='checked'" : "") . "$attrs value='1'>";
|
||||
} elseif ($field["type"] == "set") { //! 64 bits
|
||||
preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
|
||||
foreach ($matches[1] as $i => $val) {
|
||||
$val = stripcslashes(str_replace("''", "'", $val));
|
||||
$checked = (is_int($value) ? ($value >> $i) & 1 : in_array($val, explode(",", $value), true));
|
||||
echo " <label><input type='checkbox' name='fields[$name][$i]' value='" . (1 << $i) . "'" . ($checked ? ' checked' : '') . "$onchange>" . h($adminer->editVal($val, $field)) . '</label>';
|
||||
echo " <label><input type='checkbox' name='fields[$name][$i]' value='" . (1 << $i) . "'" . ($checked ? ' checked' : '') . ">" . h($adminer->editVal($val, $field)) . '</label>';
|
||||
}
|
||||
} elseif (preg_match('~blob|bytea|raw|file~', $field["type"]) && ini_bool("file_uploads")) {
|
||||
echo "<input type='file' name='fields-$name'$onchange>";
|
||||
echo "<input type='file' name='fields-$name'>";
|
||||
} elseif (($text = preg_match('~text|lob~', $field["type"])) || preg_match("~\n~", $value)) {
|
||||
if ($text && $jush != "sqlite") {
|
||||
$attrs .= " cols='50' rows='12'";
|
||||
@@ -901,7 +928,7 @@ function input($field, $value, $function) {
|
||||
$attrs .= " cols='30' rows='$rows'" . ($rows == 1 ? " style='height: 1.2em;'" : ""); // 1.2em - line-height
|
||||
}
|
||||
echo "<textarea$attrs>" . h($value) . '</textarea>';
|
||||
} elseif ($function == "json") {
|
||||
} elseif ($function == "json" || preg_match('~^jsonb?$~', $field["type"])) {
|
||||
echo "<textarea$attrs cols='50' rows='12' class='jush-js'>" . h($value) . '</textarea>';
|
||||
} else {
|
||||
// int(3) is only a display hint
|
||||
@@ -911,12 +938,24 @@ function input($field, $value, $function) {
|
||||
}
|
||||
// type='date' and type='time' display localized value which may be confusing, type='datetime' uses 'T' as date and time separator
|
||||
echo "<input"
|
||||
. ((!$has_function || $function === "") && preg_match('~(?<!o)int~', $field["type"]) ? " type='number'" : "")
|
||||
. " value='" . h($value) . "'" . ($maxlength ? " maxlength='$maxlength'" : "")
|
||||
. ((!$has_function || $function === "") && preg_match('~(?<!o)int~', $field["type"]) && !preg_match('~\[\]~', $field["full_type"]) ? " type='number'" : "")
|
||||
. " value='" . h($value) . "'" . ($maxlength ? " data-maxlength='$maxlength'" : "")
|
||||
. (preg_match('~char|binary~', $field["type"]) && $maxlength > 20 ? " size='40'" : "")
|
||||
. "$attrs>"
|
||||
;
|
||||
}
|
||||
echo $adminer->editHint($_GET["edit"], $field, $value);
|
||||
// skip 'original'
|
||||
$first = 0;
|
||||
foreach ($functions as $key => $val) {
|
||||
if ($key === "" || !$val) {
|
||||
break;
|
||||
}
|
||||
$first++;
|
||||
}
|
||||
if ($first) {
|
||||
echo script("mixin(qsl('td'), {onchange: partial(skipOriginal, $first), oninput: function () { this.onchange(); }});");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1000,7 +1039,6 @@ function fields_from_edit() {
|
||||
*/
|
||||
function search_tables() {
|
||||
global $adminer, $connection;
|
||||
$_GET["where"][0]["op"] = "LIKE %%";
|
||||
$_GET["where"][0]["val"] = $_POST["query"];
|
||||
$found = false;
|
||||
foreach (table_status('', true) as $table => $table_status) {
|
||||
@@ -1135,7 +1173,7 @@ function select_value($val, $link, $field, $text_length) {
|
||||
$link = "mailto:$val";
|
||||
}
|
||||
if ($protocol = is_url($val)) {
|
||||
$link = (($protocol == "http" && $HTTPS) || preg_match('~WebKit~i', $_SERVER["HTTP_USER_AGENT"]) // WebKit supports noreferrer since 2009
|
||||
$link = (($protocol == "http" && $HTTPS) || preg_match('~WebKit|Firefox~i', $_SERVER["HTTP_USER_AGENT"]) // WebKit supports noreferrer since 2009, Firefox since version 38
|
||||
? $val // HTTP links from HTTPS pages don't receive Referer automatically
|
||||
: "https://www.adminer.org/redirect/?url=" . urlencode($val) // intermediate page to hide Referer
|
||||
);
|
||||
@@ -1181,7 +1219,7 @@ function is_url($string) {
|
||||
* @return bool
|
||||
*/
|
||||
function is_shortable($field) {
|
||||
return preg_match('~char|text|lob|geometry|point|linestring|polygon|string~', $field["type"]);
|
||||
return preg_match('~char|text|lob|geometry|point|linestring|polygon|string|bytea~', $field["type"]);
|
||||
}
|
||||
|
||||
/** Get query to compute number of found rows
|
||||
@@ -1209,9 +1247,9 @@ function slow_query($query) {
|
||||
$db = $adminer->database();
|
||||
$timeout = $adminer->queryTimeout();
|
||||
if (support("kill") && is_object($connection2 = connect()) && ($db == "" || $connection2->select_db($db))) {
|
||||
$kill = $connection2->result("SELECT CONNECTION_ID()"); // MySQL and MySQLi can use thread_id but it's not in PDO_MySQL
|
||||
$kill = $connection2->result(connection_id()); // MySQL and MySQLi can use thread_id but it's not in PDO_MySQL
|
||||
?>
|
||||
<script type="text/javascript">
|
||||
<script<?php echo nonce(); ?>>
|
||||
var timeout = setTimeout(function () {
|
||||
ajax('<?php echo js_escape(ME); ?>script=kill', function () {
|
||||
}, 'token=<?php echo $token; ?>&kill=<?php echo $kill; ?>');
|
||||
@@ -1225,7 +1263,7 @@ var timeout = setTimeout(function () {
|
||||
flush();
|
||||
$return = @get_key_vals($query, $connection2, $timeout); // @ - may be killed
|
||||
if ($connection2) {
|
||||
echo "<script type='text/javascript'>clearTimeout(timeout);</script>\n";
|
||||
echo script("clearTimeout(timeout);");
|
||||
ob_flush();
|
||||
flush();
|
||||
}
|
||||
@@ -1292,7 +1330,7 @@ function lzw_decompress($binary) {
|
||||
* @return string
|
||||
*/
|
||||
function on_help($command, $side = 0) {
|
||||
return " onmouseover='helpMouseover(this, event, " . h($command) . ", $side);' onmouseout='helpMouseout(this, event);'";
|
||||
return script("mixin(qsl('select, input'), {onmouseover: function (event) { helpMouseover.call(this, event, $command, $side) }, onmouseout: helpMouseout});", "");
|
||||
}
|
||||
|
||||
/** Print edit data form
|
||||
@@ -1320,7 +1358,7 @@ function edit_form($TABLE, $fields, $row, $update) {
|
||||
if (!$fields) {
|
||||
echo "<p class='error'>" . lang('You have no privileges to update this table.') . "\n";
|
||||
} else {
|
||||
echo "<table cellspacing='0' onkeydown='return editingKeydown(event);'>\n";
|
||||
echo "<table cellspacing='0'>" . script("qsl('table').onkeydown = editingKeydown;");
|
||||
|
||||
foreach ($fields as $name => $field) {
|
||||
echo "<tr><th>" . $adminer->fieldName($field);
|
||||
@@ -1360,7 +1398,8 @@ function edit_form($TABLE, $fields, $row, $update) {
|
||||
}
|
||||
if (!support("table")) {
|
||||
echo "<tr>"
|
||||
. "<th><input name='field_keys[]' onkeyup='keyupChange.call(this);' onchange='fieldChange(this);' value=''>" // needs empty value for keyupChange()
|
||||
. "<th><input name='field_keys[]'>"
|
||||
. script("qsl('input').oninput = fieldChange;")
|
||||
. "<td class='function'>" . html_select("field_funs[]", $adminer->editFunctions(array("null" => isset($_GET["select"]))))
|
||||
. "<td><input name='field_vals[]'>"
|
||||
. "\n"
|
||||
@@ -1373,13 +1412,14 @@ function edit_form($TABLE, $fields, $row, $update) {
|
||||
echo "<input type='submit' value='" . lang('Save') . "'>\n";
|
||||
if (!isset($_GET["select"])) {
|
||||
echo "<input type='submit' name='insert' value='" . ($update
|
||||
? lang('Save and continue edit') . "' onclick='return !ajaxForm(this.form, \"" . lang('Saving') . '...", this)'
|
||||
? lang('Save and continue edit')
|
||||
: lang('Save and insert next')
|
||||
) . "' title='Ctrl+Shift+Enter'>\n";
|
||||
echo ($update ? script("qsl('input').onclick = function () { return !ajaxForm(this.form, '" . lang('Saving') . "...', this); };") : "");
|
||||
}
|
||||
}
|
||||
echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'" . confirm() . ">\n"
|
||||
: ($_POST || !$fields ? "" : "<script type='text/javascript'>focus(document.getElementById('form').getElementsByTagName('td')[1].firstChild);</script>\n")
|
||||
echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'>" . confirm() . "\n"
|
||||
: ($_POST || !$fields ? "" : script("focus(qsa('td', qs('#form'))[1].firstChild);"))
|
||||
);
|
||||
if (isset($_GET["select"])) {
|
||||
hidden_fields(array("check" => (array) $_POST["check"], "clone" => $_POST["clone"], "all" => $_POST["all"]));
|
||||
|
@@ -2,13 +2,13 @@
|
||||
// not used in a single language version
|
||||
|
||||
$langs = array(
|
||||
'en' => 'English', // Jakub Vrána - http://www.vrana.cz
|
||||
'en' => 'English', // Jakub Vrána - https://www.vrana.cz
|
||||
'ar' => 'العربية', // Y.M Amine - Algeria - nbr7@live.fr
|
||||
'bg' => 'Български', // Deyan Delchev
|
||||
'bn' => 'বাংলা', // Dipak Kumar - dipak.ndc@gmail.com
|
||||
'bs' => 'Bosanski', // Emir Kurtovic
|
||||
'ca' => 'Català', // Joan Llosas
|
||||
'cs' => 'Čeština', // Jakub Vrána - http://www.vrana.cz
|
||||
'cs' => 'Čeština', // Jakub Vrána - https://www.vrana.cz
|
||||
'da' => 'Dansk', // Jarne W. Beutnagel - jarne@beutnagel.dk
|
||||
'de' => 'Deutsch', // Klemens Häckel - http://clickdimension.wordpress.com
|
||||
'el' => 'Ελληνικά', // Dimitrios T. Tanis - jtanis@tanisfood.gr
|
||||
@@ -18,6 +18,7 @@ $langs = array(
|
||||
'fi' => 'Suomi', // Finnish - Kari Eveli - http://www.lexitec.fi/
|
||||
'fr' => 'Français', // Francis Gagné, Aurélien Royer
|
||||
'gl' => 'Galego', // Eduardo Penabad Ramos
|
||||
'he' => 'עברית', // Binyamin Yawitz - https://stuff-group.com/
|
||||
'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu
|
||||
'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
|
||||
'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti
|
||||
@@ -30,7 +31,7 @@ $langs = array(
|
||||
'pt' => 'Português', // André Dias
|
||||
'pt-br' => 'Português (Brazil)', // Gian Live - gian@live.com, Davi Alexandre davi@davialexandre.com.br, RobertoPC - http://www.robertopc.com.br
|
||||
'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com
|
||||
'ru' => 'Русский язык', // Maksim Izmaylov
|
||||
'ru' => 'Русский', // Maksim Izmaylov; Andre Polykanine - https://github.com/Oire/
|
||||
'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz
|
||||
'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com
|
||||
'sr' => 'Српски', // Nikola Radovanović - cobisimo@gmail.com
|
||||
|
@@ -16,10 +16,10 @@ if (extension_loaded('pdo')) {
|
||||
try {
|
||||
parent::__construct($dsn, $username, $password);
|
||||
} catch (Exception $ex) {
|
||||
auth_error($ex->getMessage());
|
||||
auth_error(h($ex->getMessage()));
|
||||
}
|
||||
$this->setAttribute(13, array('Min_PDOStatement')); // 13 - PDO::ATTR_STATEMENT_CLASS
|
||||
$this->server_info = $this->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION
|
||||
$this->server_info = @$this->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION
|
||||
}
|
||||
|
||||
/*abstract function select_db($database);*/
|
||||
|
@@ -1,2 +1,2 @@
|
||||
<?php
|
||||
$VERSION = "4.2.5";
|
||||
$VERSION = "4.4.0";
|
||||
|
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
/** Adminer - Compact database management
|
||||
* @link https://www.adminer.org/
|
||||
* @author Jakub Vrana, http://www.vrana.cz/
|
||||
* @author Jakub Vrana, https://www.vrana.cz/
|
||||
* @copyright 2007 Jakub Vrana
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
||||
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
|
||||
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
||||
* @license https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
|
||||
*/
|
||||
|
||||
include "./include/bootstrap.inc.php";
|
||||
|
@@ -5,6 +5,9 @@ $table_status = table_status($TABLE, true);
|
||||
if (preg_match('~MyISAM|M?aria' . ($connection->server_info >= 5.6 ? '|InnoDB' : '') . '~i', $table_status["Engine"])) {
|
||||
$index_types[] = "FULLTEXT";
|
||||
}
|
||||
if (preg_match('~MyISAM|M?aria' . ($connection->server_info >= 5.7 ? '|InnoDB' : '') . '~i', $table_status["Engine"])) {
|
||||
$index_types[] = "SPATIAL";
|
||||
}
|
||||
$indexes = indexes($TABLE);
|
||||
$primary = array();
|
||||
if ($jush == "mongo") { // doesn't support primary key
|
||||
@@ -93,9 +96,9 @@ if (!$row) {
|
||||
<form action="" method="post">
|
||||
<table cellspacing="0" class="nowrap">
|
||||
<thead><tr>
|
||||
<th><?php echo lang('Index Type'); ?>
|
||||
<th><input type="submit" style="left: -1000px; position: absolute;"><?php echo lang('Column (length)'); ?>
|
||||
<th><?php echo lang('Name'); ?>
|
||||
<th id="label-type"><?php echo lang('Index Type'); ?>
|
||||
<th><input type="submit" class="wayoff"><?php echo lang('Column (length)'); ?>
|
||||
<th id="label-name"><?php echo lang('Name'); ?>
|
||||
<th><noscript><input type='image' class='icon' name='add[0]' src='../adminer/static/plus.gif' alt='+' title='<?php echo lang('Add next'); ?>'></noscript>
|
||||
</thead>
|
||||
<?php
|
||||
@@ -110,25 +113,26 @@ if ($primary) {
|
||||
$j = 1;
|
||||
foreach ($row["indexes"] as $index) {
|
||||
if (!$_POST["drop_col"] || $j != key($_POST["drop_col"])) {
|
||||
echo "<tr><td>" . html_select("indexes[$j][type]", array(-1 => "") + $index_types, $index["type"], ($j == count($row["indexes"]) ? "indexesAddRow(this);" : 1));
|
||||
echo "<tr><td>" . html_select("indexes[$j][type]", array(-1 => "") + $index_types, $index["type"], ($j == count($row["indexes"]) ? "indexesAddRow.call(this);" : 1), "label-type");
|
||||
|
||||
echo "<td>";
|
||||
ksort($index["columns"]);
|
||||
$i = 1;
|
||||
foreach ($index["columns"] as $key => $column) {
|
||||
echo "<span>" . select_input(
|
||||
" name='indexes[$j][columns][$i]' onchange=\"" . ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . "(this, '" . h(js_escape($jush == "sql" ? "" : $_GET["indexes"] . "_")) . "');\"",
|
||||
" name='indexes[$j][columns][$i]' title='" . lang('Column') . "'",
|
||||
($fields ? array_combine($fields, $fields) : $fields),
|
||||
$column
|
||||
$column,
|
||||
"partial(" . ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . ", '" . js_escape($jush == "sql" ? "" : $_GET["indexes"] . "_") . "')"
|
||||
);
|
||||
echo ($jush == "sql" || $jush == "mssql" ? "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "'>" : "");
|
||||
echo ($jush == "sql" || $jush == "mssql" ? "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "' title='" . lang('Length') . "'>" : "");
|
||||
echo ($jush != "sql" ? checkbox("indexes[$j][descs][$i]", 1, $index["descs"][$key], lang('descending')) : "");
|
||||
echo " </span>";
|
||||
$i++;
|
||||
}
|
||||
|
||||
echo "<td><input name='indexes[$j][name]' value='" . h($index["name"]) . "' autocapitalize='off'>\n";
|
||||
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";
|
||||
echo "<td><input name='indexes[$j][name]' value='" . h($index["name"]) . "' autocapitalize='off' aria-labelledby='label-name'>\n";
|
||||
echo "<td><input type='image' class='icon' name='drop_col[$j]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "'>" . script("qsl('input').onclick = partial(editingRemoveRow, 'indexes\$1[type]');");
|
||||
}
|
||||
$j++;
|
||||
}
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'كلمة المرور',
|
||||
'Select database' => 'اختر قاعدة البيانات',
|
||||
'Invalid database.' => 'قاعدة البيانات غير صالحة.',
|
||||
'Create new database' => 'أنشئ فاعدة بيانات جديدة',
|
||||
'Table has been dropped.' => 'تم حذف الجدول.',
|
||||
'Table has been altered.' => 'تم تعديل الجدول.',
|
||||
'Table has been created.' => 'تم إنشاء الجدول.',
|
||||
|
@@ -82,7 +82,6 @@ $translations = array(
|
||||
'Use' => 'Избор',
|
||||
'Select database' => 'Избор на база данни',
|
||||
'Invalid database.' => 'Невалидна база данни.',
|
||||
'Create new database' => 'Нова база данни',
|
||||
'Database has been dropped.' => 'Базата данни беше премахната.',
|
||||
'Databases have been dropped.' => 'Базите данни бяха премехнати.',
|
||||
'Database has been created.' => 'Базата данни беше създадена.',
|
||||
@@ -182,13 +181,12 @@ $translations = array(
|
||||
'Values' => 'Стойности',
|
||||
|
||||
'View' => 'Изглед',
|
||||
'Materialized View' => 'Запаметен изглед',
|
||||
'Materialized view' => 'Запаметен изглед',
|
||||
'View has been dropped.' => 'Изгледа беше премахнат.',
|
||||
'View has been altered.' => 'Изгледа беше променен.',
|
||||
'View has been created.' => 'Изгледа беше създаден.',
|
||||
'Alter view' => 'Промяна на изглед',
|
||||
'Create view' => 'Създаване на изглед',
|
||||
'Create materialized view' => 'Създаване на запаметен изглед',
|
||||
|
||||
'Indexes' => 'Индекси',
|
||||
'Indexes have been altered.' => 'Индексите бяха променени.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'পাসওয়ার্ড',
|
||||
'Select database' => 'ডাটাবেজ নির্বাচন করো',
|
||||
'Invalid database.' => 'ভুল ডাটাবেজ।',
|
||||
'Create new database' => 'নতুন ডাটাবেজ তৈরী করো',
|
||||
'Table has been dropped.' => 'টেবিল মুছে ফেলা হয়েছে।',
|
||||
'Table has been altered.' => 'টেবিল সম্পাদনা করা হয়েছে।',
|
||||
'Table has been created.' => 'টেবিল তৈরী করা হয়েছে।',
|
||||
|
@@ -77,7 +77,6 @@ $translations = array(
|
||||
'Use' => 'Koristi',
|
||||
'Select database' => 'Izaberite bazu',
|
||||
'Invalid database.' => 'Neispravna baza podataka.',
|
||||
'Create new database' => 'Napravi novu bazu podataka',
|
||||
'Database has been dropped.' => 'Baza podataka je izbrisana.',
|
||||
'Databases have been dropped.' => 'Baze podataka su izbrisane.',
|
||||
'Database has been created.' => 'Baza podataka je spašena.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Contrasenya',
|
||||
'Select database' => 'Selecciona base de dades',
|
||||
'Invalid database.' => 'Base de dades invàlida.',
|
||||
'Create new database' => 'Crea una nova base de dades',
|
||||
'Table has been dropped.' => 'S\'ha suprimit la taula.',
|
||||
'Table has been altered.' => 'S\'ha modificat la taula.',
|
||||
'Table has been created.' => 'S\'ha creat la taula.',
|
||||
|
@@ -10,8 +10,9 @@ $translations = array(
|
||||
'Logout' => 'Odhlásit',
|
||||
'Logged as: %s' => 'Přihlášen jako: %s',
|
||||
'Logout successful.' => 'Odhlášení proběhlo v pořádku.',
|
||||
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Díky za použití Admineru, zvažte <a href="%s">příspěvek</a>.',
|
||||
'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
|
||||
'Implement %s method to use SQLite.' => 'Pro přihlášení k SQLite implementujte metodu %s.',
|
||||
'<a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to use SQLite.' => 'Pro přihlášení k SQLite <a href="https://www.adminer.org/cs/extension/" target="_blank">implementujte</a> metodu %s.',
|
||||
'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.'),
|
||||
'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.',
|
||||
'Language' => 'Jazyk',
|
||||
@@ -19,6 +20,7 @@ $translations = array(
|
||||
'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.',
|
||||
'No extension' => 'Žádné rozšíření',
|
||||
'None of the supported PHP extensions (%s) are available.' => 'Není dostupné žádné z podporovaných PHP rozšíření (%s).',
|
||||
'Connecting to privileged ports is not allowed.' => 'Připojování k privilegovaným portům není povoleno.',
|
||||
'Session support must be enabled.' => 'Session proměnné musí být povolené.',
|
||||
'Session expired, please login again.' => 'Session vypršela, přihlašte se prosím znovu.',
|
||||
'%s version: %s through PHP extension %s' => 'Verze %s: %s přes PHP rozšíření %s',
|
||||
@@ -84,7 +86,6 @@ $translations = array(
|
||||
'Use' => 'Vybrat',
|
||||
'Select database' => 'Vybrat databázi',
|
||||
'Invalid database.' => 'Nesprávná databáze.',
|
||||
'Create new database' => 'Vytvořit novou databázi',
|
||||
'Database has been dropped.' => 'Databáze byla odstraněna.',
|
||||
'Databases have been dropped.' => 'Databáze byly odstraněny.',
|
||||
'Database has been created.' => 'Databáze byla vytvořena.',
|
||||
@@ -184,13 +185,12 @@ $translations = array(
|
||||
'Values' => 'Hodnoty',
|
||||
|
||||
'View' => 'Pohled',
|
||||
'Materialized View' => 'Materializovaný pohled',
|
||||
'Materialized view' => 'Materializovaný pohled',
|
||||
'View has been dropped.' => 'Pohled byl odstraněn.',
|
||||
'View has been altered.' => 'Pohled byl změněn.',
|
||||
'View has been created.' => 'Pohled byl vytvořen.',
|
||||
'Alter view' => 'Pozměnit pohled',
|
||||
'Create view' => 'Vytvořit pohled',
|
||||
'Create materialized view' => 'Vytvořit materializovaný pohled',
|
||||
|
||||
'Indexes' => 'Indexy',
|
||||
'Indexes have been altered.' => 'Indexy byly změněny.',
|
||||
|
@@ -68,7 +68,6 @@ $translations = array(
|
||||
'Use' => 'Brug',
|
||||
'Select database' => 'Vælg database',
|
||||
'Invalid database.' => 'Ugyldig database.',
|
||||
'Create new database' => 'Opret ny database',
|
||||
'Database has been dropped.' => 'Databasen er blevet slettet.',
|
||||
'Databases have been dropped.' => 'Databasene er blevet slettet.',
|
||||
'Database has been created.' => 'Databasen er oprettet.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Passwort',
|
||||
'Select database' => 'Datenbank auswählen',
|
||||
'Invalid database.' => 'Datenbank ungültig.',
|
||||
'Create new database' => 'Datenbank erstellen',
|
||||
'Table has been dropped.' => 'Tabelle wurde entfernt.',
|
||||
'Table has been altered.' => 'Tabelle wurde geändert.',
|
||||
'Table has been created.' => 'Tabelle wurde erstellt.',
|
||||
|
@@ -83,7 +83,6 @@ $translations = array(
|
||||
'Use' => 'χρήση',
|
||||
'Select database' => 'Επιλέξτε Β.Δ.',
|
||||
'Invalid database.' => 'Άκυρη Β.Δ.',
|
||||
'Create new database' => 'Δημιουργία νέας Β.Δ.',
|
||||
'Database has been dropped.' => 'Η Β.Δ. διαγράφηκε.',
|
||||
'Databases have been dropped.' => 'Οι Β.Δ. διαγράφηκαν.',
|
||||
'Database has been created.' => 'Η Β.Δ. δημιουργήθηκε.',
|
||||
@@ -183,13 +182,12 @@ $translations = array(
|
||||
'Values' => 'Τιμές',
|
||||
|
||||
'View' => 'Προβολή',
|
||||
'Materialized View' => 'Υλοποιημένη Προβολή',
|
||||
'Materialized view' => 'Υλοποιημένη προβολή',
|
||||
'View has been dropped.' => 'Η προβολή διαγράφηκε.',
|
||||
'View has been altered.' => 'Η προβολή τροποποιήθηκε.',
|
||||
'View has been created.' => 'Η προβολή δημιουργήθηκε.',
|
||||
'Alter view' => 'Τροποποίηση προβολής',
|
||||
'Create view' => 'Δημιουργία προβολής',
|
||||
'Create materialized view' => 'Δημιουργία Υλοποιημένης προβολής',
|
||||
|
||||
'Indexes' => 'Δείκτες',
|
||||
'Indexes have been altered.' => 'Οι δείκτες τροποποιήθηκαν.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Contraseña',
|
||||
'Select database' => 'Seleccionar Base de datos',
|
||||
'Invalid database.' => 'Base de datos incorrecta.',
|
||||
'Create new database' => 'Crear nueva base de datos',
|
||||
'Table has been dropped.' => 'Tabla eliminada.',
|
||||
'Table has been altered.' => 'Tabla modificada.',
|
||||
'Table has been created.' => 'Tabla creada.',
|
||||
@@ -45,9 +44,9 @@ $translations = array(
|
||||
'Delete' => 'Eliminar',
|
||||
'Database' => 'Base de datos',
|
||||
'Routines' => 'Procedimientos',
|
||||
'Indexes have been altered.' => 'Indices actualizados.',
|
||||
'Indexes' => 'Indices',
|
||||
'Alter indexes' => 'Modificar indices',
|
||||
'Indexes have been altered.' => 'Índices actualizados.',
|
||||
'Indexes' => 'Índices',
|
||||
'Alter indexes' => 'Modificar índices',
|
||||
'Add next' => 'Agregar',
|
||||
'Language' => 'Idioma',
|
||||
'Select' => 'Mostrar',
|
||||
@@ -78,7 +77,7 @@ $translations = array(
|
||||
'File uploads are disabled.' => 'Importación de archivos deshablilitada.',
|
||||
'Routine has been called, %d row(s) affected.' => array('Consulta ejecutada, %d registro afectado.', 'Consulta ejecutada, %d registros afectados.'),
|
||||
'Call' => 'Llamar',
|
||||
'No extension' => 'No hay extension',
|
||||
'No extension' => 'No hay extensión',
|
||||
'None of the supported PHP extensions (%s) are available.' => 'Ninguna de las extensiones PHP soportadas (%s) está disponible.',
|
||||
'Session support must be enabled.' => 'Deben estar habilitadas las sesiones.',
|
||||
'Session expired, please login again.' => 'Sesión caducada, por favor escriba su clave de nuevo.',
|
||||
@@ -114,7 +113,7 @@ $translations = array(
|
||||
'Routine has been dropped.' => 'Procedimiento eliminado.',
|
||||
'Routine has been altered.' => 'Procedimiento modificado.',
|
||||
'Routine has been created.' => 'Procedimiento creado.',
|
||||
'Alter function' => 'Modificar Función',
|
||||
'Alter function' => 'Modificar función',
|
||||
'Alter procedure' => 'Modificar procedimiento',
|
||||
'Return type' => 'Tipo de valor de vuelta',
|
||||
'Add trigger' => 'Agregar disparador',
|
||||
@@ -128,7 +127,7 @@ $translations = array(
|
||||
'%s version: %s through PHP extension %s' => 'Versión %s: %s a través de la extensión de PHP %s',
|
||||
'%d row(s)' => array('%d registro', '%d registros'),
|
||||
'Remove' => 'Eliminar',
|
||||
'Are you sure?' => 'Está seguro?',
|
||||
'Are you sure?' => '¿Está seguro?',
|
||||
'Privileges' => 'Privilegios',
|
||||
'Create user' => 'Crear Usuario',
|
||||
'User has been dropped.' => 'Usuario eliminado.',
|
||||
@@ -140,7 +139,7 @@ $translations = array(
|
||||
'Grant' => 'Conceder',
|
||||
'Revoke' => 'Impedir',
|
||||
'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.',
|
||||
'Logged as: %s' => 'Logeado como: %s',
|
||||
'Logged as: %s' => 'Logueado como: %s',
|
||||
'Move up' => 'Mover arriba',
|
||||
'Move down' => 'Mover abajo',
|
||||
'Functions' => 'Funciones',
|
||||
@@ -192,7 +191,7 @@ $translations = array(
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Excedida la cantidad máxima de campos permitidos. Por favor aumente %s.',
|
||||
'Partition by' => 'Particionar por',
|
||||
'Partitions' => 'Particiones',
|
||||
'Partition name' => 'Nombre de Partición',
|
||||
'Partition name' => 'Nombre de partición',
|
||||
'Values' => 'Valores',
|
||||
'%d row(s) have been imported.' => array('%d registro importado.', '%d registros importados.'),
|
||||
'anywhere' => 'donde sea',
|
||||
@@ -249,16 +248,16 @@ $translations = array(
|
||||
'System' => 'Motor de base de datos',
|
||||
'Select data' => 'Visualizar contenido',
|
||||
'Show structure' => 'Mostrar estructura',
|
||||
'empty' => 'ningúno',
|
||||
'empty' => 'ninguno',
|
||||
'Network' => 'Red',
|
||||
'Geometry' => 'Geometría',
|
||||
'File exists.' => 'Ese archivo ya existe.',
|
||||
'Attachments' => 'Adjuntos',
|
||||
'%d query(s) executed OK.' => array('%d sentencia sql ejecutada correctamente.', '%d sentencias sql ejecutadas correctamente.'),
|
||||
'%d query(s) executed OK.' => array('%d sentencia SQL ejecutada correctamente.', '%d sentencias SQL ejecutadas correctamente.'),
|
||||
'Show only errors' => 'Mostrar solamente errores',
|
||||
'Refresh' => 'Refrescar',
|
||||
'Invalid schema.' => 'Esquema inválido.',
|
||||
'Please use one of the extensions %s.' => 'Por favor use una de las extensiones %s.',
|
||||
'Please use one of the extensions %s.' => 'Por favor, use una de las extensiones %s.',
|
||||
'now' => 'ahora',
|
||||
'ltr' => 'ltr',
|
||||
'Tables have been copied.' => 'Tablas copiadas.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Parool',
|
||||
'Select database' => 'Vali andmebaas',
|
||||
'Invalid database.' => 'Tundmatu andmebaas.',
|
||||
'Create new database' => 'Loo uus andmebaas',
|
||||
'Table has been dropped.' => 'Tabel on edukalt kustutatud.',
|
||||
'Table has been altered.' => 'Tabeli andmed on edukalt muudetud.',
|
||||
'Table has been created.' => 'Tabel on edukalt loodud.',
|
||||
|
@@ -81,7 +81,6 @@ $translations = array(
|
||||
'Use' => 'استفاده',
|
||||
'Select database' => 'انتخاب پایگاه داده',
|
||||
'Invalid database.' => 'پایگاه داده نامعتبر.',
|
||||
'Create new database' => 'ایجاد پایگاه داده جدید',
|
||||
'Database has been dropped.' => 'پایگاه داده حذف شد.',
|
||||
'Databases have been dropped.' => 'پایگاه های داده حذف شدند.',
|
||||
'Database has been created.' => 'پایگاه داده ایجاد شد.',
|
||||
@@ -181,13 +180,12 @@ $translations = array(
|
||||
'Values' => 'مقادیر',
|
||||
|
||||
'View' => 'نمایش',
|
||||
'Materialized View' => 'نمایه مادی',
|
||||
'Materialized view' => 'نمایه مادی',
|
||||
'View has been dropped.' => 'نمایش حذف شد.',
|
||||
'View has been altered.' => 'نمایش ویرایش شد.',
|
||||
'View has been created.' => 'نمایش ایجاد شد.',
|
||||
'Alter view' => 'حذف نمایش',
|
||||
'Create view' => 'ایجاد نمایش',
|
||||
'Create materialized view' => 'ایجاد نمایه مادی',
|
||||
|
||||
'Indexes' => 'ایندکسها',
|
||||
'Indexes have been altered.' => 'ایندکسها ویرایش شدند.',
|
||||
|
@@ -83,7 +83,6 @@ $translations = array(
|
||||
'Use' => 'Käytä',
|
||||
'Select database' => 'Valitse tietokanta',
|
||||
'Invalid database.' => 'Tietokanta ei kelpaa.',
|
||||
'Create new database' => 'Luo uusi tietokanta',
|
||||
'Database has been dropped.' => 'Tietokanta on poistettu.',
|
||||
'Databases have been dropped.' => 'Tietokannat on poistettu.',
|
||||
'Database has been created.' => 'Tietokanta on luotu.',
|
||||
@@ -183,13 +182,12 @@ $translations = array(
|
||||
'Values' => 'Arvot',
|
||||
|
||||
'View' => 'Näkymä',
|
||||
'Materialized View' => 'Materialisoitunut näkymä',
|
||||
'Materialized view' => 'Materialisoitunut näkymä',
|
||||
'View has been dropped.' => 'Näkymä on poistettu.',
|
||||
'View has been altered.' => 'Näkymää on muutettu.',
|
||||
'View has been created.' => 'Näkymä on luotu.',
|
||||
'Alter view' => 'Muuta näkymää',
|
||||
'Create view' => 'Luo näkymä',
|
||||
'Create materialized view' => 'Luo materialisoitunut näkymä',
|
||||
|
||||
'Indexes' => 'Indeksit',
|
||||
'Indexes have been altered.' => 'Indeksejä on muutettu.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Mot de passe',
|
||||
'Select database' => 'Sélectionner la base de données',
|
||||
'Invalid database.' => 'Base de données invalide.',
|
||||
'Create new database' => 'Créer une base de données',
|
||||
'Table has been dropped.' => 'La table a été effacée.',
|
||||
'Table has been altered.' => 'La table a été modifiée.',
|
||||
'Table has been created.' => 'La table a été créée.',
|
||||
@@ -283,8 +282,7 @@ $translations = array(
|
||||
'Saving' => 'Enregistrement',
|
||||
'yes' => 'oui',
|
||||
'no' => 'non',
|
||||
'Materialized View' => 'Vue matérialisée',
|
||||
'Create materialized view' => 'Créer une vue matérialisée',
|
||||
'Materialized view' => 'Vue matérialisée',
|
||||
'%d / ' => '%d / ',
|
||||
'Limit rows' => 'Limiter les lignes',
|
||||
'Default value' => 'Valeur par défaut',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Contrasinal',
|
||||
'Select database' => 'Seleccionar Base de datos',
|
||||
'Invalid database.' => 'Base de datos incorrecta.',
|
||||
'Create new database' => 'Crear nova base de datos',
|
||||
'Table has been dropped.' => 'Eliminouse a táboa.',
|
||||
'Table has been altered.' => 'Modificouse a táboa.',
|
||||
'Table has been created.' => 'Creouse a táboa.',
|
||||
@@ -267,10 +266,9 @@ $translations = array(
|
||||
'Edit all' => 'Editar todo',
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
'Tables have been optimized.' => 'Optimizáronse as táboas',
|
||||
'Materialized View' => 'Vista materializada',
|
||||
'Materialized view' => 'Vista materializada',
|
||||
'Vacuum' => 'Baleirar',
|
||||
'Selected' => 'Selección',
|
||||
'Create materialized view' => 'Crear vista materializada',
|
||||
'File must be in UTF-8 encoding.' => 'O ficheiro ten que estar codificado con UTF-8',
|
||||
'Modify' => 'Modificar',
|
||||
'Loading' => 'Cargando',
|
||||
|
294
adminer/lang/he.inc.php
Normal file
294
adminer/lang/he.inc.php
Normal file
@@ -0,0 +1,294 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Login' => 'התחברות',
|
||||
'Logout successful.' => 'ההתחברות הצליחה',
|
||||
'Invalid credentials.' => 'פרטי התחברות שגויים',
|
||||
'Server' => 'שרת',
|
||||
'Username' => 'שם משתמש',
|
||||
'Password' => 'סיסמה',
|
||||
'Select database' => 'בחר מסד נתונים',
|
||||
'Invalid database.' => 'מסד נתונים שגוי',
|
||||
'Table has been dropped.' => 'הטבלה הושלכה',
|
||||
'Table has been altered.' => 'הטבלה שונתה',
|
||||
'Table has been created.' => 'הטבלה נוצרה',
|
||||
'Alter table' => 'שנה טבלה',
|
||||
'Create table' => 'צור טבלה',
|
||||
'Table name' => 'שם הטבלה',
|
||||
'engine' => 'מנוע',
|
||||
'collation' => 'קולקציה',
|
||||
'Column name' => 'שם עמודה',
|
||||
'Type' => 'סוג',
|
||||
'Length' => 'אורך',
|
||||
'Auto Increment' => 'הגדלה אוטומטית',
|
||||
'Options' => 'אפשרויות',
|
||||
'Save' => 'שמור',
|
||||
'Drop' => 'השלך',
|
||||
'Database has been created.' => 'מסד הנתונים נוצר',
|
||||
'Database has been renamed.' => 'שם מסד הנתונים שונה',
|
||||
'Database has been altered.' => 'מסד הנתונים שונה',
|
||||
'Alter database' => 'שנה מסד נתונים',
|
||||
'Create database' => 'צור מסד נתונים',
|
||||
'SQL command' => 'שאילתת SQL',
|
||||
'Logout' => 'התנתק',
|
||||
'database' => 'מסד נתונים',
|
||||
'Use' => 'השתמש',
|
||||
'No tables.' => 'אין טבלאות',
|
||||
'select' => 'בחר',
|
||||
'Item has been deleted.' => 'הפריט נמחק',
|
||||
'Item has been updated.' => 'הפריט עודכן',
|
||||
'Edit' => 'ערוך',
|
||||
'Insert' => 'הכנס',
|
||||
'Save and insert next' => 'שמור והמשך להכניס',
|
||||
'Delete' => 'מחק',
|
||||
'Database' => 'מסד נתונים',
|
||||
'Routines' => 'רוטינות',
|
||||
'Indexes have been altered.' => 'האינדקסים שונו',
|
||||
'Indexes' => 'אינדקסים',
|
||||
'Alter indexes' => 'שנה אינדקסים',
|
||||
'Add next' => 'הוסף הבא',
|
||||
'Language' => 'שפה',
|
||||
'Select' => 'בחר',
|
||||
'New item' => 'פריט חדש',
|
||||
'Search' => 'חפש',
|
||||
'Sort' => 'מיין',
|
||||
'descending' => 'סדר הפוך',
|
||||
'Limit' => 'הגבל',
|
||||
'No rows.' => 'אין שורות',
|
||||
'Action' => 'פעולות',
|
||||
'edit' => 'ערוך',
|
||||
'Page' => 'עמוד',
|
||||
'Query executed OK, %d row(s) affected.' => 'השאילתה בוצעה כהלכה, %d שורות הושפעו',
|
||||
'Error in query' => 'שגיאה בשאילתה',
|
||||
'Execute' => 'הרץ',
|
||||
'Table' => 'טבלה',
|
||||
'Foreign keys' => 'מפתחות זרים',
|
||||
'Triggers' => 'מפעילים',
|
||||
'View' => 'הצג',
|
||||
'Unable to select the table' => 'בחירת הטבלה נכשלה',
|
||||
'Invalid CSRF token. Send the form again.' => 'כשל באבטחת נתונים, שלח טופס שוב',
|
||||
'Comment' => 'הערה',
|
||||
'Default values' => 'ערכי ברירת מחדל',
|
||||
'%d byte(s)' => '%d בתים',
|
||||
'No commands to execute.' => 'לא נמצאו פקודות להרצה',
|
||||
'Unable to upload a file.' => 'העלאת הקובץ נכשלה',
|
||||
'File upload' => 'העלה קובץ',
|
||||
'File uploads are disabled.' => 'העלאת קבצים מבוטלת',
|
||||
'Routine has been called, %d row(s) affected.' => 'הרוטינה נקראה, %d שורות הושפעו',
|
||||
'Call' => 'קרא',
|
||||
'No extension' => 'אין תוסף',
|
||||
'None of the supported PHP extensions (%s) are available.' => 'שום תוסף PHP (%s) זמין',
|
||||
'Session support must be enabled.' => 'חובה להפעיל תמיכה בסשן',
|
||||
'Session expired, please login again.' => 'תם זמן ההפעלה, אנא התחבר שוב',
|
||||
'Text length' => 'אורך הטקסט',
|
||||
'Foreign key has been dropped.' => 'המפתח הזר הושלך',
|
||||
'Foreign key has been altered.' => 'המפתח הזר שונה',
|
||||
'Foreign key has been created.' => 'המפתח הזר נוצר',
|
||||
'Foreign key' => 'מפתח זר',
|
||||
'Target table' => 'טבלת יעד',
|
||||
'Change' => 'שנה',
|
||||
'Source' => 'מקור',
|
||||
'Target' => 'יעד',
|
||||
'Add column' => 'הוסף עמודה',
|
||||
'Alter' => 'שנה',
|
||||
'Add foreign key' => 'הוסף מפתח זר',
|
||||
'ON DELETE' => 'בעת מחיקה',
|
||||
'ON UPDATE' => 'בעת עידכון',
|
||||
'Index Type' => 'סוג אינדקס',
|
||||
'Column (length)' => 'עמודה (אורך)',
|
||||
'View has been dropped.' => 'התצוגה הושלכה',
|
||||
'View has been altered.' => 'התצוגה שונתה',
|
||||
'View has been created.' => 'התצוגה נוצרה',
|
||||
'Alter view' => 'שנה תצוגה',
|
||||
'Create view' => 'צור תצוגה',
|
||||
'Name' => 'שם',
|
||||
'Process list' => 'רשימת תהליכים',
|
||||
'%d process(es) have been killed.' => '%d תהליכים חוסלו',
|
||||
'Kill' => 'חסל',
|
||||
'Parameter name' => 'שם הפרמטר',
|
||||
'Database schema' => 'סכמת מסד נתונים',
|
||||
'Create procedure' => 'צור פרוצדורה',
|
||||
'Create function' => 'צור פונקציה',
|
||||
'Routine has been dropped.' => 'הרוטינה הושלכה',
|
||||
'Routine has been altered.' => 'הרוטינה שונתה',
|
||||
'Routine has been created.' => 'הרוטינה נוצרה',
|
||||
'Alter function' => 'שנה פונקציה',
|
||||
'Alter procedure' => 'שנה פרוצדורה',
|
||||
'Return type' => 'סוג ערך מוחזר',
|
||||
'Add trigger' => 'הוסף טריגר',
|
||||
'Trigger has been dropped.' => 'הטריגר הושלך',
|
||||
'Trigger has been altered.' => 'הטריגר שונה',
|
||||
'Trigger has been created.' => 'הטריגר נוצר',
|
||||
'Alter trigger' => 'שנה טריגר',
|
||||
'Create trigger' => 'צור טריגר',
|
||||
'Time' => 'זמן',
|
||||
'Event' => 'אירוע',
|
||||
'%d row(s)' => '%d שורות',
|
||||
'Remove' => 'הסר',
|
||||
'Are you sure?' => 'האם אתה בטוח?',
|
||||
'Privileges' => 'פריווילגיות',
|
||||
'Create user' => 'צור משתמש',
|
||||
'User has been dropped.' => 'המשתמש הושלך',
|
||||
'User has been altered.' => 'המשתמש שונה',
|
||||
'User has been created.' => 'המשתמש נוצר',
|
||||
'Hashed' => 'הצפנה',
|
||||
'Column' => 'עמודה',
|
||||
'Routine' => 'רוטינה',
|
||||
'Grant' => 'הענק',
|
||||
'Revoke' => 'שלול',
|
||||
'%s version: %s through PHP extension %s' => '%s גרסה: %s דרך תוסף PHP %s',
|
||||
'Logged as: %s' => 'מחובר כ: %s',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'מידע גדול מידי נשלח ב-POST. הקטן את את המידע הוא הגדלת את הגדרות ה-%s',
|
||||
'Move up' => 'הזז למעלה',
|
||||
'Move down' => 'הזז למטה',
|
||||
'Export' => 'יצא',
|
||||
'Tables' => 'טבלאות',
|
||||
'Data' => 'נתונים',
|
||||
'Output' => 'פלט',
|
||||
'open' => 'פתח',
|
||||
'save' => 'שמור',
|
||||
'Format' => 'פורמט',
|
||||
'Functions' => 'פונקציות',
|
||||
'Aggregation' => 'צבירה',
|
||||
'Event has been dropped.' => 'האירוע הושלך',
|
||||
'Event has been altered.' => 'האירוע שונה',
|
||||
'Event has been created.' => 'האירוע נוצר',
|
||||
'Alter event' => 'שנה אירוע',
|
||||
'Create event' => 'צור אירוע',
|
||||
'Start' => 'התחלה',
|
||||
'End' => 'סיום',
|
||||
'Every' => 'כל',
|
||||
'Status' => 'סטטוס',
|
||||
'On completion preserve' => 'בעת סיום שמור',
|
||||
'Events' => 'אירועים',
|
||||
'Schedule' => 'תזמן',
|
||||
'At given time' => 'לפי זמן נתון',
|
||||
'Save and continue edit' => 'שמור והמשך לערוך',
|
||||
'original' => 'מקורי',
|
||||
'Tables have been truncated.' => 'הטבלה קוצרה',
|
||||
'Tables have been moved.' => 'הטבלה הועברה',
|
||||
'Tables have been dropped.' => 'הטבלה הושלכה',
|
||||
'Tables and views' => 'טבלאות ותצוגות',
|
||||
'Engine' => 'מנוע',
|
||||
'Collation' => 'קולקציה',
|
||||
'Data Length' => 'אורך נתונים',
|
||||
'Index Length' => 'אורך אינדקס',
|
||||
'Data Free' => 'נתונים משוחררים',
|
||||
'Rows' => 'שורות',
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
'Analyze' => 'נתח',
|
||||
'Optimize' => 'יעל',
|
||||
'Check' => 'בדוק',
|
||||
'Repair' => 'תקן',
|
||||
'Truncate' => 'קצר',
|
||||
'Move to other database' => 'העבר למסד נתונים אחר',
|
||||
'Move' => 'העבר',
|
||||
'%d item(s) have been affected.' => '%d פריטים הושפעו',
|
||||
'whole result' => 'כל התוצאות',
|
||||
'Clone' => 'שכפל',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'הגעת למספר השדות המרבי. בבקשה הגדל את %s',
|
||||
'Partition by' => 'מחיצות ע"י',
|
||||
'Partitions' => 'מחיצות',
|
||||
'Partition name' => 'שם מחיצה',
|
||||
'Values' => 'ערכים',
|
||||
'%d row(s) have been imported.' => '%d שורות יובאו',
|
||||
'anywhere' => 'בכל מקום',
|
||||
'Import' => 'יבא',
|
||||
'Stop on error' => 'עצור בעת שגיאה',
|
||||
'%.3f s' => '%.3f s',
|
||||
'$1-$3-$5' => '$1-$3-$5',
|
||||
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
|
||||
'History' => 'היסטוריה',
|
||||
'Variables' => 'משתנים',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'על עמודות המקור והיעד להיות מאותו טיפוס נתונים, חובה שיהיה אינדקס בעמודת היעד ושהמידע המתאים יהיה קיים',
|
||||
'Relations' => 'הקשרים',
|
||||
'Run file' => 'הרץ קובץ',
|
||||
'Clear' => 'נקה',
|
||||
'Maximum allowed file size is %sB.' => 'גודל מקסימלאי להעלאה: %sB',
|
||||
'Numbers' => 'מספרים',
|
||||
'Date and time' => 'תאריך ושעה',
|
||||
'Strings' => 'מחרוזות',
|
||||
'Binary' => 'בינארי',
|
||||
'Lists' => 'רשימות',
|
||||
'Editor' => 'עורך',
|
||||
'E-mail' => 'דוא"ל',
|
||||
'From' => 'מ:',
|
||||
'Subject' => 'נושא',
|
||||
'Send' => 'שלח',
|
||||
'%d e-mail(s) have been sent.' => '%d הודעות דוא"ל נשלחו',
|
||||
'Webserver file %s' => 'קובץ השרת %s',
|
||||
'File does not exist.' => 'הקובץ אינו קיים',
|
||||
'%d in total' => '%d בסך הכל',
|
||||
'Permanent login' => 'התחבר לצמיתות',
|
||||
'Databases have been dropped.' => 'מסד הנתונים הושלך',
|
||||
'Database has been dropped.' => 'מסד הנתונים הושלך',
|
||||
'Search data in tables' => 'חפש מידע בטבלאות',
|
||||
'Schema' => 'סכמה',
|
||||
'Alter schema' => 'שנה סכמה',
|
||||
'Create schema' => 'צור סכמה',
|
||||
'Schema has been dropped.' => 'הסכמה הושלכה',
|
||||
'Schema has been created.' => 'הסכמה נוצרה',
|
||||
'Schema has been altered.' => 'הסכמה שונתה',
|
||||
'Sequences' => 'סדרות',
|
||||
'Create sequence' => 'צור סדרה',
|
||||
'Alter sequence' => 'שנה סדרה',
|
||||
'Sequence has been dropped.' => 'הסדרה הושלכה',
|
||||
'Sequence has been created.' => 'הסדרה נוצרה',
|
||||
'Sequence has been altered.' => 'הסדרה שונתה',
|
||||
'User types' => 'סוגי משתמשים',
|
||||
'Create type' => 'צור סוג',
|
||||
'Alter type' => 'שנה סוג',
|
||||
'Type has been dropped.' => 'הסוג הושלך',
|
||||
'Type has been created.' => 'הסוג נוצר',
|
||||
'Use edit link to modify this value.' => 'השתמש בקישור העריכה בשביל לשנות את הערך',
|
||||
'last' => 'אחרון',
|
||||
'From server' => 'משרת',
|
||||
'System' => 'מערכת',
|
||||
'Select data' => 'בחר נתונים',
|
||||
'Show structure' => 'הראה מבנה',
|
||||
'empty' => 'ריק',
|
||||
'Network' => 'רשת',
|
||||
'Geometry' => 'גיאומטריה',
|
||||
'File exists.' => 'קובץ קיים',
|
||||
'Attachments' => 'קבצים מצורפים',
|
||||
'Item%s has been inserted.' => 'הפריט %s הוזן בהצלחה',
|
||||
'now' => 'כעת',
|
||||
'%d query(s) executed OK.' => '%d שאילתות בוצעו בהצלחה',
|
||||
'Show only errors' => 'הראה שגיאות בלבד',
|
||||
'Refresh' => 'רענן',
|
||||
'Invalid schema.' => 'סכמה שגויה',
|
||||
'Please use one of the extensions %s.' => 'בבקשה השתמש באחד מהתוספים %s',
|
||||
'ltr' => 'rtl',
|
||||
'Tables have been copied.' => 'הטבלה הועתקה',
|
||||
'Copy' => 'העתק',
|
||||
'Permanent link' => 'קישור סופי',
|
||||
'Edit all' => 'ערוך הכל',
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
'Tables have been optimized.' => 'הטבלאות עברו אופטימיזציה',
|
||||
'Materialized view' => 'תצוגת מימוש ',
|
||||
'Vacuum' => 'וואקום',
|
||||
'Selected' => 'נבחרים',
|
||||
'Ctrl+click on a value to modify it.' => 'לחץ ctrl + לחיצת עכבר לערוך ערך זה',
|
||||
'File must be in UTF-8 encoding.' => 'על הקובץ להיות בקידוד utf-8',
|
||||
'Modify' => 'ערוך',
|
||||
'Loading' => 'טוען',
|
||||
'Load more data' => 'טען נתונים נוספים',
|
||||
'ATTACH queries are not supported.' => 'שאילתת ATTACH אינה נתמכת',
|
||||
'%d / ' => '%d / ',
|
||||
'Limit rows' => 'הגבל שורות',
|
||||
'<a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to use SQLite.' => '<a href="https://www.adminer.org/en/extension/" target="_blank">התקן</a> את תוסף SQLite בשביל להתחבר',
|
||||
'Default value' => 'ערך ברירת מחדל',
|
||||
'Full table scan' => 'סריקה טבלה מלאה',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => 'יותר מידי נסיונות כניסה נכשלו, אנא נסה עוד %d דקות',
|
||||
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'תודה שהשתמש ב-adminer אנא שקול <a href="%s">לתרום</a>.',
|
||||
'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> על מנת להפוך את זה לתמידי',
|
||||
'If you did not send this request from Adminer then close this page.' => 'אם לא אתה שלחת בקשה ל-Adminer הינך יכול לסגור חלון זה',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => 'ניתן לעלות קבצים ב-FTP ואז למשוך אותם מהשרת',
|
||||
'Size' => 'גודל',
|
||||
'Compute' => 'חישוב',
|
||||
'You are offline.' => 'הינך לא מקוון',
|
||||
'You have no privileges to update this table.' => 'אין לך ההרשאות המתאימות לעדכן טבלה זו',
|
||||
'Saving' => 'שומר',
|
||||
'yes' => 'כן',
|
||||
'no' => 'לא',
|
||||
);
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Jelszó',
|
||||
'Select database' => 'Adatbázis kiválasztása',
|
||||
'Invalid database.' => 'Érvénytelen adatbázis.',
|
||||
'Create new database' => 'Új adatbázis',
|
||||
'Table has been dropped.' => 'A tábla eldobva.',
|
||||
'Table has been altered.' => 'A tábla módosult.',
|
||||
'Table has been created.' => 'A tábla létrejött.',
|
||||
|
@@ -10,11 +10,11 @@ $translations = array(
|
||||
'Logout' => 'Keluar',
|
||||
'Logged as: %s' => 'Masuk sebagai: %s',
|
||||
'Logout successful.' => 'Berhasil keluar.',
|
||||
'Invalid credentials.' => 'Akses invalid.',
|
||||
'Invalid credentials.' => 'Akses tidak sah.',
|
||||
'Language' => 'Bahasa',
|
||||
'Invalid CSRF token. Send the form again.' => 'Token CSRF invalid. Kirim ulang formulir.',
|
||||
'No extension' => 'Ekstensi tidak tersedia',
|
||||
'None of the supported PHP extensions (%s) are available.' => 'Ekstensi PHP yang didukung (%s) tidak tersedia.',
|
||||
'Invalid CSRF token. Send the form again.' => 'Token CSRF tidak sah. Kirim ulang formulir.',
|
||||
'No extension' => 'Ekstensi tidak ada',
|
||||
'None of the supported PHP extensions (%s) are available.' => 'Ekstensi PHP yang didukung (%s) tidak ada.',
|
||||
'Session support must be enabled.' => 'Dukungan sesi harus aktif.',
|
||||
'Session expired, please login again.' => 'Sesi habis, silakan masuk lagi.',
|
||||
'%s version: %s through PHP extension %s' => 'Versi %s: %s dengan ekstensi PHP %s',
|
||||
@@ -44,26 +44,26 @@ $translations = array(
|
||||
'SQL command' => 'Perintah SQL',
|
||||
'%d query(s) executed OK.' => '%d kueri berhasil dijalankan.',
|
||||
'Query executed OK, %d row(s) affected.' => 'Kueri berhasil, %d baris terpengaruh.',
|
||||
'No commands to execute.' => 'Tiada perintah untuk dijalankan.',
|
||||
'Error in query' => 'Kesalahan dalam kueri',
|
||||
'No commands to execute.' => 'Tidak ada perintah untuk dijalankan.',
|
||||
'Error in query' => 'Galat dalam kueri',
|
||||
'Execute' => 'Jalankan',
|
||||
'Stop on error' => 'Hentikan pada kesalahan',
|
||||
'Show only errors' => 'Hanya tampilkan kesalahan',
|
||||
'Stop on error' => 'Hentikan jika galat',
|
||||
'Show only errors' => 'Hanya tampilkan galat',
|
||||
// sprintf() format for time of the command
|
||||
'%.3f s' => '%.3f s',
|
||||
'History' => 'Riwayat',
|
||||
'Clear' => 'Bersihkan',
|
||||
'Edit all' => 'Edit semua',
|
||||
|
||||
'Edit all' => 'Sunting semua',
|
||||
'File upload' => 'Unggah berkas',
|
||||
'From server' => 'Dari server',
|
||||
'Webserver file %s' => 'Berkas server web %s',
|
||||
'Run file' => 'Jalankan berkas',
|
||||
'File does not exist.' => 'Berkas tidak ditemukan.',
|
||||
'File does not exist.' => 'Berkas tidak ada.',
|
||||
'File uploads are disabled.' => 'Pengunggahan berkas dimatikan.',
|
||||
'Unable to upload a file.' => 'Tidak dapat mengunggah berkas.',
|
||||
'Maximum allowed file size is %sB.' => 'Besar berkas yang diizinkan adalah %s bita.',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Data POST terlalu besar. Kurangi data atau perbesar pengarah konfigurasi %s.',
|
||||
'Maximum allowed file size is %sB.' => 'Besar berkas yang diizinkan adalah %sB.',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Data POST terlalu besar. Kurangi data atau perbesar direktif konfigurasi %s.',
|
||||
|
||||
'Export' => 'Ekspor',
|
||||
'Output' => 'Hasil',
|
||||
@@ -76,19 +76,18 @@ $translations = array(
|
||||
'database' => 'basis data',
|
||||
'Use' => 'Gunakan',
|
||||
'Select database' => 'Pilih basis data',
|
||||
'Invalid database.' => 'Basis data invalid.',
|
||||
'Create new database' => 'Buat basis data baru',
|
||||
'Invalid database.' => 'Basis data tidak sah.',
|
||||
'Database has been dropped.' => 'Basis data berhasil dihapus.',
|
||||
'Databases have been dropped.' => 'Basis data berhasil dihapus.',
|
||||
'Database has been created.' => 'Basis data berhasil dibuat.',
|
||||
'Database has been renamed.' => 'Basis data berhasil diganti nama.',
|
||||
'Database has been renamed.' => 'Basis data berhasil diganti namanya.',
|
||||
'Database has been altered.' => 'Basis data berhasil diubah.',
|
||||
'Alter database' => 'Ubah basis data',
|
||||
'Create database' => 'Buat basis data',
|
||||
'Database schema' => 'Skema basis data',
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'Tautan permanen',
|
||||
'Permanent link' => 'Pranala permanen',
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => '.',
|
||||
@@ -113,9 +112,9 @@ $translations = array(
|
||||
'Tables have been copied.' => 'Tabel berhasil disalin.',
|
||||
|
||||
'Routines' => 'Rutin',
|
||||
'Routine has been called, %d row(s) affected.' => array('Rutin telah dipanggil, %d baris terpengaruh.', 'Rutin telah dipanggil, %d baris terpengaruh'),
|
||||
'Routine has been called, %d row(s) affected.' => 'Rutin telah dipanggil, %d baris terpengaruh.',
|
||||
'Call' => 'Panggilan',
|
||||
'Parameter name' => 'Nama paramater',
|
||||
'Parameter name' => 'Nama parameter',
|
||||
'Create procedure' => 'Buat prosedur',
|
||||
'Create function' => 'Buat fungsi',
|
||||
'Routine has been dropped.' => 'Rutin berhasil dihapus.',
|
||||
@@ -123,14 +122,14 @@ $translations = array(
|
||||
'Routine has been created.' => 'Rutin berhasil dibuat.',
|
||||
'Alter function' => 'Ubah fungsi',
|
||||
'Alter procedure' => 'Ubah prosedur',
|
||||
'Return type' => 'Jenis balikan',
|
||||
'Return type' => 'Jenis pengembalian',
|
||||
|
||||
'Events' => 'Peristiwa',
|
||||
'Event has been dropped.' => 'Peristiwa berhasil dihapus.',
|
||||
'Event has been altered.' => 'Peristiwa berhasil diubah.',
|
||||
'Event has been created.' => 'Peristiwa berhasil dibuat.',
|
||||
'Alter event' => 'Ubah peristiwa',
|
||||
'Create event' => 'Buat peristiwa',
|
||||
'Events' => 'Even',
|
||||
'Event has been dropped.' => 'Even berhasil dihapus.',
|
||||
'Event has been altered.' => 'Even berhasil diubah.',
|
||||
'Event has been created.' => 'Even berhasil dibuat.',
|
||||
'Alter event' => 'Ubah even',
|
||||
'Create event' => 'Buat even',
|
||||
'At given time' => 'Pada waktu tertentu',
|
||||
'Every' => 'Setiap',
|
||||
'Schedule' => 'Jadwal',
|
||||
@@ -141,7 +140,7 @@ $translations = array(
|
||||
'Tables' => 'Tabel',
|
||||
'Tables and views' => 'Tabel dan tampilan',
|
||||
'Table' => 'Tabel',
|
||||
'No tables.' => 'Tiada tabel.',
|
||||
'No tables.' => 'Tidak ada tabel.',
|
||||
'Alter table' => 'Ubah tabel',
|
||||
'Create table' => 'Buat tabel',
|
||||
'Table has been dropped.' => 'Tabel berhasil dihapus.',
|
||||
@@ -156,16 +155,16 @@ $translations = array(
|
||||
'Column name' => 'Nama kolom',
|
||||
'Type' => 'Jenis',
|
||||
'Length' => 'Panjang',
|
||||
'Auto Increment' => 'Kenaikan Otomatis',
|
||||
'Auto Increment' => 'Inkrementasi Otomatis',
|
||||
'Options' => 'Opsi',
|
||||
'Comment' => 'Komentar',
|
||||
'Default values' => 'Nilai bawaan',
|
||||
'Drop' => 'Hapus',
|
||||
'Are you sure?' => 'Anda yakin',
|
||||
'Are you sure?' => 'Anda yakin?',
|
||||
'Move up' => 'Naik',
|
||||
'Move down' => 'Turun',
|
||||
'Remove' => 'Hapus',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Jumlah ruas maksimum yang diizinkan dilewati. Harap naikkan %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Sudah lebih dumlah ruas maksimum yang diizinkan. Harap naikkan %s.',
|
||||
|
||||
'Partition by' => 'Partisi menurut',
|
||||
'Partitions' => 'Partisi',
|
||||
@@ -202,15 +201,15 @@ $translations = array(
|
||||
'ON UPDATE' => 'ON UPDATE',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kolom sumber dan sasaran harus memiliki jenis data yang sama. Kolom sasaran harus memiliki indeks dan data rujukan harus ada.',
|
||||
|
||||
'Triggers' => 'Picu',
|
||||
'Add trigger' => 'Tambah picu',
|
||||
'Trigger has been dropped.' => 'Picu berhasil dihapus.',
|
||||
'Trigger has been altered.' => 'Picu berhasil diubah.',
|
||||
'Trigger has been created.' => 'Picu berhasil dibuat.',
|
||||
'Alter trigger' => 'Ubah picu',
|
||||
'Create trigger' => 'Buat picu',
|
||||
'Triggers' => 'Pemicu',
|
||||
'Add trigger' => 'Tambah pemicu',
|
||||
'Trigger has been dropped.' => 'Pemicu berhasil dihapus.',
|
||||
'Trigger has been altered.' => 'Pemicu berhasil diubah.',
|
||||
'Trigger has been created.' => 'Pemicu berhasil dibuat.',
|
||||
'Alter trigger' => 'Ubah pemicu',
|
||||
'Create trigger' => 'Buat pemicu',
|
||||
'Time' => 'Waktu',
|
||||
'Event' => 'Peristiwa',
|
||||
'Event' => 'Even',
|
||||
'Name' => 'Nama',
|
||||
|
||||
'select' => 'pilih',
|
||||
@@ -221,14 +220,14 @@ $translations = array(
|
||||
'Search' => 'Cari',
|
||||
'anywhere' => 'di mana pun',
|
||||
'Search data in tables' => 'Cari data dalam tabel',
|
||||
'Sort' => 'Urutan',
|
||||
'Sort' => 'Urutkan',
|
||||
'descending' => 'menurun',
|
||||
'Limit' => 'Limit',
|
||||
'Limit' => 'Batas',
|
||||
'Text length' => 'Panjang teks',
|
||||
'Action' => 'Tindakan',
|
||||
'Full table scan' => 'Pindai tabel lengkap',
|
||||
'Unable to select the table' => 'Gagal memilih tabel',
|
||||
'No rows.' => 'Tiada baris.',
|
||||
'No rows.' => 'Tidak ada baris.',
|
||||
'%d row(s)' => '%d baris',
|
||||
'Page' => 'Halaman',
|
||||
'last' => 'terakhir',
|
||||
@@ -239,7 +238,7 @@ $translations = array(
|
||||
'%d row(s) have been imported.' => '%d baris berhasil diimpor.',
|
||||
|
||||
// in-place editing in select
|
||||
'Use edit link to modify this value.' => 'Gunakan tautan edit untuk mengubah nilai ini.',
|
||||
'Use edit link to modify this value.' => 'Gunakan pranala suntingan untuk mengubah nilai ini.',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => 'Entri%s berhasil disisipkan.',
|
||||
@@ -247,30 +246,30 @@ $translations = array(
|
||||
'Item has been updated.' => 'Entri berhasil diperbarui.',
|
||||
'%d item(s) have been affected.' => '%d entri terpengaruh.',
|
||||
'New item' => 'Entri baru',
|
||||
'original' => 'orisinal',
|
||||
'original' => 'asli',
|
||||
// label for value '' in enum data type
|
||||
'empty' => 'kosong',
|
||||
'edit' => 'edit',
|
||||
'Edit' => 'Edit',
|
||||
'edit' => 'sunting',
|
||||
'Edit' => 'Sunting',
|
||||
'Insert' => 'Sisipkan',
|
||||
'Save' => 'Simpan',
|
||||
'Save and continue edit' => 'Simpan dan terus mengedit',
|
||||
'Save and insert next' => 'Simpan dan sisipkan yang lain',
|
||||
'Save and continue edit' => 'Simpan dan lanjut menyunting',
|
||||
'Save and insert next' => 'Simpan dan sisipkan berikutnya',
|
||||
'Clone' => 'Gandakan',
|
||||
'Delete' => 'Hapus',
|
||||
|
||||
'E-mail' => 'Surel',
|
||||
'From' => 'Dari',
|
||||
'Subject' => 'Subjek',
|
||||
'Subject' => 'Judul',
|
||||
'Attachments' => 'Lampiran',
|
||||
'Send' => 'Kirim',
|
||||
'%d e-mail(s) have been sent.' => array('%d surel berhasil dikirim.', '%d surel berhasil dikirim'),
|
||||
'%d e-mail(s) have been sent.' => '%d surel berhasil dikirim.',
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Angka',
|
||||
'Date and time' => 'Tanggal dan waktu',
|
||||
'Strings' => 'String',
|
||||
'Binary' => 'Biner',
|
||||
'Binary' => 'Binari',
|
||||
'Lists' => 'Daftar',
|
||||
'Network' => 'Jaringan',
|
||||
'Geometry' => 'Geometri',
|
||||
@@ -298,7 +297,7 @@ $translations = array(
|
||||
'Schema has been created.' => 'Skema berhasil dibuat.',
|
||||
'Schema has been altered.' => 'Skema berhasil diubah.',
|
||||
'Schema' => 'Skema',
|
||||
'Invalid schema.' => 'Skema invalid.',
|
||||
'Invalid schema.' => 'Skema tidak sah.',
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Deret',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Password',
|
||||
'Select database' => 'Seleziona database',
|
||||
'Invalid database.' => 'Database non valido.',
|
||||
'Create new database' => 'Crea nuovo database',
|
||||
'Table has been dropped.' => 'Tabella eliminata.',
|
||||
'Table has been altered.' => 'Tabella modificata.',
|
||||
'Table has been created.' => 'Tabella creata.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'パスワード',
|
||||
'Select database' => 'データベースを選択してください',
|
||||
'Invalid database.' => '不正なデータベース',
|
||||
'Create new database' => '新規にデータベースを作成',
|
||||
'Table has been dropped.' => 'テーブルを削除しました',
|
||||
'Table has been altered.' => 'テーブルを変更しました',
|
||||
'Table has been created.' => 'テーブルを作成しました',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => '비밀번호',
|
||||
'Select database' => '데이터베이스를 선택하십시오.',
|
||||
'Invalid database.' => '잘못된 데이터베이스입니다.',
|
||||
'Create new database' => '새 데이터베이스 만들기',
|
||||
'Table has been dropped.' => '테이블을 삭제했습니다.',
|
||||
'Table has been altered.' => '테이블을 변경했습니다.',
|
||||
'Table has been created.' => '테이블을 만들었습니다.',
|
||||
|
@@ -77,7 +77,6 @@ $translations = array(
|
||||
'Use' => 'Naudoti',
|
||||
'Select database' => 'Pasirinkti duomenų bazę',
|
||||
'Invalid database.' => 'Neteisinga duomenų bazė.',
|
||||
'Create new database' => 'Sukurti naują duomenų bazę',
|
||||
'Database has been dropped.' => 'Duomenų bazė panaikinta.',
|
||||
'Databases have been dropped.' => 'Duomenų bazės panaikintos.',
|
||||
'Database has been created.' => 'Duomenų bazė sukurta.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Wachtwoord',
|
||||
'Select database' => 'Database selecteren',
|
||||
'Invalid database.' => 'Ongeldige database.',
|
||||
'Create new database' => 'Nieuwe database',
|
||||
'Table has been dropped.' => 'Tabel verwijderd.',
|
||||
'Table has been altered.' => 'Tabel aangepast.',
|
||||
'Table has been created.' => 'Tabel aangemaakt.',
|
||||
@@ -61,7 +60,7 @@ $translations = array(
|
||||
'Action' => 'Acties',
|
||||
'edit' => 'bewerk',
|
||||
'Page' => 'Pagina',
|
||||
'Query executed OK, %d row(s) affected.' => array('Query uitgevoerd, %d rij geraakt.', 'Query uitgevoerd, %d rijen geraakt.'),
|
||||
'Query executed OK, %d row(s) affected.' => array('Query uitgevoerd, %d rij geraakt.', 'Query uitgevoerd, %d rijen beïnvloed.'),
|
||||
'Error in query' => 'Fout in query',
|
||||
'Execute' => 'Uitvoeren',
|
||||
'Table' => 'Tabel',
|
||||
|
@@ -68,7 +68,6 @@ $translations = array(
|
||||
'Use' => 'Bruk',
|
||||
'Select database' => 'Velg database',
|
||||
'Invalid database.' => 'Ugyldig database.',
|
||||
'Create new database' => 'Lag ny database',
|
||||
'Database has been dropped.' => 'Databasen har blitt slettet.',
|
||||
'Databases have been dropped.' => 'Databasene har blitt slettet.',
|
||||
'Database has been created.' => 'Databasen er opprettet.',
|
||||
|
@@ -82,7 +82,6 @@ $translations = array(
|
||||
'Use' => 'Wybierz',
|
||||
'Select database' => 'Wybierz bazę danych',
|
||||
'Invalid database.' => 'Nie znaleziono bazy danych.',
|
||||
'Create new database' => 'Utwórz nową bazę danych',
|
||||
'Database has been dropped.' => 'Baza danych została usunięta.',
|
||||
'Databases have been dropped.' => 'Bazy danych zostały usunięte.',
|
||||
'Database has been created.' => 'Baza danych została utworzona.',
|
||||
@@ -182,13 +181,12 @@ $translations = array(
|
||||
'Values' => 'Wartości',
|
||||
|
||||
'View' => 'Perspektywa',
|
||||
'Materialized View' => 'Zmaterializowana perspektywa',
|
||||
'Materialized view' => 'Zmaterializowana perspektywa',
|
||||
'View has been dropped.' => 'Perspektywa została usunięta.',
|
||||
'View has been altered.' => 'Perspektywa została zmieniona.',
|
||||
'View has been created.' => 'Perspektywa została utworzona.',
|
||||
'Alter view' => 'Zmień perspektywę',
|
||||
'Create view' => 'Utwórz perspektywę',
|
||||
'Create materialized view' => 'Utwórz zmaterializowaną perspektywę',
|
||||
|
||||
'Indexes' => 'Indeksy',
|
||||
'Indexes have been altered.' => 'Indeksy zostały zmienione.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Senha',
|
||||
'Select database' => 'Selecionar Base de dados',
|
||||
'Invalid database.' => 'Base de dados inválida.',
|
||||
'Create new database' => 'Criar nova base de dados',
|
||||
'Table has been dropped.' => 'A Tabela foi eliminada.',
|
||||
'Table has been altered.' => 'A Tabela foi alterada.',
|
||||
'Table has been created.' => 'A Tabela foi criada.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Senha',
|
||||
'Select database' => 'Selecionar Base de dados',
|
||||
'Invalid database.' => 'Base de dados inválida.',
|
||||
'Create new database' => 'Criar nova base de dados',
|
||||
'Table has been dropped.' => 'Tabela eliminada.',
|
||||
'Table has been altered.' => 'Tabela modificada.',
|
||||
'Table has been created.' => 'Tabela criada.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Parola',
|
||||
'Select database' => 'Alege baza de date',
|
||||
'Invalid database.' => 'Bază de deate invalidă.',
|
||||
'Create new database' => 'Crează o bază de date nouă',
|
||||
'Table has been dropped.' => 'Tabelul a fost șters.',
|
||||
'Table has been altered.' => 'Tabelul a fost modificat.',
|
||||
'Table has been created.' => 'Tabelul a fost creat.',
|
||||
|
@@ -7,15 +7,14 @@ $translations = array(
|
||||
'Username' => 'Имя пользователя',
|
||||
'Password' => 'Пароль',
|
||||
'Select database' => 'Выбрать базу данных',
|
||||
'Invalid database.' => 'Плохая база данных.',
|
||||
'Create new database' => 'Создать новую базу данных',
|
||||
'Invalid database.' => 'Неверная база данных.',
|
||||
'Table has been dropped.' => 'Таблица была удалена.',
|
||||
'Table has been altered.' => 'Таблица была изменена.',
|
||||
'Table has been created.' => 'Таблица была создана.',
|
||||
'Alter table' => 'Изменить таблицу',
|
||||
'Create table' => 'Создать таблицу',
|
||||
'Table name' => 'Название таблицы',
|
||||
'engine' => 'тип',
|
||||
'engine' => 'Тип таблицы',
|
||||
'collation' => 'режим сопоставления',
|
||||
'Column name' => 'Название поля',
|
||||
'Type' => 'Тип',
|
||||
@@ -30,7 +29,7 @@ $translations = array(
|
||||
'Database has been altered.' => 'База данных была изменена.',
|
||||
'Alter database' => 'Изменить базу данных',
|
||||
'Create database' => 'Создать базу данных',
|
||||
'SQL command' => 'SQL запрос',
|
||||
'SQL command' => 'SQL-запрос',
|
||||
'Logout' => 'Выйти',
|
||||
'database' => 'база данных',
|
||||
'Use' => 'Выбрать',
|
||||
@@ -68,7 +67,7 @@ $translations = array(
|
||||
'Triggers' => 'Триггеры',
|
||||
'View' => 'Представление',
|
||||
'Unable to select the table' => 'Не удалось получить данные из таблицы',
|
||||
'Invalid CSRF token. Send the form again.' => 'Недействительный CSRF токен. Отправите форму ещё раз.',
|
||||
'Invalid CSRF token. Send the form again.' => 'Недействительный CSRF-токен. Отправите форму ещё раз.',
|
||||
'Comment' => 'Комментарий',
|
||||
'Default values' => 'Значения по умолчанию',
|
||||
'%d byte(s)' => array('%d байт', '%d байта', '%d байтов'),
|
||||
@@ -91,13 +90,13 @@ $translations = array(
|
||||
'Change' => 'Изменить',
|
||||
'Source' => 'Источник',
|
||||
'Target' => 'Цель',
|
||||
'Add column' => 'Добавить колонку',
|
||||
'Add column' => 'Добавить поле',
|
||||
'Alter' => 'Изменить',
|
||||
'Add foreign key' => 'Добавить внешний ключ',
|
||||
'ON DELETE' => 'При стирании',
|
||||
'ON UPDATE' => 'При обновлении',
|
||||
'Index Type' => 'Тип индекса',
|
||||
'Column (length)' => 'Колонка (длина)',
|
||||
'Column (length)' => 'Поле (длина)',
|
||||
'View has been dropped.' => 'Представление было удалено.',
|
||||
'View has been altered.' => 'Представление было изменено.',
|
||||
'View has been created.' => 'Представление было создано.',
|
||||
@@ -135,11 +134,11 @@ $translations = array(
|
||||
'User has been altered.' => 'Пользователь был изменён.',
|
||||
'User has been created.' => 'Пользователь был создан.',
|
||||
'Hashed' => 'Хешировано',
|
||||
'Column' => 'Колонка',
|
||||
'Column' => 'поле',
|
||||
'Routine' => 'Процедура',
|
||||
'Grant' => 'Позволить',
|
||||
'Revoke' => 'Запретить',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Слишком большой объем POST-данных. Пошлите меньший объем данных или увеличьте параметр конфигурационной директивы %s.',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Слишком большой объем POST-данных. Пошлите меньший объём данных или увеличьте параметр конфигурационной директивы %s.',
|
||||
'Logged as: %s' => 'Вы вошли как: %s',
|
||||
'Move up' => 'Переместить вверх',
|
||||
'Move down' => 'Переместить вниз',
|
||||
@@ -182,7 +181,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'Таблицы были перемещены.',
|
||||
'Move to other database' => 'Переместить в другую базу данных',
|
||||
'Move' => 'Переместить',
|
||||
'Engine' => 'Тип',
|
||||
'Engine' => 'Тип таблиц',
|
||||
'Save and continue edit' => 'Сохранить и продолжить редактирование',
|
||||
'original' => 'исходный',
|
||||
'%d item(s) have been affected.' => array('Была изменена %d запись.', 'Были изменены %d записи.', 'Было изменено %d записей.'),
|
||||
@@ -203,20 +202,20 @@ $translations = array(
|
||||
'[yyyy]-mm-dd' => 'дд.мм.[гггг]',
|
||||
'History' => 'История',
|
||||
'Variables' => 'Переменные',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Колонки должны иметь одинаковые типы данных, в результирующей колонке должен быть индекс, данные для импорта должны существовать.',
|
||||
'Relations' => 'Реляции',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Поля должны иметь одинаковые типы данных, в результирующем поле должен быть индекс, данные для импорта должны существовать.',
|
||||
'Relations' => 'Отношения',
|
||||
'Run file' => 'Запустить файл',
|
||||
'Clear' => 'Очистить',
|
||||
'Maximum allowed file size is %sB.' => 'Максимальный разрешённый размер файла - %sB.',
|
||||
'Numbers' => 'Число',
|
||||
'Maximum allowed file size is %sB.' => 'Максимальный разрешённый размер файла — %sB.',
|
||||
'Numbers' => 'Числа',
|
||||
'Date and time' => 'Дата и время',
|
||||
'Strings' => 'Строки',
|
||||
'Binary' => 'Двоичный тип',
|
||||
'Lists' => 'Списки',
|
||||
'Editor' => 'Редактор',
|
||||
'E-mail' => 'Электропочта',
|
||||
'E-mail' => 'Эл. почта',
|
||||
'From' => 'От',
|
||||
'Subject' => 'Кому',
|
||||
'Subject' => 'Тема',
|
||||
'Send' => 'Послать',
|
||||
'%d e-mail(s) have been sent.' => array('Было отправлено %d письмо.', 'Было отправлено %d письма.', 'Было отправлено %d писем.'),
|
||||
'Webserver file %s' => 'Файл %s на вебсервере',
|
||||
@@ -242,7 +241,7 @@ $translations = array(
|
||||
'Alter type' => 'Изменить тип',
|
||||
'Type has been dropped.' => 'Тип удален.',
|
||||
'Type has been created.' => 'Создан новый тип.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+кликни по значению, чтобы его изменить.',
|
||||
'Ctrl+click on a value to modify it.' => 'Выполните Ctrl+Щелчок мышью по значению, чтобы его изменить.',
|
||||
'Use edit link to modify this value.' => 'Изменить это значение можно с помощью ссылки «изменить».',
|
||||
'last' => 'последняя',
|
||||
'From server' => 'С сервера',
|
||||
@@ -266,4 +265,29 @@ $translations = array(
|
||||
'Permanent link' => 'Постоянная ссылка',
|
||||
'Edit all' => 'Редактировать всё',
|
||||
'HH:MM:SS' => 'ЧЧ:ММ:СС',
|
||||
'Tables have been optimized.' => 'Таблицы оптимизированы.',
|
||||
'Materialized view' => 'Материализованное представление',
|
||||
'Vacuum' => 'Вакуум',
|
||||
'Selected' => 'Выбранные',
|
||||
'File must be in UTF-8 encoding.' => 'Файл должен быть в кодировке UTF-8.',
|
||||
'Modify' => 'Изменить',
|
||||
'Loading' => 'Загрузка',
|
||||
'Load more data' => 'Загрузить ещё данные',
|
||||
'ATTACH queries are not supported.' => 'ATTACH-запросы не поддерживаются.',
|
||||
'%d / ' => '%d / ',
|
||||
'Limit rows' => 'Лимит строк',
|
||||
'<a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to use SQLite.' => '<a href="https://www.adminer.org/en/extension/" target="_blank">Реализуйте</a> метод %s, чтобы использовать SQLite.',
|
||||
'Default value' => 'Значение по умолчанию',
|
||||
'Full table scan' => 'Анализ полной таблицы',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => array('Слишком много неудачных попыток входа. Попробуйте снова через %d минуту.', 'Слишком много неудачных попыток входа. Попробуйте снова через %d минуты.', 'Слишком много неудачных попыток входа. Попробуйте снова через %d минут.'),
|
||||
'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, чтобы сделать его постоянным.',
|
||||
'If you did not send this request from Adminer then close this page.' => 'Если вы не посылали этот запрос из Adminer, закройте эту страницу.',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => 'Вы можете закачать большой SQL-файл по FTP и затем импортировать его с сервера.',
|
||||
'Size' => 'Размер',
|
||||
'Compute' => 'Вычислить',
|
||||
'You are offline.' => 'Вы не выполнили вход.',
|
||||
'You have no privileges to update this table.' => 'У вас нет прав на обновление этой таблицы.',
|
||||
'Saving' => 'Сохранение',
|
||||
'yes' => 'Да',
|
||||
'no' => 'Нет',
|
||||
);
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'Heslo',
|
||||
'Select database' => 'Vybrať databázu',
|
||||
'Invalid database.' => 'Nesprávna databáza.',
|
||||
'Create new database' => 'Vytvoriť novú databázu',
|
||||
'Table has been dropped.' => 'Tabuľka bola odstránená.',
|
||||
'Table has been altered.' => 'Tabuľka bola zmenená.',
|
||||
'Table has been created.' => 'Tabuľka bola vytvorená.',
|
||||
|
@@ -76,7 +76,6 @@ $translations = array(
|
||||
'Use' => 'Uporabi',
|
||||
'Select database' => 'Izberi bazo',
|
||||
'Invalid database.' => 'Neveljavna baza.',
|
||||
'Create new database' => 'Ustvari novo bazo',
|
||||
'Database has been dropped.' => 'Baza je zavržena.',
|
||||
'Databases have been dropped.' => 'Baze so zavržene.',
|
||||
'Database has been created.' => 'Baza je ustvarjena.',
|
||||
|
@@ -77,7 +77,6 @@ $translations = array(
|
||||
'Use' => 'Користи',
|
||||
'Select database' => 'Изаберите базу',
|
||||
'Invalid database.' => 'Неисправна база података.',
|
||||
'Create new database' => 'Направи нову базу података',
|
||||
'Database has been dropped.' => 'База података је избрисана.',
|
||||
'Databases have been dropped.' => 'Базњ података су избрисане.',
|
||||
'Database has been created.' => 'База података је креирана.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'கடவுச்சொல்',
|
||||
'Select database' => 'தகவல்தளத்தை தேர்வு செய்',
|
||||
'Invalid database.' => 'தகவல்தளம் சரியானதல்ல.',
|
||||
'Create new database' => 'புதிய தகவல்தளத்தை உருவாக்கு',
|
||||
'Table has been dropped.' => 'அட்டவணை நீக்கப்பட்டது.',
|
||||
'Table has been altered.' => 'அட்டவணை மாற்றப்பட்டது.',
|
||||
'Table has been created.' => 'அட்டவணை உருவாக்கப்பட்டது.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => 'รหัสผ่าน',
|
||||
'Select database' => 'เลือกฐานข้อมูล',
|
||||
'Invalid database.' => 'ฐานข้อมูลไม่ถูกต้อง.',
|
||||
'Create new database' => 'สร้างฐานข้อมูลใหม่',
|
||||
'Table has been dropped.' => 'ลบตารางแล้ว.',
|
||||
'Table has been altered.' => 'แก้ไขตารางแล้ว.',
|
||||
'Table has been created.' => 'สร้างตารางใหม่แล้ว.',
|
||||
|
@@ -77,7 +77,6 @@ $translations = array(
|
||||
'Use' => 'Kullan',
|
||||
'Select database' => 'Veri tabanı seç',
|
||||
'Invalid database.' => 'Geçersiz veri tabanı.',
|
||||
'Create new database' => 'Yeni veri tabanı oluştur',
|
||||
'Database has been dropped.' => 'Veri tabanı silindi.',
|
||||
'Databases have been dropped.' => 'Veritabanları silindi.',
|
||||
'Database has been created.' => 'Veri tabanı oluşturuldu.',
|
||||
|
@@ -77,7 +77,6 @@ $translations = array(
|
||||
'Use' => 'Обрати',
|
||||
'Select database' => 'Обрати базу даних',
|
||||
'Invalid database.' => 'Погана база даних.',
|
||||
'Create new database' => 'Створити нову базу даних',
|
||||
'Database has been dropped.' => 'Базу даних було видалено.',
|
||||
'Databases have been dropped.' => 'Бази даних були видалені.',
|
||||
'Database has been created.' => 'Базу даних було створено.',
|
||||
|
@@ -80,7 +80,6 @@ $translations = array(
|
||||
'Use' => 'Sử dụng',
|
||||
'Select database' => 'Chọn CSDL',
|
||||
'Invalid database.' => 'CSDL sai.',
|
||||
'Create new database' => 'Tạo CSDL',
|
||||
'Database has been dropped.' => 'CSDL đã bị xoá.',
|
||||
'Databases have been dropped.' => 'Các CSDL đã bị xoá.',
|
||||
'Database has been created.' => 'Đã tạo CSDL.',
|
||||
|
@@ -10,8 +10,9 @@ $translations = array(
|
||||
'Logout' => 'Xx',
|
||||
'Logged as: %s' => 'Xx',
|
||||
'Logout successful.' => 'Xx.',
|
||||
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Xx.',
|
||||
'Invalid credentials.' => 'Xx.',
|
||||
'Implement %s method to use SQLite.' => 'Xx.',
|
||||
'<a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to use SQLite.' => 'Xx.',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => array('Xx.', 'Xx.'),
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Xx.',
|
||||
'Language' => 'Xx',
|
||||
@@ -85,7 +86,6 @@ $translations = array(
|
||||
'Use' => 'Xx',
|
||||
'Select database' => 'Xx',
|
||||
'Invalid database.' => 'Xx.',
|
||||
'Create new database' => 'Xx',
|
||||
'Database has been dropped.' => 'Xx.',
|
||||
'Databases have been dropped.' => 'Xx.',
|
||||
'Database has been created.' => 'Xx.',
|
||||
@@ -185,13 +185,12 @@ $translations = array(
|
||||
'Values' => 'Xx',
|
||||
|
||||
'View' => 'Xx',
|
||||
'Materialized View' => 'Xx',
|
||||
'Materialized view' => 'Xx',
|
||||
'View has been dropped.' => 'Xx.',
|
||||
'View has been altered.' => 'Xx.',
|
||||
'View has been created.' => 'Xx.',
|
||||
'Alter view' => 'Xx',
|
||||
'Create view' => 'Xx',
|
||||
'Create materialized view' => 'Xx',
|
||||
|
||||
'Indexes' => 'Xx',
|
||||
'Indexes have been altered.' => 'Xx.',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => '密碼',
|
||||
'Select database' => '選擇資料庫',
|
||||
'Invalid database.' => '無效的資料庫。',
|
||||
'Create new database' => '建立新資料庫',
|
||||
'Table has been altered.' => '資料表已修改。',
|
||||
'Table has been created.' => '資料表已修改。',
|
||||
'Alter table' => '修改資料表',
|
||||
|
@@ -8,7 +8,6 @@ $translations = array(
|
||||
'Password' => '密码',
|
||||
'Select database' => '选择数据库',
|
||||
'Invalid database.' => '无效数据库。',
|
||||
'Create new database' => '创建新数据库',
|
||||
'Table has been dropped.' => '已删除表。',
|
||||
'Table has been altered.' => '已修改表。',
|
||||
'Table has been created.' => '已创建表。',
|
||||
|
@@ -17,7 +17,7 @@ function adminer_object() {
|
||||
new AdminerDumpXml,
|
||||
new AdminerDumpAlter,
|
||||
//~ new AdminerSqlLog("past-" . rtrim(`git describe --tags --abbrev=0`) . ".sql"),
|
||||
//~ 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"),
|
||||
//~ new AdminerEditCalendar(script_src("../externals/jquery-ui/jquery-1.4.4.js") . script_src("../externals/jquery-ui/ui/jquery.ui.core.js") . script_src("../externals/jquery-ui/ui/jquery.ui.widget.js") . script_src("../externals/jquery-ui/ui/jquery.ui.datepicker.js") . script_src("../externals/jquery-ui/ui/jquery.ui.mouse.js") . script_src("../externals/jquery-ui/ui/jquery.ui.slider.js") . script_src("../externals/jquery-timepicker/jquery-ui-timepicker-addon.js") . "<link rel='stylesheet' href='../externals/jquery-ui/themes/base/jquery.ui.all.css'>\n<style>\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"),
|
||||
//~ new AdminerTinymce("../externals/tinymce/jscripts/tiny_mce/tiny_mce_dev.js"),
|
||||
//~ 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")),
|
||||
new AdminerFileUpload(""),
|
||||
|
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
page_header(lang('Privileges'));
|
||||
|
||||
echo '<p class="links"><a href="' . h(ME) . 'user=">' . lang('Create user') . "</a>";
|
||||
|
||||
$result = $connection->query("SELECT User, Host FROM mysql." . (DB == "" ? "user" : "db WHERE " . q(DB) . " LIKE Db") . " ORDER BY Host, User");
|
||||
$grant = $result;
|
||||
if (!$result) {
|
||||
@@ -25,5 +27,3 @@ if (!$grant || DB != "") {
|
||||
|
||||
echo "</table>\n";
|
||||
echo "</form>\n";
|
||||
|
||||
echo '<p class="links"><a href="' . h(ME) . 'user=">' . lang('Create user') . "</a>";
|
||||
|
@@ -49,6 +49,6 @@ if (isset($_GET["function"])) {
|
||||
<p><?php textarea("definition", $row["definition"]); ?>
|
||||
<p>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php if ($PROCEDURE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<?php if ($PROCEDURE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(); ?><?php } ?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
|
@@ -13,8 +13,9 @@ page_header(lang('Process list'), $error);
|
||||
?>
|
||||
|
||||
<form action="" method="post">
|
||||
<table cellspacing="0" onclick="tableClick(event);" ondblclick="tableClick(event, true);" class="nowrap checkable">
|
||||
<table cellspacing="0" class="nowrap checkable">
|
||||
<?php
|
||||
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
|
||||
// HTML valid because there is always at least one process
|
||||
$i = -1;
|
||||
foreach (process_list() as $i => $row) {
|
||||
@@ -44,7 +45,7 @@ foreach (process_list() as $i => $row) {
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
<script type='text/javascript'>tableCheck();</script>
|
||||
<?php echo script("tableCheck();"); ?>
|
||||
<p>
|
||||
<?php
|
||||
if (support("kill")) {
|
||||
|
@@ -48,19 +48,19 @@ foreach (table_status('', true) as $table => $table_status) {
|
||||
}
|
||||
|
||||
?>
|
||||
<div id="schema" style="height: <?php echo $top; ?>em;" onselectstart="return false;">
|
||||
<script type="text/javascript">
|
||||
<div id="schema" style="height: <?php echo $top; ?>em;">
|
||||
<script<?php echo nonce(); ?>>
|
||||
qs('#schema').onselectstart = function () { return false; };
|
||||
var tablePos = {<?php echo implode(",", $table_pos_js) . "\n"; ?>};
|
||||
var em = document.getElementById('schema').offsetHeight / <?php echo $top; ?>;
|
||||
var em = qs('#schema').offsetHeight / <?php echo $top; ?>;
|
||||
document.onmousemove = schemaMousemove;
|
||||
document.onmouseup = function (ev) {
|
||||
schemaMouseup(ev, '<?php echo js_escape(DB); ?>');
|
||||
};
|
||||
document.onmouseup = partialArg(schemaMouseup, '<?php echo js_escape(DB); ?>');
|
||||
</script>
|
||||
<?php
|
||||
foreach ($schema as $name => $table) {
|
||||
echo "<div class='table' style='top: " . $table["pos"][0] . "em; left: " . $table["pos"][1] . "em;' onmousedown='schemaMousedown(this, event);'>";
|
||||
echo "<div class='table' style='top: " . $table["pos"][0] . "em; left: " . $table["pos"][1] . "em;'>";
|
||||
echo '<a href="' . h(ME) . 'table=' . urlencode($name) . '"><b>' . h($name) . "</b></a>";
|
||||
echo script("qsl('div').onmousedown = schemaMousedown;");
|
||||
|
||||
foreach ($table["fields"] as $field) {
|
||||
$val = '<span' . type_class($field["type"]) . ' title="' . h($field["full_type"] . ($field["null"] ? " NULL" : '')) . '">' . h($field["field"]) . '</span>';
|
||||
|
@@ -27,11 +27,11 @@ if (!$row) {
|
||||
|
||||
<form action="" method="post">
|
||||
<p><input name="name" id="name" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
|
||||
<script type='text/javascript'>focus(document.getElementById('name'));</script>
|
||||
<?php echo script("focus(qs('#name'));"); ?>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php
|
||||
if ($_GET["ns"] != "") {
|
||||
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
|
||||
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . confirm() . "\n";
|
||||
}
|
||||
?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
|
@@ -205,7 +205,7 @@ if ($_POST && !$error) {
|
||||
}
|
||||
$result = (!$rows || $driver->insertUpdate($TABLE, $rows, $primary));
|
||||
if ($result) {
|
||||
$driver->commit();
|
||||
$result = $driver->commit();
|
||||
}
|
||||
queries_redirect(remove_from_uri("page"), lang('%d row(s) have been imported.', $affected), $result);
|
||||
$driver->rollback(); // after queries_redirect() to not overwrite error
|
||||
@@ -226,7 +226,7 @@ $set = null;
|
||||
if (isset($rights["insert"]) || !support("table")) {
|
||||
$set = "";
|
||||
foreach ((array) $_GET["where"] as $val) {
|
||||
if (count($foreign_keys[$val["col"]]) == 1 && ($val["op"] == "="
|
||||
if ($foreign_keys[$val["col"]] && count($foreign_keys[$val["col"]]) == 1 && ($val["op"] == "="
|
||||
|| (!$val["op"] && !preg_match('~[_%]~', $val["val"])) // LIKE in Editor
|
||||
)) {
|
||||
$set .= "&set" . urlencode("[" . bracket_escape($val["col"]) . "]") . "=" . urlencode($val["val"]);
|
||||
@@ -288,7 +288,7 @@ if (!$columns && support("table")) {
|
||||
}
|
||||
|
||||
// use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest)
|
||||
if ($_GET["page"] != "last" && +$limit && $group && $is_group && $jush == "sql") {
|
||||
if ($_GET["page"] != "last" && $limit != "" && $group && $is_group && $jush == "sql") {
|
||||
$found_rows = $connection->result(" SELECT FOUND_ROWS()"); // space to allow mysql.trace_mode
|
||||
}
|
||||
|
||||
@@ -297,8 +297,12 @@ if (!$columns && support("table")) {
|
||||
} else {
|
||||
$backward_keys = $adminer->backwardKeys($TABLE, $table_name);
|
||||
|
||||
echo "<table id='table' cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);' onkeydown='return editingKeydown(event);'>\n";
|
||||
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>");
|
||||
echo "<table id='table' cellspacing='0' class='nowrap checkable'>";
|
||||
echo script("mixin(qs('#table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true), onkeydown: editingKeydown});");
|
||||
echo "<thead><tr>" . (!$group && $select
|
||||
? ""
|
||||
: "<td><input type='checkbox' id='all-page' class='jsonly'>" . script("qs('#all-page').onclick = partial(formCheck, /check/);", "")
|
||||
. " <a href='" . h($_GET["modify"] ? remove_from_uri("modify") : $_SERVER["REQUEST_URI"] . "&modify=1") . "'>" . lang('Modify') . "</a>");
|
||||
$names = array();
|
||||
$functions = array();
|
||||
reset($select);
|
||||
@@ -314,13 +318,14 @@ if (!$columns && support("table")) {
|
||||
$column = idf_escape($key);
|
||||
$href = remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key);
|
||||
$desc = "&desc%5B0%5D=1";
|
||||
echo '<th onmouseover="columnMouse(this);" onmouseout="columnMouse(this, \' hidden\');">';
|
||||
echo "<th>" . script("mixin(qsl('th'), {onmouseover: partial(columnMouse), onmouseout: partial(columnMouse, ' hidden')});", "");
|
||||
echo '<a href="' . h($href . ($order[0] == $column || $order[0] == $key || (!$order && $is_group && $group[0] == $column) ? $desc : '')) . '">'; // $order[0] == $key - COUNT(*)
|
||||
echo apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions
|
||||
echo "<span class='column hidden'>";
|
||||
echo "<a href='" . h($href . $desc) . "' title='" . lang('descending') . "' class='text'> ↓</a>";
|
||||
if (!$val["fun"]) {
|
||||
echo '<a href="#fieldset-search" onclick="selectSearch(\'' . h(js_escape($key)) . '\'); return false;" title="' . lang('Search') . '" class="text jsonly"> =</a>';
|
||||
echo '<a href="#fieldset-search" title="' . lang('Search') . '" class="text jsonly"> =</a>';
|
||||
echo script("qsl('a').onclick = partial(selectSearch, '" . js_escape($key) . "');");
|
||||
}
|
||||
echo "</span>";
|
||||
}
|
||||
@@ -387,6 +392,9 @@ if (!$columns && support("table")) {
|
||||
$link .= where_link($i, $foreign_key["target"][$i], $rows[$n][$source]);
|
||||
}
|
||||
$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
|
||||
if ($foreign_key["ns"]) {
|
||||
$link = preg_replace('~([?&]ns=)[^&]+~', '\\1' . urlencode($foreign_key["ns"]), $link);
|
||||
}
|
||||
if (count($foreign_key["source"]) == 1) {
|
||||
break;
|
||||
}
|
||||
@@ -416,7 +424,8 @@ if (!$columns && support("table")) {
|
||||
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]'>");
|
||||
} else {
|
||||
$long = strpos($val, "<i>...</i>");
|
||||
echo "<td id='$id' onclick=\"selectClick(this, event, " . ($long ? 2 : ($text ? 1 : 0)) . ($editable ? "" : ", '" . h(lang('Use edit link to modify this value.')) . "'") . ");\">$val";
|
||||
echo "<td id='$id'>$val</td>";
|
||||
echo script("qsl('td').onclick = partialArg(selectClick, " . ($long ? 2 : ($text ? 1 : 0)) . ($editable ? "" : ", '" . h(lang('Use edit link to modify this value.')) . "'") . ");", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -437,7 +446,7 @@ if (!$columns && support("table")) {
|
||||
if (($rows || $page) && !is_ajax()) {
|
||||
$exact_count = true;
|
||||
if ($_GET["page"] != "last") {
|
||||
if (!+$limit) {
|
||||
if ($limit == "") {
|
||||
$found_rows = count($rows);
|
||||
} elseif ($jush != "sql" || !$is_group) {
|
||||
$found_rows = ($is_group ? false : found_rows($table_status, $where));
|
||||
@@ -450,7 +459,7 @@ if (!$columns && support("table")) {
|
||||
}
|
||||
}
|
||||
|
||||
if (+$limit && ($found_rows === false || $found_rows > $limit || $page)) {
|
||||
if ($limit != "" && ($found_rows === false || $found_rows > $limit || $page)) {
|
||||
echo "<p class='pages'>";
|
||||
// display first, previous 4, next 4 and last page
|
||||
$max_page = ($found_rows === false
|
||||
@@ -458,7 +467,8 @@ if (!$columns && support("table")) {
|
||||
: floor(($found_rows - 1) / $limit)
|
||||
);
|
||||
if ($jush != "simpledb") {
|
||||
echo '<a href="' . h(remove_from_uri("page")) . "\" onclick=\"pageClick(this.href, +prompt('" . lang('Page') . "', '" . ($page + 1) . "'), event); return false;\">" . lang('Page') . "</a>:";
|
||||
echo '<a href="' . h(remove_from_uri("page")) . '">' . lang('Page') . "</a>:";
|
||||
echo script("qsl('a').onclick = function () { pageClick(this.href, +prompt('" . lang('Page') . "', '" . ($page + 1) . "')); return false; };");
|
||||
echo pagination(0, $page) . ($page > 5 ? " ..." : "");
|
||||
for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
|
||||
echo pagination($i, $page);
|
||||
@@ -471,7 +481,8 @@ if (!$columns && support("table")) {
|
||||
);
|
||||
}
|
||||
echo (($found_rows === false ? count($rows) + 1 : $found_rows - $page * $limit) > $limit
|
||||
? ' <a href="' . h(remove_from_uri("page") . "&page=" . ($page + 1)) . '" onclick="return !selectLoadMore(this, ' . (+$limit) . ', \'' . lang('Loading') . '...\');" class="loadmore">' . lang('Load more data') . '</a>'
|
||||
? ' <a href="' . h(remove_from_uri("page") . "&page=" . ($page + 1)) . '" class="loadmore">' . lang('Load more data') . '</a>'
|
||||
. script("qsl('a').onclick = partial(selectLoadMore, " . (+$limit) . ", '" . lang('Loading') . "...');", "")
|
||||
: ''
|
||||
);
|
||||
} else {
|
||||
@@ -495,7 +506,7 @@ if (!$columns && support("table")) {
|
||||
<fieldset><legend><?php echo lang('Selected'); ?> <span id="selected"></span></legend><div>
|
||||
<input type="submit" name="edit" value="<?php echo lang('Edit'); ?>">
|
||||
<input type="submit" name="clone" value="<?php echo lang('Clone'); ?>">
|
||||
<input type="submit" name="delete" value="<?php echo lang('Delete'); ?>"<?php echo confirm(); ?>>
|
||||
<input type="submit" name="delete" value="<?php echo lang('Delete'); ?>"><?php echo confirm(); ?>
|
||||
</div></fieldset>
|
||||
<?php
|
||||
}
|
||||
@@ -516,7 +527,7 @@ if (!$columns && support("table")) {
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
|
||||
echo (!$group && $select ? "" : "<script type='text/javascript'>tableCheck();</script>\n");
|
||||
echo (!$group && $select ? "" : script("tableCheck();"));
|
||||
}
|
||||
|
||||
if ($adminer->selectImportPrint()) {
|
||||
|
@@ -28,7 +28,7 @@ if (!$row) {
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php
|
||||
if ($SEQUENCE != "") {
|
||||
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
|
||||
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . confirm() . "\n";
|
||||
}
|
||||
?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
|
@@ -93,7 +93,7 @@ if (!$error && $_POST) {
|
||||
$empty = false;
|
||||
$q = substr($query, 0, $pos);
|
||||
$commands++;
|
||||
$print = "<pre id='sql-$commands'><code class='jush-$jush'>" . shorten_utf8(trim($q), 1000) . "</code></pre>\n";
|
||||
$print = "<pre id='sql-$commands'><code class='jush-$jush'>" . $adminer->sqlCommandQuery($q) . "</code></pre>\n";
|
||||
if ($jush == "sqlite" && preg_match("~^$space*+ATTACH\\b~i", $q, $match)) {
|
||||
// PHP doesn't support setting SQLITE_LIMIT_ATTACHED
|
||||
echo $print;
|
||||
@@ -137,7 +137,7 @@ if (!$error && $_POST) {
|
||||
echo "<p>" . ($num_rows ? ($limit && $num_rows > $limit ? lang('%d / ', $limit) : "") . lang('%d row(s)', $num_rows) : "");
|
||||
echo $time;
|
||||
$id = "export-$commands";
|
||||
$export = ", <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('Export') . "</a><span id='$id' class='hidden'>: "
|
||||
$export = ", <a href='#$id'>" . lang('Export') . "</a>" . script("qsl('a').onclick = partial(toggle, '$id');", "") . "<span id='$id' class='hidden'>: "
|
||||
. html_select("output", $adminer->dumpOutput(), $adminer_export["output"]) . " "
|
||||
. html_select("format", $dump_format, $adminer_export["format"])
|
||||
. "<input type='hidden' name='query' value='" . h($q) . "'>"
|
||||
@@ -145,7 +145,7 @@ if (!$error && $_POST) {
|
||||
;
|
||||
if ($connection2 && preg_match("~^($space|\\()*+SELECT\\b~i", $q) && ($explain = explain($connection2, $q))) {
|
||||
$id = "explain-$commands";
|
||||
echo ", <a href='#$id' onclick=\"return !toggle('$id');\">EXPLAIN</a>$export";
|
||||
echo ", <a href='#$id'>EXPLAIN</a>" . script("qsl('a').onclick = partial(toggle, '$id');", "") . $export;
|
||||
echo "<div id='$id' class='hidden'>\n";
|
||||
select($explain, $connection2, $orgtables);
|
||||
echo "</div>\n";
|
||||
@@ -208,7 +208,7 @@ if (!isset($_GET["import"])) {
|
||||
}
|
||||
echo "<p>";
|
||||
textarea("query", $q, 20);
|
||||
echo ($_POST ? "" : "<script type='text/javascript'>focus(document.getElementsByTagName('textarea')[0]);</script>\n");
|
||||
echo ($_POST ? "" : script("qs('textarea').focus();"));
|
||||
echo "<p>$execute\n";
|
||||
echo lang('Limit rows') . ": <input type='number' name='limit' class='size' value='" . h($_POST ? $_POST["limit"] : $_GET["limit"]) . "'>\n";
|
||||
|
||||
|
8
adminer/sqlite.php
Normal file
8
adminer/sqlite.php
Normal file
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
function adminer_object() {
|
||||
include_once "../plugins/plugin.php";
|
||||
include_once "../plugins/login-sqlite.php";
|
||||
return new AdminerPlugin(array(new AdminerLoginSqlite("admin", password_hash("", PASSWORD_DEFAULT))));
|
||||
}
|
||||
|
||||
include "./index.php";
|
@@ -10,8 +10,8 @@ h2 { font-size: 150%; margin: 0 0 20px -18px; padding: .8em 1em; border-bottom:
|
||||
h3 { font-weight: normal; font-size: 130%; margin: 1em 0 0; }
|
||||
form { margin: 0; }
|
||||
td table { width: 100%; margin: 0; }
|
||||
table { margin: 1em 20px 0 0; border: 0; border-top: 1px solid #999; border-left: 1px solid #999; font-size: 90%; }
|
||||
td, th { border: 0; border-right: 1px solid #999; border-bottom: 1px solid #999; padding: .2em .3em; }
|
||||
table { margin: 1em 20px 0 0; border-collapse: collapse; font-size: 90%; }
|
||||
td, th { border: 1px solid #999; padding: .2em .3em; }
|
||||
th { background: #eee; text-align: left; }
|
||||
thead th { text-align: center; padding: .2em .5em; }
|
||||
thead td, thead th { background: #ddf; }
|
||||
@@ -26,6 +26,8 @@ pre, textarea { font: 100%/1.25 monospace; }
|
||||
input[type=image] { vertical-align: middle; }
|
||||
input.default { box-shadow: 1px 1px 1px #777; }
|
||||
input.required { box-shadow: 1px 1px 1px red; }
|
||||
input.maxlength { box-shadow: 1px 1px 1px red; }
|
||||
input.wayoff { left: -1000px; position: absolute; }
|
||||
.block { display: block; }
|
||||
.version { color: #777; font-size: 67%; }
|
||||
.js .hidden, .nojs .jsonly { display: none; }
|
||||
@@ -60,7 +62,8 @@ input.required { box-shadow: 1px 1px 1px red; }
|
||||
.logout { margin-top: .5em; position: absolute; top: 0; right: 0; }
|
||||
.loadmore { margin-left: 1ex; }
|
||||
#menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; }
|
||||
#menu p { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
|
||||
#menu p, #tables { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
|
||||
#tables li{ list-style: none; }
|
||||
#dbs { overflow: hidden; }
|
||||
#logins, #tables { white-space: nowrap; overflow: auto; }
|
||||
#logins a, #tables a, #tables span { background: #fff; }
|
||||
@@ -79,6 +82,8 @@ input.required { box-shadow: 1px 1px 1px red; }
|
||||
.rtl .logout { left: 0; right: auto; }
|
||||
.rtl #content { margin: 2em 21em 0 0; padding: 10px 0 20px 20px; }
|
||||
.rtl #breadcrumb { left: auto; right: 21em; margin: 0 -18px 0 0; }
|
||||
.rtl .pages { left: auto; right: 21em; }
|
||||
.rtl input.wayoff { left: auto; right: -1000px; }
|
||||
.rtl #lang, .rtl #menu { left: auto; right: 0; }
|
||||
|
||||
@media all and (max-device-width: 880px) {
|
||||
@@ -87,6 +92,7 @@ input.required { box-shadow: 1px 1px 1px red; }
|
||||
#content { margin-left: 10px; }
|
||||
#lang { position: static; border-top: 1px solid #999; }
|
||||
#breadcrumb { left: auto; }
|
||||
.rtl .pages { right: auto; }
|
||||
.rtl #content { margin-right: 10px; }
|
||||
.rtl #breadcrumb { right: auto; }
|
||||
}
|
||||
|
@@ -23,7 +23,7 @@ function bodyLoad(version) {
|
||||
jush.custom_links = jushLinks;
|
||||
}
|
||||
jush.highlight_tag('code', 0);
|
||||
var tags = document.getElementsByTagName('textarea');
|
||||
var tags = qsa('textarea', document);
|
||||
for (var i = 0; i < tags.length; i++) {
|
||||
if (/(^|\s)jush-/.test(tags[i].className)) {
|
||||
var pre = jush.textarea(tags[i]);
|
||||
@@ -60,6 +60,15 @@ function typePassword(el, disable) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Install toggle handler
|
||||
*/
|
||||
function messagesPrint() {
|
||||
var els = qsa('.toggle', document);
|
||||
for (var i = 0; i < els.length; i++) {
|
||||
els[i].onclick = partial(toggle, els[i].getAttribute('href').substr(1));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
var dbCtrl;
|
||||
@@ -67,45 +76,46 @@ var dbPrevious = {};
|
||||
|
||||
/** Check if database should be opened to a new window
|
||||
* @param MouseEvent
|
||||
* @param HTMLSelectElement
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function dbMouseDown(event, el) {
|
||||
function dbMouseDown(event) {
|
||||
dbCtrl = isCtrl(event);
|
||||
if (dbPrevious[el.name] == undefined) {
|
||||
dbPrevious[el.name] = el.value;
|
||||
if (dbPrevious[this.name] == undefined) {
|
||||
dbPrevious[this.name] = this.value;
|
||||
}
|
||||
}
|
||||
|
||||
/** Load database after selecting it
|
||||
* @param HTMLSelectElement
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function dbChange(el) {
|
||||
function dbChange() {
|
||||
if (dbCtrl) {
|
||||
el.form.target = '_blank';
|
||||
this.form.target = '_blank';
|
||||
}
|
||||
el.form.submit();
|
||||
el.form.target = '';
|
||||
if (dbCtrl && dbPrevious[el.name] != undefined) {
|
||||
el.value = dbPrevious[el.name];
|
||||
dbPrevious[el.name] = undefined;
|
||||
this.form.submit();
|
||||
this.form.target = '';
|
||||
if (dbCtrl && dbPrevious[this.name] != undefined) {
|
||||
this.value = dbPrevious[this.name];
|
||||
dbPrevious[this.name] = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Check whether the query will be executed with index
|
||||
* @param HTMLFormElement
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function selectFieldChange(form) {
|
||||
function selectFieldChange() {
|
||||
var form = this.form;
|
||||
var ok = (function () {
|
||||
var inputs = form.getElementsByTagName('input');
|
||||
var inputs = qsa('input', form);
|
||||
for (var i=0; i < inputs.length; i++) {
|
||||
if (inputs[i].value && /^fulltext/.test(inputs[i].name)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
var ok = form.limit.value;
|
||||
var selects = form.getElementsByTagName('select');
|
||||
var selects = qsa('select', form);
|
||||
var group = false;
|
||||
var columns = {};
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
@@ -172,14 +182,14 @@ function idfEscape(s) {
|
||||
}
|
||||
|
||||
/** Detect foreign key
|
||||
* @param HTMLInputElement
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function editingNameChange(field) {
|
||||
var name = field.name.substr(0, field.name.length - 7);
|
||||
var type = formField(field.form, name + '[type]');
|
||||
function editingNameChange() {
|
||||
var name = this.name.substr(0, this.name.length - 7);
|
||||
var type = formField(this.form, name + '[type]');
|
||||
var opts = type.options;
|
||||
var candidate; // don't select anything with ambiguous match (like column `id`)
|
||||
var val = field.value;
|
||||
var val = this.value;
|
||||
for (var i = opts.length; i--; ) {
|
||||
var match = /(.+)`(.+)/.exec(opts[i].value);
|
||||
if (!match) { // common type
|
||||
@@ -209,23 +219,23 @@ function editingNameChange(field) {
|
||||
}
|
||||
|
||||
/** Add table row for next field
|
||||
* @param HTMLInputElement
|
||||
* @param boolean
|
||||
* @return boolean
|
||||
* @return boolean false
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function editingAddRow(button, focus) {
|
||||
var match = /(\d+)(\.\d+)?/.exec(button.name);
|
||||
function editingAddRow(focus) {
|
||||
var match = /(\d+)(\.\d+)?/.exec(this.name);
|
||||
var x = match[0] + (match[2] ? added.substr(match[2].length) : added) + '1';
|
||||
var row = parentTag(button, 'tr');
|
||||
var row = parentTag(this, 'tr');
|
||||
var row2 = cloneNode(row);
|
||||
var tags = row.getElementsByTagName('select');
|
||||
var tags2 = row2.getElementsByTagName('select');
|
||||
var tags = qsa('select', row);
|
||||
var tags2 = qsa('select', row2);
|
||||
for (var i=0; i < tags.length; i++) {
|
||||
tags2[i].name = tags[i].name.replace(/[0-9.]+/, x);
|
||||
tags2[i].selectedIndex = tags[i].selectedIndex;
|
||||
}
|
||||
tags = row.getElementsByTagName('input');
|
||||
tags2 = row2.getElementsByTagName('input');
|
||||
tags = qsa('input', row);
|
||||
tags2 = qsa('input', row2);
|
||||
var input = tags2[0]; // IE loose tags2 after insertBefore()
|
||||
for (var i=0; i < tags.length; i++) {
|
||||
if (tags[i].name == 'auto_increment_col') {
|
||||
@@ -240,43 +250,52 @@ function editingAddRow(button, focus) {
|
||||
tags2[i].checked = false;
|
||||
}
|
||||
}
|
||||
tags[0].onchange = function () {
|
||||
editingNameChange(tags[0]);
|
||||
};
|
||||
tags[0].onkeyup = function () {
|
||||
};
|
||||
tags[0].oninput = editingNameChange;
|
||||
row.parentNode.insertBefore(row2, row.nextSibling);
|
||||
if (focus) {
|
||||
input.onchange = function () {
|
||||
editingNameChange(input);
|
||||
};
|
||||
input.onkeyup = function () {
|
||||
};
|
||||
input.oninput = editingNameChange;
|
||||
input.focus();
|
||||
}
|
||||
added += '0';
|
||||
rowCount++;
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Remove table row for field
|
||||
* @param HTMLInputElement
|
||||
* @param string
|
||||
* @return boolean
|
||||
* @return boolean false
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function editingRemoveRow(button, name) {
|
||||
var field = formField(button.form, button.name.replace(/[^\[]+(.+)/, name));
|
||||
function editingRemoveRow(name) {
|
||||
var field = formField(this.form, this.name.replace(/[^\[]+(.+)/, name));
|
||||
field.parentNode.removeChild(field);
|
||||
parentTag(button, 'tr').style.display = 'none';
|
||||
return true;
|
||||
parentTag(this, 'tr').style.display = 'none';
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Move table row for field
|
||||
* @param boolean direction to move row, true for up or false for down
|
||||
* @return boolean false for success
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function editingMoveRow(dir){
|
||||
var row = parentTag(this, 'tr');
|
||||
if (!('nextElementSibling' in row)) {
|
||||
return true;
|
||||
}
|
||||
row.parentNode.insertBefore(row, dir
|
||||
? row.previousElementSibling
|
||||
: row.nextElementSibling ? row.nextElementSibling.nextElementSibling : row.parentNode.firstChild);
|
||||
return false;
|
||||
}
|
||||
|
||||
var lastType = '';
|
||||
|
||||
/** Clear length and hide collation or unsigned
|
||||
* @param HTMLSelectElement
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function editingTypeChange(type) {
|
||||
function editingTypeChange() {
|
||||
var type = this;
|
||||
var name = type.name.substr(0, type.name.length - 6);
|
||||
var text = selectValue(type);
|
||||
for (var i=0; i < type.form.elements.length; i++) {
|
||||
@@ -288,7 +307,7 @@ function editingTypeChange(type) {
|
||||
)) {
|
||||
el.value = '';
|
||||
}
|
||||
el.onchange.apply(el);
|
||||
el.oninput.apply(el);
|
||||
}
|
||||
if (lastType == 'timestamp' && el.name == name + '[has_default]' && /timestamp/i.test(formField(type.form, name + '[default]').value)) {
|
||||
el.checked = false;
|
||||
@@ -310,37 +329,37 @@ function editingTypeChange(type) {
|
||||
}
|
||||
|
||||
/** Mark length as required
|
||||
* @param HTMLInputElement
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function editingLengthChange(el) {
|
||||
alterClass(el, 'required', !el.value.length && /var(char|binary)$/.test(selectValue(el.parentNode.previousSibling.firstChild)));
|
||||
function editingLengthChange() {
|
||||
alterClass(this, 'required', !this.value.length && /var(char|binary)$/.test(selectValue(this.parentNode.previousSibling.firstChild)));
|
||||
}
|
||||
|
||||
/** Edit enum or set
|
||||
* @param HTMLInputElement
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function editingLengthFocus(field) {
|
||||
var td = field.parentNode;
|
||||
function editingLengthFocus() {
|
||||
var td = this.parentNode;
|
||||
if (/(enum|set)$/.test(selectValue(td.previousSibling.firstChild))) {
|
||||
var edit = document.getElementById('enum-edit');
|
||||
var val = field.value;
|
||||
var edit = qs('#enum-edit');
|
||||
var val = this.value;
|
||||
edit.value = (/^'.+'$/.test(val) ? val.substr(1, val.length - 2).replace(/','/g, "\n").replace(/''/g, "'") : val); //! doesn't handle 'a'',''b' correctly
|
||||
td.appendChild(edit);
|
||||
field.style.display = 'none';
|
||||
this.style.display = 'none';
|
||||
edit.style.display = 'inline';
|
||||
edit.focus();
|
||||
}
|
||||
}
|
||||
|
||||
/** Finish editing of enum or set
|
||||
* @param HTMLTextAreaElement
|
||||
* @this HTMLTextAreaElement
|
||||
*/
|
||||
function editingLengthBlur(edit) {
|
||||
var field = edit.parentNode.firstChild;
|
||||
var val = edit.value;
|
||||
field.value = (/^'[^\n]+'$/.test(val) ? val : "'" + val.replace(/\n+$/, '').replace(/'/g, "''").replace(/\n/g, "','") + "'");
|
||||
function editingLengthBlur() {
|
||||
var field = this.parentNode.firstChild;
|
||||
var val = this.value;
|
||||
field.value = (/^'[^\n]+'$/.test(val) ? val : val && "'" + val.replace(/\n+$/, '').replace(/'/g, "''").replace(/\n/g, "','") + "'");
|
||||
field.style.display = 'inline';
|
||||
edit.style.display = 'none';
|
||||
this.style.display = 'none';
|
||||
}
|
||||
|
||||
/** Show or hide selected table column
|
||||
@@ -348,9 +367,9 @@ function editingLengthBlur(edit) {
|
||||
* @param number
|
||||
*/
|
||||
function columnShow(checked, column) {
|
||||
var trs = document.getElementById('edit-fields').getElementsByTagName('tr');
|
||||
var trs = qsa('tr', qs('#edit-fields'));
|
||||
for (var i=0; i < trs.length; i++) {
|
||||
alterClass(trs[i].getElementsByTagName('td')[column], 'hidden', !checked);
|
||||
alterClass(qsa('td', trs[i])[column], 'hidden', !checked);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -358,76 +377,76 @@ function columnShow(checked, column) {
|
||||
*/
|
||||
function editingHideDefaults() {
|
||||
if (innerWidth < document.documentElement.scrollWidth) {
|
||||
document.getElementById('form')['defaults'].checked = false;
|
||||
qs('#form')['defaults'].checked = false;
|
||||
columnShow(false, 5);
|
||||
}
|
||||
}
|
||||
|
||||
/** Display partition options
|
||||
* @param HTMLSelectElement
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function partitionByChange(el) {
|
||||
var partitionTable = /RANGE|LIST/.test(selectValue(el));
|
||||
alterClass(el.form['partitions'], 'hidden', partitionTable || !el.selectedIndex);
|
||||
alterClass(document.getElementById('partition-table'), 'hidden', !partitionTable);
|
||||
function partitionByChange() {
|
||||
var partitionTable = /RANGE|LIST/.test(selectValue(this));
|
||||
alterClass(this.form['partitions'], 'hidden', partitionTable || !this.selectedIndex);
|
||||
alterClass(qs('#partition-table'), 'hidden', !partitionTable);
|
||||
helpClose();
|
||||
}
|
||||
|
||||
/** Add next partition row
|
||||
* @param HTMLInputElement
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function partitionNameChange(el) {
|
||||
var row = cloneNode(parentTag(el, 'tr'));
|
||||
function partitionNameChange() {
|
||||
var row = cloneNode(parentTag(this, 'tr'));
|
||||
row.firstChild.firstChild.value = '';
|
||||
parentTag(el, 'table').appendChild(row);
|
||||
el.onchange = function () {};
|
||||
parentTag(this, 'table').appendChild(row);
|
||||
this.oninput = function () {};
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Add row for foreign key
|
||||
* @param HTMLSelectElement
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function foreignAddRow(field) {
|
||||
field.onchange = function () { };
|
||||
var row = cloneNode(parentTag(field, 'tr'));
|
||||
var selects = row.getElementsByTagName('select');
|
||||
function foreignAddRow() {
|
||||
this.onchange = function () { };
|
||||
var row = cloneNode(parentTag(this, 'tr'));
|
||||
var selects = qsa('select', row);
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
selects[i].name = selects[i].name.replace(/\]/, '1$&');
|
||||
selects[i].selectedIndex = 0;
|
||||
}
|
||||
parentTag(field, 'table').appendChild(row);
|
||||
parentTag(this, 'table').appendChild(row);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Add row for indexes
|
||||
* @param HTMLSelectElement
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function indexesAddRow(field) {
|
||||
field.onchange = function () { };
|
||||
var row = cloneNode(parentTag(field, 'tr'));
|
||||
var selects = row.getElementsByTagName('select');
|
||||
function indexesAddRow() {
|
||||
this.onchange = function () { };
|
||||
var row = cloneNode(parentTag(this, 'tr'));
|
||||
var selects = qsa('select', row);
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
selects[i].name = selects[i].name.replace(/indexes\[\d+/, '$&1');
|
||||
selects[i].selectedIndex = 0;
|
||||
}
|
||||
var inputs = row.getElementsByTagName('input');
|
||||
var inputs = qsa('input', row);
|
||||
for (var i=0; i < inputs.length; i++) {
|
||||
inputs[i].name = inputs[i].name.replace(/indexes\[\d+/, '$&1');
|
||||
inputs[i].value = '';
|
||||
}
|
||||
parentTag(field, 'table').appendChild(row);
|
||||
parentTag(this, 'table').appendChild(row);
|
||||
}
|
||||
|
||||
/** Change column in index
|
||||
* @param HTMLSelectElement
|
||||
* @param string name prefix
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function indexesChangeColumn(field, prefix) {
|
||||
function indexesChangeColumn(prefix) {
|
||||
var names = [];
|
||||
for (var tag in { 'select': 1, 'input': 1 }) {
|
||||
var columns = parentTag(field, 'td').getElementsByTagName(tag);
|
||||
var columns = qsa(tag, parentTag(this, 'td'));
|
||||
for (var i=0; i < columns.length; i++) {
|
||||
if (/\[columns\]/.test(columns[i].name)) {
|
||||
var value = selectValue(columns[i]);
|
||||
@@ -437,17 +456,15 @@ function indexesChangeColumn(field, prefix) {
|
||||
}
|
||||
}
|
||||
}
|
||||
field.form[field.name.replace(/\].*/, '][name]')].value = prefix + names.join('_');
|
||||
this.form[this.name.replace(/\].*/, '][name]')].value = prefix + names.join('_');
|
||||
}
|
||||
|
||||
/** Add column for index
|
||||
* @param HTMLSelectElement
|
||||
* @param string name prefix
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function indexesAddColumn(field, prefix) {
|
||||
field.onchange = function () {
|
||||
indexesChangeColumn(field, prefix);
|
||||
};
|
||||
function indexesAddColumn(prefix) {
|
||||
var field = this;
|
||||
var select = field.form[field.name.replace(/\].*/, '][type]')];
|
||||
if (!select.selectedIndex) {
|
||||
while (selectValue(select) != "INDEX" && select.selectedIndex < select.options.length) {
|
||||
@@ -456,13 +473,14 @@ function indexesAddColumn(field, prefix) {
|
||||
select.onchange();
|
||||
}
|
||||
var column = cloneNode(field.parentNode);
|
||||
var selects = column.getElementsByTagName('select');
|
||||
var selects = qsa('select', column);
|
||||
for (var i = 0; i < selects.length; i++) {
|
||||
select = selects[i];
|
||||
select.name = select.name.replace(/\]\[\d+/, '$&1');
|
||||
select.selectedIndex = 0;
|
||||
}
|
||||
var inputs = column.getElementsByTagName('input');
|
||||
field.onchange = partial(indexesChangeColumn, prefix);
|
||||
var inputs = qsa('input', column);
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
var input = inputs[i];
|
||||
input.name = input.name.replace(/\]\[\d+/, '$&1');
|
||||
@@ -494,48 +512,47 @@ function triggerChange(tableRe, table, form) {
|
||||
var that, x, y; // em and tablePos defined in schema.inc.php
|
||||
|
||||
/** Get mouse position
|
||||
* @param HTMLElement
|
||||
* @param MouseEvent
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function schemaMousedown(el, event) {
|
||||
function schemaMousedown(event) {
|
||||
if ((event.which ? event.which : event.button) == 1) {
|
||||
that = el;
|
||||
x = event.clientX - el.offsetLeft;
|
||||
y = event.clientY - el.offsetTop;
|
||||
that = this;
|
||||
x = event.clientX - this.offsetLeft;
|
||||
y = event.clientY - this.offsetTop;
|
||||
}
|
||||
}
|
||||
|
||||
/** Move object
|
||||
* @param MouseEvent
|
||||
*/
|
||||
function schemaMousemove(ev) {
|
||||
function schemaMousemove(event) {
|
||||
if (that !== undefined) {
|
||||
ev = ev || event;
|
||||
var left = (ev.clientX - x) / em;
|
||||
var top = (ev.clientY - y) / em;
|
||||
var divs = that.getElementsByTagName('div');
|
||||
var left = (event.clientX - x) / em;
|
||||
var top = (event.clientY - y) / em;
|
||||
var divs = qsa('div', that);
|
||||
var lineSet = { };
|
||||
for (var i=0; i < divs.length; i++) {
|
||||
if (divs[i].className == 'references') {
|
||||
var div2 = document.getElementById((/^refs/.test(divs[i].id) ? 'refd' : 'refs') + divs[i].id.substr(4));
|
||||
var div2 = qs('[id="' + (/^refs/.test(divs[i].id) ? 'refd' : 'refs') + divs[i].id.substr(4) + '"]');
|
||||
var ref = (tablePos[divs[i].title] ? tablePos[divs[i].title] : [ div2.parentNode.offsetTop / em, 0 ]);
|
||||
var left1 = -1;
|
||||
var id = divs[i].id.replace(/^ref.(.+)-.+/, '$1');
|
||||
if (divs[i].parentNode != div2.parentNode) {
|
||||
left1 = Math.min(0, ref[1] - left) - 1;
|
||||
divs[i].style.left = left1 + 'em';
|
||||
divs[i].getElementsByTagName('div')[0].style.width = -left1 + 'em';
|
||||
divs[i].querySelector('div').style.width = -left1 + 'em';
|
||||
var left2 = Math.min(0, left - ref[1]) - 1;
|
||||
div2.style.left = left2 + 'em';
|
||||
div2.getElementsByTagName('div')[0].style.width = -left2 + 'em';
|
||||
div2.querySelector('div').style.width = -left2 + 'em';
|
||||
}
|
||||
if (!lineSet[id]) {
|
||||
var line = document.getElementById(divs[i].id.replace(/^....(.+)-.+$/, 'refl$1'));
|
||||
var line = qs('[id="' + divs[i].id.replace(/^....(.+)-.+$/, 'refl$1') + '"]');
|
||||
var top1 = top + divs[i].offsetTop / em;
|
||||
var top2 = top + div2.offsetTop / em;
|
||||
if (divs[i].parentNode != div2.parentNode) {
|
||||
top2 += ref[0] - top;
|
||||
line.getElementsByTagName('div')[0].style.height = Math.abs(top1 - top2) + 'em';
|
||||
line.querySelector('div').style.height = Math.abs(top1 - top2) + 'em';
|
||||
}
|
||||
line.style.left = (left + left1) + 'em';
|
||||
line.style.top = Math.min(top1, top2) + 'em';
|
||||
@@ -552,17 +569,16 @@ function schemaMousemove(ev) {
|
||||
* @param MouseEvent
|
||||
* @param string
|
||||
*/
|
||||
function schemaMouseup(ev, db) {
|
||||
function schemaMouseup(event, db) {
|
||||
if (that !== undefined) {
|
||||
ev = ev || event;
|
||||
tablePos[that.firstChild.firstChild.firstChild.data] = [ (ev.clientY - y) / em, (ev.clientX - x) / em ];
|
||||
tablePos[that.firstChild.firstChild.firstChild.data] = [ (event.clientY - y) / em, (event.clientX - x) / em ];
|
||||
that = undefined;
|
||||
var s = '';
|
||||
for (var key in tablePos) {
|
||||
s += '_' + key + ':' + Math.round(tablePos[key][0] * 10000) / 10000 + 'x' + Math.round(tablePos[key][1] * 10000) / 10000;
|
||||
}
|
||||
s = encodeURIComponent(s.substr(1));
|
||||
var link = document.getElementById('schema-link');
|
||||
var link = qs('#schema-link');
|
||||
link.href = link.href.replace(/[^=]+$/, '') + s;
|
||||
cookie('adminer_schema-' + db + '=' + s, 30); //! special chars in db
|
||||
}
|
||||
@@ -573,18 +589,18 @@ function schemaMouseup(ev, db) {
|
||||
var helpOpen, helpIgnore; // when mouse outs <option> then it mouse overs border of <select> - ignore it
|
||||
|
||||
/** Display help
|
||||
* @param HTMLElement
|
||||
* @param MouseEvent
|
||||
* @param string
|
||||
* @param bool display on left side (otherwise on top)
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function helpMouseover(el, event, text, side) {
|
||||
function helpMouseover(event, text, side) {
|
||||
var target = getTarget(event);
|
||||
if (!text) {
|
||||
helpClose();
|
||||
} else if (window.jush && (!helpIgnore || el != target)) {
|
||||
} else if (window.jush && (!helpIgnore || this != target)) {
|
||||
helpOpen = 1;
|
||||
var help = document.getElementById('help');
|
||||
var help = qs('#help');
|
||||
help.innerHTML = text;
|
||||
jush.highlight_tag([ help ]);
|
||||
alterClass(help, 'hidden');
|
||||
@@ -596,12 +612,12 @@ function helpMouseover(el, event, text, side) {
|
||||
}
|
||||
|
||||
/** Close help after timeout
|
||||
* @param HTMLElement
|
||||
* @param MouseEvent
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function helpMouseout(el, event) {
|
||||
function helpMouseout(event) {
|
||||
helpOpen = 0;
|
||||
helpIgnore = (el != getTarget(event));
|
||||
helpIgnore = (this != getTarget(event));
|
||||
setTimeout(function () {
|
||||
if (!helpOpen) {
|
||||
helpClose();
|
||||
@@ -612,5 +628,5 @@ function helpMouseout(el, event) {
|
||||
/** Close help
|
||||
*/
|
||||
function helpClose() {
|
||||
alterClass(document.getElementById('help'), 'hidden', true);
|
||||
alterClass(qs('#help'), 'hidden', true);
|
||||
}
|
||||
|
@@ -1,4 +1,66 @@
|
||||
|
||||
/** Get first element by selector
|
||||
* @param string
|
||||
* @return HTMLElement
|
||||
*/
|
||||
function qs(selector) {
|
||||
return document.querySelector(selector);
|
||||
}
|
||||
|
||||
/** Get last element by selector
|
||||
* @param string
|
||||
* @param [HTMLElement] defaults to document
|
||||
* @return HTMLElement
|
||||
*/
|
||||
function qsl(selector, context) {
|
||||
var els = qsa(selector, context || document);
|
||||
return els[els.length - 1];
|
||||
}
|
||||
|
||||
/** Get all elements by selector
|
||||
* @param string
|
||||
* @param HTMLElement
|
||||
* @return NodeList
|
||||
*/
|
||||
function qsa(selector, context) {
|
||||
return context.querySelectorAll(selector);
|
||||
}
|
||||
|
||||
/** Return a function calling fn with the next arguments
|
||||
* @param function
|
||||
* @param ...
|
||||
* @return function with preserved this
|
||||
*/
|
||||
function partial(fn) {
|
||||
var args = Array.apply(null, arguments).slice(1);
|
||||
return function () {
|
||||
return fn.apply(this, args);
|
||||
};
|
||||
}
|
||||
|
||||
/** Return a function calling fn with the first parameter and then the next arguments
|
||||
* @param function
|
||||
* @param ...
|
||||
* @return function with preserved this
|
||||
*/
|
||||
function partialArg(fn) {
|
||||
var args = Array.apply(null, arguments);
|
||||
return function (arg) {
|
||||
args[0] = arg;
|
||||
return fn.apply(this, args);
|
||||
};
|
||||
}
|
||||
|
||||
/** Assign values from source to target
|
||||
* @param Object
|
||||
* @param Object
|
||||
*/
|
||||
function mixin(target, source) {
|
||||
for (var key in source) {
|
||||
target[key] = source[key];
|
||||
}
|
||||
}
|
||||
|
||||
/** Add or remove CSS class
|
||||
* @param HTMLElement
|
||||
* @param string
|
||||
@@ -12,12 +74,12 @@ function alterClass(el, className, enable) {
|
||||
|
||||
/** Toggle visibility
|
||||
* @param string
|
||||
* @return boolean
|
||||
* @return boolean false
|
||||
*/
|
||||
function toggle(id) {
|
||||
var el = document.getElementById(id);
|
||||
var el = qs('#' + id);
|
||||
el.className = (el.className == 'hidden' ? '' : 'hidden');
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Set permanent cookie
|
||||
@@ -54,7 +116,7 @@ function verifyVersion(current) {
|
||||
}
|
||||
}, false);
|
||||
}
|
||||
document.getElementById('version').appendChild(iframe);
|
||||
qs('#version').appendChild(iframe);
|
||||
}
|
||||
|
||||
/** Get value of select
|
||||
@@ -70,20 +132,20 @@ function selectValue(select) {
|
||||
}
|
||||
|
||||
/** Verify if element has a specified tag name
|
||||
* @param HTMLElement
|
||||
* @param string regular expression
|
||||
* @return bool
|
||||
*/
|
||||
* @param HTMLElement
|
||||
* @param string regular expression
|
||||
* @return bool
|
||||
*/
|
||||
function isTag(el, tag) {
|
||||
var re = new RegExp('^(' + tag + ')$', 'i');
|
||||
return re.test(el.tagName);
|
||||
}
|
||||
|
||||
/** Get parent node with specified tag name
|
||||
* @param HTMLElement
|
||||
* @param string regular expression
|
||||
* @return HTMLElement
|
||||
*/
|
||||
* @param HTMLElement
|
||||
* @param string regular expression
|
||||
* @return HTMLElement
|
||||
*/
|
||||
function parentTag(el, tag) {
|
||||
while (el && !isTag(el, tag)) {
|
||||
el = el.parentNode;
|
||||
@@ -108,24 +170,27 @@ function trCheck(el) {
|
||||
*/
|
||||
function selectCount(id, count) {
|
||||
setHtml(id, (count === '' ? '' : '(' + (count + '').replace(/\B(?=(\d{3})+$)/g, ' ') + ')'));
|
||||
var inputs = document.getElementById(id).parentNode.parentNode.getElementsByTagName('input');
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
var input = inputs[i];
|
||||
if (input.type == 'submit') {
|
||||
input.disabled = (count == '0');
|
||||
var el = qs('#' + id);
|
||||
if (el) {
|
||||
var inputs = qsa('input', el.parentNode.parentNode);
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
var input = inputs[i];
|
||||
if (input.type == 'submit') {
|
||||
input.disabled = (count == '0');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Check all elements matching given name
|
||||
* @param HTMLInputElement
|
||||
* @param RegExp
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function formCheck(el, name) {
|
||||
var elems = el.form.elements;
|
||||
function formCheck(name) {
|
||||
var elems = this.form.elements;
|
||||
for (var i=0; i < elems.length; i++) {
|
||||
if (name.test(elems[i].name)) {
|
||||
elems[i].checked = el.checked;
|
||||
elems[i].checked = this.checked;
|
||||
trCheck(elems[i]);
|
||||
}
|
||||
}
|
||||
@@ -134,10 +199,10 @@ function formCheck(el, name) {
|
||||
/** Check all rows in <table class="checkable">
|
||||
*/
|
||||
function tableCheck() {
|
||||
var tables = document.getElementsByTagName('table');
|
||||
var tables = qsa('table', document);
|
||||
for (var i=0; i < tables.length; i++) {
|
||||
if (/(^|\s)checkable(\s|$)/.test(tables[i].className)) {
|
||||
var trs = tables[i].getElementsByTagName('tr');
|
||||
var trs = qsa('tr', tables[i]);
|
||||
for (var j=0; j < trs.length; j++) {
|
||||
trCheck(trs[j].firstChild.firstChild);
|
||||
}
|
||||
@@ -149,7 +214,7 @@ function tableCheck() {
|
||||
* @param string
|
||||
*/
|
||||
function formUncheck(id) {
|
||||
var el = document.getElementById(id);
|
||||
var el = qs('#' + id);
|
||||
el.checked = false;
|
||||
trCheck(el);
|
||||
}
|
||||
@@ -182,7 +247,7 @@ function tableClick(event, click) {
|
||||
if (el.type != 'checkbox') {
|
||||
return;
|
||||
}
|
||||
checkboxClick(event, el);
|
||||
checkboxClick.call(el, event);
|
||||
click = false;
|
||||
}
|
||||
el = el.parentNode;
|
||||
@@ -201,25 +266,25 @@ function tableClick(event, click) {
|
||||
var lastChecked;
|
||||
|
||||
/** Shift-click on checkbox for multiple selection.
|
||||
* @param MouseEvent
|
||||
* @param HTMLInputElement
|
||||
*/
|
||||
function checkboxClick(event, el) {
|
||||
if (!el.name) {
|
||||
* @param MouseEvent
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function checkboxClick(event) {
|
||||
if (!this.name) {
|
||||
return;
|
||||
}
|
||||
if (event.shiftKey && (!lastChecked || lastChecked.name == el.name)) {
|
||||
if (event.shiftKey && (!lastChecked || lastChecked.name == this.name)) {
|
||||
var checked = (lastChecked ? lastChecked.checked : true);
|
||||
var inputs = parentTag(el, 'table').getElementsByTagName('input');
|
||||
var inputs = qsa('input', parentTag(this, 'table'));
|
||||
var checking = !lastChecked;
|
||||
for (var i=0; i < inputs.length; i++) {
|
||||
var input = inputs[i];
|
||||
if (input.name === el.name) {
|
||||
if (input.name === this.name) {
|
||||
if (checking) {
|
||||
input.checked = checked;
|
||||
trCheck(input);
|
||||
}
|
||||
if (input === el || input === lastChecked) {
|
||||
if (input === this || input === lastChecked) {
|
||||
if (checking) {
|
||||
break;
|
||||
}
|
||||
@@ -228,7 +293,7 @@ function checkboxClick(event, el) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
lastChecked = el;
|
||||
lastChecked = this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,9 +302,9 @@ function checkboxClick(event, el) {
|
||||
* @param string undefined to set parentNode to
|
||||
*/
|
||||
function setHtml(id, html) {
|
||||
var el = document.getElementById(id);
|
||||
var el = qs('#' + id);
|
||||
if (el) {
|
||||
if (html == undefined) {
|
||||
if (html == null) {
|
||||
el.parentNode.innerHTML = ' ';
|
||||
} else {
|
||||
el.innerHTML = html;
|
||||
@@ -262,88 +327,89 @@ function nodePosition(el) {
|
||||
/** Go to the specified page
|
||||
* @param string
|
||||
* @param string
|
||||
* @param [MouseEvent]
|
||||
*/
|
||||
function pageClick(href, page, event) {
|
||||
function pageClick(href, page) {
|
||||
if (!isNaN(page) && page) {
|
||||
href += (page != 1 ? '&page=' + (page - 1) : '');
|
||||
location.href = href;
|
||||
location.href = href + (page != 1 ? '&page=' + (page - 1) : '');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Display items in menu
|
||||
* @param HTMLElement
|
||||
* @param MouseEvent
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function menuOver(el, event) {
|
||||
function menuOver(event) {
|
||||
var a = getTarget(event);
|
||||
if (isTag(a, 'a|span') && a.offsetLeft + a.offsetWidth > a.parentNode.offsetWidth - 15) { // 15 - ellipsis
|
||||
el.style.overflow = 'visible';
|
||||
this.style.overflow = 'visible';
|
||||
}
|
||||
}
|
||||
|
||||
/** Hide items in menu
|
||||
* @param HTMLElement
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function menuOut(el) {
|
||||
el.style.overflow = 'auto';
|
||||
function menuOut() {
|
||||
this.style.overflow = 'auto';
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Add row in select fieldset
|
||||
* @param HTMLSelectElement
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function selectAddRow(field) {
|
||||
field.onchange = function () {
|
||||
selectFieldChange(field.form);
|
||||
};
|
||||
field.onchange();
|
||||
function selectAddRow() {
|
||||
var field = this;
|
||||
var row = cloneNode(field.parentNode);
|
||||
var selects = row.getElementsByTagName('select');
|
||||
field.onchange = selectFieldChange;
|
||||
field.onchange();
|
||||
var selects = qsa('select', row);
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
selects[i].name = selects[i].name.replace(/[a-z]\[\d+/, '$&1');
|
||||
selects[i].selectedIndex = 0;
|
||||
}
|
||||
var inputs = row.getElementsByTagName('input');
|
||||
var inputs = qsa('input', row);
|
||||
for (var i=0; i < inputs.length; i++) {
|
||||
inputs[i].name = inputs[i].name.replace(/[a-z]\[\d+/, '$&1');
|
||||
inputs[i].value = '';
|
||||
inputs[i].className = '';
|
||||
if (inputs[i].type == 'checkbox') {
|
||||
inputs[i].checked = false;
|
||||
} else {
|
||||
inputs[i].value = '';
|
||||
}
|
||||
}
|
||||
field.parentNode.parentNode.appendChild(row);
|
||||
}
|
||||
|
||||
/** Prevent onsearch handler on Enter
|
||||
* @param HTMLInputElement
|
||||
* @param KeyboardEvent
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function selectSearchKeydown(el, event) {
|
||||
function selectSearchKeydown(event) {
|
||||
if (event.keyCode == 13 || event.keyCode == 10) {
|
||||
el.onsearch = function () {
|
||||
this.onsearch = function () {
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/** Clear column name after resetting search
|
||||
* @param HTMLInputElement
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function selectSearchSearch(el) {
|
||||
if (!el.value) {
|
||||
el.parentNode.firstChild.selectedIndex = 0;
|
||||
function selectSearchSearch() {
|
||||
if (!this.value) {
|
||||
this.parentNode.firstChild.selectedIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Toggles column context menu
|
||||
* @param HTMLElement
|
||||
* @param [string] extra class name
|
||||
*/
|
||||
function columnMouse(el, className) {
|
||||
var spans = el.getElementsByTagName('span');
|
||||
* @param [string] extra class name
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function columnMouse(className) {
|
||||
var spans = qsa('span', this);
|
||||
for (var i=0; i < spans.length; i++) {
|
||||
if (/column/.test(spans[i].className)) {
|
||||
spans[i].className = 'column' + (className || '');
|
||||
@@ -354,12 +420,13 @@ function columnMouse(el, className) {
|
||||
|
||||
|
||||
/** Fill column in search field
|
||||
* @param string
|
||||
*/
|
||||
* @param string
|
||||
* @return boolean false
|
||||
*/
|
||||
function selectSearch(name) {
|
||||
var el = document.getElementById('fieldset-search');
|
||||
var el = qs('#fieldset-search');
|
||||
el.className = '';
|
||||
var divs = el.getElementsByTagName('div');
|
||||
var divs = qsa('div', el);
|
||||
for (var i=0; i < divs.length; i++) {
|
||||
var div = divs[i];
|
||||
if (isTag(div.firstChild, 'select') && selectValue(div.firstChild) == name) {
|
||||
@@ -371,6 +438,7 @@ function selectSearch(name) {
|
||||
div.firstChild.onchange();
|
||||
}
|
||||
div.lastChild.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -398,6 +466,7 @@ function getTarget(event) {
|
||||
* @return boolean
|
||||
*/
|
||||
function bodyKeydown(event, button) {
|
||||
eventStop(event);
|
||||
var target = getTarget(event);
|
||||
if (target.jushTextarea) {
|
||||
target = target.jushTextarea;
|
||||
@@ -446,55 +515,56 @@ function editingKeydown(event) {
|
||||
return false;
|
||||
}
|
||||
if (event.shiftKey && !bodyKeydown(event, 'insert')) {
|
||||
eventStop(event);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Disable maxlength for functions
|
||||
* @param HTMLSelectElement
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function functionChange(select) {
|
||||
var input = select.form[select.name.replace(/^function/, 'fields')];
|
||||
if (selectValue(select)) {
|
||||
function functionChange() {
|
||||
var input = this.form[this.name.replace(/^function/, 'fields')];
|
||||
if (selectValue(this)) {
|
||||
if (input.origType === undefined) {
|
||||
input.origType = input.type;
|
||||
input.origMaxLength = input.maxLength;
|
||||
input.origMaxLength = input.getAttribute('data-maxlength');
|
||||
}
|
||||
input.removeAttribute('maxlength');
|
||||
input.removeAttribute('data-maxlength');
|
||||
input.type = 'text';
|
||||
} else if (input.origType) {
|
||||
input.type = input.origType;
|
||||
if (input.origMaxLength >= 0) {
|
||||
input.maxLength = input.origMaxLength;
|
||||
input.setAttribute('data-maxlength', input.origMaxLength);
|
||||
}
|
||||
}
|
||||
oninput({target: input});
|
||||
helpClose();
|
||||
}
|
||||
|
||||
/** Call this.onchange() if value changes
|
||||
* @this HTMLInputElement
|
||||
/** Skip 'original' when typing
|
||||
* @param number
|
||||
* @this HTMLTableCellElement
|
||||
*/
|
||||
function keyupChange() {
|
||||
if (this.value != this.getAttribute('value')) {
|
||||
this.onchange();
|
||||
this.setAttribute('value', this.value);
|
||||
function skipOriginal(first) {
|
||||
var fnSelect = this.previousSibling.firstChild;
|
||||
if (fnSelect.selectedIndex < first) {
|
||||
fnSelect.selectedIndex = first;
|
||||
}
|
||||
}
|
||||
|
||||
/** Add new field in schema-less edit
|
||||
* @param HTMLInputElement
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function fieldChange(field) {
|
||||
var row = cloneNode(parentTag(field, 'tr'));
|
||||
var inputs = row.getElementsByTagName('input');
|
||||
function fieldChange() {
|
||||
var row = cloneNode(parentTag(this, 'tr'));
|
||||
var inputs = qsa('input', row);
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
inputs[i].value = '';
|
||||
}
|
||||
// keep value in <select> (function)
|
||||
parentTag(field, 'table').appendChild(row);
|
||||
field.onchange = function () { };
|
||||
parentTag(this, 'table').appendChild(row);
|
||||
this.oninput = function () { };
|
||||
}
|
||||
|
||||
|
||||
@@ -509,7 +579,7 @@ function fieldChange(field) {
|
||||
function ajax(url, callback, data, message) {
|
||||
var request = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : false));
|
||||
if (request) {
|
||||
var ajaxStatus = document.getElementById('ajaxstatus');
|
||||
var ajaxStatus = qs('#ajaxstatus');
|
||||
if (message) {
|
||||
ajaxStatus.innerHTML = '<div class="message">' + message + '</div>';
|
||||
ajaxStatus.className = ajaxStatus.className.replace(/ hidden/g, '');
|
||||
@@ -538,11 +608,11 @@ function ajax(url, callback, data, message) {
|
||||
|
||||
/** Use setHtml(key, value) for JSON response
|
||||
* @param string
|
||||
* @return XMLHttpRequest or false in case of an error
|
||||
* @return boolean false for success
|
||||
*/
|
||||
function ajaxSetHtml(url) {
|
||||
return ajax(url, function (request) {
|
||||
var data = eval('(' + request.responseText + ')');
|
||||
return !ajax(url, function (request) {
|
||||
var data = window.JSON ? JSON.parse(request.responseText) : eval('(' + request.responseText + ')');
|
||||
for (var key in data) {
|
||||
setHtml(key, data[key]);
|
||||
}
|
||||
@@ -579,7 +649,7 @@ function ajaxForm(form, message, button) {
|
||||
return ajax(url, function (request) {
|
||||
setHtml('ajaxstatus', request.responseText);
|
||||
if (window.jush) {
|
||||
jush.highlight_tag(document.getElementById('ajaxstatus').getElementsByTagName('code'), 0);
|
||||
jush.highlight_tag(qsa('code', qs('#ajaxstatus')), 0);
|
||||
}
|
||||
}, data, message);
|
||||
}
|
||||
@@ -587,12 +657,13 @@ function ajaxForm(form, message, button) {
|
||||
|
||||
|
||||
/** Display edit field
|
||||
* @param HTMLElement
|
||||
* @param MouseEvent
|
||||
* @param number display textarea instead of input, 2 - load long text
|
||||
* @param string warning to display
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function selectClick(td, event, text, warning) {
|
||||
function selectClick(event, text, warning) {
|
||||
var td = this;
|
||||
var target = getTarget(event);
|
||||
if (!isCtrl(event) || isTag(td.firstChild, 'input|textarea') || isTag(target, 'a')) {
|
||||
return;
|
||||
@@ -622,7 +693,7 @@ function selectClick(td, event, text, warning) {
|
||||
});
|
||||
input.rows = rows;
|
||||
}
|
||||
if (value == '\u00A0' || td.getElementsByTagName('i').length) { // or i - NULL
|
||||
if (value == '\u00A0' || qsa('i', td).length) { // or i - NULL
|
||||
value = '';
|
||||
}
|
||||
if (document.selection) {
|
||||
@@ -659,21 +730,22 @@ function selectClick(td, event, text, warning) {
|
||||
|
||||
|
||||
/** Load and display next page in select
|
||||
* @param HTMLLinkElement
|
||||
* @param number
|
||||
* @param string
|
||||
* @return boolean
|
||||
* @return boolean false for success
|
||||
* @this HTMLLinkElement
|
||||
*/
|
||||
function selectLoadMore(a, limit, loading) {
|
||||
function selectLoadMore(limit, loading) {
|
||||
var a = this;
|
||||
var title = a.innerHTML;
|
||||
var href = a.href;
|
||||
a.innerHTML = loading;
|
||||
if (href) {
|
||||
a.removeAttribute('href');
|
||||
return ajax(href, function (request) {
|
||||
return !ajax(href, function (request) {
|
||||
var tbody = document.createElement('tbody');
|
||||
tbody.innerHTML = request.responseText;
|
||||
document.getElementById('table').appendChild(tbody);
|
||||
qs('#table').appendChild(tbody);
|
||||
if (tbody.children.length < limit) {
|
||||
a.parentNode.removeChild(a);
|
||||
} else {
|
||||
@@ -706,7 +778,7 @@ function eventStop(event) {
|
||||
*/
|
||||
function setupSubmitHighlight(parent) {
|
||||
for (var key in { input: 1, select: 1, textarea: 1 }) {
|
||||
var inputs = parent.getElementsByTagName(key);
|
||||
var inputs = qsa(key, parent);
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
setupSubmitHighlightInput(inputs[i])
|
||||
}
|
||||
@@ -751,7 +823,7 @@ function findDefaultSubmit(el) {
|
||||
if (el.jushTextarea) {
|
||||
el = el.jushTextarea;
|
||||
}
|
||||
var inputs = el.form.getElementsByTagName('input');
|
||||
var inputs = qsa('input', el.form);
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
var input = inputs[i];
|
||||
if (input.type == 'submit' && !input.style.zIndex) {
|
||||
@@ -790,6 +862,23 @@ function focus(el) {
|
||||
*/
|
||||
function cloneNode(el) {
|
||||
var el2 = el.cloneNode(true);
|
||||
var selector = 'input, select';
|
||||
var origEls = qsa(selector, el);
|
||||
var cloneEls = qsa(selector, el2);
|
||||
for (var i=0; i < origEls.length; i++) {
|
||||
var origEl = origEls[i];
|
||||
for (var key in origEl) {
|
||||
if (/^on/.test(key) && origEl[key]) {
|
||||
cloneEls[i][key] = origEl[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
setupSubmitHighlight(el2);
|
||||
return el2;
|
||||
}
|
||||
|
||||
oninput = function (event) {
|
||||
var target = event.target;
|
||||
var maxLength = target.getAttribute('data-maxlength');
|
||||
alterClass(target, 'maxlength', target.value && maxLength != null && target.value.length > maxLength); // maxLength could be 0
|
||||
};
|
||||
|
@@ -6,7 +6,7 @@ if (!$fields) {
|
||||
}
|
||||
$table_status = table_status1($TABLE, true);
|
||||
|
||||
page_header(($fields && is_view($table_status) ? lang('View') : lang('Table')) . ": " . h($TABLE), $error);
|
||||
page_header(($fields && is_view($table_status) ? $table_status['Engine'] == 'materialized view' ? lang('Materialized view') : lang('View') : lang('Table')) . ": " . h($TABLE), $error);
|
||||
|
||||
$adminer->selectLinks($table_status);
|
||||
$comment = $table_status["Comment"];
|
||||
@@ -15,18 +15,7 @@ if ($comment != "") {
|
||||
}
|
||||
|
||||
if ($fields) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . (support("comment") ? "<td>" . lang('Comment') : "") . "</thead>\n";
|
||||
foreach ($fields as $field) {
|
||||
echo "<tr" . odd() . "><th>" . h($field["field"]);
|
||||
echo "<td><span title='" . h($field["collation"]) . "'>" . h($field["full_type"]) . "</span>";
|
||||
echo ($field["null"] ? " <i>NULL</i>" : "");
|
||||
echo ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : "");
|
||||
echo (isset($field["default"]) ? " <span title='" . lang('Default value') . "'>[<b>" . h($field["default"]) . "</b>]</span>" : "");
|
||||
echo (support("comment") ? "<td>" . nbsp($field["comment"]) : "");
|
||||
echo "\n";
|
||||
}
|
||||
echo "</table>\n";
|
||||
$adminer->tableStructurePrint($fields);
|
||||
}
|
||||
|
||||
if (!is_view($table_status)) {
|
||||
@@ -34,19 +23,7 @@ if (!is_view($table_status)) {
|
||||
echo "<h3 id='indexes'>" . lang('Indexes') . "</h3>\n";
|
||||
$indexes = indexes($TABLE);
|
||||
if ($indexes) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
foreach ($indexes as $name => $index) {
|
||||
ksort($index["columns"]); // enforce correct columns order
|
||||
$print = array();
|
||||
foreach ($index["columns"] as $key => $val) {
|
||||
$print[] = "<i>" . h($val) . "</i>"
|
||||
. ($index["lengths"][$key] ? "(" . $index["lengths"][$key] . ")" : "")
|
||||
. ($index["descs"][$key] ? " DESC" : "")
|
||||
;
|
||||
}
|
||||
echo "<tr title='" . h($name) . "'><th>$index[type]<td>" . implode(", ", $print) . "\n";
|
||||
}
|
||||
echo "</table>\n";
|
||||
$adminer->tableIndexesPrint($indexes);
|
||||
}
|
||||
echo '<p class="links"><a href="' . h(ME) . 'indexes=' . urlencode($TABLE) . '">' . lang('Alter indexes') . "</a>\n";
|
||||
}
|
||||
|
@@ -40,10 +40,10 @@ page_header(($name != "" ? lang('Alter trigger') . ": " . h($name) : lang('Creat
|
||||
<tr><th><?php echo lang('Type'); ?><td><?php echo html_select("Type", $trigger_options["Type"], $row["Type"]); ?>
|
||||
</table>
|
||||
<p><?php echo lang('Name'); ?>: <input name="Trigger" value="<?php echo h($row["Trigger"]); ?>" maxlength="64" autocapitalize="off">
|
||||
<script type="text/javascript">document.getElementById('form')['Timing'].onchange();</script>
|
||||
<?php echo script("qs('#form')['Timing'].onchange();"); ?>
|
||||
<p><?php textarea("Statement", $row["Statement"]); ?>
|
||||
<p>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php if ($name != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<?php if ($name != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(); ?><?php } ?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
|
@@ -22,7 +22,7 @@ if (!$row) {
|
||||
<p>
|
||||
<?php
|
||||
if ($TYPE != "") {
|
||||
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
|
||||
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . confirm() . "\n";
|
||||
} else {
|
||||
echo "<input name='name' value='" . h($row['name']) . "' autocapitalize='off'>\n";
|
||||
textarea("as", $row["as"]);
|
||||
|
@@ -135,7 +135,7 @@ if ($_POST) {
|
||||
<tr><th><?php echo lang('Server'); ?><td><input name="host" maxlength="60" value="<?php echo h($row["host"]); ?>" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Username'); ?><td><input name="user" maxlength="16" value="<?php echo h($row["user"]); ?>" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Password'); ?><td><input name="pass" id="pass" value="<?php echo h($row["pass"]); ?>">
|
||||
<?php if (!$row["hashed"]) { ?><script type="text/javascript">typePassword(document.getElementById('pass'));</script><?php } ?>
|
||||
<?php if (!$row["hashed"]) { echo script("typePassword(qs('#pass'));"); } ?>
|
||||
<?php echo checkbox("hashed", 1, $row["hashed"], lang('Hashed'), "typePassword(this.form['pass'], this.checked);"); ?>
|
||||
</table>
|
||||
|
||||
@@ -169,7 +169,11 @@ foreach (array(
|
||||
} elseif (isset($_GET["grant"])) {
|
||||
echo "<td><select name=$name><option><option value='1'" . ($value ? " selected" : "") . ">" . lang('Grant') . "<option value='0'" . ($value == "0" ? " selected" : "") . ">" . lang('Revoke') . "</select>";
|
||||
} else {
|
||||
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
|
||||
echo "<td align='center'><label class='block'>";
|
||||
echo "<input type='checkbox' name=$name value='1'" . ($value ? " checked" : "") . ($privilege == "All privileges"
|
||||
? " id='grants-$i-all'>" //! uncheck all except grant if all is checked
|
||||
: ">" . ($privilege == "Grant option" ? "" : script("qsl('input').onclick = function () { if (this.checked) formUncheck('grants-$i-all'); };")));
|
||||
echo "</label>";
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
@@ -180,6 +184,6 @@ echo "</table>\n";
|
||||
?>
|
||||
<p>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php if (isset($_GET["host"])) { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<?php if (isset($_GET["host"])) { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(); ?><?php } ?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
|
@@ -1,6 +1,11 @@
|
||||
<?php
|
||||
$TABLE = $_GET["view"];
|
||||
$row = $_POST;
|
||||
$orig_type = "VIEW";
|
||||
if ($jush == "pgsql" && $TABLE != "") {
|
||||
$status = table_status($TABLE);
|
||||
$orig_type = strtoupper($status["Engine"]);
|
||||
}
|
||||
|
||||
if ($_POST && !$error) {
|
||||
$name = trim($row["name"]);
|
||||
@@ -8,22 +13,14 @@ if ($_POST && !$error) {
|
||||
$location = ME . "table=" . urlencode($name);
|
||||
$message = lang('View has been altered.');
|
||||
|
||||
if ($_GET["materialized"]) {
|
||||
$type = "MATERIALIZED VIEW";
|
||||
} else {
|
||||
$type = "VIEW";
|
||||
if ($jush == "pgsql") {
|
||||
$status = table_status($name);
|
||||
$type = ($status ? strtoupper($status["Engine"]) : $type);
|
||||
}
|
||||
}
|
||||
$type = ($_POST["materialized"] ? "MATERIALIZED VIEW" : "VIEW");
|
||||
|
||||
if (!$_POST["drop"] && $TABLE == $name && $jush != "sqlite" && $type != "MATERIALIZED VIEW") {
|
||||
if (!$_POST["drop"] && $TABLE == $name && $jush != "sqlite" && $type == "VIEW" && $orig_type == "VIEW") {
|
||||
query_redirect(($jush == "mssql" ? "ALTER" : "CREATE OR REPLACE") . " VIEW " . table($name) . $as, $location, $message);
|
||||
} else {
|
||||
$temp_name = $name . "_adminer_" . uniqid();
|
||||
drop_create(
|
||||
"DROP $type " . table($TABLE),
|
||||
"DROP $orig_type " . table($TABLE),
|
||||
"CREATE $type " . table($name) . $as,
|
||||
"DROP $type " . table($name),
|
||||
"CREATE $type " . table($temp_name) . $as,
|
||||
@@ -41,6 +38,7 @@ if ($_POST && !$error) {
|
||||
if (!$_POST && $TABLE != "") {
|
||||
$row = view($TABLE);
|
||||
$row["name"] = $TABLE;
|
||||
$row["materialized"] = ($orig_type != "VIEW");
|
||||
if (!$error) {
|
||||
$error = error();
|
||||
}
|
||||
@@ -51,9 +49,10 @@ page_header(($TABLE != "" ? lang('Alter view') : lang('Create view')), $error, a
|
||||
|
||||
<form action="" method="post">
|
||||
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64" autocapitalize="off">
|
||||
<?php echo (support("materializedview") ? " " . checkbox("materialized", 1, $row["materialized"], lang('Materialized view')) : ""); ?>
|
||||
<p><?php textarea("select", $row["select"]); ?>
|
||||
<p>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php if ($_GET["view"] != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<?php if ($_GET["view"] != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(); ?><?php } ?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
|
37
changes.txt
37
changes.txt
@@ -1,3 +1,40 @@
|
||||
Adminer 4.4.0 (released 2018-01-17):
|
||||
Add Content Security Policy
|
||||
Disallow scripts without nonce
|
||||
Rate limit password-less login attempts from the same IP address
|
||||
Disallow connecting to privileged ports
|
||||
Add nosniff header
|
||||
PHP 7.1: Prevent warning when using empty limit
|
||||
PHP 7.2: Prevent warning when searching in select
|
||||
MySQL: Remove dedicated view for replication status (added in 4.3.0)
|
||||
PostgreSQL: Sort table names (regression from 4.3.1)
|
||||
Editor: Don't set time zone from PHP, fixes DST
|
||||
Editor: Display field comment's text inside [] only in edit form
|
||||
Editor: Fix doubleclick on database page
|
||||
Editor: Fix Search data in tables
|
||||
Customization: Always send security headers
|
||||
Hebrew translation
|
||||
|
||||
Adminer 4.3.1 (released 2017-04-14):
|
||||
Fix permanent login after logout (bug #539)
|
||||
Fix SQL command autofocus (regression from 4.0.0)
|
||||
PostgreSQL: Support JSON and JSONB data types
|
||||
PostgreSQL: Fix index size computation in PostgreSQL < 9.0 (regression from 4.3.0)
|
||||
PostgreSQL: Fix nullable fields in export
|
||||
|
||||
Adminer 4.3.0 (released 2017-03-15):
|
||||
Make maxlength in edit fields a soft limit
|
||||
Add accessibility labels
|
||||
Add Cache-Control: immutable to static files
|
||||
MySQL: Support MySQL 8
|
||||
MySQL: Support JSON data type
|
||||
MySQL: Add dedicated view for replication status
|
||||
MySQL: Support spatial indexes
|
||||
PostgreSQL: Export
|
||||
PostgreSQL: Don't treat partial indexes as unique
|
||||
MS SQL: Support pdo_dblib
|
||||
Elasticsearch: Support HTTPS by inputting https://server
|
||||
|
||||
Adminer 4.2.5 (released 2016-06-01):
|
||||
Fix remote execution in SQLite query
|
||||
SQLite: Require credentials to use
|
||||
|
22
compile.php
22
compile.php
@@ -134,7 +134,7 @@ function put_file_lang($match) {
|
||||
case "' . $lang . '": $compressed = "' . add_quo_slashes(lzw_compress(implode("\n", $translation_ids))) . '"; break;';
|
||||
}
|
||||
$translations_version = crc32($return);
|
||||
return '$translations = &$_SESSION["translations"];
|
||||
return '$translations = $_SESSION["translations"];
|
||||
if ($_SESSION["translations_version"] != ' . $translations_version . ') {
|
||||
$translations = array();
|
||||
$_SESSION["translations_version"] = ' . $translations_version . ';
|
||||
@@ -152,6 +152,7 @@ function get_translations($lang) {
|
||||
|
||||
if (!$translations) {
|
||||
$translations = get_translations($LANG);
|
||||
$_SESSION["translations"] = $translations;
|
||||
}
|
||||
';
|
||||
}
|
||||
@@ -375,9 +376,9 @@ if ($driver) {
|
||||
}
|
||||
}
|
||||
if (count($drivers) == 1) {
|
||||
$file = str_replace('<?php echo html_select("driver", $drivers, DRIVER); ?>', "<input type='hidden' name='driver' value='" . ($driver == "mysql" ? "server" : $driver) . "'>" . reset($drivers), $file);
|
||||
$file = str_replace('<?php echo html_select("auth[driver]", $drivers, DRIVER); ?>', "<input type='hidden' name='auth[driver]' value='" . ($driver == "mysql" ? "server" : $driver) . "'>" . reset($drivers), $file);
|
||||
}
|
||||
$file = preg_replace('(;../externals/jush/modules/jush-(?!textarea\.|txt\.|' . preg_quote($driver == "mysql" ? "sql" : $driver) . '\.)[^.]+.js)', '', $file);
|
||||
$file = preg_replace('(;../externals/jush/modules/jush-(?!textarea\.|txt\.|js\.|' . preg_quote($driver == "mysql" ? "sql" : $driver) . '\.)[^.]+.js)', '', $file);
|
||||
}
|
||||
if ($project == "editor") {
|
||||
$file = preg_replace('~;../externals/jush/jush.css~', '', $file);
|
||||
@@ -392,16 +393,15 @@ if ($_SESSION["lang"]) {
|
||||
$file = str_replace("<?php switch_lang(); ?>\n", "", $file);
|
||||
$file = str_replace('<?php echo $LANG; ?>', $_SESSION["lang"], $file);
|
||||
}
|
||||
$file = str_replace('<script type="text/javascript" src="static/editing.js"></script>' . "\n", "", $file);
|
||||
$file = str_replace('<script type="text/javascript" src="../externals/jush/modules/jush-textarea.js"></script>' . "\n", "", $file);
|
||||
$file = str_replace('<script type="text/javascript" src="../externals/jush/modules/jush-txt.js"></script>' . "\n", "", $file);
|
||||
$file = str_replace('<script type="text/javascript" src="../externals/jush/modules/jush-<?php echo $jush; ?>.js"></script>' . "\n", "", $file);
|
||||
$file = str_replace('<?php echo script_src("static/editing.js"); ?>' . "\n", "", $file);
|
||||
$file = preg_replace('~\\s+echo script_src\\("\\.\\./externals/jush/modules/jush-(textarea|txt|js|\\$jush)\\.js"\\);~', '', $file);
|
||||
$file = str_replace('<link rel="stylesheet" type="text/css" href="../externals/jush/jush.css">' . "\n", "", $file);
|
||||
$file = preg_replace_callback("~compile_file\\('([^']+)'(?:, '([^']*)')?\\)~", 'compile_file', $file); // integrate static files
|
||||
$replace = 'h(preg_replace("~\\\\\\\\?.*~", "", ME)) . "?file=\\1&version=' . $VERSION . ($driver ? '&driver=' . $driver : '');
|
||||
$file = preg_replace('~\\.\\./adminer/static/(default\\.css|functions\\.js|favicon\\.ico)~', '<?php echo ' . $replace . '"; ?>', $file);
|
||||
$file = preg_replace('~\\.\\./adminer/static/([^\'"]*)~', '" . ' . $replace, $file);
|
||||
$file = preg_replace('~\\.\\./externals/jush/modules/(jush\\.js)~', '<?php echo ' . $replace . '"; ?>', $file);
|
||||
$replace = 'preg_replace("~\\\\\\\\?.*~", "", ME) . "?file=\\1&version=' . $VERSION . ($driver ? '&driver=' . $driver : '') . '"';
|
||||
$file = preg_replace('~\\.\\./adminer/static/(default\\.css|favicon\\.ico)~', '<?php echo h(' . $replace . '); ?>', $file);
|
||||
$file = preg_replace('~"\\.\\./adminer/static/(functions\\.js)"~', $replace, $file);
|
||||
$file = preg_replace('~\\.\\./adminer/static/([^\'"]*)~', '" . h(' . $replace . ') . "', $file);
|
||||
$file = preg_replace('~"\\.\\./externals/jush/modules/(jush\\.js)"~', $replace, $file);
|
||||
$file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file);
|
||||
$file = php_shrink($file);
|
||||
|
||||
|
@@ -13,7 +13,7 @@
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jakub Vrána",
|
||||
"homepage": "http://www.vrana.cz/"
|
||||
"homepage": "https://www.vrana.cz/"
|
||||
}
|
||||
],
|
||||
"autoload": {
|
||||
|
@@ -46,7 +46,7 @@ border:5px solid #ccc;margin:0}
|
||||
#menu a:hover{background:#333;color:#fff;border-color:#333}
|
||||
#menu a.h1,#menu a.h1:hover{display:block;height:0;width:175px;padding:40px 0 0 0;overflow:hidden;float:left;border:0;margin:0;
|
||||
outline:0;background:url(//www.bradezone.com/random/adminer_logo.gif) no-repeat;line-height:32px}
|
||||
#menu p{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0}
|
||||
#menu p,#tables{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0}
|
||||
#breadcrumb{background:#333;color:#fff;position:fixed;top:0;left:320px;width:100%;line-height:40px;padding:0;z-index:1;margin:0}
|
||||
#breadcrumb a{color:#ff9}
|
||||
#breadcrumb a:hover{background:transparent;color:#ff9;border-color:#ff9}
|
||||
|
@@ -339,7 +339,7 @@ border: 1px solid #E3E3E3;
|
||||
#menu form {
|
||||
margin: 0;
|
||||
}
|
||||
#menu p {
|
||||
#menu p, #tables {
|
||||
padding-left: 8px;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
@@ -173,13 +173,14 @@ h3{
|
||||
margin:0;}
|
||||
#menu form{
|
||||
margin:0;}
|
||||
#menu p{
|
||||
#menu p,#tables{
|
||||
padding-left:8px;
|
||||
border-bottom:none;}
|
||||
#menu form p{
|
||||
padding-left:0;
|
||||
text-align:center;}
|
||||
#tables a,#tables a b{
|
||||
#logins a,#tables a,#tables a b{
|
||||
background: transparent none repeat scroll 0 0;
|
||||
color:#c00;
|
||||
padding:0 0.3ex;}
|
||||
/*#tables a b{background-color:#ff7400;color:black;}*/
|
||||
|
108
designs/flat/adminer.css
Executable file
108
designs/flat/adminer.css
Executable file
@@ -0,0 +1,108 @@
|
||||
/**
|
||||
* Adminer "flat" theme by Israel Viana
|
||||
*
|
||||
* Color palette from https://kuler.adobe.com/Copy-of-Flat-UI-color-theme-3785174/
|
||||
* Navy: 2c3e50
|
||||
* Red: e74c3c
|
||||
* Gray: ecf0f1
|
||||
* Light blue: 3498db
|
||||
* Blue: 2980b9
|
||||
*/
|
||||
|
||||
/*
|
||||
* Basic tags
|
||||
*/
|
||||
|
||||
a {
|
||||
color: #2980b9;
|
||||
}
|
||||
|
||||
a:visited {
|
||||
color: #3498db
|
||||
}
|
||||
|
||||
a:link:hover, a:visited:hover {
|
||||
color: #e74c3c;
|
||||
}
|
||||
|
||||
h1 {
|
||||
border-bottom: 1px solid #e74c3c;
|
||||
background: #ecf0f1;
|
||||
}
|
||||
|
||||
h2 {
|
||||
border-bottom: 1px solid #e74c3c;
|
||||
background: #ecf0f1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tables
|
||||
*/
|
||||
|
||||
table {
|
||||
border-top: 0;
|
||||
border-left: 1px solid silver;
|
||||
}
|
||||
|
||||
td, th {
|
||||
border-right: 1px solid silver;
|
||||
border-bottom: 1px solid silver;
|
||||
padding: .3em .5em;
|
||||
}
|
||||
|
||||
thead th, thead td {
|
||||
background: #3498db;
|
||||
color: white;
|
||||
border-right: 1px solid white;
|
||||
border-bottom: 1px solid white;
|
||||
padding: .3em .5em;
|
||||
}
|
||||
|
||||
thead th a, thead td a {
|
||||
color: #eee;
|
||||
}
|
||||
|
||||
.js span.column {
|
||||
background: white;
|
||||
}
|
||||
th span.column a.text {
|
||||
color: #2980b9;
|
||||
}
|
||||
|
||||
.js .checkable .checked td, .js .checkable .checked th {
|
||||
background: rgba(52, 152, 219, .3);
|
||||
}
|
||||
|
||||
.pages {
|
||||
border: none;
|
||||
box-shadow: -1px -1px 4px silver;
|
||||
}
|
||||
|
||||
/*
|
||||
* Common sections
|
||||
*/
|
||||
|
||||
#breadcrumb a {
|
||||
color: #e74c3c;
|
||||
}
|
||||
|
||||
#logout {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/*
|
||||
* Elements
|
||||
*/
|
||||
|
||||
sup {
|
||||
padding: 3px 7px;
|
||||
background: #3498db;
|
||||
color: white;
|
||||
border-radius: 2em;
|
||||
}
|
||||
|
||||
code.jush-sql {
|
||||
display: block;
|
||||
padding: .4em .7em;
|
||||
line-height: 1.5em;
|
||||
}
|
@@ -733,7 +733,7 @@ legend{
|
||||
}
|
||||
|
||||
/* tables */
|
||||
#menu p#tables{
|
||||
#tables{
|
||||
border-bottom: none;
|
||||
line-height: 20px;
|
||||
padding: 18px 0;
|
||||
|
@@ -3,7 +3,8 @@
|
||||
*
|
||||
* Klemens Häckel [http://clickdimension.wordpress.com/]
|
||||
*
|
||||
* update 2014-01
|
||||
* update 2017-03
|
||||
* adapted for adminer 4.3.0
|
||||
*
|
||||
* new remaster based on style for WT-NMP 13.12
|
||||
*
|
||||
@@ -77,7 +78,7 @@ html>/**/body input[name="logout"], #logout {
|
||||
right: 8px;
|
||||
text-indent: 8px;
|
||||
top: 6px;
|
||||
width: 80px;
|
||||
width: 120px;
|
||||
position:fixed;
|
||||
z-index: 10;
|
||||
}
|
||||
@@ -154,10 +155,10 @@ html>/**/body form>table a[href*="&edit="][href*="&where"] {
|
||||
}
|
||||
|
||||
/* Select data */
|
||||
html>/**/body #menu p a[href*="&select="], html>/**/body .links a[href*="&select="] {
|
||||
html>/**/body #menu li a[href*="&select="], html>/**/body .links a[href*="&select="] {
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdVJREFUeNqck8tO21AQhn8bB8ehRe0SUEBOlIsSVFGqqlK3oey6K+9A96wTKU/RFU/AG7CrKhAg7gmKiJKIplFWqItWIQEfuzOT2LmsSo408j+2/5lvjo+1rULhM4AFTLfahuu6i3vF4rdp3F/y+W3DVUrzKNk8BTzPC4IKS3h8Hc0Hz49zr8BeXSml8wu8PsU1uW7EhjpHOmd7wX1fs4e9hnIcTUkBDfs1DzGjS5N1pPOGRR3bLjR6ztoNNJm9ebDXcBxnjMD99YCdzGvJT25v8T6ZFH1QLuNjNiv6++UlESyDvSMEEIKcCZzX6zLvXDiMo0pFZn5hWfhxfS2aF3sCAkUvDwmA1ZUVyS9qNawnEn0aKvQhkxF9WCqBPUIgBSYISnd3QmCZJs6qVekaYZqbmzGCfoGnp2AEnyAdjUpeajTwJh4XfU778S6d7tNQISlA3rFN9AkqzaYQmLOzuKIxuGuYaE4H++F/RvbqVEVXE+cgsbSEFFH0Hh+RtW2sxmLo9npYoy/yNpUajkBeo9ftzkwSVFstIeBVpjH8rhc0xigBe43f9/dmKBTCburv4ISb//VvsYe9mmXbX/VIZHman8ntdH7y0BbFSwrjmX6H4s8/AQYAQChL+KIinhAAAAAASUVORK5CYII=") no-repeat left bottom
|
||||
}
|
||||
html>/**/body #menu p a[href*="&select="] {
|
||||
html>/**/body #menu li a[href*="&select="] {
|
||||
clear: left;
|
||||
display: block;
|
||||
float: left;
|
||||
@@ -305,8 +306,12 @@ a, a:visited {
|
||||
box-shadow: 0px 0px 3px rgba(0,0,0,0.30) !important;
|
||||
margin: 0;
|
||||
padding-bottom: 0;
|
||||
padding-top: 30px;
|
||||
top: 0;
|
||||
}
|
||||
#menu > h1:first-child {
|
||||
margin-top: -30px;
|
||||
}
|
||||
/*** Forms ***/
|
||||
fieldset {
|
||||
border-radius: 1px !important
|
||||
@@ -316,7 +321,7 @@ fieldset {
|
||||
background: transparent;
|
||||
font-size: .9em;
|
||||
left: auto;
|
||||
right: 90px;
|
||||
right: 120px;
|
||||
position:fixed;
|
||||
z-index: 10;
|
||||
padding-top: 2px;
|
||||
@@ -333,10 +338,6 @@ p {
|
||||
margin: 0.8em 0 0 0
|
||||
}
|
||||
|
||||
#menu form {
|
||||
padding-top: 30px;
|
||||
}
|
||||
|
||||
.view {
|
||||
background-color: #FFFFAA !important;
|
||||
}
|
||||
|
@@ -27,11 +27,9 @@ a[href$="&import="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEU
|
||||
#menu .links a:hover {color:red;}
|
||||
}
|
||||
|
||||
#menu p a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll left bottom; clear:left; display:block; float:left; height:16px; margin-right:8px; padding-top:1px; overflow:hidden; padding-left:16px; width:0; text-decoration:none;}
|
||||
#tables li a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll left bottom; clear:left; display:block; float:left; height:16px; margin-right:8px; padding-top:1px; overflow:hidden; padding-left:16px; width:0; text-decoration:none;}
|
||||
|
||||
#menu p a[href*="&table="], #menu p a[href*="&view="] {clear:right; margin-left:24px; display:block; height:17px; padding-bottom:1px; text-decoration:none;}
|
||||
|
||||
#menu p#tables br {display:none;}
|
||||
#tables li a[href*="&table="], tables li a[href*="&view="] {clear:right; margin-left:24px; display:block; height:17px; padding-bottom:1px; text-decoration:none;}
|
||||
|
||||
.links a[href*="&create="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ6SURBVDjLpZNZSNRRGMV//2XGsjFrMg2z0so2K21xIFpepYUiAsGIICLffI8eWiBBeg3qQV+KwBYKLB8qpHUmrahcKLc0QsxldNSxdPz/79LD1ChBUXTh8sG93POdc75zDa01/7NsgGvPR09rzQmpVZZSCqlAKIWUCqk0QqoZWyKFRir1uvxIbsAGUFqXHQqkpP1L57M3Pm5MMJBKpQHUdF9BKIGQAlcJXOlOVykSdye3leO6MmkGQNyHw+uO/1X3bzGBK+S0B1IqAKqDg3986HeCZPffwvJtoNT7lOZLvUdtAPEDAKBkRzo3QwMUb89InN1uGGD3spdE214xe8MRUnM2MfppNW0Pqy7YAK5UKK2xLbhdP4hlmdxpGMQwwQT8ziNiI534c7cT6WrFazikzF2Eb8HS1IQEDdiWwcHAQmpehTkQSAcgNvSMiYFW5uUUMdV3HW+ywefGNqITJsbUUL75k4FWYJtQ+yaMZcXrk1ANk/33mbdiD7EvlRieETy+FJLkMFcjRRSW3emIAwiF1hqPBfu2LGSWbbA1uZ41SfWkrtxPrPcypsfFiWYzFGzGKTjFV28WEJeIUHETLdOgrmkI1VdHpCdEet5enP4qLK9mKrqMgedv6cyrAP+qxOTiUxAi7oEJi8frELoFoTLpa7nI/HQvscgSRt+0kV1SSW7qYtp7xrBMphm4Mi5h/VIfTcEq1u0oJaknSEdNiMYHET7UvcMpPEN31Ed7zxgASmk1I0g6dK66s8CRak5mVxjnfS05+TsZCw/T9baTx1nnGb47DrQksjE6HrsHYPz6nYt3+Sc3L8+wA2tz0J6pF5OD4WP7Kpq7f5fO79DfSxjdtCtDAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
|
||||
.links a[href$="&create="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIpSURBVDjLpZNPSFRRFMZ/749/Kt3IqFTSRoSMmrGIYTTbpEJtjBCCok1Em9JVG1dRC8FFEES5aGFEgRRZWq1iLKKxBiNqLDcltQgmHR9hY6LOu+feFm+YGVsZXbh8nHO53/nud8+xjDH8z3IB7r5avGgMZ8XoBq01okFpjYhGtEGJLtmCKINo/XbgVFPUBdDG9PVEq0P/UvnSvdlwQYFoHQIY/3obpRVKFL5W+OIXUVThrL91AN+XihKCwIeTu85sqPryqsJXUvRARAMwkshsiKB7fw25UgKVJwA40V7H/cl5jh+oL+RGk/P0xIqxl11dr8AXjTYG14HRNxkcx+ZhMoNlg52/ND6VAWMoc6F5+2Zy/l9PMIDrWByL1jI+tcDRaN06BaXxbDqLUnq9AqPBteHpuwUcJ0AIcgBXH93h+/wEyyuLrPk5cmv7gNY8gdIYYyhz4PDeWuIpj85IsS2ujQ2zJAk6DkZpqGnixcwYyU+PifUOX7Eh6DoAx7aIpzwA4imPeMrj+bTH+88PaNkZQWwhsrULsXxie9oAzgcESgUe2NAZCeE6AXZGQhwKh/Cyc5RZVXQ39wFwoeMmjXVhgMqiB8awe0cVP36u0Fi/iW9zvwuzkF3+xUz6Nal0gv6uWww+O02lUwGwmv8FM3l55EtLTvQWXwm+EkRpfNEoUZRXHCE5PUFbuJ0nH4cot1wSH14C3LA2Os6x3m2DwDmgGlgChpLX0/1/AIu8MA7WsWBMAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;}
|
||||
|
@@ -18,9 +18,10 @@ img { vertical-align: middle; margin: 0; padding: 0; }
|
||||
.message { color: black; background: #dedede; padding: .5em .8em; border: 1px solid black; }
|
||||
#menu { overflow: scroll; position: absolute; top: 0; left: 0; width: 270px; white-space: nowrap; background: #FFE594 url('data:image/gif;base64,R0lGODlhXgEBAIIAAPzabPzijvzihPzefvzmnPzedPzmlPzadCwAAAAAXgEBAAIDYEi63P5wGTXJvNZew7sJBNiBwWeWaPoFbNq+cCzPs8DaeJDvuGAPOh9wIBgWAwMjMblsOpnQqHRKrRaY1+sguz1sB4esN0wulM+HtNqMZqsBafgBTp/PAfQ8fs/v+/8ACQA7') top left repeat-y; height: 100%; _height: 650px; border: 1px solid #a3a3a3; }
|
||||
#menu form { margin: 0; }
|
||||
#menu p { text-align: center; font-size: 11px; }
|
||||
#menu p a { color: black; }
|
||||
#menu p a:hover { color: #626262; text-decoration: none; }
|
||||
#menu p, #tables li { text-align: center; font-size: 11px; }
|
||||
#menu p a, #tables li a { color: black; }
|
||||
#menu p a:hover, #tables li a:hover { color: #626262; text-decoration: none; }
|
||||
#tables a, #tables span { background: #FFE594; }
|
||||
#content { margin: 1.5em 0 0 293px; padding: 10px 20px 20px 0; }
|
||||
#lang { margin: 0; padding: 0; text-align: center; font-size: 10px; width: 270px; background-color: #d9dadb; border-bottom: 1px solid black; }
|
||||
#lang a { color: black; font-weight: bold; }
|
||||
|
@@ -106,7 +106,7 @@ img {vertical-align: middle; margin: 0; padding: 0;}
|
||||
#breadcrumb {margin: 0; height: 21px; display: block; position: absolute; top: 0; left: 300px; background-color: #f1f1f1; border: 1px solid #E3E3E3; padding: 2px 12px; line-height: 1.25em }
|
||||
#menu {position: absolute; padding: 10px; margin: 0; top: 28px; left: 0; width: 250px; background-color: #f1f1f1; border: 1px solid #E3E3E3;}
|
||||
#menu form {margin: 0;}
|
||||
#menu p {padding-left: 8px; font-size: 10pt; border-bottom: none;}
|
||||
#menu p, #tables {padding-left: 8px; font-size: 10pt; border-bottom: none;}
|
||||
#menu form p {padding-left: 0; text-align: left;}
|
||||
h1 .h1:hover {text-decoration: underline;}
|
||||
h1, h2 {font: italic normal normal 24px/29px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; margin: 0; padding: 14px 15px 3px 10px; line-height: 35px; text-shadow: rgba(255,255,255,1) 0 1px 0px; background: none;}
|
||||
|
709
designs/lucas-sandery/adminer.css
Normal file
709
designs/lucas-sandery/adminer.css
Normal file
@@ -0,0 +1,709 @@
|
||||
/*
|
||||
Icons from http://FlatIcon.com:
|
||||
"Translation" by Freepik
|
||||
"Power" by Vectors Market
|
||||
"Database" by Madebyoliver
|
||||
"Table" by Vaadin icons
|
||||
"Plus" by Freepik
|
||||
"Up arrow" by Alfredo Hernandez
|
||||
"Down arrow" by Alfredo Hernandez
|
||||
"Forbidden Mark" by Pavel Kozlov
|
||||
"Search" by Freepik
|
||||
|
||||
Background from "All Work and No Play", http://thenewcode.com/1008/SVG-Movie-Backgrounds-Andys-Room-and-Overlook-Hotel
|
||||
*/
|
||||
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
}
|
||||
body {
|
||||
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 340.6 491.8' width='56px' height='81px'%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='229.9,208.7 170.5,243 111,208.7 111,140 170.5,105.7 229.9,140'/%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='0,305.3 59.5,339.6 59.5,408.3 0,442.6'/%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='342.8,442.6 283.3,408.3 283.3,339.6 342.8,305.3'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='91.6,0 0,52.9 0,0'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='340.6,0 340.6,52.9 248.8,0'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='21.4,264.6 102.8,311.6 102.8,431.7 -1.2,491.8 0,544.5 149.7,458.1 149.1,285.1 68.2,236.7 68.2,116.6 172.2,56.5 276.2,116.6 276.2,236.7 192.5,285 192.5,337.1 192.5,337.1 192.5,458.1 342.2,544.5 341,491.8 237,431.7 237,311.6 320.8,263.3 320.8,90.2 171.1,3.8 21.4,90.2'/%3E%3C/svg%3E");
|
||||
}
|
||||
p {
|
||||
margin-right: 0;
|
||||
}
|
||||
a {
|
||||
color: #41658a;
|
||||
}
|
||||
a:visited {
|
||||
color: #414073;
|
||||
}
|
||||
a:link:hover,
|
||||
a:visited:hover,
|
||||
a:link:focus,
|
||||
a:visited:focus {
|
||||
color: #ec5f12;
|
||||
text-decoration: underline;
|
||||
outline: none;
|
||||
}
|
||||
:-moz-focus-inner {
|
||||
border: 0;
|
||||
}
|
||||
#noindex {
|
||||
cursor: help;
|
||||
}
|
||||
#help,
|
||||
input:not([type="image"]),
|
||||
select,
|
||||
textarea,
|
||||
fieldset {
|
||||
border: 1px solid rgba(65, 101, 138, 0.3);
|
||||
}
|
||||
label {
|
||||
white-space: nowrap;
|
||||
}
|
||||
.sqlarea {
|
||||
background: #fff;
|
||||
border: 1px solid rgba(65, 101, 138, 0.3) !important;
|
||||
width: auto !important;
|
||||
}
|
||||
legend {
|
||||
padding: 0 0.5em;
|
||||
}
|
||||
input[type="image"],
|
||||
input[type="file"],
|
||||
input[type="submit"],
|
||||
input[type="reset"],
|
||||
input[type="button"] {
|
||||
border-style: none;
|
||||
}
|
||||
.error,
|
||||
.message {
|
||||
margin-right: 0;
|
||||
color: #fff;
|
||||
}
|
||||
.error {
|
||||
background: #ae1010;
|
||||
}
|
||||
.message {
|
||||
background: #379f17;
|
||||
}
|
||||
.time {
|
||||
color: #70a37f;
|
||||
}
|
||||
.error .time,
|
||||
.message .time {
|
||||
color: #e7ffaf;
|
||||
}
|
||||
thead a sup,
|
||||
.error > a,
|
||||
.error div > a,
|
||||
.error p > a,
|
||||
.message > a,
|
||||
.message div > a,
|
||||
.message p > a {
|
||||
color: #cce2f8;
|
||||
}
|
||||
thead a:link:hover,
|
||||
thead a:visited:hover,
|
||||
thead a:link:focus,
|
||||
thead a:visited:focus,
|
||||
.error > a:link:hover,
|
||||
.error > a:visited:hover,
|
||||
.error > a:link:focus,
|
||||
.error > a:visited:focus,
|
||||
.error div > a:link:hover,
|
||||
.error div > a:visited:hover,
|
||||
.error div > a:link:focus,
|
||||
.error div > a:visited:focus,
|
||||
.error p > a:link:hover,
|
||||
.error p > a:visited:hover,
|
||||
.error p > a:link:focus,
|
||||
.error p > a:visited:focus,
|
||||
.message > a:link:hover,
|
||||
.message > a:visited:hover,
|
||||
.message > a:link:focus,
|
||||
.message > a:visited:focus,
|
||||
.message div > a:link:hover,
|
||||
.message div > a:visited:hover,
|
||||
.message div > a:link:focus,
|
||||
.message div > a:visited:focus,
|
||||
.message p > a:link:hover,
|
||||
.message p > a:visited:hover,
|
||||
.message p > a:link:focus,
|
||||
.message p > a:visited:focus {
|
||||
color: #f39561;
|
||||
}
|
||||
code.jush-sql {
|
||||
display: inline-block;
|
||||
padding: 0.3em 0.5em 0.2em;
|
||||
-webkit-box-decoration-break: clone;
|
||||
-o-box-decoration-break: clone;
|
||||
box-decoration-break: clone;
|
||||
box-sizing: border-box;
|
||||
max-width: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
th > code {
|
||||
background: transparent;
|
||||
}
|
||||
.version {
|
||||
color: #fff;
|
||||
white-space: nowrap;
|
||||
}
|
||||
/*
|
||||
html:lang(en) .version:before,
|
||||
html:lang(en) #version:before {
|
||||
content: 'v';
|
||||
}
|
||||
*/
|
||||
#version:empty {
|
||||
display: none;
|
||||
}
|
||||
#content,
|
||||
#menu {
|
||||
padding: 0 20px 2em;
|
||||
margin: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
#content {
|
||||
min-height: 100%;
|
||||
padding-bottom: 3em;
|
||||
border-left: 20em solid #41658a;
|
||||
}
|
||||
.rtl #content {
|
||||
margin: 0;
|
||||
padding: 0 20px 3em;
|
||||
border-left-style: none;
|
||||
border-right: 20em solid #41658a;
|
||||
}
|
||||
#breadcrumb {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
white-space: normal;
|
||||
background: #70a37f;
|
||||
color: #fff;
|
||||
padding: 0.1em 2.5em 0.1em 20px;
|
||||
height: auto;
|
||||
margin: 0 -20px -2em;
|
||||
top: auto;
|
||||
left: auto;
|
||||
}
|
||||
.rtl #breadcrumb {
|
||||
right: auto;
|
||||
margin: 0 -20px -2em;
|
||||
padding-right: 20px;
|
||||
padding-left: 2.5em;
|
||||
}
|
||||
thead a,
|
||||
#breadcrumb a,
|
||||
thead a:visited,
|
||||
#breadcrumb a:visited {
|
||||
color: inherit;
|
||||
}
|
||||
h1,
|
||||
h2 {
|
||||
margin: 0 -20px 1em;
|
||||
padding: 2em 20px 0.5em;
|
||||
border-bottom-style: none;
|
||||
color: #fff;
|
||||
}
|
||||
#h1,
|
||||
h2 a {
|
||||
color: inherit;
|
||||
}
|
||||
#h1:hover,
|
||||
#h1:focus {
|
||||
text-decoration: underline;
|
||||
}
|
||||
h2 {
|
||||
background: #79b473;
|
||||
position: relative;
|
||||
}
|
||||
.rtl h2 {
|
||||
margin: 0 -20px 1em;
|
||||
}
|
||||
#content > form {
|
||||
overflow: auto;
|
||||
position: relative;
|
||||
margin-top: 1em;
|
||||
}
|
||||
#content > form > :first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
fieldset {
|
||||
display: inline-block;
|
||||
}
|
||||
.rtl fieldset {
|
||||
margin-right: 0;
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
input.default {
|
||||
background-color: #414073;
|
||||
box-shadow: none;
|
||||
}
|
||||
input.required {
|
||||
outline: 1px dashed #ec5f12;
|
||||
outline-offset: 1px;
|
||||
box-shadow: none;
|
||||
}
|
||||
table {
|
||||
border-style: none;
|
||||
background: rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
td,
|
||||
th {
|
||||
border-bottom-style: none;
|
||||
border-right-color: #dde5ef;
|
||||
padding: 0.3em 0.8em 0.4em;
|
||||
background: rgba(65, 101, 138, 0.02);
|
||||
}
|
||||
.rtl td,
|
||||
.rtl th {
|
||||
border-right-style: none;
|
||||
border-left: 1px solid #dde5ef;
|
||||
}
|
||||
th {
|
||||
background: rgba(65, 64, 115, 0.02);
|
||||
}
|
||||
td:last-child,
|
||||
th:last-child {
|
||||
border-style: none;
|
||||
}
|
||||
thead th,
|
||||
thead td {
|
||||
border-right-color: #fff;
|
||||
padding: 0.5em 0.8em 0.6em;
|
||||
background: #414073;
|
||||
color: #fff;
|
||||
}
|
||||
.rtl thead th,
|
||||
.rtl thead td {
|
||||
border-right-style: none;
|
||||
border-left-color: #fff;
|
||||
}
|
||||
thead th {
|
||||
text-align: left;
|
||||
font-weight: normal;
|
||||
}
|
||||
.rtl thead th {
|
||||
text-align: right;
|
||||
}
|
||||
thead td {
|
||||
background: #41658a;
|
||||
}
|
||||
.js .column {
|
||||
background: transparent;
|
||||
padding: 0;
|
||||
margin-top: 0;
|
||||
line-height: 1.25em
|
||||
}
|
||||
.column a {
|
||||
margin-left: 0.2em;
|
||||
display: inline-block;
|
||||
width: 1.25em;
|
||||
height: 1.25em;
|
||||
vertical-align: middle;
|
||||
overflow: hidden;
|
||||
text-indent: -5em;
|
||||
background: #4c3957 center no-repeat;
|
||||
background-size: 66%;
|
||||
}
|
||||
.rtl .column a {
|
||||
margin-left: 0;
|
||||
margin-right: 0.2em;
|
||||
}
|
||||
.column a:hover,
|
||||
.column a:focus {
|
||||
background-color: #ec5f12;
|
||||
}
|
||||
tbody tr:nth-child(even) td {
|
||||
background: rgba(65, 101, 138, 0.06);
|
||||
}
|
||||
tbody tr:nth-child(even) th {
|
||||
background: rgba(65, 64, 115, 0.06);
|
||||
}
|
||||
tbody tr:nth-child(n):hover td {
|
||||
background: rgba(236, 95, 18, 0.15);
|
||||
}
|
||||
tbody tr:nth-child(n):hover th {
|
||||
background: rgba(236, 72, 18, 0.2);
|
||||
}
|
||||
.js .checkable .checked td {
|
||||
background: rgba(236, 72, 18, 0.25);
|
||||
}
|
||||
.js .checkable .checked:nth-child(even) td,
|
||||
.js .checkable .checked th {
|
||||
background: rgba(236, 72, 18, 0.3);
|
||||
}
|
||||
.js .checkable .checked:nth-child(even) th {
|
||||
background: rgba(236, 72, 18, 0.35);
|
||||
}
|
||||
.js .checkable .checked:hover td {
|
||||
background: rgba(236, 72, 18, 0.4);
|
||||
}
|
||||
.js .checkable .checked:hover th {
|
||||
background: rgba(236, 72, 18, 0.45);
|
||||
}
|
||||
.icon {
|
||||
height: 0;
|
||||
padding-top: 1.2em;
|
||||
width: 1.2em;
|
||||
background: #4c3957 center no-repeat;
|
||||
background-size: 66%;
|
||||
}
|
||||
.icon[src*="plus.gif"] {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' width='512px' height='512px' viewBox='0 0 456 456' style='enable-background:new 0 0 456 456;'%3E%3Cg%3E%3Cpolygon points='456,157.566 298.433,157.566 298.433,0 157.567,0 157.567,157.566 0,157.566 0,298.434 157.567,298.434 157.567,456 298.433,456 298.433,298.434 456,298.434' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
|
||||
}
|
||||
.icon[src*="minus.gif"] {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' width='512px' height='512px' viewBox='0 0 456 456' style='enable-background:new 0 0 456 456;'%3E%3Cg%3E%3Cpolygon points='456,157.566 0,157.566 0,298.434 456,298.434' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
|
||||
}
|
||||
.column a[href*="&asc%5B"],
|
||||
.icon[src*="up.gif"] {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' viewBox='0 0 490 490' style='enable-background:new 0 0 490 490;' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='M490,474.459H0L245.009,15.541L490,474.459z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
|
||||
}
|
||||
.column a[href*="&desc%5B"],
|
||||
.icon[src*="down.gif"] {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' viewBox='0 0 490 490' style='enable-background:new 0 0 490 490;' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='M0,15.541h490L244.991,474.459L0,15.541z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
|
||||
}
|
||||
.icon[src*="cross.gif"] {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' viewBox='0 0 174.239 174.239' style='enable-background:new 0 0 174.239 174.239;' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='M146.537,1.047c-1.396-1.396-3.681-1.396-5.077,0L89.658,52.849c-1.396,1.396-3.681,1.396-5.077,0L32.78,1.047 c-1.396-1.396-3.681-1.396-5.077,0L1.047,27.702c-1.396,1.396-1.396,3.681,0,5.077l51.802,51.802c1.396,1.396,1.396,3.681,0,5.077 L1.047,141.46c-1.396,1.396-1.396,3.681,0,5.077l26.655,26.655c1.396,1.396,3.681,1.396,5.077,0l51.802-51.802 c1.396-1.396,3.681-1.396,5.077,0l51.801,51.801c1.396,1.396,3.681,1.396,5.077,0l26.655-26.655c1.396-1.396,1.396-3.681,0-5.077 l-51.801-51.801c-1.396-1.396-1.396-3.681,0-5.077l51.801-51.801c1.396-1.396,1.396-3.681,0-5.077L146.537,1.047z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
|
||||
}
|
||||
.column a[href="#fieldset-search"] {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' viewBox='0 0 310.088 310.088' enable-background='new 0 0 310.088 310.088' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='m299.85,250.413l-62.808-62.808c-3.982-3.982-10.437-3.982-14.418,0l-3.539,3.539-18.586-18.586c29.709-42.872 25.472-102.152-12.716-140.34-42.958-42.958-112.606-42.958-155.563,0s-42.958,112.606 0,155.563c38.189,38.188 97.468,42.425 140.34,12.716l18.586,18.586-3.539,3.539c-3.982,3.981-3.982,10.437 0,14.418l62.808,62.808c13.651,13.651 35.785,13.651 49.436,0s13.65-35.784-0.001-49.435zm-251.368-78.895c-33.921-33.921-33.921-89.115-0.001-123.036 33.922-33.921 89.117-33.922 123.037-0.001v0.001c33.922,33.921 33.922,89.115 0,123.036-16.96,16.961-39.239,25.441-61.518,25.441-22.279,0-44.558-8.48-61.518-25.441z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
|
||||
}
|
||||
.pages {
|
||||
display: inline-block;
|
||||
background: #4c3957;
|
||||
color: #f39561;
|
||||
border-color: rgba(255, 255, 255, 0.8);
|
||||
border-bottom-style: none;
|
||||
padding: 0.3em;
|
||||
padding-right: 0.7em;
|
||||
left: 20em;
|
||||
margin-left: 19px;
|
||||
}
|
||||
.rtl .pages {
|
||||
padding-right: 0.3em;
|
||||
padding-left: 0.7em;
|
||||
right: 20em;
|
||||
margin-left: 0;
|
||||
margin-right: 19px;
|
||||
}
|
||||
.pages span {
|
||||
color: #fff;
|
||||
}
|
||||
.pages a {
|
||||
color: #fff;
|
||||
display: inline-block;
|
||||
padding: 0.1em 0.4em 0.2em;
|
||||
}
|
||||
.loadmore {
|
||||
margin-right: -0.4em;
|
||||
}
|
||||
.rtl .loadmore {
|
||||
margin-right: 0;
|
||||
margin-left: -0.4em;
|
||||
}
|
||||
.pages a:hover,
|
||||
.pages a:focus,
|
||||
.pages a:visited:hover,
|
||||
.pages a:focus:hover {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
background: #ec5f12;
|
||||
}
|
||||
#lang,
|
||||
.logout {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
width: 2em;
|
||||
height: 2em;
|
||||
}
|
||||
#lang {
|
||||
left: 18em;
|
||||
z-index: 1;
|
||||
}
|
||||
.rtl #lang {
|
||||
right: 18em;
|
||||
}
|
||||
.logout {
|
||||
z-index: 2;
|
||||
}
|
||||
.rtl .logout {
|
||||
margin: 0;
|
||||
left: 0;
|
||||
right: auto;
|
||||
}
|
||||
#lang select,
|
||||
#logout {
|
||||
opacity: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
cursor: pointer;
|
||||
z-index: 1;
|
||||
}
|
||||
#lang:after,
|
||||
.logout:after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
display: block;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
content: " ";
|
||||
background: #2d3047 center no-repeat;
|
||||
background-size: 70%;
|
||||
}
|
||||
#lang:after {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' viewBox='0 0 470 470' enable-background='new 0 0 470 470' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='m432.5,227.5h-77.031c-0.611-37.438-5.782-73.616-14.771-105.694h50.518c4.143,0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-55.112c-8.018-24.165-18.316-45.521-30.553-62.656-2.408-3.371-7.093-4.153-10.462-1.745-3.371,2.407-4.152,7.092-1.745,10.462 10.618,14.868 19.688,33.199 26.965,53.939h-77.809v-69.306c0-4.143-3.357-7.5-7.5-7.5s-7.5,3.357-7.5,7.5v69.306h-77.81c7.277-20.74 16.347-39.071 26.965-53.939 2.407-3.37 1.626-8.055-1.745-10.462-3.372-2.407-8.055-1.625-10.462,1.745-12.237,17.135-22.535,38.492-30.553,62.656h-55.112c-4.143,0-7.5,3.357-7.5,7.5s3.357,7.5 7.5,7.5h50.518c-8.988,32.078-14.159,68.256-14.771,105.694h-77.03c-4.143,0-7.5,3.357-7.5,7.5s3.357,7.5 7.5,7.5h77.031c0.611,37.438 5.782,73.616 14.771,105.694h-50.519c-4.143,0-7.5,3.357-7.5,7.5s3.357,7.5 7.5,7.5h55.112c8.019,24.169 18.32,45.529 30.56,62.666 1.464,2.049 3.77,3.142 6.11,3.142 1.508,0 3.031-0.454 4.353-1.397 3.37-2.408 4.151-7.092 1.744-10.463-10.621-14.869-19.693-33.204-26.972-53.947h77.81v69.305c0,4.143 3.357,7.5 7.5,7.5s7.5-3.357 7.5-7.5v-69.306h77.81c-7.278,20.744-16.351,39.078-26.972,53.947-2.407,3.371-1.626,8.055 1.744,10.463 1.321,0.943 2.844,1.397 4.353,1.397 2.341,0 4.646-1.093 6.11-3.142 12.24-17.137 22.54-38.497 30.56-62.666h55.112c4.143,0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-50.519c8.989-32.078 14.16-68.256 14.771-105.694h77.031c4.143,0 7.5-3.357 7.5-7.5s-3.357-7.499-7.5-7.499zm-107.36-105.694c9.313,31.683 14.695,67.958 15.326,105.694h-97.966v-105.694h82.64zm-180.28,0h82.64v105.694h-97.966c0.632-37.737 6.013-74.011 15.326-105.694zm0,226.388c-9.313-31.683-14.695-67.958-15.326-105.694h97.966v105.694h-82.64zm180.28,0h-82.64v-105.694h97.966c-0.632,37.737-6.013,74.012-15.326,105.694z' fill='%23ECEBE4'/%3E%3Cpath d='M401.17,68.83C356.784,24.444,297.771,0,235,0S113.216,24.444,68.83,68.83S0,172.229,0,235.001 c0,46.271,13.391,90.899,38.764,129.316l-28.718,86.148c-0.898,2.695-0.197,5.667,1.812,7.676c2.009,2.008,4.979,2.708,7.676,1.812 l86.15-28.716C144.102,456.609,188.729,470,235,470c62.771,0,121.784-24.444,166.17-68.83S470,297.771,470,235.001 C470,172.229,445.556,113.216,401.17,68.83z M235,455c-44.491,0-87.355-13.222-123.961-38.235 c-1.262-0.862-2.739-1.308-4.231-1.308c-0.797,0-1.598,0.127-2.372,0.385L29.02,440.979l25.14-75.414 c0.741-2.225,0.399-4.668-0.923-6.604C28.222,322.357,15,279.492,15,235.001C15,113.692,113.691,15,235,15s220,98.692,220,220.001 C455,356.309,356.309,455,235,455z' fill='%23ECEBE4'/%3E%3C/g%3E%3C/svg%3E");
|
||||
}
|
||||
.logout:after {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' viewBox='0 0 512 512' enable-background='new 0 0 512 512' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='m256,501c-129.6,0-235-102.2-235-227.8 0-87.8 50.6-166.3 132.1-204.9 10.2-4.8 22.4-0.5 27.2,9.7 4.8,10.2 0.5,22.4-9.7,27.2-67.1,31.8-108.7,96.1-108.7,168-7.10543e-15,103.1 87.1,187 194.1,187 107,0 194.1-83.9 194.1-187 0-72.4-44-138.9-112.2-169.5-10.3-4.6-14.9-16.7-10.3-27 4.6-10.3 16.7-14.9 27-10.2 82.9,37.1 136.4,118.3 136.4,206.7 0,125.6-105.4,227.8-235,227.8z' fill='%23FFFFFF'/%3E%3Cpath d='m256,287.9c-11.3,0-20.4-9.1-20.4-20.4v-236.1c0-11.3 9.2-20.4 20.4-20.4 11.3,0 20.4,9.1 20.4,20.4v236.1c0,11.3-9.1,20.4-20.4,20.4z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
|
||||
}
|
||||
/* need a real element for :focus ~ styling */
|
||||
#lang:hover:after,
|
||||
.logout:hover:after {
|
||||
background-color: #ec5f12;
|
||||
}
|
||||
#menu {
|
||||
top: 0;
|
||||
width: 20em;
|
||||
background: #41658a;
|
||||
}
|
||||
.rtl #menu {
|
||||
left: auto;
|
||||
right: 0;
|
||||
}
|
||||
h1 {
|
||||
background: #414073;
|
||||
}
|
||||
#h1 {
|
||||
font-style: normal;
|
||||
}
|
||||
#dbs {
|
||||
color: transparent;
|
||||
}
|
||||
#dbs:before {
|
||||
content: " ";
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
height: 1em;
|
||||
width: 1em;
|
||||
margin-right: -0.5em;
|
||||
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' viewBox='0 0 58.201 58.201' enable-background='new 0 0 58.201 58.201' xml:space='preserve' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='M31.707,33.07c-0.87,0.027-1.74,0.042-2.606,0.042c-0.869,0-1.742-0.014-2.614-0.042 c-7.341-0.201-13.191-1.238-17.403-2.717C7.104,29.685,5.409,28.899,4.1,28v7.111v0.5v0.5V37.4c2.846,2.971,12.394,5.711,25,5.711 s22.154-2.74,25-5.711v-1.289v-0.5v-0.5V28c-1.318,0.905-3.028,1.697-5.025,2.367C44.865,31.839,39.027,32.87,31.707,33.07z' fill='%23FFFFFF'/%3E%3Cpath d='M4.1,14.889V22v0.5V23v1.289c2.638,2.754,11.033,5.31,22.286,5.668c0.115,0.004,0.233,0.005,0.349,0.008 c0.326,0.009,0.651,0.018,0.982,0.023C28.174,29.996,28.635,30,29.1,30s0.926-0.004,1.383-0.011 c0.33-0.005,0.656-0.014,0.982-0.023c0.116-0.003,0.234-0.005,0.349-0.008c11.253-0.359,19.648-2.915,22.286-5.668V23v-0.5V22 v-7.111C49.233,18.232,38.944,20,29.1,20S8.968,18.232,4.1,14.889z' fill='%23FFFFFF'/%3E%3Cpath d='M53.965,8.542C52.843,4.241,44.215,0,29.1,0C14.023,0,5.404,4.22,4.247,8.51C4.162,8.657,4.1,8.818,4.1,9v0.5v1.806 C6.937,14.267,16.417,17,29.1,17s22.164-2.733,25-5.694V9.5V9C54.1,8.832,54.044,8.681,53.965,8.542z' fill='%23FFFFFF'/%3E%3Cpath d='M4.1,41v8.201c0,0.162,0.043,0.315,0.117,0.451c1.181,4.895,11.747,8.549,24.883,8.549c13.106,0,23.655-3.639,24.875-8.516 c0.08-0.144,0.125-0.309,0.125-0.484v-8.199c-4.135,2.911-12.655,5.199-25,5.199C16.754,46.201,8.234,43.911,4.1,41z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E") center no-repeat;
|
||||
background-size: auto 100%;
|
||||
}
|
||||
.rtl #dbs:before {
|
||||
margin-right: 0;
|
||||
margin-left: -0.5em;
|
||||
}
|
||||
#dbs span {
|
||||
display: none;
|
||||
}
|
||||
#menu p, #tables {
|
||||
padding: 0;
|
||||
margin: 1.5em 0 0;
|
||||
border-bottom-style: none;
|
||||
}
|
||||
#menu .message,
|
||||
#menu .error {
|
||||
padding: 0.2em 0.4em;
|
||||
}
|
||||
input[type="submit"],
|
||||
input[type="reset"],
|
||||
input[type="button"],
|
||||
button,
|
||||
.links a {
|
||||
display: inline-block;
|
||||
font-size: 85%;
|
||||
text-align: center;
|
||||
background: #4c3957;
|
||||
color: #fff;
|
||||
padding: 0.5em 0.8em 0.6em;
|
||||
margin: 0;
|
||||
border-style: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
input[type="submit"]:hover,
|
||||
input[type="submit"]:focus,
|
||||
input[type="reset"]:hover,
|
||||
input[type="reset"]:focus,
|
||||
input[type="button"]:hover,
|
||||
input[type="button"]:focus,
|
||||
button:hover,
|
||||
button:focus,
|
||||
.links a:link:hover,
|
||||
.links a:visited:hover,
|
||||
.links a:link:focus,
|
||||
.links a:visited:focus {
|
||||
color: #fff;
|
||||
background: #ec5f12;
|
||||
text-decoration: none;
|
||||
}
|
||||
input[type="submit"]:disabled,
|
||||
input[type="reset"]:disabled,
|
||||
input[type="button"]:disabled,
|
||||
button:disabled {
|
||||
background-color: rgba(76, 57, 87, 0.35);
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.links .active {
|
||||
font-weight: normal;
|
||||
background-color: #414073;
|
||||
}
|
||||
#menu .links:after {
|
||||
content: " ";
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
#menu .links a {
|
||||
float: left;
|
||||
box-sizing: border-box;
|
||||
width: 48%;
|
||||
width: calc(50% - 5px);
|
||||
}
|
||||
.rtl #menu .links a {
|
||||
float: right;
|
||||
}
|
||||
#menu .links a:nth-child(even) {
|
||||
float: right;
|
||||
}
|
||||
.rtl #menu .links a:nth-child(even) {
|
||||
float: left;
|
||||
}
|
||||
#menu .links a:nth-child(n+3) {
|
||||
margin-top: 10px;
|
||||
}
|
||||
#logins a,
|
||||
#tables a,
|
||||
#tables span {
|
||||
background: #41658a;
|
||||
color: #fff;
|
||||
}
|
||||
#logins {
|
||||
line-height: 2;
|
||||
}
|
||||
#tables a.select {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
overflow: hidden;
|
||||
background: transparent;
|
||||
color: transparent;
|
||||
position: relative;
|
||||
margin-right: 0.3em;
|
||||
}
|
||||
.rtl #tables a.select {
|
||||
margin-right: 0;
|
||||
margin-left: 0.3em;
|
||||
}
|
||||
#tables a.select + a {
|
||||
display: inline-block;
|
||||
padding: 0.3em 0.6em 0.3em 0;
|
||||
margin-top: -0.3em;
|
||||
}
|
||||
.rtl #tables a.select + a {
|
||||
padding-right: 0;
|
||||
padding-left: 0.6em;
|
||||
}
|
||||
#tables a.select:after {
|
||||
content: ' ';
|
||||
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' width='512px' height='512px' viewBox='0 0 16 16'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M0 1v15h16v-15h-16zM5 15h-4v-2h4v2zM5 12h-4v-2h4v2zM5 9h-4v-2h4v2zM5 6h-4v-2h4v2zM10 15h-4v-2h4v2zM10 12h-4v-2h4v2zM10 9h-4v-2h4v2zM10 6h-4v-2h4v2zM15 15h-4v-2h4v2zM15 12h-4v-2h4v2zM15 9h-4v-2h4v2zM15 6h-4v-2h4v2z'/%3E%3C/g%3E%3C/svg%3E") center no-repeat;
|
||||
background-size: contain;
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: -0.1em;
|
||||
}
|
||||
#routines + .links a {
|
||||
margin-right: 0.45em;
|
||||
}
|
||||
#routines + .links a:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
.rtl #routines + .links a {
|
||||
margin-right: 0;
|
||||
margin-left: 0.45em;
|
||||
}
|
||||
.rtl #routines + .links a:last-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
.rtl p,
|
||||
.rtl table,
|
||||
.rtl .error,
|
||||
.rtl .message {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
@media all and (max-device-width:880px) {
|
||||
body {
|
||||
padding-bottom: 2em;
|
||||
}
|
||||
#content {
|
||||
min-height: 0;
|
||||
border-left-style: none;
|
||||
}
|
||||
.rtl #content {
|
||||
border-right-style: none;
|
||||
}
|
||||
.rtl #content,
|
||||
.rtl #menu,
|
||||
#content,
|
||||
#menu {
|
||||
/*! margin: 0; */
|
||||
padding: 0 10px 2em;
|
||||
width: auto;
|
||||
}
|
||||
#breadcrumb {
|
||||
padding: 0 0 0 10px;
|
||||
height: 2em;
|
||||
line-height: 2em;
|
||||
margin: 0 -10px;
|
||||
overflow: auto;
|
||||
position: static;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.rtl #breadcrumb {
|
||||
padding: 0 10px 0 0;
|
||||
margin: 0 -10px;
|
||||
}
|
||||
#breadcrumb:after {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
width: 2.4em;
|
||||
}
|
||||
.rtl h1,
|
||||
.rtl h2,
|
||||
h1,
|
||||
h2 {
|
||||
position: static;
|
||||
margin: 0 -10px 1em;
|
||||
padding: 1em 10px 0.5em;
|
||||
}
|
||||
#content .links a {
|
||||
white-space: normal;
|
||||
margin-bottom: 0.2em;
|
||||
-webkit-box-decoration-break: clone;
|
||||
-o-box-decoration-break: clone;
|
||||
box-decoration-break: clone;
|
||||
}
|
||||
.pages {
|
||||
position: static;
|
||||
margin-left: 0;
|
||||
}
|
||||
.rtl .pages {
|
||||
margin-right: 0;
|
||||
}
|
||||
#lang {
|
||||
margin-left: auto;
|
||||
position: relative;
|
||||
top: auto;
|
||||
left: auto;
|
||||
margin-bottom: -2em;
|
||||
}
|
||||
.rtl #lang {
|
||||
right: auto;
|
||||
margin-left: 0;
|
||||
margin-right: auto;
|
||||
}
|
||||
}
|
@@ -290,7 +290,7 @@ table code {
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
#menu p {
|
||||
#menu p, #tables {
|
||||
border: none;
|
||||
margin: 0 0 4px;
|
||||
padding: 0 0 4px;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user