mirror of
https://github.com/vrana/adminer.git
synced 2025-08-30 09:39:51 +02:00
Compare commits
136 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
7247f801bd | ||
|
21f0481a1d | ||
|
7defb7787d | ||
|
659003e07f | ||
|
2cb426b464 | ||
|
2117f224b6 | ||
|
7ea6266482 | ||
|
edb79998a9 | ||
|
41043f8dad | ||
|
31bbadb479 | ||
|
a2fbcbe28e | ||
|
a623cd69de | ||
|
ed346be313 | ||
|
7eaa57fc0b | ||
|
c275362c30 | ||
|
b2606cda0e | ||
|
da76e6b9b8 | ||
|
83fe083f2f | ||
|
85e6f2ac9e | ||
|
e148db4b0f | ||
|
660703e422 | ||
|
55f11df052 | ||
|
ea6370ef77 | ||
|
0ad6a1e578 | ||
|
e546b483a1 | ||
|
5b443a4e7d | ||
|
e4837a0564 | ||
|
83a0776e8d | ||
|
5bebb439a1 | ||
|
9f0ee9cf41 | ||
|
c002009bfe | ||
|
a592ad52f1 | ||
|
3127c0d95e | ||
|
9447d97a6a | ||
|
c8e41ee649 | ||
|
b327a76fc0 | ||
|
7f2dd73670 | ||
|
c8975a151c | ||
|
150841e5d7 | ||
|
ae03bdd4c4 | ||
|
01e08cc053 | ||
|
a426fefd40 | ||
|
90df1b14f0 | ||
|
cd3231b4af | ||
|
65c52735fb | ||
|
93ccc7502b | ||
|
84e86cf572 | ||
|
1ce5b5ad31 | ||
|
941bf22e52 | ||
|
a5c54563c6 | ||
|
0234fe4a66 | ||
|
1883e250ff | ||
|
56d8b89bee | ||
|
4d66e42817 | ||
|
94f6a45a2a | ||
|
0f08592bc0 | ||
|
a5cbad504c | ||
|
d581f3dedb | ||
|
e8e4934e97 | ||
|
e959e46fa5 | ||
|
bb3d2957e1 | ||
|
ea408aa530 | ||
|
df90d9f68c | ||
|
cf76ad529b | ||
|
3d84dcf859 | ||
|
4b9d88545e | ||
|
26a39ac243 | ||
|
3676b7fb71 | ||
|
c564a8ef50 | ||
|
2780eb01f5 | ||
|
b98d0bcc55 | ||
|
e856e28892 | ||
|
8f269d66b0 | ||
|
3de94b67ca | ||
|
a9a7488454 | ||
|
36f13031f7 | ||
|
6f25b1b5cf | ||
|
659c34f7c5 | ||
|
11f24a52e4 | ||
|
3c3d861f41 | ||
|
7b60b03e6a | ||
|
84c65fcca6 | ||
|
733fe9e430 | ||
|
5c3fb875e1 | ||
|
60d1b7b3b4 | ||
|
db11fa4c1a | ||
|
c3cfc0e69b | ||
|
5f4d407f2e | ||
|
70afe70b72 | ||
|
75f43a4454 | ||
|
78f4513d9d | ||
|
89c66ccabe | ||
|
6ba77b7899 | ||
|
d271d0b481 | ||
|
af7ac6f06a | ||
|
19034c35fe | ||
|
88438cd607 | ||
|
34c792bb59 | ||
|
6ed94f1f6d | ||
|
8c4726bb61 | ||
|
8ab2c7e03b | ||
|
665fafb297 | ||
|
67c2a91c67 | ||
|
78b8707bd0 | ||
|
7c15940be8 | ||
|
8c5603a822 | ||
|
4e7c31a589 | ||
|
cf9cad66e2 | ||
|
26a3967cf9 | ||
|
6c63c2f91e | ||
|
acee5c0011 | ||
|
36b75b4203 | ||
|
4a24ee7672 | ||
|
e21ddd9767 | ||
|
f844fc499e | ||
|
52d7c38ef1 | ||
|
53dd78f5af | ||
|
ea1dad584b | ||
|
910bb39424 | ||
|
14db884471 | ||
|
3410836c12 | ||
|
cd503f6a0d | ||
|
00721402e0 | ||
|
4355aaa96f | ||
|
b1cdc7902b | ||
|
3f4f3454f8 | ||
|
846435aef8 | ||
|
d7982e0b29 | ||
|
7b35ebd82e | ||
|
5b359263eb | ||
|
6ebbd8c719 | ||
|
8bb51bec36 | ||
|
fc5ddddf92 | ||
|
d3a429314a | ||
|
b4392b3f91 | ||
|
2021ea8fd7 |
7
.gitmodules
vendored
7
.gitmodules
vendored
@@ -1,9 +1,6 @@
|
||||
[submodule "jush"]
|
||||
path = externals/jush
|
||||
url = git://git.code.sf.net/p/jush/git
|
||||
[submodule "wymeditor"]
|
||||
path = externals/wymeditor
|
||||
url = git://github.com/wymeditor/wymeditor.git
|
||||
url = git://github.com/vrana/jush
|
||||
[submodule "JsShrink"]
|
||||
path = externals/JsShrink
|
||||
url = git://github.com/vrana/JsShrink.git
|
||||
url = git://github.com/vrana/JsShrink
|
||||
|
@@ -62,7 +62,7 @@ if (!$error && $_POST) {
|
||||
<form action="" method="post">
|
||||
<?php
|
||||
if ($in) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<table cellspacing='0' class='layout'>\n";
|
||||
foreach ($in as $key) {
|
||||
$field = $routine["fields"][$key];
|
||||
$name = $field["field"];
|
||||
|
@@ -27,6 +27,10 @@ if ($row["auto_increment_col"]) {
|
||||
$row["fields"][$row["auto_increment_col"]]["auto_increment"] = true;
|
||||
}
|
||||
|
||||
if ($_POST) {
|
||||
set_adminer_settings(array("comments" => $_POST["comments"], "defaults" => $_POST["defaults"]));
|
||||
}
|
||||
|
||||
if ($_POST && !process_fields($row["fields"]) && !$error) {
|
||||
if ($_POST["drop"]) {
|
||||
queries_redirect(substr(ME, 0, -1), lang('Table has been dropped.'), drop_tables(array($TABLE)));
|
||||
@@ -162,7 +166,7 @@ foreach ($engines as $engine) {
|
||||
<form action="" method="post" id="form">
|
||||
<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 echo lang('Table name'); ?>: <input name="name" data-maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
|
||||
<?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"]) : ""); ?>
|
||||
@@ -170,28 +174,19 @@ foreach ($engines as $engine) {
|
||||
<?php } ?>
|
||||
|
||||
<?php if (support("columns")) { ?>
|
||||
<div class="scrollable">
|
||||
<table cellspacing="0" id="edit-fields" class="nowrap">
|
||||
<?php
|
||||
$comments = ($_POST ? $_POST["comments"] : $row["Comment"] != "");
|
||||
if (!$_POST && !$comments) {
|
||||
foreach ($row["fields"] as $field) {
|
||||
if ($field["comment"] != "") {
|
||||
$comments = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
edit_fields($row["fields"], $collations, "TABLE", $foreign_keys, $comments);
|
||||
edit_fields($row["fields"], $collations, "TABLE", $foreign_keys);
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
<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, !$_POST || $_POST["defaults"], lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
|
||||
<?php echo ($_POST ? "" : script("editingHideDefaults();")); ?>
|
||||
<?php echo checkbox("defaults", 1, ($_POST ? $_POST["defaults"] : adminer_setting("defaults")), lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
|
||||
<?php echo (support("comment")
|
||||
? "<label><input type='checkbox' name='comments' value='1' class='jsonly'" . ($comments ? " checked" : "") . ">" . lang('Comment') . "</label>"
|
||||
. script("qsl('input').onclick = partial(editingCommentsClick, true);")
|
||||
. ' <input name="Comment" value="' . h($row["Comment"]) . '" maxlength="' . (min_version(5.5) ? 2048 : 60) . '"' . ($comments ? '' : ' class="hidden"') . '>'
|
||||
? checkbox("comments", 1, ($_POST ? $_POST["comments"] : adminer_setting("comments")), lang('Comment'), "editingCommentsClick(this, true);", "jsonly")
|
||||
. ' <input name="Comment" value="' . h($row["Comment"]) . '" data-maxlength="' . (min_version(5.5) ? 2048 : 60) . '">'
|
||||
: '')
|
||||
; ?>
|
||||
<p>
|
||||
@@ -225,4 +220,4 @@ foreach ($row["partition_names"] as $key => $val) {
|
||||
?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
<?php echo script("qs('#form')['defaults'].onclick();" . (support("comment") ? " editingCommentsClick.call(qs('#form')['comments']);" : "")); ?>
|
||||
<?php echo script("qs('#form')['defaults'].onclick();" . (support("comment") ? " editingCommentsClick(qs('#form')['comments']);" : "")); ?>
|
||||
|
@@ -47,7 +47,7 @@ if ($_POST) {
|
||||
} elseif ($jush == "sql") {
|
||||
// propose database name with limited privileges
|
||||
foreach (get_vals("SHOW GRANTS") as $grant) {
|
||||
if (preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~', $grant, $match) && $match[1]) {
|
||||
if (preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\.\*)?~', $grant, $match) && $match[1]) {
|
||||
$name = stripcslashes(idf_unescape("`$match[2]`"));
|
||||
break;
|
||||
}
|
||||
@@ -60,7 +60,7 @@ if ($_POST) {
|
||||
<?php
|
||||
echo ($_POST["add_x"] || strpos($name, "\n")
|
||||
? '<textarea id="name" name="name" rows="10" cols="40">' . h($name) . '</textarea><br>'
|
||||
: '<input name="name" id="name" value="' . h($name) . '" maxlength="64" autocapitalize="off">'
|
||||
: '<input name="name" id="name" value="' . h($name) . '" data-maxlength="64" autocapitalize="off">'
|
||||
) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $row["collation"]) . doc_link(array(
|
||||
'sql' => "charset-charsets.html",
|
||||
'mariadb' => "supported-character-sets-and-collations/",
|
||||
|
@@ -66,6 +66,7 @@ if ($adminer->homepage()) {
|
||||
}
|
||||
}
|
||||
$doc_link = doc_link(array('sql' => 'show-table-status.html'));
|
||||
echo "<div class='scrollable'>\n";
|
||||
echo "<table cellspacing='0' class='nowrap checkable'>\n";
|
||||
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
|
||||
echo '<thead><tr class="wrap">';
|
||||
@@ -104,21 +105,22 @@ if ($adminer->homepage()) {
|
||||
echo ($link ? "<td align='right'>" . (support("table") || $key == "Rows" || (support("indexes") && $key != "Data_length")
|
||||
? "<a href='" . h(ME . "$link[0]=") . urlencode($name) . "'$id title='$link[1]'>?</a>"
|
||||
: "<span$id>?</span>"
|
||||
) : "<td id='$key-" . h($name) . "'> ");
|
||||
) : "<td id='$key-" . h($name) . "'>");
|
||||
}
|
||||
$tables++;
|
||||
}
|
||||
echo (support("comment") ? "<td id='Comment-" . h($name) . "'> " : "");
|
||||
echo (support("comment") ? "<td id='Comment-" . h($name) . "'>" : "");
|
||||
}
|
||||
|
||||
echo "<tr><td> <th>" . lang('%d in total', count($tables_list));
|
||||
echo "<td>" . nbsp($jush == "sql" ? $connection->result("SELECT @@storage_engine") : "");
|
||||
echo "<td>" . nbsp(db_collation(DB, collations()));
|
||||
echo "<tr><td><th>" . lang('%d in total', count($tables_list));
|
||||
echo "<td>" . h($jush == "sql" ? $connection->result("SELECT @@storage_engine") : "");
|
||||
echo "<td>" . h(db_collation(DB, collations()));
|
||||
foreach (array("Data_length", "Index_length", "Data_free") as $key) {
|
||||
echo "<td align='right' id='sum-$key'> ";
|
||||
echo "<td align='right' id='sum-$key'>";
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
echo "</div>\n";
|
||||
if (!information_schema(DB)) {
|
||||
echo "<div class='footer'><div>\n";
|
||||
$vacuum = "<input type='submit' value='" . lang('Vacuum') . "'> " . on_help("'VACUUM'");
|
||||
@@ -159,7 +161,7 @@ if ($adminer->homepage()) {
|
||||
$routines = routines();
|
||||
if ($routines) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo '<thead><tr><th>' . lang('Name') . '<td>' . lang('Type') . '<td>' . lang('Return type') . "<td> </thead>\n";
|
||||
echo '<thead><tr><th>' . lang('Name') . '<td>' . lang('Type') . '<td>' . lang('Return type') . "<td></thead>\n";
|
||||
odd('');
|
||||
foreach ($routines as $row) {
|
||||
$name = ($row["SPECIFIC_NAME"] == $row["ROUTINE_NAME"] ? "" : "&name=" . urlencode($row["ROUTINE_NAME"])); // not computed on the pages to be able to print the header first
|
||||
|
354
adminer/drivers/clickhouse.inc.php
Normal file
354
adminer/drivers/clickhouse.inc.php
Normal file
@@ -0,0 +1,354 @@
|
||||
<?php
|
||||
$drivers["clickhouse"] = "ClickHouse (alpha)";
|
||||
|
||||
if (isset($_GET["clickhouse"])) {
|
||||
define("DRIVER", "clickhouse");
|
||||
|
||||
class Min_DB {
|
||||
var $extension = "JSON", $server_info, $errno, $_result, $error, $_url;
|
||||
var $_db = 'default';
|
||||
|
||||
function rootQuery($db, $query) {
|
||||
@ini_set('track_errors', 1); // @ - may be disabled
|
||||
$file = @file_get_contents("$this->_url/?database=$db", false, stream_context_create(array('http' => array(
|
||||
'method' => 'POST',
|
||||
'content' => $this->isQuerySelectLike($query) ? "$query FORMAT JSONCompact" : $query,
|
||||
'header' => 'Content-type: application/x-www-form-urlencoded',
|
||||
'ignore_errors' => 1, // available since PHP 5.2.10
|
||||
))));
|
||||
|
||||
if ($file === false) {
|
||||
$this->error = $php_errormsg;
|
||||
return $file;
|
||||
}
|
||||
if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
|
||||
$this->error = $file;
|
||||
return false;
|
||||
}
|
||||
$return = json_decode($file, true);
|
||||
if ($return === null) {
|
||||
$this->errno = json_last_error();
|
||||
if (function_exists('json_last_error_msg')) {
|
||||
$this->error = json_last_error_msg();
|
||||
} else {
|
||||
$constants = get_defined_constants(true);
|
||||
foreach ($constants['json'] as $name => $value) {
|
||||
if ($value == $this->errno && preg_match('~^JSON_ERROR_~', $name)) {
|
||||
$this->error = $name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return new Min_Result($return);
|
||||
}
|
||||
|
||||
function isQuerySelectLike($query) {
|
||||
return (bool) preg_match('~^(select|show)~i', $query);
|
||||
}
|
||||
|
||||
function query($query) {
|
||||
return $this->rootQuery($this->_db, $query);
|
||||
}
|
||||
|
||||
function connect($server, $username, $password) {
|
||||
preg_match('~^(https?://)?(.*)~', $server, $match);
|
||||
$this->_url = ($match[1] ? $match[1] : "http://") . "$username:$password@$match[2]";
|
||||
$return = $this->query('SELECT 1');
|
||||
return (bool) $return;
|
||||
}
|
||||
|
||||
function select_db($database) {
|
||||
$this->_db = $database;
|
||||
return true;
|
||||
}
|
||||
|
||||
function quote($string) {
|
||||
return "'" . addcslashes($string, "\\'") . "'";
|
||||
}
|
||||
|
||||
function multi_query($query) {
|
||||
return $this->_result = $this->query($query);
|
||||
}
|
||||
|
||||
function store_result() {
|
||||
return $this->_result;
|
||||
}
|
||||
|
||||
function next_result() {
|
||||
return false;
|
||||
}
|
||||
|
||||
function result($query, $field = 0) {
|
||||
$result = $this->query($query);
|
||||
return $result['data'];
|
||||
}
|
||||
}
|
||||
|
||||
class Min_Result {
|
||||
var $num_rows, $_rows, $columns, $meta, $_offset = 0;
|
||||
|
||||
function __construct($result) {
|
||||
$this->num_rows = $result['rows'];
|
||||
$this->_rows = $result['data'];
|
||||
$this->meta = $result['meta'];
|
||||
$this->columns = array_column($this->meta, 'name');
|
||||
reset($this->_rows);
|
||||
}
|
||||
|
||||
function fetch_assoc() {
|
||||
$row = current($this->_rows);
|
||||
next($this->_rows);
|
||||
return $row === false ? false : array_combine($this->columns, $row);
|
||||
}
|
||||
|
||||
function fetch_row() {
|
||||
$row = current($this->_rows);
|
||||
next($this->_rows);
|
||||
return $row;
|
||||
}
|
||||
|
||||
function fetch_field() {
|
||||
$column = $this->_offset++;
|
||||
$return = new stdClass;
|
||||
if ($column < count($this->columns)) {
|
||||
$return->name = $this->meta[$column]['name'];
|
||||
$return->orgname = $return->name;
|
||||
$return->type = $this->meta[$column]['type'];
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Min_Driver extends Min_SQL {
|
||||
function delete($table, $queryWhere, $limit = 0) {
|
||||
return queries("ALTER TABLE " . table($table) . " DELETE $queryWhere");
|
||||
}
|
||||
|
||||
function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
|
||||
$values = array();
|
||||
foreach ($set as $key => $val) {
|
||||
$values[] = "$key = $val";
|
||||
}
|
||||
$query = $separator . implode(",$separator", $values);
|
||||
return queries("ALTER TABLE " . table($table) . " UPDATE $query$queryWhere");
|
||||
}
|
||||
}
|
||||
|
||||
function idf_escape($idf) {
|
||||
return "`" . str_replace("`", "``", $idf) . "`";
|
||||
}
|
||||
|
||||
function table($idf) {
|
||||
return idf_escape($idf);
|
||||
}
|
||||
|
||||
function explain($connection, $query) {
|
||||
return '';
|
||||
}
|
||||
|
||||
function found_rows($table_status, $where) {
|
||||
$rows = get_vals("SELECT COUNT(*) FROM " . idf_escape($table_status["Name"]) . ($where ? " WHERE " . implode(" AND ", $where) : ""));
|
||||
return empty($rows) ? false : $rows[0];
|
||||
}
|
||||
|
||||
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
|
||||
foreach ($fields as $field) {
|
||||
if ($field[1][2] === " NULL") {
|
||||
$field[1][1] = " Nullable({$field[1][1]})";
|
||||
}
|
||||
unset($field[1][2]);
|
||||
}
|
||||
}
|
||||
|
||||
function truncate_tables($tables) {
|
||||
return apply_queries("TRUNCATE TABLE", $tables);
|
||||
}
|
||||
|
||||
function drop_views($views) {
|
||||
return drop_tables($views);
|
||||
}
|
||||
|
||||
function drop_tables($tables) {
|
||||
return apply_queries("DROP TABLE", $tables);
|
||||
}
|
||||
|
||||
function connect() {
|
||||
global $adminer;
|
||||
$connection = new Min_DB;
|
||||
$credentials = $adminer->credentials();
|
||||
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
|
||||
return $connection;
|
||||
}
|
||||
return $connection->error;
|
||||
}
|
||||
|
||||
function get_databases($flush) {
|
||||
global $connection;
|
||||
$result = get_rows('SHOW DATABASES');
|
||||
|
||||
$return = array();
|
||||
foreach ($result as $row) {
|
||||
$return[] = $row['name'];
|
||||
}
|
||||
sort($return);
|
||||
return $return;
|
||||
}
|
||||
|
||||
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
|
||||
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? ", $offset" : "") : "");
|
||||
}
|
||||
|
||||
function limit1($table, $query, $where, $separator = "\n") {
|
||||
return limit($query, $where, 1, 0, $separator);
|
||||
}
|
||||
|
||||
function db_collation($db, $collations) {
|
||||
}
|
||||
|
||||
function engines() {
|
||||
return array('MergeTree');
|
||||
}
|
||||
|
||||
function logged_user() {
|
||||
global $adminer;
|
||||
$credentials = $adminer->credentials();
|
||||
return $credentials[1];
|
||||
}
|
||||
|
||||
function tables_list() {
|
||||
$result = get_rows('SHOW TABLES');
|
||||
$return = array();
|
||||
foreach ($result as $row) {
|
||||
$return[$row['name']] = 'table';
|
||||
}
|
||||
ksort($return);
|
||||
return $return;
|
||||
}
|
||||
|
||||
function count_tables($databases) {
|
||||
return array();
|
||||
}
|
||||
|
||||
function table_status($name = "", $fast = false) {
|
||||
global $connection;
|
||||
$return = array();
|
||||
$tables = get_rows("SELECT name, engine FROM system.tables WHERE database = " . q($connection->_db));
|
||||
foreach ($tables as $table) {
|
||||
$return[$table['name']] = array(
|
||||
'Name' => $table['name'],
|
||||
'Engine' => $table['engine'],
|
||||
);
|
||||
if ($name === $table['name']) {
|
||||
return $return[$table['name']];
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
function is_view($table_status) {
|
||||
return false;
|
||||
}
|
||||
|
||||
function fk_support($table_status) {
|
||||
return false;
|
||||
}
|
||||
|
||||
function convert_field($field) {
|
||||
}
|
||||
|
||||
function unconvert_field($field, $return) {
|
||||
if (in_array($field['type'], array("Int8", "Int16", "Int32", "Int64", "UInt8", "UInt16", "UInt32", "UInt64", "Float32", "Float64"))) {
|
||||
return "to$field[type]($return)";
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
function fields($table) {
|
||||
$return = array();
|
||||
$result = get_rows("SELECT name, type, default_expression FROM system.columns WHERE " . idf_escape('table') . " = " . q($table));
|
||||
foreach($result as $row) {
|
||||
$type = trim($row['type']);
|
||||
$nullable = strpos($type, 'Nullable(') === 0;
|
||||
$return[trim($row['name'])] = array(
|
||||
"field" => trim($row['name']),
|
||||
"full_type" => $type,
|
||||
"type" => $type,
|
||||
"default" => trim($row['default_expression']),
|
||||
"null" => $nullable,
|
||||
"auto_increment" => '0',
|
||||
"privileges" => array("insert" => 1, "select" => 1, "update" => 0),
|
||||
);
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
function indexes($table, $connection2 = null) {
|
||||
return array();
|
||||
}
|
||||
|
||||
function foreign_keys($table) {
|
||||
return array();
|
||||
}
|
||||
|
||||
function collations() {
|
||||
return array();
|
||||
}
|
||||
|
||||
function information_schema($db) {
|
||||
return false;
|
||||
}
|
||||
|
||||
function error() {
|
||||
global $connection;
|
||||
return h($connection->error);
|
||||
}
|
||||
|
||||
function types() {
|
||||
return array();
|
||||
}
|
||||
|
||||
function schemas() {
|
||||
return array();
|
||||
}
|
||||
|
||||
function get_schema() {
|
||||
return "";
|
||||
}
|
||||
|
||||
function set_schema($schema) {
|
||||
return true;
|
||||
}
|
||||
|
||||
function auto_increment() {
|
||||
return '';
|
||||
}
|
||||
|
||||
function last_id() {
|
||||
return 0; // ClickHouse doesn't have it
|
||||
}
|
||||
|
||||
function support($feature) {
|
||||
return preg_match("~^(columns|sql|status|table)$~", $feature);
|
||||
}
|
||||
|
||||
$jush = "clickhouse";
|
||||
$types = array();
|
||||
$structured_types = array();
|
||||
foreach (array( //! arrays
|
||||
lang('Numbers') => array("Int8" => 3, "Int16" => 5, "Int32" => 10, "Int64" => 19, "UInt8" => 3, "UInt16" => 5, "UInt32" => 10, "UInt64" => 20, "Float32" => 7, "Float64" => 16, 'Decimal' => 38, 'Decimal32' => 9, 'Decimal64' => 18, 'Decimal128' => 38),
|
||||
lang('Date and time') => array("Date" => 13, "DateTime" => 20),
|
||||
lang('Strings') => array("String" => 0),
|
||||
lang('Binary') => array("FixedString" => 0),
|
||||
) as $key => $val) {
|
||||
$types += $val;
|
||||
$structured_types[$key] = array_keys($val);
|
||||
}
|
||||
$unsigned = array();
|
||||
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL");
|
||||
$functions = array();
|
||||
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||
$edit_functions = array();
|
||||
}
|
@@ -2,10 +2,10 @@
|
||||
$drivers["elastic"] = "Elasticsearch (beta)";
|
||||
|
||||
if (isset($_GET["elastic"])) {
|
||||
$possible_drivers = array("json");
|
||||
$possible_drivers = array("json + allow_url_fopen");
|
||||
define("DRIVER", "elastic");
|
||||
|
||||
if (function_exists('json_decode')) {
|
||||
if (function_exists('json_decode') && ini_bool('allow_url_fopen')) {
|
||||
class Min_DB {
|
||||
var $extension = "JSON", $server_info, $errno, $error, $_url;
|
||||
|
||||
@@ -129,7 +129,7 @@ if (isset($_GET["elastic"])) {
|
||||
}
|
||||
}
|
||||
foreach ($where as $val) {
|
||||
list($col,$op,$val) = explode(" ",$val,3);
|
||||
list($col, $op, $val) = explode(" ", $val, 3);
|
||||
if ($col == "_id") {
|
||||
$data["query"]["ids"]["values"][] = $val;
|
||||
}
|
||||
@@ -177,7 +177,8 @@ if (isset($_GET["elastic"])) {
|
||||
return new Min_Result($return);
|
||||
}
|
||||
|
||||
function update($type, $record, $queryWhere) {
|
||||
function update($type, $record, $queryWhere, $limit = 0, $separator = "\n") {
|
||||
//! use $limit
|
||||
$parts = preg_split('~ *= *~', $queryWhere);
|
||||
if (count($parts) == 2) {
|
||||
$id = trim($parts[1]);
|
||||
@@ -195,7 +196,8 @@ if (isset($_GET["elastic"])) {
|
||||
return $response['created'];
|
||||
}
|
||||
|
||||
function delete($type, $queryWhere) {
|
||||
function delete($type, $queryWhere, $limit = 0) {
|
||||
//! use $limit
|
||||
$ids = array();
|
||||
if (is_array($_GET["where"]) && $_GET["where"]["_id"]) {
|
||||
$ids[] = $_GET["where"]["_id"];
|
||||
@@ -225,8 +227,11 @@ if (isset($_GET["elastic"])) {
|
||||
function connect() {
|
||||
global $adminer;
|
||||
$connection = new Min_DB;
|
||||
$credentials = $adminer->credentials();
|
||||
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
|
||||
list($server, $username, $password) = $adminer->credentials();
|
||||
if ($password != "" && $connection->connect($server, $username, "")) {
|
||||
return lang('Database does not support password.');
|
||||
}
|
||||
if ($connection->connect($server, $username, $password)) {
|
||||
return $connection;
|
||||
}
|
||||
return $connection->error;
|
||||
|
@@ -7,26 +7,10 @@ if (isset($_GET["mongo"])) {
|
||||
|
||||
if (class_exists('MongoDB')) {
|
||||
class Min_DB {
|
||||
var $extension = "Mongo", $error, $last_id, $_link, $_db;
|
||||
var $extension = "Mongo", $server_info = MongoClient::VERSION, $error, $last_id, $_link, $_db;
|
||||
|
||||
function connect($server, $username, $password) {
|
||||
global $adminer;
|
||||
$db = $adminer->database();
|
||||
$options = array();
|
||||
if ($username != "") {
|
||||
$options["username"] = $username;
|
||||
$options["password"] = $password;
|
||||
}
|
||||
if ($db != "") {
|
||||
$options["db"] = $db;
|
||||
}
|
||||
try {
|
||||
$this->_link = @new MongoClient("mongodb://$server", $options);
|
||||
return true;
|
||||
} catch (Exception $ex) {
|
||||
$this->error = $ex->getMessage();
|
||||
return false;
|
||||
}
|
||||
function connect($uri, $options) {
|
||||
return @new MongoClient($uri, $options);
|
||||
}
|
||||
|
||||
function query($query) {
|
||||
@@ -214,30 +198,14 @@ if (isset($_GET["mongo"])) {
|
||||
|
||||
} elseif (class_exists('MongoDB\Driver\Manager')) {
|
||||
class Min_DB {
|
||||
var $extension = "MongoDB", $error, $last_id;
|
||||
var $extension = "MongoDB", $server_info = MONGODB_VERSION, $error, $last_id;
|
||||
/** @var MongoDB\Driver\Manager */
|
||||
var $_link;
|
||||
var $_db, $_db_name;
|
||||
|
||||
function connect($server, $username, $password) {
|
||||
global $adminer;
|
||||
$db = $adminer->database();
|
||||
$options = array();
|
||||
if ($username != "") {
|
||||
$options["username"] = $username;
|
||||
$options["password"] = $password;
|
||||
}
|
||||
if ($db != "") {
|
||||
$options["db"] = $db;
|
||||
}
|
||||
try {
|
||||
$class = 'MongoDB\Driver\Manager';
|
||||
$this->_link = new $class("mongodb://$server", $options);
|
||||
return true;
|
||||
} catch (Exception $ex) {
|
||||
$this->error = $ex->getMessage();
|
||||
return false;
|
||||
}
|
||||
function connect($uri, $options) {
|
||||
$class = 'MongoDB\Driver\Manager';
|
||||
return new $class($uri, $options);
|
||||
}
|
||||
|
||||
function query($query) {
|
||||
@@ -245,13 +213,8 @@ if (isset($_GET["mongo"])) {
|
||||
}
|
||||
|
||||
function select_db($database) {
|
||||
try {
|
||||
$this->_db_name = $database;
|
||||
return true;
|
||||
} catch (Exception $ex) {
|
||||
$this->error = $ex->getMessage();
|
||||
return false;
|
||||
}
|
||||
$this->_db_name = $database;
|
||||
return true;
|
||||
}
|
||||
|
||||
function quote($string) {
|
||||
@@ -405,7 +368,7 @@ if (isset($_GET["mongo"])) {
|
||||
}
|
||||
|
||||
function get_databases($flush) {
|
||||
/** @var $connection Min_DB */
|
||||
/** @var Min_DB */
|
||||
global $connection;
|
||||
$return = array();
|
||||
$class = 'MongoDB\Driver\Command';
|
||||
@@ -516,7 +479,7 @@ if (isset($_GET["mongo"])) {
|
||||
}
|
||||
|
||||
function where_to_query($whereAnd = array(), $whereOr = array()) {
|
||||
global $operators;
|
||||
global $adminer;
|
||||
$data = array();
|
||||
foreach (array('and' => $whereAnd, 'or' => $whereOr) as $type => $where) {
|
||||
if (is_array($where)) {
|
||||
@@ -528,7 +491,7 @@ if (isset($_GET["mongo"])) {
|
||||
$class = 'MongoDB\BSON\ObjectID';
|
||||
$val = new $class($val);
|
||||
}
|
||||
if (!in_array($op, $operators)) {
|
||||
if (!in_array($op, $adminer->operators)) {
|
||||
continue;
|
||||
}
|
||||
if (preg_match('~^\(f\)(.+)~', $op, $match)) {
|
||||
@@ -563,7 +526,7 @@ if (isset($_GET["mongo"])) {
|
||||
$op = '$regex';
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
continue 2;
|
||||
}
|
||||
if ($type == 'and') {
|
||||
$data['$and'][] = array($col => array($op => $val));
|
||||
@@ -618,6 +581,10 @@ if (isset($_GET["mongo"])) {
|
||||
return $return;
|
||||
}
|
||||
|
||||
function create_database($db, $collation) {
|
||||
return true;
|
||||
}
|
||||
|
||||
function last_id() {
|
||||
global $connection;
|
||||
return $connection->last_id;
|
||||
@@ -641,11 +608,31 @@ if (isset($_GET["mongo"])) {
|
||||
function connect() {
|
||||
global $adminer;
|
||||
$connection = new Min_DB;
|
||||
$credentials = $adminer->credentials();
|
||||
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
|
||||
return $connection;
|
||||
list($server, $username, $password) = $adminer->credentials();
|
||||
$options = array();
|
||||
if ($username . $password != "") {
|
||||
$options["username"] = $username;
|
||||
$options["password"] = $password;
|
||||
}
|
||||
$db = $adminer->database();
|
||||
if ($db != "") {
|
||||
$options["db"] = $db;
|
||||
}
|
||||
try {
|
||||
$connection->_link = $connection->connect("mongodb://$server", $options);
|
||||
if ($password != "") {
|
||||
$options["password"] = "";
|
||||
try {
|
||||
$connection->connect("mongodb://$server", $options);
|
||||
return lang('Database does not support password.');
|
||||
} catch (Exception $ex) {
|
||||
// this is what we want
|
||||
}
|
||||
}
|
||||
return $connection;
|
||||
} catch (Exception $ex) {
|
||||
return $ex->getMessage();
|
||||
}
|
||||
return $connection->error;
|
||||
}
|
||||
|
||||
function alter_indexes($table, $alter) {
|
||||
@@ -675,7 +662,7 @@ if (isset($_GET["mongo"])) {
|
||||
}
|
||||
|
||||
function support($feature) {
|
||||
return preg_match("~database|indexes~", $feature);
|
||||
return preg_match("~database|indexes|descidx~", $feature);
|
||||
}
|
||||
|
||||
function db_collation($db, $collations) {
|
||||
|
@@ -24,7 +24,13 @@ if (isset($_GET["mssql"])) {
|
||||
}
|
||||
|
||||
function connect($server, $username, $password) {
|
||||
$this->_link = @sqlsrv_connect($server, array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8"));
|
||||
global $adminer;
|
||||
$db = $adminer->database();
|
||||
$connection_info = array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8");
|
||||
if ($db != "") {
|
||||
$connection_info["Database"] = $db;
|
||||
}
|
||||
$this->_link = @sqlsrv_connect(preg_replace('~:~', ',', $server), $connection_info);
|
||||
if ($this->_link) {
|
||||
$info = sqlsrv_server_info($this->_link);
|
||||
$this->server_info = $info['SQLServerVersion'];
|
||||
@@ -147,8 +153,10 @@ if (isset($_GET["mssql"])) {
|
||||
$this->_link = @mssql_connect($server, $username, $password);
|
||||
if ($this->_link) {
|
||||
$result = $this->query("SELECT SERVERPROPERTY('ProductLevel'), SERVERPROPERTY('Edition')");
|
||||
$row = $result->fetch_row();
|
||||
$this->server_info = $this->result("sp_server_info 2", 2) . " [$row[0]] $row[1]";
|
||||
if ($result) {
|
||||
$row = $result->fetch_row();
|
||||
$this->server_info = $this->result("sp_server_info 2", 2) . " [$row[0]] $row[1]";
|
||||
}
|
||||
} else {
|
||||
$this->error = mssql_get_last_message();
|
||||
}
|
||||
@@ -239,7 +247,7 @@ if (isset($_GET["mssql"])) {
|
||||
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);
|
||||
$this->dsn("dblib:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\d)~', ';port=\1', $server)), $username, $password);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -406,7 +414,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
|
||||
|
||||
function view($name) {
|
||||
global $connection;
|
||||
return array("select" => preg_replace('~^(?:[^[]|\\[[^]]*])*\\s+AS\\s+~isU', '', $connection->result("SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = SCHEMA_NAME() AND TABLE_NAME = " . q($name))));
|
||||
return array("select" => preg_replace('~^(?:[^[]|\[[^]]*])*\s+AS\s+~isU', '', $connection->result("SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = SCHEMA_NAME() AND TABLE_NAME = " . q($name))));
|
||||
}
|
||||
|
||||
function collations() {
|
||||
@@ -423,7 +431,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
|
||||
|
||||
function error() {
|
||||
global $connection;
|
||||
return nl_br(h(preg_replace('~^(\\[[^]]*])+~m', '', $connection->error)));
|
||||
return nl_br(h(preg_replace('~^(\[[^]]*])+~m', '', $connection->error)));
|
||||
}
|
||||
|
||||
function create_database($db, $collation) {
|
||||
@@ -454,7 +462,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
|
||||
if (!$val) {
|
||||
$alter["DROP"][] = " COLUMN $column";
|
||||
} else {
|
||||
$val[1] = preg_replace("~( COLLATE )'(\\w+)'~", "\\1\\2", $val[1]);
|
||||
$val[1] = preg_replace("~( COLLATE )'(\\w+)'~", '\1\2', $val[1]);
|
||||
if ($field[0] == "") {
|
||||
$alter["ADD"][] = "\n " . implode("", $val) . ($table == "" ? substr($foreign[$val[0]], 16 + strlen($val[0])) : ""); // 16 - strlen(" FOREIGN KEY ()")
|
||||
} else {
|
||||
@@ -561,7 +569,7 @@ WHERE s.xtype = 'TR' AND s.name = " . q($name)
|
||||
); // triggers are not schema-scoped
|
||||
$return = reset($rows);
|
||||
if ($return) {
|
||||
$return["Statement"] = preg_replace('~^.+\\s+AS\\s+~isU', '', $return["text"]); //! identifiers, comments
|
||||
$return["Statement"] = preg_replace('~^.+\s+AS\s+~isU', '', $return["text"]); //! identifiers, comments
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
@@ -624,7 +632,7 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
|
||||
}
|
||||
|
||||
function support($feature) {
|
||||
return preg_match('~^(columns|database|drop_col|indexes|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
|
||||
return preg_match('~^(columns|database|drop_col|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
|
||||
}
|
||||
|
||||
$jush = "mssql";
|
||||
|
@@ -30,6 +30,7 @@ if (!defined("DRIVER")) {
|
||||
(!is_numeric($port) ? $port : $socket),
|
||||
($ssl ? 64 : 0) // 64 - MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT (not available before PHP 5.6.16)
|
||||
);
|
||||
$this->options(MYSQLI_OPT_LOCAL_INFILE, false);
|
||||
return $return;
|
||||
}
|
||||
|
||||
@@ -56,7 +57,7 @@ if (!defined("DRIVER")) {
|
||||
}
|
||||
}
|
||||
|
||||
} elseif (extension_loaded("mysql") && !(ini_get("sql.safe_mode") && extension_loaded("pdo_mysql"))) {
|
||||
} elseif (extension_loaded("mysql") && !((ini_bool("sql.safe_mode") || ini_bool("mysql.allow_local_infile")) && extension_loaded("pdo_mysql"))) {
|
||||
class Min_DB {
|
||||
var
|
||||
$extension = "MySQL", ///< @var string extension name
|
||||
@@ -74,6 +75,10 @@ if (!defined("DRIVER")) {
|
||||
* @return bool
|
||||
*/
|
||||
function connect($server, $username, $password) {
|
||||
if (ini_bool("mysql.allow_local_infile")) {
|
||||
$this->error = lang('Disable %s or enable %s or %s extensions.', "'mysql.allow_local_infile'", "MySQLi", "PDO_MySQL");
|
||||
return false;
|
||||
}
|
||||
$this->_link = @mysql_connect(
|
||||
($server != "" ? $server : ini_get("mysql.default_host")),
|
||||
("$server$username" != "" ? $username : ini_get("mysql.default_user")),
|
||||
@@ -230,17 +235,17 @@ if (!defined("DRIVER")) {
|
||||
|
||||
function connect($server, $username, $password) {
|
||||
global $adminer;
|
||||
$options = array();
|
||||
$options = array(PDO::MYSQL_ATTR_LOCAL_INFILE => false);
|
||||
$ssl = $adminer->connectSsl();
|
||||
if ($ssl) {
|
||||
$options = array(
|
||||
$options += array(
|
||||
PDO::MYSQL_ATTR_SSL_KEY => $ssl['key'],
|
||||
PDO::MYSQL_ATTR_SSL_CERT => $ssl['cert'],
|
||||
PDO::MYSQL_ATTR_SSL_CA => $ssl['ca'],
|
||||
);
|
||||
}
|
||||
$this->dsn(
|
||||
"mysql:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\\d)~', ';port=\\1', $server)),
|
||||
"mysql:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\d)~', ';port=\1', $server)),
|
||||
$username,
|
||||
$password,
|
||||
$options
|
||||
@@ -298,8 +303,18 @@ if (!defined("DRIVER")) {
|
||||
return queries($prefix . implode(",\n", $values) . $suffix);
|
||||
}
|
||||
|
||||
function slowQuery($query, $timeout) {
|
||||
if (min_version('5.7.8', '10.1.2')) {
|
||||
if (preg_match('~MariaDB~', $this->_conn->server_info)) {
|
||||
return "SET STATEMENT max_statement_time=$timeout FOR $query";
|
||||
} elseif (preg_match('~^(SELECT\b)(.+)~is', $query, $match)) {
|
||||
return "$match[1] /*+ MAX_EXECUTION_TIME(" . ($timeout * 1000) . ") */ $match[2]";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function convertSearch($idf, $val, $field) {
|
||||
return (preg_match('~char|text|enum|set~', $field["type"]) && !preg_match("~^utf8~", $field["collation"])
|
||||
return (preg_match('~char|text|enum|set~', $field["type"]) && !preg_match("~^utf8~", $field["collation"]) && preg_match('~[\x80-\xFF]~', $val['val'])
|
||||
? "CONVERT($idf USING " . charset($this->_conn) . ")"
|
||||
: $idf
|
||||
);
|
||||
@@ -376,7 +391,7 @@ if (!defined("DRIVER")) {
|
||||
$return = get_session("dbs");
|
||||
if ($return === null) {
|
||||
$query = (min_version(5)
|
||||
? "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA"
|
||||
? "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA ORDER BY SCHEMA_NAME"
|
||||
: "SHOW DATABASES"
|
||||
); // SHOW DATABASES can be disabled by skip_show_database
|
||||
$return = ($flush ? slow_query($query) : get_vals($query));
|
||||
@@ -484,7 +499,7 @@ if (!defined("DRIVER")) {
|
||||
) as $row) {
|
||||
if ($row["Engine"] == "InnoDB") {
|
||||
// ignore internal comment, unnecessary since MySQL 5.1.21
|
||||
$row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]);
|
||||
$row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\1', $row["Comment"]);
|
||||
}
|
||||
if (!isset($row["Engine"])) {
|
||||
$row["Comment"] = "";
|
||||
@@ -521,7 +536,7 @@ if (!defined("DRIVER")) {
|
||||
function fields($table) {
|
||||
$return = array();
|
||||
foreach (get_rows("SHOW FULL COLUMNS FROM " . table($table)) as $row) {
|
||||
preg_match('~^([^( ]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match);
|
||||
preg_match('~^([^( ]+)(?:\((.+)\))?( unsigned)?( zerofill)?$~', $row["Type"], $match);
|
||||
$return[$row["Field"]] = array(
|
||||
"field" => $row["Field"],
|
||||
"full_type" => $row["Type"],
|
||||
@@ -564,7 +579,7 @@ if (!defined("DRIVER")) {
|
||||
*/
|
||||
function foreign_keys($table) {
|
||||
global $connection, $on_actions;
|
||||
static $pattern = '`(?:[^`]|``)+`';
|
||||
static $pattern = '(?:`(?:[^`]|``)+`)|(?:"(?:[^"]|"")+")';
|
||||
$return = array();
|
||||
$create_table = $connection->result("SHOW CREATE TABLE " . table($table), 1);
|
||||
if ($create_table) {
|
||||
@@ -591,7 +606,7 @@ if (!defined("DRIVER")) {
|
||||
*/
|
||||
function view($name) {
|
||||
global $connection;
|
||||
return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)*\\s+AS\\s+~isU', '', $connection->result("SHOW CREATE VIEW " . table($name), 1)));
|
||||
return array("select" => preg_replace('~^(?:[^`]|`[^`]*`)*\s+AS\s+~isU', '', $connection->result("SHOW CREATE VIEW " . table($name), 1)));
|
||||
}
|
||||
|
||||
/** Get sorted grouped list of collations
|
||||
@@ -795,19 +810,22 @@ if (!defined("DRIVER")) {
|
||||
queries("SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'");
|
||||
foreach ($tables as $table) {
|
||||
$name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
|
||||
if (!queries("\nDROP TABLE IF EXISTS $name")
|
||||
|| !queries("CREATE TABLE $name LIKE " . table($table))
|
||||
if (!queries("CREATE TABLE $name LIKE " . table($table))
|
||||
|| !queries("INSERT INTO $name SELECT * FROM " . table($table))
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_\\"))) as $row) {
|
||||
$trigger = $row["Trigger"];
|
||||
if (!queries("CREATE TRIGGER " . ($target == DB ? idf_escape("copy_$trigger") : idf_escape($target) . "." . idf_escape($trigger)) . " $row[Timing] $row[Event] ON $name FOR EACH ROW\n$row[Statement];")) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($views as $table) {
|
||||
$name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
|
||||
$view = view($table);
|
||||
if (!queries("DROP VIEW IF EXISTS $name")
|
||||
|| !queries("CREATE VIEW $name AS $view[select]") //! USE to avoid db.table
|
||||
) {
|
||||
if (!queries("CREATE VIEW $name AS $view[select]")) { //! USE to avoid db.table
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -870,7 +888,7 @@ if (!defined("DRIVER")) {
|
||||
"field" => $name,
|
||||
"type" => strtolower($param[5]),
|
||||
"length" => preg_replace_callback("~$enum_length~s", 'normalize_enum', $param[6]),
|
||||
"unsigned" => strtolower(preg_replace('~\\s+~', ' ', trim("$param[8] $param[7]"))),
|
||||
"unsigned" => strtolower(preg_replace('~\s+~', ' ', trim("$param[8] $param[7]"))),
|
||||
"null" => 1,
|
||||
"full_type" => $param[4],
|
||||
"inout" => strtoupper($param[1]),
|
||||
@@ -976,7 +994,7 @@ if (!defined("DRIVER")) {
|
||||
global $connection;
|
||||
$return = $connection->result("SHOW CREATE TABLE " . table($table), 1);
|
||||
if (!$auto_increment) {
|
||||
$return = preg_replace('~ AUTO_INCREMENT=\\d+~', '', $return); //! skip comments
|
||||
$return = preg_replace('~ AUTO_INCREMENT=\d+~', '', $return); //! skip comments
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
@@ -1065,11 +1083,11 @@ if (!defined("DRIVER")) {
|
||||
}
|
||||
|
||||
/** Check whether a feature is supported
|
||||
* @param string "comment", "copy", "database", "drop_col", "dump", "event", "kill", "materializedview", "partitioning", "privileges", "procedure", "processlist", "routine", "scheme", "sequence", "status", "table", "trigger", "type", "variables", "view", "view_trigger"
|
||||
* @param string "comment", "copy", "database", "descidx", "drop_col", "dump", "event", "indexes", "kill", "materializedview", "partitioning", "privileges", "procedure", "processlist", "routine", "scheme", "sequence", "status", "table", "trigger", "type", "variables", "view", "view_trigger"
|
||||
* @return bool
|
||||
*/
|
||||
function support($feature) {
|
||||
return !preg_match("~scheme|sequence|type|view_trigger|materializedview" . (min_version(5.1) ? "" : "|event|partitioning" . (min_version(5) ? "" : "|routine|trigger|view")) . "~", $feature);
|
||||
return !preg_match("~scheme|sequence|type|view_trigger|materializedview" . (min_version(8) ? "" : "|descidx" . (min_version(5.1) ? "" : "|event|partitioning" . (min_version(5) ? "" : "|routine|trigger|view"))) . "~", $feature);
|
||||
}
|
||||
|
||||
function kill_process($val) {
|
||||
@@ -1105,7 +1123,7 @@ if (!defined("DRIVER")) {
|
||||
$grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"); ///< @var array grouping functions used in select
|
||||
$edit_functions = array( ///< @var array of array("$type|$type2" => "$function/$function2") functions used in editing, [0] - edit and insert, [1] - edit only
|
||||
array(
|
||||
"char" => "md5/sha1/password/encrypt/uuid", //! JavaScript for disabling maxlength
|
||||
"char" => "md5/sha1/password/encrypt/uuid",
|
||||
"binary" => "md5/sha1",
|
||||
"date|time" => "now",
|
||||
), array(
|
||||
|
@@ -398,7 +398,7 @@ ORDER BY PROCESS
|
||||
}
|
||||
|
||||
function support($feature) {
|
||||
return preg_match('~^(columns|database|drop_col|indexes|processlist|scheme|sql|status|table|variables|view|view_trigger)$~', $feature); //!
|
||||
return preg_match('~^(columns|database|drop_col|indexes|descidx|processlist|scheme|sql|status|table|variables|view|view_trigger)$~', $feature); //!
|
||||
}
|
||||
|
||||
$jush = "oracle";
|
||||
|
@@ -6,7 +6,7 @@ if (isset($_GET["pgsql"])) {
|
||||
define("DRIVER", "pgsql");
|
||||
if (extension_loaded("pgsql")) {
|
||||
class Min_DB {
|
||||
var $extension = "PgSQL", $_link, $_result, $_string, $_database = true, $server_info, $affected_rows, $error;
|
||||
var $extension = "PgSQL", $_link, $_result, $_string, $_database = true, $server_info, $affected_rows, $error, $timeout;
|
||||
|
||||
function _error($errno, $error) {
|
||||
if (ini_bool("html_errors")) {
|
||||
@@ -69,12 +69,18 @@ if (isset($_GET["pgsql"])) {
|
||||
$this->error = "";
|
||||
if (!$result) {
|
||||
$this->error = pg_last_error($this->_link);
|
||||
return false;
|
||||
$return = false;
|
||||
} elseif (!pg_num_fields($result)) {
|
||||
$this->affected_rows = pg_affected_rows($result);
|
||||
return true;
|
||||
$return = true;
|
||||
} else {
|
||||
$return = new Min_Result($result);
|
||||
}
|
||||
return new Min_Result($result);
|
||||
if ($this->timeout) {
|
||||
$this->timeout = 0;
|
||||
$this->query("RESET statement_timeout");
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
function multi_query($query) {
|
||||
@@ -139,7 +145,7 @@ if (isset($_GET["pgsql"])) {
|
||||
|
||||
} elseif (extension_loaded("pdo_pgsql")) {
|
||||
class Min_DB extends Min_PDO {
|
||||
var $extension = "PDO_PgSQL";
|
||||
var $extension = "PDO_PgSQL", $timeout;
|
||||
|
||||
function connect($server, $username, $password) {
|
||||
global $adminer;
|
||||
@@ -155,14 +161,19 @@ if (isset($_GET["pgsql"])) {
|
||||
return ($adminer->database() == $database);
|
||||
}
|
||||
|
||||
function value($val, $field) {
|
||||
return $val;
|
||||
}
|
||||
|
||||
function quoteBinary($s) {
|
||||
return q($s);
|
||||
}
|
||||
|
||||
function query($query, $unbuffered = false) {
|
||||
$return = parent::query($query, $unbuffered);
|
||||
if ($this->timeout) {
|
||||
$this->timeout = 0;
|
||||
parent::query("RESET statement_timeout");
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
function warnings() {
|
||||
return ''; // not implemented in PDO_PgSQL as of PHP 7.2.1
|
||||
}
|
||||
@@ -197,17 +208,21 @@ if (isset($_GET["pgsql"])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
function slowQuery($query, $timeout) {
|
||||
$this->_conn->query("SET statement_timeout = " . (1000 * $timeout));
|
||||
$this->_conn->timeout = 1000 * $timeout;
|
||||
return $query;
|
||||
}
|
||||
|
||||
function convertSearch($idf, $val, $field) {
|
||||
return (preg_match('~char|text' . (is_numeric($val["val"]) && !preg_match('~LIKE~', $val["op"]) ? '|' . number_type() : '') . '~', $field["type"])
|
||||
return (preg_match('~char|text'
|
||||
. (!preg_match('~LIKE~', $val["op"]) ? '|date|time(stamp)?|boolean|uuid|' . number_type() : '')
|
||||
. '~', $field["type"])
|
||||
? $idf
|
||||
: "CAST($idf AS text)"
|
||||
);
|
||||
}
|
||||
|
||||
function value($val, $field) {
|
||||
return $this->_conn->value($val, $field);
|
||||
}
|
||||
|
||||
function quoteBinary($s) {
|
||||
return $this->_conn->quoteBinary($s);
|
||||
}
|
||||
@@ -271,7 +286,7 @@ if (isset($_GET["pgsql"])) {
|
||||
function limit1($table, $query, $where, $separator = "\n") {
|
||||
return (preg_match('~^INTO~', $query)
|
||||
? limit($query, $where, 1, 0, $separator)
|
||||
: " $query WHERE ctid = (SELECT ctid FROM " . table($table) . $where . $separator . "LIMIT 1)"
|
||||
: " $query" . (is_view(table_status1($table)) ? $where : " WHERE ctid = (SELECT ctid FROM " . table($table) . $where . $separator . "LIMIT 1)")
|
||||
);
|
||||
}
|
||||
|
||||
@@ -334,7 +349,10 @@ WHERE relkind IN ('r', 'm', 'v', 'f')
|
||||
'timestamp without time zone' => 'timestamp',
|
||||
'timestamp with time zone' => 'timestamptz',
|
||||
);
|
||||
foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, d.adsrc AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment
|
||||
|
||||
$identity_column = min_version(10) ? "(a.attidentity = 'd')::int" : '0';
|
||||
|
||||
foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, d.adsrc AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment, $identity_column AS identity
|
||||
FROM pg_class c
|
||||
JOIN pg_namespace n ON c.relnamespace = n.oid
|
||||
JOIN pg_attribute a ON c.oid = a.attrelid
|
||||
@@ -357,8 +375,11 @@ ORDER BY a.attnum"
|
||||
$row["type"] = $type;
|
||||
$row["full_type"] = $row["type"] . $length . $addon . $array;
|
||||
}
|
||||
if ($row['identity']) {
|
||||
$row['default'] = 'GENERATED BY DEFAULT AS IDENTITY';
|
||||
}
|
||||
$row["null"] = !$row["attnotnull"];
|
||||
$row["auto_increment"] = preg_match('~^nextval\\(~i', $row["default"]);
|
||||
$row["auto_increment"] = $row['identity'] || preg_match('~^nextval\(~i', $row["default"]);
|
||||
$row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
|
||||
if (preg_match('~(.+)::[^)]+(.*)~', $row["default"], $match)) {
|
||||
$row["default"] = ($match[1] == "NULL" ? null : (($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]) . $match[2]));
|
||||
@@ -434,8 +455,8 @@ WHERE table_schema = current_schema() AND table_name = " . q($name))));
|
||||
function error() {
|
||||
global $connection;
|
||||
$return = h($connection->error);
|
||||
if (preg_match('~^(.*\\n)?([^\\n]*)\\n( *)\\^(\\n.*)?$~s', $return, $match)) {
|
||||
$return = $match[1] . preg_replace('~((?:[^&]|&[^;]*;){' . strlen($match[3]) . '})(.*)~', '\\1<b>\\2</b>', $match[2]) . $match[4];
|
||||
if (preg_match('~^(.*\n)?([^\n]*)\n( *)\^(\n.*)?$~s', $return, $match)) {
|
||||
$return = $match[1] . preg_replace('~((?:[^&]|&[^;]*;){' . strlen($match[3]) . '})(.*)~', '\1<b>\2</b>', $match[2]) . $match[4];
|
||||
}
|
||||
return nl_br($return);
|
||||
}
|
||||
@@ -743,7 +764,11 @@ AND typelem = 0"
|
||||
// "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'])) . ");";
|
||||
$columns = array();
|
||||
foreach ($index['columns'] as $key => $val) {
|
||||
$columns[] = idf_escape($val) . ($index['descs'][$key] ? " DESC" : "");
|
||||
}
|
||||
$return .= "\n\nCREATE INDEX " . idf_escape($index_name) . " ON " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " USING btree (" . implode(', ', $columns) . ");";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -799,7 +824,7 @@ AND typelem = 0"
|
||||
}
|
||||
|
||||
function support($feature) {
|
||||
return preg_match('~^(database|table|columns|sql|indexes|comment|view|' . (min_version(9.3) ? 'materializedview|' : '') . 'scheme|routine|processlist|sequence|trigger|type|variables|drop_col|kill|dump)$~', $feature);
|
||||
return preg_match('~^(database|table|columns|sql|indexes|descidx|comment|view|' . (min_version(9.3) ? 'materializedview|' : '') . 'scheme|routine|processlist|sequence|trigger|type|variables|drop_col|kill|dump)$~', $feature);
|
||||
}
|
||||
|
||||
function kill_process($val) {
|
||||
@@ -830,7 +855,7 @@ AND typelem = 0"
|
||||
$structured_types[$key] = array_keys($val);
|
||||
}
|
||||
$unsigned = array();
|
||||
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "SQL" to avoid SQL injection
|
||||
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "SQL" to avoid CSRF
|
||||
$functions = array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper");
|
||||
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||
$edit_functions = array(
|
||||
|
@@ -19,6 +19,7 @@ if (isset($_GET["simpledb"])) {
|
||||
$params['NextToken'] = $this->next;
|
||||
}
|
||||
$result = sdb_request_all('Select', 'Item', $params, $this->timeout); //! respect $unbuffered
|
||||
$this->timeout = 0;
|
||||
if ($result === false) {
|
||||
return $result;
|
||||
}
|
||||
@@ -236,12 +237,22 @@ if (isset($_GET["simpledb"])) {
|
||||
function rollback() {
|
||||
return false;
|
||||
}
|
||||
|
||||
function slowQuery($query, $timeout) {
|
||||
$this->_conn->timeout = $timeout;
|
||||
return $query;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function connect() {
|
||||
global $adminer;
|
||||
list(, , $password) = $adminer->credentials();
|
||||
if ($password != "") {
|
||||
return lang('Database does not support password.');
|
||||
}
|
||||
return new Min_DB;
|
||||
}
|
||||
|
||||
|
@@ -152,7 +152,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
|
||||
function fetch_field() {
|
||||
$name = $this->_result->fieldName($this->_offset++);
|
||||
$pattern = '(\\[.*]|"(?:[^"]|"")*"|(.+))';
|
||||
$pattern = '(\[.*]|"(?:[^"]|"")*"|(.+))';
|
||||
if (preg_match("~^($pattern\\.)?$pattern\$~", $name, $match)) {
|
||||
$table = ($match[3] != "" ? $match[3] : idf_unescape($match[2]));
|
||||
$name = ($match[5] != "" ? $match[5] : idf_unescape($match[4]));
|
||||
@@ -240,6 +240,11 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
}
|
||||
|
||||
function connect() {
|
||||
global $adminer;
|
||||
list(, , $password) = $adminer->credentials();
|
||||
if ($password != "") {
|
||||
return lang('Database does not support password.');
|
||||
}
|
||||
return new Min_DB;
|
||||
}
|
||||
|
||||
@@ -273,7 +278,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
}
|
||||
|
||||
function tables_list() {
|
||||
return get_key_vals("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') ORDER BY (name = 'sqlite_sequence'), name", 1);
|
||||
return get_key_vals("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') ORDER BY (name = 'sqlite_sequence'), name");
|
||||
}
|
||||
|
||||
function count_tables($databases) {
|
||||
@@ -402,7 +407,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
|
||||
function view($name) {
|
||||
global $connection;
|
||||
return array("select" => preg_replace('~^(?:[^`"[]+|`[^`]*`|"[^"]*")* AS\\s+~iU', '', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . q($name)))); //! identifiers may be inside []
|
||||
return array("select" => preg_replace('~^(?:[^`"[]+|`[^`]*`|"[^"]*")* AS\s+~iU', '', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . q($name)))); //! identifiers may be inside []
|
||||
}
|
||||
|
||||
function collations() {
|
||||
@@ -649,7 +654,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
if ($name == "") {
|
||||
return array("Statement" => "BEGIN\n\t;\nEND");
|
||||
}
|
||||
$idf = '(?:[^`"\\s]+|`[^`]*`|"[^"]*")+';
|
||||
$idf = '(?:[^`"\s]+|`[^`]*`|"[^"]*")+';
|
||||
$trigger_options = trigger_options();
|
||||
preg_match(
|
||||
"~^CREATE\\s+TRIGGER\\s*$idf\\s*(" . implode("|", $trigger_options["Timing"]) . ")\\s+([a-z]+)(?:\\s+OF\\s+($idf))?\\s+ON\\s*$idf\\s*(?:FOR\\s+EACH\\s+ROW\\s)?(.*)~is",
|
||||
@@ -670,7 +675,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
$return = array();
|
||||
$trigger_options = trigger_options();
|
||||
foreach (get_rows("SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . q($table)) as $row) {
|
||||
preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*(' . implode("|", $trigger_options["Timing"]) . ')\\s*(.*)\\s+ON\\b~iU', $row["sql"], $match);
|
||||
preg_match('~^CREATE\s+TRIGGER\s*(?:[^`"\s]+|`[^`]*`|"[^"]*")+\s*(' . implode("|", $trigger_options["Timing"]) . ')\s*(.*)\s+ON\b~iU', $row["sql"], $match);
|
||||
$return[$row["name"]] = array($match[1], $match[2]);
|
||||
}
|
||||
return $return;
|
||||
@@ -765,7 +770,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
}
|
||||
|
||||
function support($feature) {
|
||||
return preg_match('~^(columns|database|drop_col|dump|indexes|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
|
||||
return preg_match('~^(columns|database|drop_col|dump|indexes|descidx|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
|
||||
}
|
||||
|
||||
$jush = "sqlite";
|
||||
|
@@ -126,7 +126,7 @@ page_header(lang('Export'), $error, ($_GET["export"] != "" ? array("table" => $_
|
||||
?>
|
||||
|
||||
<form action="" method="post">
|
||||
<table cellspacing="0">
|
||||
<table cellspacing="0" class="layout">
|
||||
<?php
|
||||
$db_style = array('', 'USE', 'DROP+CREATE', 'CREATE');
|
||||
$table_style = array('', 'DROP+CREATE', 'CREATE');
|
||||
|
@@ -35,14 +35,14 @@ if (!$row && $EVENT != "") {
|
||||
?>
|
||||
|
||||
<form action="" method="post">
|
||||
<table cellspacing="0">
|
||||
<tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" maxlength="64" autocapitalize="off">
|
||||
<table cellspacing="0" class="layout">
|
||||
<tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" data-maxlength="64" autocapitalize="off">
|
||||
<tr><th title="datetime"><?php echo lang('Start'); ?><td><input name="STARTS" value="<?php echo h("$row[EXECUTE_AT]$row[STARTS]"); ?>">
|
||||
<tr><th title="datetime"><?php echo lang('End'); ?><td><input name="ENDS" value="<?php echo h($row["ENDS"]); ?>">
|
||||
<tr><th><?php echo lang('Every'); ?><td><input type="number" name="INTERVAL_VALUE" value="<?php echo h($row["INTERVAL_VALUE"]); ?>" class="size"> <?php echo html_select("INTERVAL_FIELD", $intervals, $row["INTERVAL_FIELD"]); ?>
|
||||
<tr><th><?php echo lang('Status'); ?><td><?php echo html_select("STATUS", $statuses, $row["STATUS"]); ?>
|
||||
<tr><th><?php echo lang('Comment'); ?><td><input name="EVENT_COMMENT" value="<?php echo h($row["EVENT_COMMENT"]); ?>" maxlength="64">
|
||||
<tr><th> <td><?php echo checkbox("ON_COMPLETION", "PRESERVE", $row["ON_COMPLETION"] == "PRESERVE", lang('On completion preserve')); ?>
|
||||
<tr><th><?php echo lang('Comment'); ?><td><input name="EVENT_COMMENT" value="<?php echo h($row["EVENT_COMMENT"]); ?>" data-maxlength="64">
|
||||
<tr><th><td><?php echo checkbox("ON_COMPLETION", "PRESERVE", $row["ON_COMPLETION"] == "PRESERVE", lang('On completion preserve')); ?>
|
||||
</table>
|
||||
<p><?php textarea("EVENT_DEFINITION", $row["EVENT_DEFINITION"]); ?>
|
||||
<p>
|
||||
|
@@ -1,13 +1,5 @@
|
||||
<?php
|
||||
//! rewrite in compile.php to cache moderately with -dev version
|
||||
if ($_SERVER["HTTP_IF_MODIFIED_SINCE"]) {
|
||||
header("HTTP/1.1 304 Not Modified");
|
||||
exit;
|
||||
}
|
||||
|
||||
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");
|
||||
// caching headers added in compile.php
|
||||
|
||||
if ($_GET["file"] == "favicon.ico") {
|
||||
header("Content-Type: image/x-icon");
|
||||
|
@@ -75,7 +75,7 @@ class Adminer {
|
||||
* @return float number of seconds
|
||||
*/
|
||||
function queryTimeout() {
|
||||
return 5;
|
||||
return 2;
|
||||
}
|
||||
|
||||
/** Headers to send before HTML output
|
||||
@@ -118,19 +118,26 @@ class Adminer {
|
||||
*/
|
||||
function loginForm() {
|
||||
global $drivers;
|
||||
?>
|
||||
<table cellspacing="0">
|
||||
<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>
|
||||
<?php
|
||||
echo script("focus(qs('#username'));");
|
||||
echo "<table cellspacing='0' class='layout'>\n";
|
||||
echo $this->loginFormField('driver', '<tr><th>' . lang('System') . '<td>', html_select("auth[driver]", $drivers, DRIVER, "loginDriver(this);") . "\n");
|
||||
echo $this->loginFormField('server', '<tr><th>' . lang('Server') . '<td>', '<input name="auth[server]" value="' . h(SERVER) . '" title="hostname[:port]" placeholder="localhost" autocapitalize="off">' . "\n");
|
||||
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocomplete="username" autocapitalize="off">' . script("focus(qs('#username')); qs('#username').form['auth[driver]'].onchange();"));
|
||||
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]" autocomplete="current-password">' . "\n");
|
||||
echo $this->loginFormField('db', '<tr><th>' . lang('Database') . '<td>', '<input name="auth[db]" value="' . h($_GET["db"]) . '" autocapitalize="off">' . "\n");
|
||||
echo "</table>\n";
|
||||
echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
|
||||
echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
|
||||
}
|
||||
|
||||
/** Get login form field
|
||||
* @param string
|
||||
* @param string HTML
|
||||
* @param string HTML
|
||||
* @return string
|
||||
*/
|
||||
function loginFormField($name, $heading, $value) {
|
||||
return $heading . $value;
|
||||
}
|
||||
|
||||
/** Authorize the user
|
||||
* @param string
|
||||
@@ -138,9 +145,8 @@ class Adminer {
|
||||
* @return mixed true for success, string for error message, false for unknown error
|
||||
*/
|
||||
function login($login, $password) {
|
||||
global $jush;
|
||||
if ($jush == "sqlite") {
|
||||
return lang('<a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to use SQLite.', target_blank(), '<code>login()</code>');
|
||||
if ($password == "") {
|
||||
return lang('Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.', target_blank());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -304,6 +310,7 @@ class Adminer {
|
||||
* @return null
|
||||
*/
|
||||
function tableStructurePrint($fields) {
|
||||
echo "<div class='scrollable'>\n";
|
||||
echo "<table cellspacing='0' class='nowrap'>\n";
|
||||
echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . (support("comment") ? "<td>" . lang('Comment') : "") . "</thead>\n";
|
||||
foreach ($fields as $field) {
|
||||
@@ -312,10 +319,11 @@ class Adminer {
|
||||
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 (support("comment") ? "<td>" . h($field["comment"]) : "");
|
||||
echo "\n";
|
||||
}
|
||||
echo "</table>\n";
|
||||
echo "</div>\n";
|
||||
}
|
||||
|
||||
/** Print list of indexes on table in tabular format
|
||||
@@ -553,7 +561,7 @@ class Adminer {
|
||||
// find anywhere
|
||||
$cols = array();
|
||||
foreach ($fields as $name => $field) {
|
||||
if ((is_numeric($val["val"]) || !preg_match('~' . number_type() . '|bit~', $field["type"]))
|
||||
if ((preg_match('~^[-\d.' . (preg_match('~IN$~', $val["op"]) ? ',' : '') . ']+$~', $val["val"]) || !preg_match('~' . number_type() . '|bit~', $field["type"]))
|
||||
&& (!preg_match("~[\x80-\xFF]~", $val["val"]) || preg_match('~char|text|enum|set~', $field["type"]))
|
||||
) {
|
||||
$cols[] = $prefix . $driver->convertSearch(idf_escape($name), $val, $field) . $cond;
|
||||
@@ -575,7 +583,7 @@ class Adminer {
|
||||
$return = array();
|
||||
foreach ((array) $_GET["order"] as $key => $val) {
|
||||
if ($val != "") {
|
||||
$return[] = (preg_match('~^((COUNT\\(DISTINCT |[A-Z0-9_]+\\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\\)|COUNT\\(\\*\\))$~', $val) ? $val : idf_escape($val)) //! MS SQL uses []
|
||||
$return[] = (preg_match('~^((COUNT\(DISTINCT |[A-Z0-9_]+\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\)|COUNT\(\*\))$~', $val) ? $val : idf_escape($val)) //! MS SQL uses []
|
||||
. (isset($_GET["desc"][$key]) ? " DESC" : "")
|
||||
;
|
||||
}
|
||||
@@ -633,7 +641,7 @@ class Adminer {
|
||||
$history[$_GET["db"]] = array();
|
||||
}
|
||||
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
|
||||
$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"]
|
||||
$sql_id = "sql-" . count($history[$_GET["db"]]);
|
||||
@@ -718,7 +726,7 @@ class Adminer {
|
||||
$return = "$function()";
|
||||
} elseif (preg_match('~^current_(date|timestamp)$~', $function)) {
|
||||
$return = $function;
|
||||
} elseif (preg_match('~^([+-]|\\|\\|)$~', $function)) {
|
||||
} 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);
|
||||
@@ -837,7 +845,7 @@ class Adminer {
|
||||
foreach ($row as $key => $val) {
|
||||
$field = $fields[$key];
|
||||
$row[$key] = ($val !== null
|
||||
? unconvert_field($field, preg_match(number_type(), $field["type"]) && $val != '' ? $val : q($val))
|
||||
? unconvert_field($field, preg_match(number_type(), $field["type"]) && $val != '' && !preg_match('~\[~', $field["full_type"]) ? $val : q(($val === false ? 0 : $val)))
|
||||
: "NULL"
|
||||
);
|
||||
}
|
||||
@@ -925,12 +933,12 @@ class Adminer {
|
||||
foreach ($usernames as $username => $password) {
|
||||
if ($password !== null) {
|
||||
if ($first) {
|
||||
echo "<p id='logins'>" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
echo "<ul id='logins'>" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
$first = false;
|
||||
}
|
||||
$dbs = $_SESSION["db"][$vendor][$server][$username];
|
||||
foreach (($dbs ? array_keys($dbs) : array("")) as $db) {
|
||||
echo "<a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@" . $this->serverName($server) : "") . ($db != "" ? " - $db" : "")) . "</a><br>\n";
|
||||
echo "<li><a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@" . $this->serverName($server) : "") . ($db != "" ? " - $db" : "")) . "</a>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -962,7 +970,7 @@ class Adminer {
|
||||
}
|
||||
$server_info = $connection->server_info;
|
||||
?>
|
||||
bodyLoad('<?php echo (is_object($connection) ? preg_replace('~^(\\d\\.?\\d).*~s', '\\1', $server_info) : ""); ?>'<?php echo (preg_match('~MariaDB~', $server_info) ? ", true" : ""); ?>);
|
||||
bodyLoad('<?php echo (is_object($connection) ? preg_replace('~^(\d\.?\d).*~s', '\1', $server_info) : ""); ?>'<?php echo (preg_match('~MariaDB~', $server_info) ? ", true" : ""); ?>);
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
@@ -991,6 +999,9 @@ bodyLoad('<?php echo (is_object($connection) ? preg_replace('~^(\\d\\.?\\d).*~s'
|
||||
function databasesPrint($missing) {
|
||||
global $adminer, $connection;
|
||||
$databases = $this->databases();
|
||||
if ($databases && !in_array(DB, $databases)) {
|
||||
array_unshift($databases, DB);
|
||||
}
|
||||
?>
|
||||
<form action="">
|
||||
<p id="dbs">
|
||||
@@ -1010,11 +1021,12 @@ bodyLoad('<?php echo (is_object($connection) ? preg_replace('~^(\\d\\.?\\d).*~s'
|
||||
}
|
||||
}
|
||||
}
|
||||
echo (isset($_GET["sql"]) ? '<input type="hidden" name="sql" value="">'
|
||||
: (isset($_GET["schema"]) ? '<input type="hidden" name="schema" value="">'
|
||||
: (isset($_GET["dump"]) ? '<input type="hidden" name="dump" value="">'
|
||||
: (isset($_GET["privileges"]) ? '<input type="hidden" name="privileges" value="">'
|
||||
: ""))));
|
||||
foreach (array("import", "sql", "schema", "dump", "privileges") as $val) {
|
||||
if (isset($_GET[$val])) {
|
||||
echo "<input type='hidden' name='$val' value=''>";
|
||||
break;
|
||||
}
|
||||
}
|
||||
echo "</p></form>\n";
|
||||
}
|
||||
|
||||
|
@@ -83,7 +83,7 @@ if ($auth) {
|
||||
set_session($key, null);
|
||||
}
|
||||
unset_permanent();
|
||||
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'));
|
||||
redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.') . ' ' . lang('Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.'));
|
||||
}
|
||||
|
||||
} elseif ($permanent && !$_SESSION["pwds"]) {
|
||||
@@ -120,6 +120,7 @@ function auth_error($error) {
|
||||
if (($_COOKIE[$session_name] || $_GET[$session_name]) && !$has_token) {
|
||||
$error = lang('Session expired, please login again.');
|
||||
} else {
|
||||
restart_session();
|
||||
add_invalid_login();
|
||||
$password = get_password();
|
||||
if ($password !== null) {
|
||||
@@ -149,14 +150,17 @@ function auth_error($error) {
|
||||
exit;
|
||||
}
|
||||
|
||||
if (isset($_GET["username"]) && !class_exists("Min_DB")) {
|
||||
unset($_SESSION["pwds"][DRIVER]);
|
||||
unset_permanent();
|
||||
page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', implode(", ", $possible_drivers)), false);
|
||||
page_footer("auth");
|
||||
exit;
|
||||
}
|
||||
|
||||
stop_session(true);
|
||||
|
||||
if (isset($_GET["username"])) {
|
||||
if (!class_exists("Min_DB")) {
|
||||
unset($_SESSION["pwds"][DRIVER]);
|
||||
unset_permanent();
|
||||
page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', implode(", ", $possible_drivers)), false);
|
||||
page_footer("auth");
|
||||
exit;
|
||||
}
|
||||
list($host, $port) = explode(":", SERVER, 2);
|
||||
if (is_numeric($port) && $port < 1024) {
|
||||
auth_error(lang('Connecting to privileged ports is not allowed.'));
|
||||
@@ -168,7 +172,8 @@ if (isset($_GET["username"])) {
|
||||
|
||||
$login = null;
|
||||
if (!is_object($connection) || ($login = $adminer->login($_GET["username"], get_password())) !== true) {
|
||||
auth_error((is_string($connection) ? h($connection) : (is_string($login) ? $login : lang('Invalid credentials.'))));
|
||||
$error = (is_string($connection) ? h($connection) : (is_string($login) ? $login : lang('Invalid credentials.')));
|
||||
auth_error($error . (preg_match('~^ | $~', get_password()) ? '<br>' . lang('There is a space in the input password which might be the cause.') : ''));
|
||||
}
|
||||
|
||||
if ($auth && $_POST["token"]) {
|
||||
|
@@ -33,7 +33,7 @@ if ($_GET["script"] == "version") {
|
||||
exit;
|
||||
}
|
||||
|
||||
global $adminer, $connection, $drivers, $edit_functions, $enum_length, $error, $functions, $grouping, $HTTPS, $inout, $jush, $LANG, $langs, $on_actions, $permanent, $structured_types, $has_token, $token, $translations, $types, $unsigned, $VERSION; // allows including Adminer inside a function
|
||||
global $adminer, $connection, $driver, $drivers, $edit_functions, $enum_length, $error, $functions, $grouping, $HTTPS, $inout, $jush, $LANG, $langs, $on_actions, $permanent, $structured_types, $has_token, $token, $translations, $types, $unsigned, $VERSION; // allows including Adminer inside a function
|
||||
|
||||
if (!$_SERVER["REQUEST_URI"]) { // IIS 5 compatibility
|
||||
$_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"];
|
||||
@@ -44,13 +44,13 @@ if (!strpos($_SERVER["REQUEST_URI"], '?') && $_SERVER["QUERY_STRING"] != "") { /
|
||||
if ($_SERVER["HTTP_X_FORWARDED_PREFIX"]) {
|
||||
$_SERVER["REQUEST_URI"] = $_SERVER["HTTP_X_FORWARDED_PREFIX"] . $_SERVER["REQUEST_URI"];
|
||||
}
|
||||
$HTTPS = $_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off");
|
||||
$HTTPS = ($_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off")) || ini_bool("session.cookie_secure"); // session.cookie_secure could be set on HTTP if we are behind a reverse proxy
|
||||
|
||||
@ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled
|
||||
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);
|
||||
$params = array(0, preg_replace('~\?.*~', '', $_SERVER["REQUEST_URI"]), "", $HTTPS);
|
||||
if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
|
||||
$params[] = true; // HttpOnly
|
||||
}
|
||||
@@ -79,11 +79,12 @@ include "../adminer/drivers/firebird.inc.php";
|
||||
include "../adminer/drivers/simpledb.inc.php";
|
||||
include "../adminer/drivers/mongo.inc.php";
|
||||
include "../adminer/drivers/elastic.inc.php";
|
||||
include "../adminer/drivers/clickhouse.inc.php";
|
||||
include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
|
||||
|
||||
define("SERVER", $_GET[DRIVER]); // read from pgsql=localhost
|
||||
define("DB", $_GET["db"]); // for the sake of speed and size
|
||||
define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\\1', $_SERVER["REQUEST_URI"]) . '?'
|
||||
define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\1', $_SERVER["REQUEST_URI"]) . '?'
|
||||
. (sid() ? SID . '&' : '')
|
||||
. (SERVER !== null ? DRIVER . "=" . urlencode(SERVER) . '&' : '')
|
||||
. (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '')
|
||||
@@ -95,11 +96,6 @@ include "./include/adminer.inc.php";
|
||||
include "../adminer/include/design.inc.php";
|
||||
include "../adminer/include/xxtea.inc.php";
|
||||
include "../adminer/include/auth.inc.php";
|
||||
|
||||
if (!ini_bool("session.use_cookies") || @ini_set("session.use_cookies", false) !== false) { // @ - may be disabled
|
||||
session_write_close(); // improves concurrency if a user opens several pages at once, may be restarted later
|
||||
}
|
||||
|
||||
include "./include/editing.inc.php";
|
||||
include "./include/connect.inc.php";
|
||||
|
||||
|
@@ -32,7 +32,7 @@ function connect_error() {
|
||||
echo "<table cellspacing='0' class='checkable'>\n";
|
||||
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
|
||||
echo "<thead><tr>"
|
||||
. (support("database") ? "<td> " : "")
|
||||
. (support("database") ? "<td>" : "")
|
||||
. "<th>" . lang('Database') . " - <a href='" . h(ME) . "refresh=1'>" . lang('Refresh') . "</a>"
|
||||
. "<td>" . lang('Collation')
|
||||
. "<td>" . lang('Tables')
|
||||
@@ -47,7 +47,7 @@ function connect_error() {
|
||||
$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='$id'>" . h($db) . "</a>";
|
||||
$collation = nbsp(db_collation($db, $collations));
|
||||
$collation = h(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>";
|
||||
echo "<td align='right' id='size-" . h($db) . "'>" . ($_GET["dbsize"] ? db_size($db) : "?");
|
||||
|
@@ -113,6 +113,14 @@
|
||||
return queries("ROLLBACK");
|
||||
}
|
||||
|
||||
/** Return query with a timeout
|
||||
* @param string
|
||||
* @param int seconds
|
||||
* @return string or null if the driver doesn't support query timeouts
|
||||
*/
|
||||
function slowQuery($query, $timeout) {
|
||||
}
|
||||
|
||||
/** Convert column to be searchable
|
||||
* @param string escaped column name
|
||||
* @param array array("op" => , "val" => )
|
||||
@@ -129,7 +137,10 @@
|
||||
* @return string
|
||||
*/
|
||||
function value($val, $field) {
|
||||
return $val;
|
||||
return (method_exists($this->_conn, 'value')
|
||||
? $this->_conn->value($val, $field)
|
||||
: (is_resource($val) ? stream_get_contents($val) : $val)
|
||||
);
|
||||
}
|
||||
|
||||
/** Quote binary string
|
||||
|
@@ -17,6 +17,7 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
|
||||
odd(''); // reset odd for each result
|
||||
for ($i=0; (!$limit || $i < $limit) && ($row = $result->fetch_row()); $i++) {
|
||||
if (!$i) {
|
||||
echo "<div class='scrollable'>\n";
|
||||
echo "<table cellspacing='0' class='nowrap'>\n";
|
||||
echo "<thead><tr>";
|
||||
for ($j=0; $j < count($row); $j++) {
|
||||
@@ -64,8 +65,6 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
|
||||
$val = "<i>NULL</i>";
|
||||
} elseif ($blobs[$key] && !is_utf8($val)) {
|
||||
$val = "<i>" . lang('%d byte(s)', strlen($val)) . "</i>"; //! link to download
|
||||
} elseif (!strlen($val)) { // strlen - SQLite can return int
|
||||
$val = " "; // some content to print a border
|
||||
} else {
|
||||
$val = h($val);
|
||||
if ($types[$key] == 254) { // 254 - char
|
||||
@@ -87,7 +86,7 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
|
||||
echo "<td>$val";
|
||||
}
|
||||
}
|
||||
echo ($i ? "</table>" : "<p class='message'>" . lang('No rows.')) . "\n";
|
||||
echo ($i ? "</table>\n</div>" : "<p class='message'>" . lang('No rows.')) . "\n";
|
||||
return $return;
|
||||
}
|
||||
|
||||
@@ -113,6 +112,31 @@ function referencable_primary($self) {
|
||||
return $return;
|
||||
}
|
||||
|
||||
/** Get settings stored in a cookie
|
||||
* @return array
|
||||
*/
|
||||
function adminer_settings() {
|
||||
parse_str($_COOKIE["adminer_settings"], $settings);
|
||||
return $settings;
|
||||
}
|
||||
|
||||
/** Get setting stored in a cookie
|
||||
* @param string
|
||||
* @return array
|
||||
*/
|
||||
function adminer_setting($key) {
|
||||
$settings = adminer_settings();
|
||||
return $settings[$key];
|
||||
}
|
||||
|
||||
/** Store settings to a cookie
|
||||
* @param array
|
||||
* @return bool
|
||||
*/
|
||||
function set_adminer_settings($settings) {
|
||||
return cookie("adminer_settings", http_build_query($settings + adminer_settings()));
|
||||
}
|
||||
|
||||
/** Print SQL <textarea> tag
|
||||
* @param string
|
||||
* @param string or array in which case [0] of every element is used
|
||||
@@ -156,10 +180,10 @@ echo optionlist(array_merge($extra_types, $structured_types), $type);
|
||||
?></select>
|
||||
<?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
|
||||
<td><input name="<?php echo h($key); ?>[length]" value="<?php echo h($field["length"]); ?>" size="3"<?php echo (!$field["length"] && preg_match('~var(char|binary)$~', $type) ? " class='required'" : ""); //! type="number" with enabled JavaScript ?> aria-labelledby="label-length"><?php echo script("mixin(qsl('input'), {onfocus: editingLengthFocus, oninput: editingLengthChange});", ""); ?><td class="options"><?php
|
||||
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(number_type(), $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>' : '');
|
||||
echo (isset($field['on_update']) ? "<select name='" . h($key) . "[on_update]'" . (preg_match('~timestamp|datetime~', $type) ? "" : " class='hidden'") . '>' . optionlist(array("" => "(" . lang('ON UPDATE') . ")", "CURRENT_TIMESTAMP"), (preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"]) ? "CURRENT_TIMESTAMP" : $field["on_update"])) . '</select>' : '');
|
||||
echo ($foreign_keys ? "<select name='" . h($key) . "[on_delete]'" . (preg_match("~`~", $type) ? "" : " class='hidden'") . "><option value=''>(" . lang('ON DELETE') . ")" . optionlist(explode("|", $on_actions), $field["on_delete"]) . "</select> " : " "); // space for IE
|
||||
}
|
||||
|
||||
@@ -237,15 +261,14 @@ function type_class($type) {
|
||||
* @param array
|
||||
* @param string TABLE or PROCEDURE
|
||||
* @param array returned by referencable_primary()
|
||||
* @param bool display comments column
|
||||
* @return null
|
||||
*/
|
||||
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array(), $comments = false) {
|
||||
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array()) {
|
||||
global $inout;
|
||||
$fields = array_values($fields);
|
||||
?>
|
||||
<thead><tr>
|
||||
<?php if ($type == "PROCEDURE") { ?><td> <?php } ?>
|
||||
<?php if ($type == "PROCEDURE") { ?><td><?php } ?>
|
||||
<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'); ?>
|
||||
@@ -260,7 +283,7 @@ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = arra
|
||||
'mssql' => "ms186775.aspx",
|
||||
)); ?>
|
||||
<td id="label-default"><?php echo lang('Default value'); ?>
|
||||
<?php echo (support("comment") ? "<td id='label-comment'" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
|
||||
<?php echo (support("comment") ? "<td id='label-comment'>" . 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("row_count = " . count($fields) . ";"); ?>
|
||||
</thead>
|
||||
@@ -274,20 +297,20 @@ 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"]); ?>" 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 } ?>
|
||||
<th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" data-maxlength="64" autocapitalize="off" aria-labelledby="label-name"><?php echo script("qsl('input').oninput = function () { editingNameChange.call(this);" . ($field["field"] != "" || count($fields) > 1 ? "" : " editingAddRow.call(this);") . " };", ""); ?><?php } ?>
|
||||
<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", "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"></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 (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
|
||||
echo (support("comment") ? "<td><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' data-maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
|
||||
}
|
||||
echo "<td>";
|
||||
echo (support("move_col") ?
|
||||
"<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'> "
|
||||
. "<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='↓' title='" . lang('Move down') . "'> "
|
||||
"<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'> "
|
||||
. "<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='↓' title='" . lang('Move down') . "'> "
|
||||
: "");
|
||||
echo ($orig == "" || support("drop_col") ? "<input type='image' class='icon' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "'>" : "");
|
||||
}
|
||||
@@ -360,7 +383,7 @@ function grant($grant, $privileges, $columns, $on) {
|
||||
: queries("$grant ALL PRIVILEGES$on") && queries("$grant GRANT OPTION$on")
|
||||
);
|
||||
}
|
||||
return queries("$grant " . preg_replace('~(GRANT OPTION)\\([^)]*\\)~', '\\1', implode("$columns, ", $privileges) . $columns) . $on);
|
||||
return queries("$grant " . preg_replace('~(GRANT OPTION)\([^)]*\)~', '\1', implode("$columns, ", $privileges) . $columns) . $on);
|
||||
}
|
||||
|
||||
/** Drop old object and create a new one
|
||||
@@ -443,7 +466,7 @@ function create_routine($routine, $row) {
|
||||
* @return string
|
||||
*/
|
||||
function remove_definer($query) {
|
||||
return preg_replace('~^([A-Z =]+) DEFINER=`' . preg_replace('~@(.*)~', '`@`(%|\\1)', logged_user()) . '`~', '\\1', $query); //! proper escaping of user
|
||||
return preg_replace('~^([A-Z =]+) DEFINER=`' . preg_replace('~@(.*)~', '`@`(%|\1)', logged_user()) . '`~', '\1', $query); //! proper escaping of user
|
||||
}
|
||||
|
||||
/** Format foreign key to use in SQL query
|
||||
@@ -499,7 +522,7 @@ function ini_bytes($ini) {
|
||||
function doc_link($paths, $text = "<sup>?</sup>") {
|
||||
global $jush, $connection;
|
||||
$server_info = $connection->server_info;
|
||||
$version = preg_replace('~^(\\d\\.?\\d).*~s', '\\1', $server_info); // two most significant digits
|
||||
$version = preg_replace('~^(\d\.?\d).*~s', '\1', $server_info); // two most significant digits
|
||||
$urls = array(
|
||||
'sql' => "https://dev.mysql.com/doc/refman/$version/en/",
|
||||
'sqlite' => "https://www.sqlite.org/",
|
||||
|
@@ -154,14 +154,6 @@ function h($string) {
|
||||
return str_replace("\0", "�", htmlspecialchars($string, ENT_QUOTES, 'utf-8'));
|
||||
}
|
||||
|
||||
/** Escape for TD
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function nbsp($string) {
|
||||
return (trim($string) != "" ? h($string) : " ");
|
||||
}
|
||||
|
||||
/** Convert \n to <br>
|
||||
* @param string
|
||||
* @return string
|
||||
@@ -401,19 +393,16 @@ function get_vals($query, $column = 0) {
|
||||
/** Get keys from first column and values from second
|
||||
* @param string
|
||||
* @param Min_DB
|
||||
* @param float
|
||||
* @param bool
|
||||
* @return array
|
||||
*/
|
||||
function get_key_vals($query, $connection2 = null, $timeout = 0, $set_keys = true) {
|
||||
function get_key_vals($query, $connection2 = null, $set_keys = true) {
|
||||
global $connection;
|
||||
if (!is_object($connection2)) {
|
||||
$connection2 = $connection;
|
||||
}
|
||||
$return = array();
|
||||
$connection2->timeout = $timeout;
|
||||
$result = $connection2->query($query);
|
||||
$connection2->timeout = 0;
|
||||
if (is_object($result)) {
|
||||
while ($row = $result->fetch_row()) {
|
||||
if ($set_keys) {
|
||||
@@ -490,7 +479,7 @@ 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) ? " 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
|
||||
@@ -557,7 +546,7 @@ function cookie($name, $value, $lifetime = 2592000) { // 2592000 - 30 days
|
||||
global $HTTPS;
|
||||
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"])
|
||||
. "; path=" . preg_replace('~\?.*~', '', $_SERVER["REQUEST_URI"])
|
||||
. ($HTTPS ? "; secure" : "")
|
||||
. "; HttpOnly; SameSite=lax",
|
||||
false);
|
||||
@@ -572,12 +561,13 @@ function restart_session() {
|
||||
}
|
||||
}
|
||||
|
||||
/** Stop session if it would be possible to restart it later
|
||||
/** Stop session if possible
|
||||
* @param bool
|
||||
* @return null
|
||||
*/
|
||||
function stop_session() {
|
||||
if (!ini_bool("session.use_cookies")) {
|
||||
session_write_close();
|
||||
function stop_session($force = false) {
|
||||
if (!ini_bool("session.use_cookies") || ($force && @ini_set("session.use_cookies", false) !== false)) { // @ - may be disabled
|
||||
session_write_close(); // improves concurrency if a user opens several pages at once, may be restarted later
|
||||
}
|
||||
}
|
||||
|
||||
@@ -607,7 +597,7 @@ function set_session($key, $val) {
|
||||
*/
|
||||
function auth_url($vendor, $server, $username, $db = null) {
|
||||
global $drivers;
|
||||
preg_match('~([^?]*)\\??(.*)~', remove_from_uri(implode("|", array_keys($drivers)) . "|username|" . ($db !== null ? "db|" : "") . session_name()), $match);
|
||||
preg_match('~([^?]*)\??(.*)~', remove_from_uri(implode("|", array_keys($drivers)) . "|username|" . ($db !== null ? "db|" : "") . session_name()), $match);
|
||||
return "$match[1]?"
|
||||
. (sid() ? SID . "&" : "")
|
||||
. ($vendor != "server" || $server != "" ? urlencode($vendor) . "=" . urlencode($server) . "&" : "")
|
||||
@@ -767,7 +757,7 @@ function get_file($key, $decompress = false) {
|
||||
}
|
||||
$name = $file["name"][$key];
|
||||
$tmp_name = $file["tmp_name"][$key];
|
||||
$content = file_get_contents($decompress && preg_match('~\\.gz$~', $name)
|
||||
$content = file_get_contents($decompress && preg_match('~\.gz$~', $name)
|
||||
? "compress.zlib://$tmp_name"
|
||||
: $tmp_name
|
||||
); //! may not be reachable because of open_basedir
|
||||
@@ -812,7 +802,7 @@ function repeat_pattern($pattern, $length) {
|
||||
*/
|
||||
function is_utf8($val) {
|
||||
// don't print control chars except \t\r\n
|
||||
return (preg_match('~~u', $val) && !preg_match('~[\\0-\\x8\\xB\\xC\\xE-\\x1F]~', $val));
|
||||
return (preg_match('~~u', $val) && !preg_match('~[\0-\x8\xB\xC\xE-\x1F]~', $val));
|
||||
}
|
||||
|
||||
/** Shorten UTF-8 string
|
||||
@@ -825,7 +815,7 @@ function shorten_utf8($string, $length = 80, $suffix = "") {
|
||||
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>");
|
||||
return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i>…</i>");
|
||||
}
|
||||
|
||||
/** Format decimal number
|
||||
@@ -946,14 +936,14 @@ function input($field, $value, $function) {
|
||||
$functions = (isset($_GET["select"]) || $reset ? array("orig" => lang('original')) : array()) + $adminer->editFunctions($field);
|
||||
$attrs = " name='fields[$name]'";
|
||||
if ($field["type"] == "enum") {
|
||||
echo nbsp($functions[""]) . "<td>" . $adminer->editInput($_GET["edit"], $field, $attrs, $value);
|
||||
echo h($functions[""]) . "<td>" . $adminer->editInput($_GET["edit"], $field, $attrs, $value);
|
||||
} else {
|
||||
$has_function = (in_array($function, $functions) || isset($functions[$function]));
|
||||
echo (count($functions) > 1
|
||||
? "<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))
|
||||
: h(reset($functions))
|
||||
) . '<td>';
|
||||
$input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table
|
||||
if ($input != "") {
|
||||
@@ -982,7 +972,7 @@ function input($field, $value, $function) {
|
||||
echo "<textarea$attrs cols='50' rows='12' class='jush-js'>" . h($value) . '</textarea>';
|
||||
} else {
|
||||
// int(3) is only a display hint
|
||||
$maxlength = (!preg_match('~int~', $field["type"]) && preg_match('~^(\\d+)(,(\\d+))?$~', $field["length"], $match) ? ((preg_match("~binary~", $field["type"]) ? 2 : 1) * $match[1] + ($match[3] ? 1 : 0) + ($match[2] && !$field["unsigned"] ? 1 : 0)) : ($types[$field["type"]] ? $types[$field["type"]] + ($field["unsigned"] ? 0 : 1) : 0));
|
||||
$maxlength = (!preg_match('~int~', $field["type"]) && preg_match('~^(\d+)(,(\d+))?$~', $field["length"], $match) ? ((preg_match("~binary~", $field["type"]) ? 2 : 1) * $match[1] + ($match[3] ? 1 : 0) + ($match[2] && !$field["unsigned"] ? 1 : 0)) : ($types[$field["type"]] ? $types[$field["type"]] + ($field["unsigned"] ? 0 : 1) : 0));
|
||||
if ($jush == 'sql' && min_version(5.6) && preg_match('~time~', $field["type"])) {
|
||||
$maxlength += 7; // microtime
|
||||
}
|
||||
@@ -1031,7 +1021,7 @@ function process_input($field) {
|
||||
return null;
|
||||
}
|
||||
if ($function == "orig") {
|
||||
return ($field["on_update"] == "CURRENT_TIMESTAMP" ? idf_escape($field["field"]) : false);
|
||||
return (preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"]) ? idf_escape($field["field"]) : false);
|
||||
}
|
||||
if ($function == "NULL") {
|
||||
return "NULL";
|
||||
@@ -1253,9 +1243,7 @@ function select_value($val, $link, $field, $text_length) {
|
||||
}
|
||||
$return = $adminer->editVal($val, $field);
|
||||
if ($return !== null) {
|
||||
if ($return === "") { // === - may be int
|
||||
$return = " ";
|
||||
} elseif (!is_utf8($return)) {
|
||||
if (!is_utf8($return)) {
|
||||
$return = "\0"; // htmlspecialchars of binary data returns an empty string
|
||||
} elseif ($text_length != "" && is_shortable($field)) {
|
||||
$return = shorten_utf8($return, max(0, +$text_length)); // usage of LEFT() would reduce traffic but complicate query - expected average speedup: .001 s VS .01 s on local network
|
||||
@@ -1315,10 +1303,11 @@ function count_rows($table, $where, $is_group, $group) {
|
||||
* @return array of strings
|
||||
*/
|
||||
function slow_query($query) {
|
||||
global $adminer, $token;
|
||||
global $adminer, $token, $driver;
|
||||
$db = $adminer->database();
|
||||
$timeout = $adminer->queryTimeout();
|
||||
if (support("kill") && is_object($connection2 = connect()) && ($db == "" || $connection2->select_db($db))) {
|
||||
$slow_query = $driver->slowQuery($query, $timeout);
|
||||
if (!$slow_query && support("kill") && is_object($connection2 = connect()) && ($db == "" || $connection2->select_db($db))) {
|
||||
$kill = $connection2->result(connection_id()); // MySQL and MySQLi can use thread_id but it's not in PDO_MySQL
|
||||
?>
|
||||
<script<?php echo nonce(); ?>>
|
||||
@@ -1333,7 +1322,7 @@ var timeout = setTimeout(function () {
|
||||
}
|
||||
ob_flush();
|
||||
flush();
|
||||
$return = @get_key_vals($query, $connection2, $timeout, false); // @ - may be killed
|
||||
$return = @get_key_vals(($slow_query ? $slow_query : $query), $connection2, false); // @ - may be killed
|
||||
if ($connection2) {
|
||||
echo script("clearTimeout(timeout);");
|
||||
ob_flush();
|
||||
@@ -1430,7 +1419,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'>" . script("qsl('table').onkeydown = editingKeydown;");
|
||||
echo "<table cellspacing='0' class='layout'>" . script("qsl('table').onkeydown = editingKeydown;");
|
||||
|
||||
foreach ($fields as $name => $field) {
|
||||
echo "<tr><th>" . $adminer->fieldName($field);
|
||||
@@ -1456,12 +1445,12 @@ function edit_form($TABLE, $fields, $row, $update) {
|
||||
}
|
||||
$function = ($_POST["save"]
|
||||
? (string) $_POST["function"][$name]
|
||||
: ($update && $field["on_update"] == "CURRENT_TIMESTAMP"
|
||||
: ($update && preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"])
|
||||
? "now"
|
||||
: ($value === false ? null : ($value !== null ? '' : 'NULL'))
|
||||
)
|
||||
);
|
||||
if (preg_match("~time~", $field["type"]) && $value == "CURRENT_TIMESTAMP") {
|
||||
if (preg_match("~time~", $field["type"]) && preg_match('~^CURRENT_TIMESTAMP~i', $value)) {
|
||||
$value = "";
|
||||
$function = "now";
|
||||
}
|
||||
@@ -1487,7 +1476,7 @@ function edit_form($TABLE, $fields, $row, $update) {
|
||||
? 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 ? script("qsl('input').onclick = function () { return !ajaxForm(this.form, '" . lang('Saving') . "…', this); };") : "");
|
||||
}
|
||||
}
|
||||
echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'>" . confirm() . "\n"
|
||||
|
@@ -23,6 +23,7 @@ $langs = array(
|
||||
'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
|
||||
'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti
|
||||
'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/
|
||||
'ka' => 'ქართული', // Saba Khmaladze skhmaladze@uglt.org
|
||||
'ko' => '한국어', // dalli - skcha67@gmail.com
|
||||
'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
|
||||
'ms' => 'Bahasa Melayu', // Pisyek
|
||||
|
@@ -29,6 +29,9 @@ if (extension_loaded('pdo')) {
|
||||
$this->error = "";
|
||||
if (!$result) {
|
||||
list(, $this->errno, $this->error) = $this->errorInfo();
|
||||
if (!$this->error) {
|
||||
$this->error = lang('Unknown error.');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
$this->store_result($result);
|
||||
|
@@ -1,2 +1,2 @@
|
||||
<?php
|
||||
$VERSION = "4.6.2";
|
||||
$VERSION = "4.7.1";
|
||||
|
@@ -94,12 +94,13 @@ if (!$row) {
|
||||
?>
|
||||
|
||||
<form action="" method="post">
|
||||
<div class="scrollable">
|
||||
<table cellspacing="0" class="nowrap">
|
||||
<thead><tr>
|
||||
<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>
|
||||
<th><noscript><?php echo "<input type='image' class='icon' name='add[0]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?></noscript>
|
||||
</thead>
|
||||
<?php
|
||||
if ($primary) {
|
||||
@@ -126,7 +127,7 @@ foreach ($row["indexes"] as $index) {
|
||||
"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]) . "' title='" . lang('Length') . "'>" : "");
|
||||
echo ($jush != "sql" ? checkbox("indexes[$j][descs][$i]", 1, $index["descs"][$key], lang('descending')) : "");
|
||||
echo (support("descidx") ? checkbox("indexes[$j][descs][$i]", 1, $index["descs"][$key], lang('descending')) : "");
|
||||
echo " </span>";
|
||||
$i++;
|
||||
}
|
||||
@@ -138,6 +139,7 @@ foreach ($row["indexes"] as $index) {
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
<p>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
|
@@ -10,9 +10,11 @@ $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>.',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Díky za použití Admineru, <a href="https://www.adminer.org/cs/donation/">přispějte</a> na vývoj.',
|
||||
'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
|
||||
'<a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to use SQLite.' => 'Pro přihlášení k SQLite <a href="https://www.adminer.org/cs/extension/"%s>implementujte</a> metodu %s.',
|
||||
'There is a space in the input password which might be the cause.' => 'Problém může být, že je v zadaném hesle mezera.',
|
||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer nepodporuje přístup k databázi bez hesla, <a href="https://www.adminer.org/cs/password/"%s>více informací</a>.',
|
||||
'Database does not support password.' => 'Databáze nepodporuje heslo.',
|
||||
'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/"%s>Implement</a> %s method to make it permanent.' => 'Platnost hlavního hesla vypršela. <a href="https://www.adminer.org/cs/extension/"%s>Implementujte</a> metodu %s, aby platilo stále.',
|
||||
'Language' => 'Jazyk',
|
||||
@@ -21,6 +23,7 @@ $translations = array(
|
||||
'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.',
|
||||
'Disable %s or enable %s or %s extensions.' => 'Zakažte %s nebo povolte extenze %s nebo %s.',
|
||||
'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.',
|
||||
'The action will be performed after successful login with the same credentials.' => 'Akce bude provedena po úspěšném přihlášení se stejnými přihlašovacími údaji.',
|
||||
@@ -53,6 +56,7 @@ $translations = array(
|
||||
'Query executed OK, %d row(s) affected.' => array('Příkaz proběhl v pořádku, byl změněn %d záznam.', 'Příkaz proběhl v pořádku, byly změněny %d záznamy.', 'Příkaz proběhl v pořádku, bylo změněno %d záznamů.'),
|
||||
'No commands to execute.' => 'Žádné příkazy k vykonání.',
|
||||
'Error in query' => 'Chyba v dotazu',
|
||||
'Unknown error.' => 'Neznámá chyba.',
|
||||
'Warnings' => 'Varování',
|
||||
'ATTACH queries are not supported.' => 'Dotazy ATTACH nejsou podporované.',
|
||||
'Execute' => 'Provést',
|
||||
|
@@ -276,11 +276,10 @@ $translations = array(
|
||||
'ATTACH queries are not supported.' => 'שאילתת ATTACH אינה נתמכת',
|
||||
'%d / ' => '%d / ',
|
||||
'Limit rows' => 'הגבל שורות',
|
||||
'<a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to use SQLite.' => '<a href="https://www.adminer.org/en/extension/"%s>התקן</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>.',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'תודה שהשתמש ב-adminer אנא שקול <a href="https://www.adminer.org/en/donation/">לתרום</a>.',
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'סיסמת המאסטר פגה <a href="https://www.adminer.org/en/extension/"%s>התקן תוסף</a> על מנת להפוך את זה לתמידי',
|
||||
'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 ואז למשוך אותם מהשרת',
|
||||
|
@@ -178,7 +178,7 @@ $translations = array(
|
||||
'Optimize' => '最適化',
|
||||
'Check' => 'チェック',
|
||||
'Repair' => '修復',
|
||||
'Truncate' => 'Truncate',
|
||||
'Truncate' => '空にする',
|
||||
'Move to other database' => '別のデータベースへ移動',
|
||||
'Move' => '移動',
|
||||
'Save and continue edit' => '保存して継続',
|
||||
@@ -264,4 +264,14 @@ $translations = array(
|
||||
'Permanent link' => 'パーマネントリンク',
|
||||
'Edit all' => 'すべて編集',
|
||||
'HH:MM:SS' => '時:分:秒',
|
||||
'Selected' => '選択済',
|
||||
'Modify' => '修正',
|
||||
'Load more data' => '続きを読み込み',
|
||||
'Loading' => '読み込み中',
|
||||
'Size' => 'サイズ',
|
||||
'Compute' => '算出',
|
||||
'Saving' => '保存中',
|
||||
'yes' => 'はい',
|
||||
'no' => 'いいえ',
|
||||
'Default value' => '既定値',
|
||||
);
|
||||
|
303
adminer/lang/ka.inc.php
Normal file
303
adminer/lang/ka.inc.php
Normal file
@@ -0,0 +1,303 @@
|
||||
<?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 dropped.' => 'ბაზა წაიშალა.',
|
||||
'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.' => 'ჩანაწერი განახლდა.',
|
||||
'Item%s has been inserted.' => 'ჩანაწერი%s ჩაჯდა.',
|
||||
'Edit' => 'შეცვლა',
|
||||
'Insert' => 'ჩასმა',
|
||||
'Save and insert next' => 'შენახვა და სხვის ჩასმა',
|
||||
'Delete' => 'წაშლა',
|
||||
'Database' => 'ბაზა',
|
||||
'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.' => 'უმოქმედო CSRF-ტოკენი. ფორმის კიდევ ერთხელ გაგზავნა.',
|
||||
'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.' => 'არც ერთი მხარდაჭერილი გაფართოება არ მოიძებნა (%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' => 'გარე გასაღები',
|
||||
'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' => 'ღონისძიება',
|
||||
'%s version: %s through PHP extension %s' => 'ვერსია %s: %s PHP-გაფართოება %s',
|
||||
'%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' => 'შეზღუდვა',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST ინფორმაცია ძალიან დიდია. შეამცირეთ ზომა ან გაზარდეს POST ინფორმაციის ზომა პარამეტრებიდან %s.',
|
||||
'Logged as: %s' => 'შესული ხართ როგორც: %s',
|
||||
'Move up' => 'ზემოთ ატანა',
|
||||
'Move down' => 'ქვემოთ ჩატანა',
|
||||
'Functions' => 'ფუნქციები',
|
||||
'Aggregation' => 'აგრეგაცია',
|
||||
'Export' => 'ექსპორტი',
|
||||
'Output' => 'გამომავალი ინფორმაცია',
|
||||
'open' => 'გახსნა',
|
||||
'save' => 'შენახვა',
|
||||
'Format' => 'ფორმატი',
|
||||
'Tables' => 'ცხრილები',
|
||||
'Data' => 'ინფორმაცია',
|
||||
'Event has been dropped.' => 'ღონისძიება წაიშალა.',
|
||||
'Event has been altered.' => 'ღონისძიება შეიცვალა.',
|
||||
'Event has been created.' => 'ღონისძიება შეიქმნა.',
|
||||
'Alter event' => 'ღონისძიების შეცვლა',
|
||||
'Create event' => 'ღონისძიების შექმნა',
|
||||
'At given time' => 'მოცემულ დროში',
|
||||
'Every' => 'ყოველ',
|
||||
'Events' => 'ღონისძიება',
|
||||
'Schedule' => 'განრიგი',
|
||||
'Start' => 'დასაწყისი',
|
||||
'End' => 'დასასრული',
|
||||
'Status' => 'მდგომარეობა',
|
||||
'On completion preserve' => 'შენახვა დასრულებისას',
|
||||
'Tables and views' => 'ცხრილები და წარმოდგენები',
|
||||
'Data Length' => 'ინფორმაციის მოცულობა',
|
||||
'Index Length' => 'ინდექსების მოცულობა',
|
||||
'Data Free' => 'თავისუფალი სივრცე',
|
||||
'Collation' => 'კოდირება',
|
||||
'Analyze' => 'ანალიზი',
|
||||
'Optimize' => 'ოპტიმიზაცია',
|
||||
'Check' => 'შემოწმება',
|
||||
'Repair' => 'გასწორება',
|
||||
'Truncate' => 'გასუფთავება',
|
||||
'Tables have been truncated.' => 'ცხრილი გასუფთავდა.',
|
||||
'Rows' => 'რიგი',
|
||||
',' => ' ',
|
||||
'0123456789' => '0123456789',
|
||||
'Tables have been moved.' => 'ცხრილი გადაადგილდა.',
|
||||
'Move to other database' => 'გადატანა სხვა ბაზაში',
|
||||
'Move' => 'გადატანა',
|
||||
'Engine' => 'ძრავი',
|
||||
'Save and continue edit' => 'შენახვა და ცვლილების გაგრძელება',
|
||||
'original' => 'საწყისი',
|
||||
'%d item(s) have been affected.' => 'შეიცვალა %d ჩანაწერი.',
|
||||
'Whole result' => 'სრული შედეგი',
|
||||
'Tables have been dropped.' => 'ცხრილები წაიშალა.',
|
||||
'Clone' => 'კლონირება',
|
||||
'Partition by' => 'დაყოფა',
|
||||
'Partitions' => 'დანაყოფები',
|
||||
'Partition name' => 'დანაყოფის სახელი',
|
||||
'Values' => 'პარამეტრები',
|
||||
'%d row(s) have been imported.' => 'დაიმპორტდა %d რიგი.',
|
||||
'Import' => 'იმპორტი',
|
||||
'Stop on error' => 'გაჩერება შეცდომისას',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'მიღწეულია დაშვებული ველების მაქსიმალური რაოდენობა, გაზარდეთ %s.',
|
||||
'anywhere' => 'ნებისმიერ ადგილას',
|
||||
'%.3f s' => '%.3f s',
|
||||
'$1-$3-$5' => '$5.$3.$1',
|
||||
'[yyyy]-mm-dd' => 'დდ.თთ.[წწწწ]',
|
||||
'History' => 'ისტორია',
|
||||
'Variables' => 'ცვლადები',
|
||||
'Relations' => 'ურთიერთობა',
|
||||
'Run file' => 'ფაილის გაშვება',
|
||||
'Clear' => 'გასუფთავება',
|
||||
'Maximum allowed file size is %sB.' => 'ფაილის მაქსიმალური ზომა - %sB.',
|
||||
'Numbers' => 'ციფრები',
|
||||
'Date and time' => 'დრო და თარიღი',
|
||||
'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.' => 'ბაზა წაიშალა.',
|
||||
'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.' => 'სახეობა შეიქმნა.',
|
||||
'Ctrl+click on a value to modify it.' => 'შესაცვლელად გამოიყენეთ Ctrl+თაგვის ღილაკი.',
|
||||
'Use edit link to modify this value.' => 'ამ მნიშვნელობის შესაცვლელად გამოიყენეთ ბმული «შეცვლა».',
|
||||
'last' => 'ბოლო',
|
||||
'From server' => 'სერვერიდან',
|
||||
'System' => 'სისტემა',
|
||||
'Select data' => 'არჩევა',
|
||||
'Show structure' => 'სტრუქტურის ჩვენება',
|
||||
'empty' => 'ცარიელი',
|
||||
'Network' => 'ქსელი',
|
||||
'Geometry' => 'გეომეტრია',
|
||||
'File exists.' => 'ფაილი უკვე არსებობს.',
|
||||
'Attachments' => 'მიმაგრებული ფაილები',
|
||||
'%d query(s) executed OK.' => '%d მოთხოვნა შესრულდა.',
|
||||
'Show only errors' => 'მხოლოდ შეცდომები',
|
||||
'Refresh' => 'განახლება',
|
||||
'Invalid schema.' => 'არასწორი სქემა.',
|
||||
'Please use one of the extensions %s.' => 'გამოიყენეთ ერთ-ერთი გაფართოება %s.',
|
||||
'now' => 'ახლა',
|
||||
'ltr' => 'ltr',
|
||||
'Tables have been copied.' => 'ცხრილი დაკოპირდა.',
|
||||
'Copy' => 'კოპირება',
|
||||
'Permanent link' => 'მუდმივი ბმული',
|
||||
'Edit all' => 'ყველას შეცვლა',
|
||||
'HH:MM:SS' => 'სთ:წთ:წმ',
|
||||
'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' => 'რიგების შეზღუდვა',
|
||||
'Default value' => 'სტანდარტული მნიშვნელობა',
|
||||
'Full table scan' => 'სრული ცხრილის ანალიზი',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => 'ძალიან ბევრჯერ შეგეშალათ მომხმარებელი და პაროლი. სცადეთ %d წუთში.',
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'ძირითად პაროლს ვადა გაუვიდა. <a href="https://www.adminer.org/en/extension/"%s>გამოიყენეთ</a> მეთოდი %s, რათა ის მუდმივი გახადოთ.',
|
||||
'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' => 'არა',
|
||||
'Routines' => 'რუტინები',
|
||||
'Target table' => 'მიზნობრივი ცხრილი',
|
||||
'Strings' => 'ველები',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'საწყისი და მიზნობრივი ველები უნდა იყოს ერთიდაიგივე სახეობის, მიზნობრივ ველზე უნდა იყოს ინდექსი და უნდა არსებობდეს შესაბამისი ინფორმაცია.',
|
||||
'Drop %s?' => 'წაიშალოს %s?',
|
||||
'Warnings' => 'გაფრთხილება',
|
||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'უპაროლო წვდომა ბაზასთან არაა დაშვებული Adminer-ში, მეტი ინფორმაციისთვის ეწვიეთ <a href="https://www.adminer.org/en/password/"%s>ბმულს</a>.',
|
||||
'DB' => 'ბაზა',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'მადლობას გიხდით Adminer-ით სარგებლობისთვის, გადახედეთ ბმულს <a href="https://www.adminer.org/en/donation/">შემოწირულობა</a>.',
|
||||
'The action will be performed after successful login with the same credentials.' => 'მოქმედება შესრულდება იგივე მომხმარებლით წარმატებული ავტორიზაციის შემდეგ.',
|
||||
'Connecting to privileged ports is not allowed.' => 'პრივილეგირებულ პორტთან წვდომა დაუშვებელია.',
|
||||
'There is a space in the input password which might be the cause.' => 'პაროლში არის გამოტოვება, შეიძლება ეს ქმნის პრობლემას.',
|
||||
'Unknown error.' => 'უცნობი შეცდომა.',
|
||||
'Database does not support password.' => 'ბაზაში არაა მხარდაჭერილი პაროლი.',
|
||||
'Disable %s or enable %s or %s extensions.' => 'გათიშეთ %s ან ჩართეთ %s ან %s გაფართოება.',
|
||||
);
|
@@ -10,9 +10,8 @@ $translations = array(
|
||||
'Logout' => 'Log keluar',
|
||||
'Logged as: %s' => 'Log masuk sebagai: %s',
|
||||
'Logout successful.' => 'Log keluar berjaya.',
|
||||
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Terima kasih kerana menggunakan Adminer, pertimbangkan untuk <a href="%s">menderma</a>.',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Terima kasih kerana menggunakan Adminer, pertimbangkan untuk <a href="https://www.adminer.org/en/donation/">menderma</a>.',
|
||||
'Invalid credentials.' => 'Akses tidak sah.',
|
||||
'<a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to use SQLite.' => '<a href="https://www.adminer.org/en/extension/"%s>Gunakan</a> cara %s untuk menggunakan SQLite.',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => 'Terlalu banyak percubaan log masuk yang gagal, sila cuba lagi dalam masa %d minit.',
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Kata laluan utama telah luput. <a href="https://www.adminer.org/en/extension/"%s>Gunakan</a> cara %s untuk mengekalkannya.',
|
||||
'Language' => 'Bahasa',
|
||||
|
@@ -10,9 +10,8 @@ $translations = array(
|
||||
'Logout' => 'Wyloguj',
|
||||
'Logged as: %s' => 'Zalogowany jako: %s',
|
||||
'Logout successful.' => 'Wylogowano pomyślnie.',
|
||||
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Dziękujemy za używanie Adminera, rozważ proszę <a href="%s">dotację</a>.',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Dziękujemy za używanie Adminera, rozważ proszę <a href="https://www.adminer.org/pl/donation/">dotację</a>.',
|
||||
'Invalid credentials.' => 'Nieprawidłowe dane logowania.',
|
||||
'<a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to use SQLite.' => '<a href="https://www.adminer.org/pl/extension/"%s>Zaimplementuj</a> metodę %s aby użyć SQLite.',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => array('Za dużo nieudanych prób logowania, spróbuj ponownie za %d minutę.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minuty.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minut.'),
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ważność hasła głównego wygasła. <a href="https://www.adminer.org/pl/extension/"%s>Zaimplementuj</a> własną metodę %s, aby ustawić je na stałe.',
|
||||
'Language' => 'Język',
|
||||
|
@@ -276,7 +276,6 @@ $translations = array(
|
||||
'ATTACH queries are not supported.' => 'ATTACH-запросы не поддерживаются.',
|
||||
'%d / ' => '%d / ',
|
||||
'Limit rows' => 'Лимит строк',
|
||||
'<a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to use SQLite.' => '<a href="https://www.adminer.org/en/extension/"%s>Реализуйте</a> метод %s, чтобы использовать SQLite.',
|
||||
'Default value' => 'Значение по умолчанию',
|
||||
'Full table scan' => 'Анализ полной таблицы',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => array('Слишком много неудачных попыток входа. Попробуйте снова через %d минуту.', 'Слишком много неудачных попыток входа. Попробуйте снова через %d минуты.', 'Слишком много неудачных попыток входа. Попробуйте снова через %d минут.'),
|
||||
|
@@ -10,9 +10,8 @@ $translations = array(
|
||||
'Logout' => 'Çıkış',
|
||||
'Logged as: %s' => '%s olarak giriş yapıldı.',
|
||||
'Logout successful.' => 'Oturum başarıyla sonlandı.',
|
||||
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Adminer kullandığınız için teşekkür ederiz <a href="%s">bağış yapmayı düşünün</a>.',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Adminer kullandığınız için teşekkür ederiz <a href="https://www.adminer.org/en/donation/">bağış yapmayı düşünün</a>.',
|
||||
'Invalid credentials.' => 'Geçersiz kimlik bilgileri.',
|
||||
'<a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to use SQLite.' => 'SQLite kullanmak için <a href="https://www.adminer.org/en/extension/"%s>%s metodunu</a> kullanın.',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => array('Çok fazla oturum açma denemesi yapıldı.', '%d Dakika sonra tekrar deneyiniz.'),
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ana şifrenin süresi doldu. Kalıcı olması için <a href="https://www.adminer.org/en/extension/"%s>%s medodunu</a> kullanın.',
|
||||
'Language' => 'Dil',
|
||||
|
@@ -206,8 +206,8 @@ $translations = array(
|
||||
'ON UPDATE' => 'Khi cập nhật',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Cột gốc và cột đích phải cùng kiểu, phải đặt chỉ mục trong cột đích và dữ liệu tham chiếu phải tồn tại.',
|
||||
|
||||
'Triggers' => 'xx',
|
||||
'Add trigger' => 'xx',
|
||||
'Triggers' => 'Phản xạ',
|
||||
'Add trigger' => 'Thêm phản xạ',
|
||||
'Trigger has been dropped.' => 'Đã xoá phản xạ.',
|
||||
'Trigger has been altered.' => 'Đã sửa phản xạ.',
|
||||
'Trigger has been created.' => 'Đã tạo phản xạ.',
|
||||
@@ -308,12 +308,12 @@ $translations = array(
|
||||
'Schema has been dropped.' => 'Đã xoá schema.',
|
||||
'Schema has been created.' => 'Đã tạo schema.',
|
||||
'Schema has been altered.' => 'Đã thay đổi schema.',
|
||||
'Schema' => 'schema',
|
||||
'Invalid schema.' => 'Schema khong hợp lệ.',
|
||||
'Schema' => 'Schema',
|
||||
'Invalid schema.' => 'Schema không hợp lệ.',
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Dãy số',
|
||||
'Create sequence' => 'Tạo đãy số',
|
||||
'Create sequence' => 'Tạo dãy số',
|
||||
'Sequence has been dropped.' => 'Dãy số đã bị xoá.',
|
||||
'Sequence has been created.' => 'Đã tạo dãy số.',
|
||||
'Sequence has been altered.' => 'Đã sửa dãy số.',
|
||||
|
@@ -10,9 +10,11 @@ $translations = array(
|
||||
'Logout' => 'Xx',
|
||||
'Logged as: %s' => 'Xx: %s',
|
||||
'Logout successful.' => 'Xx.',
|
||||
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Xx <a href="%s">xx</a>.',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Xx <a href="https://www.adminer.org/en/donation/">xx</a>.',
|
||||
'Invalid credentials.' => 'Xx.',
|
||||
'<a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to use SQLite.' => '<a href="https://www.adminer.org/en/extension/"%s>Xx</a> %s xx.',
|
||||
'There is a space in the input password which might be the cause.' => 'Xx.',
|
||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Xx, <a href="https://www.adminer.org/en/password/"%s>xx</a>.',
|
||||
'Database does not support password.' => 'Xx.',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => array('Xx %d.', 'Xx %d.'),
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '<a href="https://www.adminer.org/en/extension/"%s>Xx</a> %s xx.',
|
||||
'Language' => 'Xx',
|
||||
@@ -21,6 +23,7 @@ $translations = array(
|
||||
'No extension' => 'Xx',
|
||||
'None of the supported PHP extensions (%s) are available.' => 'Xx (%s).',
|
||||
'Connecting to privileged ports is not allowed.' => 'Xx.',
|
||||
'Disable %s or enable %s or %s extensions.' => 'Xx %s xx %s xx %s xx.',
|
||||
'Session support must be enabled.' => 'Xx.',
|
||||
'Session expired, please login again.' => 'Xx.',
|
||||
'The action will be performed after successful login with the same credentials.' => 'Xx.',
|
||||
@@ -53,6 +56,7 @@ $translations = array(
|
||||
'Query executed OK, %d row(s) affected.' => array('Xx, %d.', 'Xx, %d.'),
|
||||
'No commands to execute.' => 'Xx.',
|
||||
'Error in query' => 'Xx',
|
||||
'Unknown error.' => 'Xx.',
|
||||
'Warnings' => 'Xx',
|
||||
'ATTACH queries are not supported.' => 'Xx.',
|
||||
'Execute' => 'Xx',
|
||||
|
@@ -1,119 +1,230 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Login' => '登入',
|
||||
'Logout successful.' => '成功登出。',
|
||||
'Invalid credentials.' => '無效的憑證。',
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'System' => '資料庫系統',
|
||||
'Server' => '伺服器',
|
||||
'Username' => '帳號',
|
||||
'Password' => '密碼',
|
||||
'Permanent login' => '永久登入',
|
||||
'Login' => '登入',
|
||||
'Logout' => '登出',
|
||||
'Logged as: %s' => '登錄為: %s',
|
||||
'Logout successful.' => '成功登出。',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => '感謝使用Adminer,請考慮為我們<a href="https://www.adminer.org/en/donation/">捐款(英文網頁)</a>.',
|
||||
'Invalid credentials.' => '無效的憑證。',
|
||||
'There is a space in the input password which might be the cause.' => '您輸入的密碼中有一個空格,這可能是導致問題的原因。',
|
||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer預設不支援訪問沒有密碼的資料庫,<a href="https://www.adminer.org/en/password/"%s>詳情見這裡</a>.',
|
||||
'Database does not support password.' => '資料庫不支援密碼。',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => '登錄失敗次數過多,請 %d 分鐘後重試。',
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '主密碼已過期。<a href="https://www.adminer.org/en/extension/"%s>請擴展</a> %s 方法讓它永久化。',
|
||||
'Language' => '語言',
|
||||
'Invalid CSRF token. Send the form again.' => '無效的 CSRF token。請重新發送表單。',
|
||||
'If you did not send this request from Adminer then close this page.' => '如果您並沒有從Adminer發送請求,請關閉此頁面。',
|
||||
'No extension' => '無擴充模組',
|
||||
'None of the supported PHP extensions (%s) are available.' => '沒有任何支援的 PHP 擴充模組(%s)。',
|
||||
'Connecting to privileged ports is not allowed.' => '不允許連接到特權埠。',
|
||||
'Disable %s or enable %s or %s extensions.' => '禁用 %s 或啟用 %s 或 %s 擴充模組。',
|
||||
'Session support must be enabled.' => 'Session 必須被啟用。',
|
||||
'Session expired, please login again.' => 'Session 已過期,請重新登入。',
|
||||
'The action will be performed after successful login with the same credentials.' => '此操作將在成功使用相同的憑據登錄後執行。',
|
||||
'%s version: %s through PHP extension %s' => '%s 版本:%s 透過 PHP 擴充模組 %s',
|
||||
'Refresh' => '重新載入',
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'ltr',
|
||||
|
||||
'Privileges' => '權限',
|
||||
'Create user' => '建立使用者',
|
||||
'User has been dropped.' => '已刪除使用者。',
|
||||
'User has been altered.' => '已修改使用者。',
|
||||
'User has been created.' => '已建立使用者。',
|
||||
'Hashed' => 'Hashed',
|
||||
'Column' => '欄位',
|
||||
'Routine' => '程序',
|
||||
'Grant' => '授權',
|
||||
'Revoke' => '廢除',
|
||||
|
||||
'Process list' => '處理程序列表',
|
||||
'%d process(es) have been killed.' => '%d 個 Process(es) 被終止',
|
||||
'Kill' => '終止',
|
||||
|
||||
'Variables' => '變數',
|
||||
'Status' => '狀態',
|
||||
|
||||
'SQL command' => 'SQL 命令',
|
||||
'%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
|
||||
'Query executed OK, %d row(s) affected.' => '執行查詢 OK,%d 行受影響。',
|
||||
'No commands to execute.' => '沒有命令可執行。',
|
||||
'Error in query' => '查詢發生錯誤',
|
||||
'Unknown error.' => '未知錯誤。',
|
||||
'Warnings' => '警告',
|
||||
'ATTACH queries are not supported.' => '不支援ATTACH查詢。',
|
||||
'Execute' => '執行',
|
||||
'Stop on error' => '出錯時停止',
|
||||
'Show only errors' => '僅顯示錯誤訊息',
|
||||
// sprintf() format for time of the command
|
||||
'%.3f s' => '%.3f 秒',
|
||||
'History' => '紀錄',
|
||||
'Clear' => '清除',
|
||||
'Edit all' => '編輯全部',
|
||||
|
||||
'File upload' => '檔案上傳',
|
||||
'From server' => '從伺服器',
|
||||
'Webserver file %s' => '網頁伺服器檔案 %s',
|
||||
'Run file' => '執行檔案',
|
||||
'File does not exist.' => '檔案不存在',
|
||||
'File uploads are disabled.' => '檔案上傳已經被停用。',
|
||||
'Unable to upload a file.' => '無法上傳檔案。',
|
||||
'Maximum allowed file size is %sB.' => '允許的檔案上限大小為 %sB',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 資料太大。減少資料或者增加 %s 的設定值。',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => '您可以通過FTP上傳大型SQL檔並從伺服器導入。',
|
||||
'You are offline.' => '您離線了。',
|
||||
|
||||
'Export' => '匯出',
|
||||
'Output' => '輸出',
|
||||
'open' => '打開',
|
||||
'save' => '儲存',
|
||||
'Saving' => '保存中',
|
||||
'Format' => '格式',
|
||||
'Data' => '資料',
|
||||
|
||||
'Database' => '資料庫',
|
||||
'database' => '資料庫',
|
||||
'DB' => '資料庫',
|
||||
'Use' => '使用',
|
||||
'Select database' => '選擇資料庫',
|
||||
'Invalid database.' => '無效的資料庫。',
|
||||
'Table has been altered.' => '資料表已修改。',
|
||||
'Table has been created.' => '資料表已修改。',
|
||||
'Alter table' => '修改資料表',
|
||||
'Create table' => '建立資料表',
|
||||
'Table name' => '資料表名稱',
|
||||
'engine' => '引擎',
|
||||
'collation' => '校對',
|
||||
'Column name' => '列名',
|
||||
'Type' => '類型',
|
||||
'Length' => '長度',
|
||||
'Auto Increment' => '自動遞增',
|
||||
'Options' => '選項',
|
||||
'Save' => '儲存',
|
||||
'Drop' => '刪除',
|
||||
'Database has been dropped.' => '資料庫已刪除。',
|
||||
'Databases have been dropped.' => '資料庫已刪除。',
|
||||
'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 updated.' => '已更新項目。',
|
||||
'Item%s has been inserted.' => '已新增項目%s。',
|
||||
'Edit' => '編輯',
|
||||
'Insert' => '新增',
|
||||
'Save and insert next' => '儲存並新增下一筆',
|
||||
'Delete' => '刪除',
|
||||
'Database' => '資料庫',
|
||||
'Database schema' => '資料庫結構',
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => '永久連結',
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
'Engine' => '引擎',
|
||||
'Collation' => '校對',
|
||||
'Data Length' => '資料長度',
|
||||
'Index Length' => '索引長度',
|
||||
'Data Free' => '資料空閒',
|
||||
'Rows' => '行數',
|
||||
'%d in total' => '總共 %d 個',
|
||||
'Analyze' => '分析',
|
||||
'Optimize' => '最佳化',
|
||||
'Vacuum' => '整理(Vacuum)',
|
||||
'Check' => '檢查',
|
||||
'Repair' => '修復',
|
||||
'Truncate' => '清空',
|
||||
'Tables have been truncated.' => '已清空資料表。',
|
||||
'Move to other database' => '轉移到其它資料庫',
|
||||
'Move' => '轉移',
|
||||
'Tables have been moved.' => '已轉移資料表。',
|
||||
'Copy' => '複製',
|
||||
'Tables have been copied.' => '資料表已經複製',
|
||||
|
||||
'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.' => '執行查詢OK,%d行受影響',
|
||||
'Error in query' => '查詢發生錯誤',
|
||||
'Execute' => '執行',
|
||||
'Table' => '資料表',
|
||||
'Foreign keys' => '外來鍵',
|
||||
'Triggers' => '觸發器',
|
||||
'View' => '檢視表',
|
||||
'Unable to select the table' => '無法選擇該資料表',
|
||||
'Invalid CSRF token. Send the form again.' => '無效的 CSRF token。請重新發送表單。',
|
||||
'Comment' => '註解',
|
||||
'Default values' => '預設值',
|
||||
'%d byte(s)' => '%d byte(s)',
|
||||
'No commands to execute.' => '沒有命令可執行。',
|
||||
'Unable to upload a file.' => '無法上傳檔案。',
|
||||
'File upload' => '檔案上傳',
|
||||
'File uploads are disabled.' => '檔案上傳已經被停用。',
|
||||
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d行被影響',
|
||||
'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 必須被啟用。',
|
||||
'Session expired, please login again.' => 'Session 已過期,請重新登入。',
|
||||
'Text length' => 'Text 長度',
|
||||
'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 DELETE',
|
||||
'ON UPDATE' => 'ON UPDATE',
|
||||
'Index Type' => '索引類型',
|
||||
'Column (length)' => '列(長度)',
|
||||
'Parameter name' => '參數名稱',
|
||||
'Create procedure' => '建立預存程序',
|
||||
'Create function' => '建立函式',
|
||||
'Routine has been dropped.' => '已刪除程序。',
|
||||
'Routine has been altered.' => '已修改子程序。',
|
||||
'Routine has been created.' => '已建立子程序。',
|
||||
'Alter function' => '修改函式',
|
||||
'Alter procedure' => '修改預存程序',
|
||||
'Return type' => '回傳類型',
|
||||
|
||||
'Events' => '事件',
|
||||
'Event has been dropped.' => '已刪除事件。',
|
||||
'Event has been altered.' => '已修改事件。',
|
||||
'Event has been created.' => '已建立事件。',
|
||||
'Alter event' => '修改事件',
|
||||
'Create event' => '建立事件',
|
||||
'At given time' => '在指定時間',
|
||||
'Every' => '每',
|
||||
'Schedule' => '排程',
|
||||
'Start' => '開始',
|
||||
'End' => '結束',
|
||||
'On completion preserve' => '在完成後儲存',
|
||||
|
||||
'Tables' => '資料表',
|
||||
'Tables and views' => '資料表和檢視表',
|
||||
'Table' => '資料表',
|
||||
'No tables.' => '沒有資料表。',
|
||||
'Alter table' => '修改資料表',
|
||||
'Create table' => '建立資料表',
|
||||
'Table has been dropped.' => '已經刪除資料表。',
|
||||
'Tables have been dropped.' => '已經將資料表刪除。',
|
||||
'Tables have been optimized.' => '已優化資料表。',
|
||||
'Table has been altered.' => '資料表已修改。',
|
||||
'Table has been created.' => '資料表已建立。',
|
||||
'Table name' => '資料表名稱',
|
||||
'Show structure' => '顯示結構',
|
||||
'engine' => '引擎',
|
||||
'collation' => '校對',
|
||||
'Column name' => '欄位名稱',
|
||||
'Type' => '類型',
|
||||
'Length' => '長度',
|
||||
'Auto Increment' => '自動遞增',
|
||||
'Options' => '選項',
|
||||
'Comment' => '註解',
|
||||
'Default value' => '預設值',
|
||||
'Default values' => '預設值',
|
||||
'Drop' => '刪除',
|
||||
'Drop %s?' => '刪除 %s?',
|
||||
'Are you sure?' => '你確定嗎?',
|
||||
'Size' => '大小',
|
||||
'Compute' => '計算',
|
||||
'Move up' => '上移',
|
||||
'Move down' => '下移',
|
||||
'Remove' => '移除',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => '超過允許的字段數量的最大值。請增加 %s。',
|
||||
|
||||
'Partition by' => '分區類型',
|
||||
'Partitions' => '分區',
|
||||
'Partition name' => '分區名稱',
|
||||
'Values' => '值',
|
||||
|
||||
'View' => '檢視表',
|
||||
'Materialized view' => '物化視圖',
|
||||
'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 個 Process(es) 被終止',
|
||||
'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' => '回傳類型',
|
||||
|
||||
'Indexes' => '索引',
|
||||
'Indexes have been altered.' => '已修改索引。',
|
||||
'Alter indexes' => '修改索引',
|
||||
'Add next' => '新增下一筆',
|
||||
'Index Type' => '索引類型',
|
||||
'Column (length)' => '欄位(長度)',
|
||||
|
||||
'Foreign keys' => '外來鍵',
|
||||
'Foreign key' => '外來鍵',
|
||||
'Foreign key has been dropped.' => '已刪除外來鍵。',
|
||||
'Foreign key has been altered.' => '已修改外來鍵。',
|
||||
'Foreign key has been created.' => '已建立外來鍵。',
|
||||
'Target table' => '目標資料表',
|
||||
'Change' => '變更',
|
||||
'Source' => '來源',
|
||||
'Target' => '目標',
|
||||
'Add column' => '新增欄位',
|
||||
'Alter' => '修改',
|
||||
'Add foreign key' => '新增外來鍵',
|
||||
'ON DELETE' => 'ON DELETE',
|
||||
'ON UPDATE' => 'ON UPDATE',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '來源列和目標列必須具有相同的資料類型,在目標列上必須有一個索引並且引用的資料必須存在。',
|
||||
|
||||
'Triggers' => '觸發器',
|
||||
'Add trigger' => '建立觸發器',
|
||||
'Trigger has been dropped.' => '已刪除觸發器。',
|
||||
'Trigger has been altered.' => '已修改觸發器。',
|
||||
@@ -122,146 +233,116 @@ $translations = array(
|
||||
'Create trigger' => '建立觸發器',
|
||||
'Time' => '時間',
|
||||
'Event' => '事件',
|
||||
'%s version: %s through PHP extension %s' => '%s版本:%s 透過PHP擴充模組 %s',
|
||||
'%d row(s)' => '%d行',
|
||||
'Remove' => '移除',
|
||||
'Are you sure?' => '你確定嗎?',
|
||||
'Privileges' => '權限',
|
||||
'Create user' => '建立使用者',
|
||||
'User has been dropped.' => '已刪除使用者。',
|
||||
'User has been altered.' => '已修改使用者。',
|
||||
'User has been created.' => '已建立使用者。',
|
||||
'Hashed' => 'Hashed',
|
||||
'Column' => '列',
|
||||
'Routine' => '程序',
|
||||
'Grant' => '授權',
|
||||
'Revoke' => '廢除',
|
||||
'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' => '函數',
|
||||
'Name' => '名稱',
|
||||
|
||||
'select' => '選擇',
|
||||
'Select' => '選擇',
|
||||
'Select data' => '選擇資料',
|
||||
'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' => '在指定時間',
|
||||
'Tables have been truncated.' => '已清空資料表。',
|
||||
'Tables have been moved.' => '已轉移資料表。',
|
||||
'Tables and views' => '資料表和檢視表',
|
||||
'Engine' => '引擎',
|
||||
'Collation' => '校對',
|
||||
'Data Length' => '資料長度',
|
||||
'Index Length' => '索引長度',
|
||||
'Data Free' => '資料空閒',
|
||||
'Rows' => '行數',
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
'Analyze' => '分析',
|
||||
'Optimize' => '最佳化',
|
||||
'Check' => '檢查',
|
||||
'Repair' => '修復',
|
||||
'Truncate' => '清空',
|
||||
'Move to other database' => '轉移到其它資料庫',
|
||||
'Move' => '轉移',
|
||||
'Save and continue edit' => '儲存並繼續編輯',
|
||||
'original' => '原始',
|
||||
'%d item(s) have been affected.' => '%d個項目受到影響。',
|
||||
'Whole result' => '所有結果',
|
||||
'Tables have been dropped.' => '已經將資料表刪除。',
|
||||
'Clone' => '複製',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => '超過允許的字段數量的最大值。請增加%s。',
|
||||
'Partition by' => '分區類型',
|
||||
'Partitions' => '分區',
|
||||
'Partition name' => '分區名稱',
|
||||
'Values' => '值',
|
||||
'%d row(s) have been imported.' => '已匯入%d行。',
|
||||
'Search' => '搜尋',
|
||||
'anywhere' => '任意位置',
|
||||
'Search data in tables' => '在資料庫搜尋',
|
||||
'Sort' => '排序',
|
||||
'descending' => '降冪 (遞減)',
|
||||
'Limit' => '限定',
|
||||
'Limit rows' => '限制行數',
|
||||
'Text length' => 'Text 長度',
|
||||
'Action' => '動作',
|
||||
'Full table scan' => '全資料表掃描',
|
||||
'Unable to select the table' => '無法選擇該資料表',
|
||||
'No rows.' => '沒有資料行。',
|
||||
'%d / ' => '%d / ',
|
||||
'%d row(s)' => '%d 行',
|
||||
'Page' => '頁',
|
||||
'last' => '最後一頁',
|
||||
'Load more data' => '載入更多資料',
|
||||
'Loading' => '載入中',
|
||||
'Whole result' => '所有結果',
|
||||
'%d byte(s)' => '%d byte(s)',
|
||||
|
||||
'Import' => '匯入',
|
||||
'Stop on error' => '出錯時停止',
|
||||
'%.3f s' => '%.3f秒',
|
||||
'$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',
|
||||
'%d row(s) have been imported.' => '已匯入 %d 行。',
|
||||
'File must be in UTF-8 encoding.' => '檔必須使用UTF-8編碼。',
|
||||
|
||||
// in-place editing in select
|
||||
'Modify' => '修改',
|
||||
'Ctrl+click on a value to modify it.' => '按住Ctrl並按一下某個值進行修改。',
|
||||
'Use edit link to modify this value.' => '使用編輯連結來修改。',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => '已新增項目 %s。',
|
||||
'Item has been deleted.' => '該項目已被刪除',
|
||||
'Item has been updated.' => '已更新項目。',
|
||||
'%d item(s) have been affected.' => '%d 個項目受到影響。',
|
||||
'New item' => '新增項目',
|
||||
'original' => '原始',
|
||||
// label for value '' in enum data type
|
||||
'empty' => '空值',
|
||||
'edit' => '編輯',
|
||||
'Edit' => '編輯',
|
||||
'Insert' => '新增',
|
||||
'Save' => '儲存',
|
||||
'Save and continue edit' => '儲存並繼續編輯',
|
||||
'Save and insert next' => '儲存並新增下一筆',
|
||||
'Selected' => '已選中',
|
||||
'Clone' => '複製',
|
||||
'Delete' => '刪除',
|
||||
'You have no privileges to update this table.' => '您沒有許可權更新這個資料表。',
|
||||
|
||||
'E-mail' => '電子郵件',
|
||||
'From' => '來自',
|
||||
'Subject' => '主旨',
|
||||
'Attachments' => '附件',
|
||||
'Send' => '寄出',
|
||||
'%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。',
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => '數字',
|
||||
'Date and time' => '日期時間',
|
||||
'Strings' => '字串',
|
||||
'Binary' => '二進位',
|
||||
'Lists' => '列表',
|
||||
'Network' => '網路',
|
||||
'Geometry' => '幾何',
|
||||
'Relations' => '關聯',
|
||||
|
||||
'Editor' => '編輯器',
|
||||
'E-mail' => '電子郵件',
|
||||
'From' => '來自',
|
||||
'Subject' => '主旨',
|
||||
'Send' => '寄出',
|
||||
'%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。',
|
||||
'Webserver file %s' => '網頁伺服器檔案 %s',
|
||||
'File does not exist.' => '檔案不存在',
|
||||
'Item has been deleted.' => '該項目已被刪除',
|
||||
'%d in total' => '總共 %d 個',
|
||||
'Permanent login' => '永久登入',
|
||||
'Table has been dropped.' => '已經刪除資料表。',
|
||||
'Databases have been dropped.' => '資料庫已刪除。',
|
||||
'Search data in tables' => '在資料庫搜尋',
|
||||
'Schema' => '資料表結構',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$1.$3.$5',
|
||||
// hint for date format - use language equivalents for day, month and year shortcuts
|
||||
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
|
||||
// hint for time format - use language equivalents for hour, minute and second shortcuts
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
'now' => '現在',
|
||||
'yes' => '是',
|
||||
'no' => '否',
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => '檔案已存在。',
|
||||
'Please use one of the extensions %s.' => '請使用下列其中一個擴充模組 %s。',
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => '修改資料表結構',
|
||||
'Create schema' => '建立資料表結構',
|
||||
'Schema has been dropped.' => '已刪除資料表結構。',
|
||||
'Schema has been created.' => '已建立資料表結構。',
|
||||
'Schema has been altered.' => '已修改資料表結構。',
|
||||
'Schema' => '資料表結構',
|
||||
'Invalid schema.' => '無效的資料表結構。',
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => '序列',
|
||||
'Create sequence' => '建立序列',
|
||||
'Alter sequence' => '修改序列',
|
||||
'Sequence has been dropped.' => '已刪除序列。',
|
||||
'Sequence has been created.' => '已建立序列。',
|
||||
'Sequence has been altered.' => '已修改序列。',
|
||||
'Alter sequence' => '修改序列',
|
||||
|
||||
// PostgreSQL user types support
|
||||
'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' => '附件',
|
||||
'%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
|
||||
'Show only errors' => '僅顯示錯誤訊息',
|
||||
'Refresh' => '重新載入',
|
||||
'Invalid schema.' => '無效的資料表結構。',
|
||||
'Please use one of the extensions %s.' => '請使用下列其中一個擴充模組 %s。',
|
||||
'now' => '現在',
|
||||
'ltr' => 'ltr',
|
||||
'Tables have been copied.' => '資料表已經複製',
|
||||
'Copy' => '複製',
|
||||
'Permanent link' => '永久連結',
|
||||
'Edit all' => '編輯全部',
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
'Alter type' => '修改類型',
|
||||
);
|
||||
|
@@ -1,133 +1,38 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Login' => '登录',
|
||||
'Logout successful.' => '注销成功。',
|
||||
'Invalid credentials.' => '无效凭据。',
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'System' => '系统',
|
||||
'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 dropped.' => '已删除数据库。',
|
||||
'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.' => '已更新项目。',
|
||||
'Item%s has been inserted.' => '已插入项目%s。',
|
||||
'Edit' => '编辑',
|
||||
'Insert' => '插入',
|
||||
'Save and insert next' => '保存并插入下一个',
|
||||
'Delete' => '删除',
|
||||
'Database' => '数据库',
|
||||
'Routines' => '子程序',
|
||||
'Indexes have been altered.' => '已修改索引。',
|
||||
'Indexes' => '索引',
|
||||
'Alter indexes' => '修改索引',
|
||||
'Add next' => '下一行插入',
|
||||
'Permanent login' => '保持登录',
|
||||
'Login' => '登录',
|
||||
'Logout' => '登出',
|
||||
'Logged as: %s' => '登录用户:%s',
|
||||
'Logout successful.' => '成功登出。',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => '感谢使用Adminer,请考虑为我们<a href="https://www.adminer.org/en/donation/">捐款(英文页面)</a>.',
|
||||
'Invalid credentials.' => '无效凭据。',
|
||||
'There is a space in the input password which might be the cause.' => '您输入的密码中有一个空格,这可能是导致问题的原因。',
|
||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer默认不支持访问没有密码的数据库,<a href="https://www.adminer.org/en/password/"%s>详情见这里</a>.',
|
||||
'Database does not support password.' => '数据库不支持密码。',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => '登录失败次数过多,请 %d 分钟后重试。',
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '主密码已过期。<a href="https://www.adminer.org/en/extension/"%s>请扩展</a> %s 方法让它永久化。',
|
||||
'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.' => '无效 CSRF 令牌。重新发送表单。',
|
||||
'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' => '调用',
|
||||
'Invalid CSRF token. Send the form again.' => '无效 CSRF 令牌。请重新发送表单。',
|
||||
'If you did not send this request from Adminer then close this page.' => '如果您并没有从Adminer发送请求,请关闭此页面。',
|
||||
'No extension' => '没有扩展',
|
||||
'None of the supported PHP extensions (%s) are available.' => '没有支持的 PHP 扩展可用(%s)。',
|
||||
'Session support must be enabled.' => 'Session 必须被启用。',
|
||||
'Session expired, please login again.' => 'Session 已过期,请重新登录。',
|
||||
'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 DELETE',
|
||||
'ON UPDATE' => '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' => '事件',
|
||||
'Connecting to privileged ports is not allowed.' => '不允许连接到特权端口。',
|
||||
'Disable %s or enable %s or %s extensions.' => '禁用 %s 或启用 %s 或 %s 扩展。',
|
||||
'Session support must be enabled.' => '必须启用会话支持。',
|
||||
'Session expired, please login again.' => '会话已过期,请重新登录。',
|
||||
'The action will be performed after successful login with the same credentials.' => '此操作将在成功使用相同的凭据登录后执行。',
|
||||
'%s version: %s through PHP extension %s' => '%s 版本:%s, 使用PHP扩展 %s',
|
||||
'%d row(s)' => '%d 行',
|
||||
'Remove' => '移除',
|
||||
'Are you sure?' => '你确定吗?',
|
||||
'Refresh' => '刷新',
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'ltr',
|
||||
|
||||
'Privileges' => '权限',
|
||||
'Create user' => '创建用户',
|
||||
'User has been dropped.' => '已删除用户。',
|
||||
@@ -138,130 +43,306 @@ $translations = array(
|
||||
'Routine' => '子程序',
|
||||
'Grant' => '授权',
|
||||
'Revoke' => '废除',
|
||||
'Logged as: %s' => '登录用户:%s',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => '太大的 POST 数据。减少数据或者增加 %s 配置命令。',
|
||||
'Move up' => '上移',
|
||||
'Move down' => '下移',
|
||||
|
||||
'Process list' => '进程列表',
|
||||
'%d process(es) have been killed.' => '%d 个进程被终止',
|
||||
'Kill' => '终止',
|
||||
|
||||
'Variables' => '变量',
|
||||
'Status' => '状态',
|
||||
|
||||
'SQL command' => 'SQL命令',
|
||||
'%d query(s) executed OK.' => '%d 条查询已成功执行。',
|
||||
'Query executed OK, %d row(s) affected.' => '查询执行完毕,%d 行受影响。',
|
||||
'No commands to execute.' => '没有命令被执行。',
|
||||
'Error in query' => '查询出错',
|
||||
'Unknown error.' => '未知错误。',
|
||||
'Warnings' => '警告',
|
||||
'ATTACH queries are not supported.' => '不支持ATTACH查询。',
|
||||
'Execute' => '执行',
|
||||
'Stop on error' => '出错时停止',
|
||||
'Show only errors' => '仅显示错误',
|
||||
// sprintf() format for time of the command
|
||||
'%.3f s' => '%.3f 秒',
|
||||
'History' => '历史',
|
||||
'Clear' => '清除',
|
||||
'Edit all' => '编辑全部',
|
||||
|
||||
'File upload' => '文件上传',
|
||||
'From server' => '来自服务器',
|
||||
'Webserver file %s' => 'Web服务器文件 %s',
|
||||
'Run file' => '运行文件',
|
||||
'File does not exist.' => '文件不存在。',
|
||||
'File uploads are disabled.' => '文件上传被禁用。',
|
||||
'Unable to upload a file.' => '不能上传文件。',
|
||||
'Maximum allowed file size is %sB.' => '最多允许的文件大小为 %sB。',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 数据太大。请减少数据或者增加 %s 配置命令。',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => '您可以通过FTP上传大型SQL文件并从服务器导入。',
|
||||
'You are offline.' => '您离线了。',
|
||||
|
||||
'Export' => '导出',
|
||||
'Tables' => '表',
|
||||
'Data' => '数据',
|
||||
'Output' => '输出',
|
||||
'open' => '打开',
|
||||
'save' => '保存',
|
||||
'Saving' => '保存中',
|
||||
'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' => '在指定时间',
|
||||
'Tables have been truncated.' => '已清空表。',
|
||||
'Tables have been moved.' => '已转移表。',
|
||||
'Tables and views' => '表和视图',
|
||||
'Data' => '数据',
|
||||
|
||||
'Database' => '数据库',
|
||||
'database' => '数据库',
|
||||
'DB' => '数据库',
|
||||
'Use' => '使用',
|
||||
'Select database' => '选择数据库',
|
||||
'Invalid database.' => '无效数据库。',
|
||||
'Database has been dropped.' => '已删除数据库。',
|
||||
'Databases have been dropped.' => '已删除数据库。',
|
||||
'Database has been created.' => '已创建数据库。',
|
||||
'Database has been renamed.' => '已重命名数据库。',
|
||||
'Database has been altered.' => '已修改数据库。',
|
||||
'Alter database' => '修改数据库',
|
||||
'Create database' => '创建数据库',
|
||||
'Database schema' => '数据库概要',
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => '固定链接',
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
'Engine' => '引擎',
|
||||
'Collation' => '校对',
|
||||
'Data Length' => '数据长度',
|
||||
'Index Length' => '索引长度',
|
||||
'Data Free' => '数据空闲',
|
||||
'Rows' => '行数',
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
'%d in total' => '共计 %d',
|
||||
'Analyze' => '分析',
|
||||
'Optimize' => '优化',
|
||||
'Vacuum' => '整理(Vacuum)',
|
||||
'Check' => '检查',
|
||||
'Repair' => '修复',
|
||||
'Truncate' => '清空',
|
||||
'Tables have been truncated.' => '已清空表。',
|
||||
'Move to other database' => '转移到其它数据库',
|
||||
'Move' => '转移',
|
||||
'Save and continue edit' => '保存并继续编辑',
|
||||
'original' => '原始',
|
||||
'%d item(s) have been affected.' => '%d 个项目受到影响。',
|
||||
'Whole result' => '所有结果',
|
||||
'Tables have been moved.' => '已转移表。',
|
||||
'Copy' => '复制',
|
||||
'Tables have been copied.' => '已复制表。',
|
||||
|
||||
'Routines' => '子程序',
|
||||
'Routine has been called, %d row(s) affected.' => '子程序被调用,%d 行被影响。',
|
||||
'Call' => '调用',
|
||||
'Parameter name' => '参数名',
|
||||
'Create procedure' => '创建过程',
|
||||
'Create function' => '创建函数',
|
||||
'Routine has been dropped.' => '已删除子程序。',
|
||||
'Routine has been altered.' => '已修改子程序。',
|
||||
'Routine has been created.' => '已创建子程序。',
|
||||
'Alter function' => '修改函数',
|
||||
'Alter procedure' => '修改过程',
|
||||
'Return type' => '返回类型',
|
||||
|
||||
'Events' => '事件',
|
||||
'Event has been dropped.' => '已删除事件。',
|
||||
'Event has been altered.' => '已修改事件。',
|
||||
'Event has been created.' => '已创建事件。',
|
||||
'Alter event' => '修改事件',
|
||||
'Create event' => '创建事件',
|
||||
'At given time' => '在指定时间',
|
||||
'Every' => '每',
|
||||
'Schedule' => '调度',
|
||||
'Start' => '开始',
|
||||
'End' => '结束',
|
||||
'On completion preserve' => '完成后仍保留',
|
||||
|
||||
'Tables' => '表',
|
||||
'Tables and views' => '表和视图',
|
||||
'Table' => '表',
|
||||
'No tables.' => '没有表。',
|
||||
'Alter table' => '修改表',
|
||||
'Create table' => '创建表',
|
||||
'Table has been dropped.' => '已删除表。',
|
||||
'Tables have been dropped.' => '已删除表。',
|
||||
'Clone' => '复制',
|
||||
'Tables have been optimized.' => '已优化表。',
|
||||
'Table has been altered.' => '已修改表。',
|
||||
'Table has been created.' => '已创建表。',
|
||||
'Table name' => '表名',
|
||||
'Show structure' => '显示结构',
|
||||
'engine' => '引擎',
|
||||
'collation' => '校对',
|
||||
'Column name' => '字段名',
|
||||
'Type' => '类型',
|
||||
'Length' => '长度',
|
||||
'Auto Increment' => '自动增量',
|
||||
'Options' => '选项',
|
||||
'Comment' => '注释',
|
||||
'Default value' => '默认值',
|
||||
'Default values' => '默认值',
|
||||
'Drop' => '删除',
|
||||
'Drop %s?' => '删除 %s?',
|
||||
'Are you sure?' => '您确定吗?',
|
||||
'Size' => '大小',
|
||||
'Compute' => '计算',
|
||||
'Move up' => '上移',
|
||||
'Move down' => '下移',
|
||||
'Remove' => '移除',
|
||||
'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 秒',
|
||||
'$1-$3-$5' => '$1.$3.$5',
|
||||
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
|
||||
'History' => '历史',
|
||||
'Variables' => '变量',
|
||||
|
||||
'View' => '视图',
|
||||
'Materialized view' => '物化视图',
|
||||
'View has been dropped.' => '已删除视图。',
|
||||
'View has been altered.' => '已修改视图。',
|
||||
'View has been created.' => '已创建视图。',
|
||||
'Alter view' => '修改视图',
|
||||
'Create view' => '创建视图',
|
||||
|
||||
'Indexes' => '索引',
|
||||
'Indexes have been altered.' => '已修改索引。',
|
||||
'Alter indexes' => '修改索引',
|
||||
'Add next' => '下一行插入',
|
||||
'Index Type' => '索引类型',
|
||||
'Column (length)' => '列(长度)',
|
||||
|
||||
'Foreign keys' => '外键',
|
||||
'Foreign key' => '外键',
|
||||
'Foreign key has been dropped.' => '已删除外键。',
|
||||
'Foreign key has been altered.' => '已修改外键。',
|
||||
'Foreign key has been created.' => '已创建外键。',
|
||||
'Target table' => '目标表',
|
||||
'Change' => '修改',
|
||||
'Source' => '源',
|
||||
'Target' => '目标',
|
||||
'Add column' => '增加列',
|
||||
'Alter' => '修改',
|
||||
'Add foreign key' => '添加外键',
|
||||
'ON DELETE' => 'ON DELETE',
|
||||
'ON UPDATE' => 'ON UPDATE',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '源列和目标列必须具有相同的数据类型,在目标列上必须有一个索引并且引用的数据必须存在。',
|
||||
'Relations' => '关联信息',
|
||||
'Run file' => '运行文件',
|
||||
'Clear' => '清除',
|
||||
'Maximum allowed file size is %sB.' => '最多允许的文件大小为 %sB',
|
||||
|
||||
'Triggers' => '触发器',
|
||||
'Add trigger' => '创建触发器',
|
||||
'Trigger has been dropped.' => '已删除触发器。',
|
||||
'Trigger has been altered.' => '已修改触发器。',
|
||||
'Trigger has been created.' => '已创建触发器。',
|
||||
'Alter trigger' => '修改触发器',
|
||||
'Create trigger' => '创建触发器',
|
||||
'Time' => '时间',
|
||||
'Event' => '事件',
|
||||
'Name' => '名称',
|
||||
|
||||
'select' => '选择',
|
||||
'Select' => '选择',
|
||||
'Select data' => '选择数据',
|
||||
'Functions' => '函数',
|
||||
'Aggregation' => '集合',
|
||||
'Search' => '搜索',
|
||||
'anywhere' => '任意位置',
|
||||
'Search data in tables' => '在表中搜索数据',
|
||||
'Sort' => '排序',
|
||||
'descending' => '降序',
|
||||
'Limit' => '范围',
|
||||
'Limit rows' => '限制行数',
|
||||
'Text length' => '文本显示限制',
|
||||
'Action' => '动作',
|
||||
'Full table scan' => '全表扫描',
|
||||
'Unable to select the table' => '不能选择该表',
|
||||
'No rows.' => '无数据。',
|
||||
'%d / ' => '%d / ',
|
||||
'%d row(s)' => '%d 行',
|
||||
'Page' => '页面',
|
||||
'last' => '最后',
|
||||
'Load more data' => '加载更多数据',
|
||||
'Loading' => '加载中',
|
||||
'Whole result' => '所有结果',
|
||||
'%d byte(s)' => '%d 字节',
|
||||
|
||||
'Import' => '导入',
|
||||
'%d row(s) have been imported.' => '%d 行已导入。',
|
||||
'File must be in UTF-8 encoding.' => '文件必须使用UTF-8编码。',
|
||||
|
||||
// in-place editing in select
|
||||
'Modify' => '修改',
|
||||
'Ctrl+click on a value to modify it.' => '按住Ctrl并单击某个值进行修改。',
|
||||
'Use edit link to modify this value.' => '使用编辑链接修改该值。',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => '已插入项目%s。',
|
||||
'Item has been deleted.' => '已删除项目。',
|
||||
'Item has been updated.' => '已更新项目。',
|
||||
'%d item(s) have been affected.' => '%d 个项目受到影响。',
|
||||
'New item' => '新建数据',
|
||||
'original' => '原始',
|
||||
// label for value '' in enum data type
|
||||
'empty' => '空',
|
||||
'edit' => '编辑',
|
||||
'Edit' => '编辑',
|
||||
'Insert' => '插入',
|
||||
'Save' => '保存',
|
||||
'Save and continue edit' => '保存并继续编辑',
|
||||
'Save and insert next' => '保存并插入下一个',
|
||||
'Selected' => '已选中',
|
||||
'Clone' => '复制',
|
||||
'Delete' => '删除',
|
||||
'You have no privileges to update this table.' => '您没有权限更新这个表。',
|
||||
|
||||
'E-mail' => '电子邮件',
|
||||
'From' => '来自',
|
||||
'Subject' => '主题',
|
||||
'Attachments' => '附件',
|
||||
'Send' => '发送',
|
||||
'%d e-mail(s) have been sent.' => '%d 封邮件已发送。',
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => '数字',
|
||||
'Date and time' => '日期时间',
|
||||
'Strings' => '字符串',
|
||||
'Binary' => '二进制',
|
||||
'Lists' => '列表',
|
||||
'Network' => '网络',
|
||||
'Geometry' => '几何图形',
|
||||
'Relations' => '关联信息',
|
||||
|
||||
'Editor' => '编辑器',
|
||||
'E-mail' => '电子邮件',
|
||||
'From' => '来自',
|
||||
'Subject' => '主题',
|
||||
'Send' => '发送',
|
||||
'%d e-mail(s) have been sent.' => '%d 封邮件已发送。',
|
||||
'Webserver file %s' => 'Web服务器文件 %s',
|
||||
'File does not exist.' => '文件不存在。',
|
||||
'%d in total' => '共计 %d',
|
||||
'Permanent login' => '保持登录',
|
||||
'Databases have been dropped.' => '已删除数据库。',
|
||||
'Search data in tables' => '在表中搜索数据',
|
||||
'Schema' => '模式',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$1.$3.$5',
|
||||
// hint for date format - use language equivalents for day, month and year shortcuts
|
||||
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
|
||||
// hint for time format - use language equivalents for hour, minute and second shortcuts
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
'now' => '现在',
|
||||
'yes' => '是',
|
||||
'no' => '否',
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => '文件已存在。',
|
||||
'Please use one of the extensions %s.' => '请使用其中一个扩展:%s。',
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => '修改模式',
|
||||
'Create schema' => '创建模式',
|
||||
'Schema has been dropped.' => '已删除模式。',
|
||||
'Schema has been created.' => '已创建模式。',
|
||||
'Schema has been altered.' => '已修改模式。',
|
||||
'Schema' => '模式',
|
||||
'Invalid schema.' => '非法模式。',
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => '序列',
|
||||
'Create sequence' => '创建序列',
|
||||
'Alter sequence' => '修改序列',
|
||||
'Sequence has been dropped.' => '已删除序列。',
|
||||
'Sequence has been created.' => '已创建序列。',
|
||||
'Sequence has been altered.' => '已修改序列。',
|
||||
'Alter sequence' => '修改序列',
|
||||
|
||||
// PostgreSQL user types support
|
||||
'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' => '附件',
|
||||
'%d query(s) executed OK.' => '%d 条查询已成功执行。',
|
||||
'Show only errors' => '仅显示错误',
|
||||
'Refresh' => '刷新',
|
||||
'Invalid schema.' => '非法模式。',
|
||||
'Please use one of the extensions %s.' => '请使用这些扩展中的一个:%s。',
|
||||
'now' => '现在',
|
||||
'ltr' => 'ltr',
|
||||
'Tables have been copied.' => '表已复制。',
|
||||
'Copy' => '复制',
|
||||
'Permanent link' => '固定链接',
|
||||
'Edit all' => '编辑全部',
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
'Alter type' => '修改类型',
|
||||
);
|
||||
|
@@ -15,7 +15,7 @@ hidden_fields_get();
|
||||
echo "<input type='hidden' name='db' value='" . h(DB) . "'>\n";
|
||||
echo ($grant ? "" : "<input type='hidden' name='grant' value=''>\n");
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<thead><tr><th>" . lang('Username') . "<th>" . lang('Server') . "<th> </thead>\n";
|
||||
echo "<thead><tr><th>" . lang('Username') . "<th>" . lang('Server') . "<th></thead>\n";
|
||||
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
echo '<tr' . odd() . '><td>' . h($row["User"]) . "<td>" . h($row["Host"]) . '<td><a href="' . h(ME . 'user=' . urlencode($row["User"]) . '&host=' . urlencode($row["Host"])) . '">' . lang('Edit') . "</a>\n";
|
||||
|
@@ -35,9 +35,10 @@ $routine_languages = routine_languages();
|
||||
?>
|
||||
|
||||
<form action="" method="post" id="form">
|
||||
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64" autocapitalize="off">
|
||||
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" data-maxlength="64" autocapitalize="off">
|
||||
<?php echo ($routine_languages ? lang('Language') . ": " . html_select("language", $routine_languages, $row["language"]) . "\n" : ""); ?>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<div class="scrollable">
|
||||
<table cellspacing="0" class="nowrap">
|
||||
<?php
|
||||
edit_fields($row["fields"], $collations, $routine);
|
||||
@@ -47,6 +48,7 @@ if (isset($_GET["function"])) {
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
<p><?php textarea("definition", $row["definition"]); ?>
|
||||
<p>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
|
@@ -13,6 +13,7 @@ page_header(lang('Process list'), $error);
|
||||
?>
|
||||
|
||||
<form action="" method="post">
|
||||
<div class="scrollable">
|
||||
<table cellspacing="0" class="nowrap checkable">
|
||||
<?php
|
||||
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
|
||||
@@ -21,7 +22,7 @@ $i = -1;
|
||||
foreach (process_list() as $i => $row) {
|
||||
|
||||
if (!$i) {
|
||||
echo "<thead><tr lang='en'>" . (support("kill") ? "<th> " : "");
|
||||
echo "<thead><tr lang='en'>" . (support("kill") ? "<th>" : "");
|
||||
foreach ($row as $key => $val) {
|
||||
echo "<th>$key" . doc_link(array(
|
||||
'sql' => "show-processlist.html#processlist_" . strtolower($key),
|
||||
@@ -38,13 +39,14 @@ foreach (process_list() as $i => $row) {
|
||||
($jush == "pgsql" && $key == "current_query" && $val != "<IDLE>") ||
|
||||
($jush == "oracle" && $key == "sql_text" && $val != "")
|
||||
? "<code class='jush-$jush'>" . shorten_utf8($val, 100, "</code>") . ' <a href="' . h(ME . ($row["db"] != "" ? "db=" . urlencode($row["db"]) . "&" : "") . "sql=" . urlencode($val)) . '">' . lang('Clone') . '</a>'
|
||||
: nbsp($val)
|
||||
: h($val)
|
||||
);
|
||||
}
|
||||
echo "\n";
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
<p>
|
||||
<?php
|
||||
if (support("kill")) {
|
||||
|
@@ -4,10 +4,10 @@ header("Content-Type: text/javascript; charset=utf-8");
|
||||
if ($_GET["script"] == "db") {
|
||||
$sums = array("Data_length" => 0, "Index_length" => 0, "Data_free" => 0);
|
||||
foreach (table_status() as $name => $table_status) {
|
||||
json_row("Comment-$name", nbsp($table_status["Comment"]));
|
||||
json_row("Comment-$name", h($table_status["Comment"]));
|
||||
if (!is_view($table_status)) {
|
||||
foreach (array("Engine", "Collation") as $key) {
|
||||
json_row("$key-$name", nbsp($table_status[$key]));
|
||||
json_row("$key-$name", h($table_status[$key]));
|
||||
}
|
||||
foreach ($sums + array("Auto_increment" => 0, "Rows" => 0) as $key => $val) {
|
||||
if ($table_status[$key] != "") {
|
||||
|
@@ -184,7 +184,7 @@ if ($_POST && !$error) {
|
||||
cookie("adminer_import", "output=" . urlencode($adminer_import["output"]) . "&format=" . urlencode($_POST["separator"]));
|
||||
$result = true;
|
||||
$cols = array_keys($fields);
|
||||
preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~', $file, $matches);
|
||||
preg_match_all('~(?>"[^"]*"|[^"\r\n]+)+~', $file, $matches);
|
||||
$affected = count($matches[0]);
|
||||
$driver->begin();
|
||||
$separator = ($_POST["separator"] == "csv" ? "," : ($_POST["separator"] == "tsv" ? "\t" : ";"));
|
||||
@@ -309,6 +309,7 @@ if (!$columns && support("table")) {
|
||||
} else {
|
||||
$backward_keys = $adminer->backwardKeys($TABLE, $table_name);
|
||||
|
||||
echo "<div class='scrollable'>";
|
||||
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
|
||||
@@ -369,7 +370,7 @@ if (!$columns && support("table")) {
|
||||
if (!$unique_array) {
|
||||
$unique_array = array();
|
||||
foreach ($rows[$n] as $key => $val) {
|
||||
if (!preg_match('~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~', $key)) { //! columns looking like functions
|
||||
if (!preg_match('~^(COUNT\((\*|(DISTINCT )?`(?:[^`]|``)+`)\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\(`(?:[^`]|``)+`\))$~', $key)) { //! columns looking like functions
|
||||
$unique_array[$key] = $val;
|
||||
}
|
||||
}
|
||||
@@ -407,9 +408,9 @@ if (!$columns && support("table")) {
|
||||
foreach ($foreign_key["source"] as $i => $source) {
|
||||
$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
|
||||
$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);
|
||||
$link = preg_replace('~([?&]ns=)[^&]+~', '\1' . urlencode($foreign_key["ns"]), $link);
|
||||
}
|
||||
if (count($foreign_key["source"]) == 1) {
|
||||
break;
|
||||
@@ -439,7 +440,7 @@ if (!$columns && support("table")) {
|
||||
$h_value = h($value !== null ? $value : $row[$key]);
|
||||
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>");
|
||||
$long = strpos($val, "<i>…</i>");
|
||||
echo "<td id='$id' data-text='" . ($long ? 2 : ($text ? 1 : 0)) . "'"
|
||||
. ($editable ? "" : " data-warning='" . h(lang('Use edit link to modify this value.')) . "'")
|
||||
. ">$val</td>"
|
||||
@@ -459,6 +460,7 @@ if (!$columns && support("table")) {
|
||||
exit;
|
||||
}
|
||||
echo "</table>\n";
|
||||
echo "</div>\n";
|
||||
}
|
||||
|
||||
if (!is_ajax()) {
|
||||
@@ -482,7 +484,7 @@ if (!$columns && support("table")) {
|
||||
if ($pagination) {
|
||||
echo (($found_rows === false ? count($rows) + 1 : $found_rows - $page * $limit) > $limit
|
||||
? '<p><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') . "...');", "")
|
||||
. script("qsl('a').onclick = partial(selectLoadMore, " . (+$limit) . ", '" . lang('Loading') . "…');", "")
|
||||
: ''
|
||||
);
|
||||
echo "\n";
|
||||
@@ -501,12 +503,12 @@ if (!$columns && support("table")) {
|
||||
if ($jush != "simpledb") {
|
||||
echo "<legend><a href='" . h(remove_from_uri("page")) . "'>" . lang('Page') . "</a></legend>";
|
||||
echo script("qsl('a').onclick = function () { pageClick(this.href, +prompt('" . lang('Page') . "', '" . ($page + 1) . "')); return false; };");
|
||||
echo pagination(0, $page) . ($page > 5 ? " ..." : "");
|
||||
echo pagination(0, $page) . ($page > 5 ? " …" : "");
|
||||
for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
|
||||
echo pagination($i, $page);
|
||||
}
|
||||
if ($max_page > 0) {
|
||||
echo ($page + 5 < $max_page ? " ..." : "");
|
||||
echo ($page + 5 < $max_page ? " …" : "");
|
||||
echo ($exact_count && $found_rows !== false
|
||||
? pagination($max_page, $page)
|
||||
: " <a href='" . h(remove_from_uri("page") . "&page=last") . "' title='~$max_page'>" . lang('last') . "</a>"
|
||||
@@ -514,9 +516,9 @@ if (!$columns && support("table")) {
|
||||
}
|
||||
} else {
|
||||
echo "<legend>" . lang('Page') . "</legend>";
|
||||
echo pagination(0, $page) . ($page > 1 ? " ..." : "");
|
||||
echo pagination(0, $page) . ($page > 1 ? " …" : "");
|
||||
echo ($page ? pagination($page, $page) : "");
|
||||
echo ($max_page > $page ? pagination($page + 1, $page) . ($max_page > $page + 1 ? " ..." : "") : "");
|
||||
echo ($max_page > $page ? pagination($page + 1, $page) . ($max_page > $page + 1 ? " …" : "") : "");
|
||||
}
|
||||
echo "</fieldset>\n";
|
||||
}
|
||||
|
@@ -56,7 +56,7 @@ if (!$error && $_POST) {
|
||||
}
|
||||
$commands = 0;
|
||||
$errors = array();
|
||||
$parse = '[\'"' . ($jush == "sql" ? '`#' : ($jush == "sqlite" ? '`[' : ($jush == "mssql" ? '[' : ''))) . ']|/\\*|-- |$' . ($jush == "pgsql" ? '|\\$[^$]*\\$' : '');
|
||||
$parse = '[\'"' . ($jush == "sql" ? '`#' : ($jush == "sqlite" ? '`[' : ($jush == "mssql" ? '[' : ''))) . ']|/\*|-- |$' . ($jush == "pgsql" ? '|\$[^$]*\$' : '');
|
||||
$total_start = microtime(true);
|
||||
parse_str($_COOKIE["adminer_export"], $adminer_export);
|
||||
$dump_format = $adminer->dumpFormat();
|
||||
@@ -78,7 +78,7 @@ if (!$error && $_POST) {
|
||||
$offset = $pos + strlen($found);
|
||||
|
||||
if ($found && rtrim($found) != $delimiter) { // find matching quote or comment end
|
||||
while (preg_match('(' . ($found == '/*' ? '\\*/' : ($found == '[' ? ']' : (preg_match('~^-- |^#~', $found) ? "\n" : preg_quote($found) . "|\\\\."))) . '|$)s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES
|
||||
while (preg_match('(' . ($found == '/*' ? '\*/' : ($found == '[' ? ']' : (preg_match('~^-- |^#~', $found) ? "\n" : preg_quote($found) . "|\\\\."))) . '|$)s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES
|
||||
$s = $match[0][0];
|
||||
if (!$s && $fp && !feof($fp)) {
|
||||
$query .= fread($fp, 1e5);
|
||||
@@ -219,21 +219,25 @@ if (!isset($_GET["import"])) {
|
||||
}
|
||||
echo "<p>";
|
||||
textarea("query", $q, 20);
|
||||
echo ($_POST ? "" : script("qs('textarea').focus();"));
|
||||
echo script(($_POST ? "" : "qs('textarea').focus();\n") . "qs('#form').onsubmit = partial(sqlSubmit, qs('#form'), '" . remove_from_uri("sql|limit|error_stops|only_errors") . "');");
|
||||
echo "<p>$execute\n";
|
||||
echo lang('Limit rows') . ": <input type='number' name='limit' class='size' value='" . h($_POST ? $_POST["limit"] : $_GET["limit"]) . "'>\n";
|
||||
|
||||
} else {
|
||||
echo "<fieldset><legend>" . lang('File upload') . "</legend><div>";
|
||||
$gz = (extension_loaded("zlib") ? "[.gz]" : "");
|
||||
echo (ini_bool("file_uploads")
|
||||
? "SQL (< " . ini_get("upload_max_filesize") . "B): <input type='file' name='sql_file[]' multiple>\n$execute" // ignore post_max_size because it is for all form fields together and bytes computing would be necessary
|
||||
? "SQL$gz (< " . ini_get("upload_max_filesize") . "B): <input type='file' name='sql_file[]' multiple>\n$execute" // ignore post_max_size because it is for all form fields together and bytes computing would be necessary
|
||||
: lang('File uploads are disabled.')
|
||||
);
|
||||
echo "</div></fieldset>\n";
|
||||
echo "<fieldset><legend>" . lang('From server') . "</legend><div>";
|
||||
echo lang('Webserver file %s', "<code>" . h($adminer->importServerPath()) . (extension_loaded("zlib") ? "[.gz]" : "") . "</code>");
|
||||
echo ' <input type="submit" name="webfile" value="' . lang('Run file') . '">';
|
||||
echo "</div></fieldset>\n";
|
||||
$importServerPath = $adminer->importServerPath();
|
||||
if ($importServerPath) {
|
||||
echo "<fieldset><legend>" . lang('From server') . "</legend><div>";
|
||||
echo lang('Webserver file %s', "<code>" . h($importServerPath) . "$gz</code>");
|
||||
echo ' <input type="submit" name="webfile" value="' . lang('Run file') . '">';
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
echo "<p>";
|
||||
}
|
||||
|
||||
|
@@ -1,8 +1,11 @@
|
||||
<?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_once "../plugins/login-password-less.php";
|
||||
return new AdminerPlugin(array(
|
||||
// TODO: inline the result of password_hash() so that the password is not visible in source codes
|
||||
new AdminerLoginPasswordLess(password_hash("YOUR_PASSWORD_HERE", PASSWORD_DEFAULT)),
|
||||
));
|
||||
}
|
||||
|
||||
include "./index.php";
|
||||
|
@@ -66,8 +66,8 @@ input.wayoff { left: -1000px; position: absolute; }
|
||||
.loadmore { margin-left: 1ex; }
|
||||
/* .edit used in designs */
|
||||
#menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; }
|
||||
#menu p, #tables { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
|
||||
#tables li{ list-style: none; }
|
||||
#menu p, #logins, #tables { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
|
||||
#logins li, #tables li { list-style: none; }
|
||||
#dbs { overflow: hidden; }
|
||||
#logins, #tables { white-space: nowrap; overflow: auto; }
|
||||
#logins a, #tables a, #tables span { background: #fff; }
|
||||
|
@@ -15,7 +15,11 @@ function bodyLoad(version, maria) {
|
||||
key = 0;
|
||||
if (maria) {
|
||||
for (var i = 1; i < obj.length; i++) {
|
||||
obj[i] = obj[i].replace(/\.html/, '/');
|
||||
obj[i] = obj[i]
|
||||
.replace(/\.html/, '/')
|
||||
.replace(/(numeric)(-type-overview)/, '$1-data$2')
|
||||
.replace(/#statvar_.*/, '#$$1')
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -78,6 +82,18 @@ function messagesPrint() {
|
||||
|
||||
|
||||
|
||||
/** Hide or show some login rows for selected driver
|
||||
* @param HTMLSelectElement
|
||||
*/
|
||||
function loginDriver(driver) {
|
||||
var trs = parentTag(driver, 'table').rows;
|
||||
var disabled = /sqlite/.test(selectValue(driver));
|
||||
alterClass(trs[1], 'hidden', disabled); // 1 - row with server
|
||||
trs[1].getElementsByTagName('input')[0].disabled = disabled;
|
||||
}
|
||||
|
||||
|
||||
|
||||
var dbCtrl;
|
||||
var dbPrevious = {};
|
||||
|
||||
@@ -395,8 +411,7 @@ function editingLengthFocus() {
|
||||
var td = this.parentNode;
|
||||
if (/(enum|set)$/.test(selectValue(td.previousSibling.firstChild))) {
|
||||
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
|
||||
edit.value = enumValues(this.value);
|
||||
td.appendChild(edit);
|
||||
this.style.display = 'none';
|
||||
edit.style.display = 'inline';
|
||||
@@ -404,13 +419,32 @@ function editingLengthFocus() {
|
||||
}
|
||||
}
|
||||
|
||||
/** Get enum values
|
||||
* @param string
|
||||
* @return string values separated by newlines
|
||||
*/
|
||||
function enumValues(s) {
|
||||
var re = /(^|,)\s*'(([^\\']|\\.|'')*)'\s*/g;
|
||||
var result = [];
|
||||
var offset = 0;
|
||||
var match;
|
||||
while (match = re.exec(s)) {
|
||||
if (offset != match.index) {
|
||||
break;
|
||||
}
|
||||
result.push(match[2].replace(/'(')|\\(.)/g, '$1$2'));
|
||||
offset += match[0].length;
|
||||
}
|
||||
return (offset == s.length ? result.join('\n') : s);
|
||||
}
|
||||
|
||||
/** Finish editing of enum or set
|
||||
* @this HTMLTextAreaElement
|
||||
*/
|
||||
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.value = (/^'[^\n]+'$/.test(val) ? val : val && "'" + val.replace(/\n+$/, '').replace(/'/g, "''").replace(/\\/g, '\\\\').replace(/\n/g, "','") + "'");
|
||||
field.style.display = 'inline';
|
||||
this.style.display = 'none';
|
||||
}
|
||||
@@ -426,14 +460,6 @@ function columnShow(checked, column) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Hide column with default values in narrow window
|
||||
*/
|
||||
function editingHideDefaults() {
|
||||
if (innerWidth < document.documentElement.scrollWidth) {
|
||||
qs('#form')['defaults'].checked = false;
|
||||
}
|
||||
}
|
||||
|
||||
/** Display partition options
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
@@ -455,14 +481,14 @@ function partitionNameChange() {
|
||||
}
|
||||
|
||||
/** Show or hide comment fields
|
||||
* @param HTMLInputElement
|
||||
* @param [boolean] whether to focus Comment if checked
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function editingCommentsClick(focus) {
|
||||
var comment = this.form['Comment'];
|
||||
columnShow(this.checked, 6);
|
||||
alterClass(comment, 'hidden', !this.checked);
|
||||
if (focus && this.checked) {
|
||||
function editingCommentsClick(el, focus) {
|
||||
var comment = el.form['Comment'];
|
||||
columnShow(el.checked, 6);
|
||||
alterClass(comment, 'hidden', !el.checked);
|
||||
if (focus && el.checked) {
|
||||
comment.focus();
|
||||
}
|
||||
}
|
||||
@@ -491,8 +517,8 @@ function dumpClick(event) {
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function foreignAddRow() {
|
||||
this.onchange = function () { };
|
||||
var row = cloneNode(parentTag(this, 'tr'));
|
||||
this.onchange = function () { };
|
||||
var selects = qsa('select', row);
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
selects[i].name = selects[i].name.replace(/\]/, '1$&');
|
||||
@@ -507,8 +533,8 @@ function foreignAddRow() {
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function indexesAddRow() {
|
||||
this.onchange = function () { };
|
||||
var row = cloneNode(parentTag(this, 'tr'));
|
||||
this.onchange = function () { };
|
||||
var selects = qsa('select', row);
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
selects[i].name = selects[i].name.replace(/indexes\[\d+/, '$&1');
|
||||
@@ -577,6 +603,23 @@ function indexesAddColumn(prefix) {
|
||||
|
||||
|
||||
|
||||
/** Updates the form action
|
||||
* @param HTMLFormElement
|
||||
* @param string
|
||||
*/
|
||||
function sqlSubmit(form, root) {
|
||||
if (encodeURIComponent(form['query'].value).length < 2e3) {
|
||||
form.action = root
|
||||
+ '&sql=' + encodeURIComponent(form['query'].value)
|
||||
+ (form['limit'].value ? '&limit=' + +form['limit'].value : '')
|
||||
+ (form['error_stops'].checked ? '&error_stops=1' : '')
|
||||
+ (form['only_errors'].checked ? '&only_errors=1' : '')
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Handle changing trigger time or event
|
||||
* @param RegExp
|
||||
* @param string
|
||||
|
@@ -143,7 +143,7 @@ function selectValue(select) {
|
||||
*/
|
||||
function isTag(el, tag) {
|
||||
var re = new RegExp('^(' + tag + ')$', 'i');
|
||||
return re.test(el.tagName);
|
||||
return el && re.test(el.tagName);
|
||||
}
|
||||
|
||||
/** Get parent node with specified tag name
|
||||
@@ -205,14 +205,9 @@ function formCheck(name) {
|
||||
/** Check all rows in <table class="checkable">
|
||||
*/
|
||||
function tableCheck() {
|
||||
var tables = qsa('table', document);
|
||||
for (var i=0; i < tables.length; i++) {
|
||||
if (/(^|\s)checkable(\s|$)/.test(tables[i].className)) {
|
||||
var trs = qsa('tr', tables[i]);
|
||||
for (var j=0; j < trs.length; j++) {
|
||||
trCheck(trs[j].firstChild.firstChild);
|
||||
}
|
||||
}
|
||||
var inputs = qsa('table.checkable td:first-child input', document);
|
||||
for (var i=0; i < inputs.length; i++) {
|
||||
trCheck(inputs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -319,13 +314,13 @@ function checkboxClick(event) {
|
||||
|
||||
/** Set HTML code of an element
|
||||
* @param string
|
||||
* @param string undefined to set parentNode to
|
||||
* @param string undefined to set parentNode to empty string
|
||||
*/
|
||||
function setHtml(id, html) {
|
||||
var el = qs('#' + id);
|
||||
var el = qs('[id="' + id.replace(/[\\"]/g, '\\$&') + '"]'); // database name is used as ID
|
||||
if (el) {
|
||||
if (html == null) {
|
||||
el.parentNode.innerHTML = ' ';
|
||||
el.parentNode.innerHTML = '';
|
||||
} else {
|
||||
el.innerHTML = html;
|
||||
}
|
||||
@@ -496,6 +491,9 @@ function bodyKeydown(event, button) {
|
||||
if (button) {
|
||||
target.form[button].click();
|
||||
} else {
|
||||
if (target.form.onsubmit) {
|
||||
target.form.onsubmit();
|
||||
}
|
||||
target.form.submit();
|
||||
}
|
||||
target.focus();
|
||||
@@ -545,20 +543,22 @@ function editingKeydown(event) {
|
||||
*/
|
||||
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.getAttribute('data-maxlength');
|
||||
}
|
||||
input.removeAttribute('data-maxlength');
|
||||
input.type = 'text';
|
||||
} else if (input.origType) {
|
||||
input.type = input.origType;
|
||||
if (input.origMaxLength >= 0) {
|
||||
input.setAttribute('data-maxlength', input.origMaxLength);
|
||||
if (input) { // undefined with the set data type
|
||||
if (selectValue(this)) {
|
||||
if (input.origType === undefined) {
|
||||
input.origType = input.type;
|
||||
input.origMaxLength = input.getAttribute('data-maxlength');
|
||||
}
|
||||
input.removeAttribute('data-maxlength');
|
||||
input.type = 'text';
|
||||
} else if (input.origType) {
|
||||
input.type = input.origType;
|
||||
if (input.origMaxLength >= 0) {
|
||||
input.setAttribute('data-maxlength', input.origMaxLength);
|
||||
}
|
||||
}
|
||||
oninput({target: input});
|
||||
}
|
||||
oninput({target: input});
|
||||
helpClose();
|
||||
}
|
||||
|
||||
@@ -707,7 +707,7 @@ function selectClick(event, text, warning) {
|
||||
}
|
||||
};
|
||||
var pos = event.rangeOffset;
|
||||
var value = td.firstChild.alt || td.textContent || td.innerText;
|
||||
var value = (td.firstChild && td.firstChild.alt) || td.textContent || td.innerText;
|
||||
input.style.width = Math.max(td.clientWidth - 14, 20) + 'px'; // 14 = 2 * (td.border + td.padding + input.border)
|
||||
if (text) {
|
||||
var rows = 1;
|
||||
@@ -716,7 +716,7 @@ function selectClick(event, text, warning) {
|
||||
});
|
||||
input.rows = rows;
|
||||
}
|
||||
if (value == '\u00A0' || qsa('i', td).length) { // or i - NULL
|
||||
if (qsa('i', td).length) { // <i> - NULL
|
||||
value = '';
|
||||
}
|
||||
if (document.selection) {
|
||||
|
@@ -34,7 +34,7 @@ if (!is_view($table_status)) {
|
||||
$foreign_keys = foreign_keys($TABLE);
|
||||
if ($foreign_keys) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<thead><tr><th>" . lang('Source') . "<td>" . lang('Target') . "<td>" . lang('ON DELETE') . "<td>" . lang('ON UPDATE') . "<td> </thead>\n";
|
||||
echo "<thead><tr><th>" . lang('Source') . "<td>" . lang('Target') . "<td>" . lang('ON DELETE') . "<td>" . lang('ON UPDATE') . "<td></thead>\n";
|
||||
foreach ($foreign_keys as $name => $foreign_key) {
|
||||
echo "<tr title='" . h($name) . "'>";
|
||||
echo "<th><i>" . implode("</i>, <i>", array_map('h', $foreign_key["source"])) . "</i>";
|
||||
@@ -43,8 +43,8 @@ if (!is_view($table_status)) {
|
||||
. "</a>"
|
||||
;
|
||||
echo "(<i>" . implode("</i>, <i>", array_map('h', $foreign_key["target"])) . "</i>)";
|
||||
echo "<td>" . nbsp($foreign_key["on_delete"]) . "\n";
|
||||
echo "<td>" . nbsp($foreign_key["on_update"]) . "\n";
|
||||
echo "<td>" . h($foreign_key["on_delete"]) . "\n";
|
||||
echo "<td>" . h($foreign_key["on_update"]) . "\n";
|
||||
echo '<td><a href="' . h(ME . 'foreign=' . urlencode($TABLE) . '&name=' . urlencode($name)) . '">' . lang('Alter') . '</a>';
|
||||
}
|
||||
echo "</table>\n";
|
||||
|
@@ -33,13 +33,13 @@ page_header(($name != "" ? lang('Alter trigger') . ": " . h($name) : lang('Creat
|
||||
?>
|
||||
|
||||
<form action="" method="post" id="form">
|
||||
<table cellspacing="0">
|
||||
<table cellspacing="0" class="layout">
|
||||
<tr><th><?php echo lang('Time'); ?><td><?php echo html_select("Timing", $trigger_options["Timing"], $row["Timing"], "triggerChange(/^" . preg_quote($TABLE, "/") . "_[ba][iud]$/, '" . js_escape($TABLE) . "', this.form);"); ?>
|
||||
<tr><th><?php echo lang('Event'); ?><td><?php echo html_select("Event", $trigger_options["Event"], $row["Event"], "this.form['Timing'].onchange();"); ?>
|
||||
<?php echo (in_array("UPDATE OF", $trigger_options["Event"]) ? " <input name='Of' value='" . h($row["Of"]) . "' class='hidden'>": ""); ?>
|
||||
<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">
|
||||
<p><?php echo lang('Name'); ?>: <input name="Trigger" value="<?php echo h($row["Trigger"]); ?>" data-maxlength="64" autocapitalize="off">
|
||||
<?php echo script("qs('#form')['Timing'].onchange();"); ?>
|
||||
<p><?php textarea("Statement", $row["Statement"]); ?>
|
||||
<p>
|
||||
|
@@ -29,7 +29,7 @@ $old_pass = "";
|
||||
|
||||
if (isset($_GET["host"]) && ($result = $connection->query("SHOW GRANTS FOR " . q($USER) . "@" . q($_GET["host"])))) { //! use information_schema for MySQL 5 - column names in column privileges are not escaped
|
||||
while ($row = $result->fetch_row()) {
|
||||
if (preg_match('~GRANT (.*) ON (.*) TO ~', $row[0], $match) && preg_match_all('~ *([^(,]*[^ ,(])( *\\([^)]+\\))?~', $match[1], $matches, PREG_SET_ORDER)) { //! escape the part between ON and TO
|
||||
if (preg_match('~GRANT (.*) ON (.*) TO ~', $row[0], $match) && preg_match_all('~ *([^(,]*[^ ,(])( *\([^)]+\))?~', $match[1], $matches, PREG_SET_ORDER)) { //! escape the part between ON and TO
|
||||
foreach ($matches as $val) {
|
||||
if ($val[1] != "USAGE") {
|
||||
$grants["$match[2]$val[2]"][$val[1]] = true;
|
||||
@@ -84,7 +84,7 @@ if ($_POST && !$error) {
|
||||
$grant = array_diff($grant, $old_grant);
|
||||
unset($grants[$object]);
|
||||
}
|
||||
if (preg_match('~^(.+)\\s*(\\(.*\\))?$~U', $object, $match) && (
|
||||
if (preg_match('~^(.+)\s*(\(.*\))?$~U', $object, $match) && (
|
||||
!grant("REVOKE", $revoke, $match[2], " ON $match[1] FROM $new_user") //! SQL injection
|
||||
|| !grant("GRANT", $grant, $match[2], " ON $match[1] TO $new_user")
|
||||
)) {
|
||||
@@ -99,7 +99,7 @@ if ($_POST && !$error) {
|
||||
queries("DROP USER $old_user");
|
||||
} elseif (!isset($_GET["grant"])) {
|
||||
foreach ($grants as $object => $revoke) {
|
||||
if (preg_match('~^(.+)(\\(.*\\))?$~U', $object, $match)) {
|
||||
if (preg_match('~^(.+)(\(.*\))?$~U', $object, $match)) {
|
||||
grant("REVOKE", array_keys($revoke), $match[2], " ON $match[1] FROM $new_user");
|
||||
}
|
||||
}
|
||||
@@ -131,9 +131,9 @@ if ($_POST) {
|
||||
|
||||
?>
|
||||
<form action="" method="post">
|
||||
<table cellspacing="0">
|
||||
<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">
|
||||
<table cellspacing="0" class="layout">
|
||||
<tr><th><?php echo lang('Server'); ?><td><input name="host" data-maxlength="60" value="<?php echo h($row["host"]); ?>" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Username'); ?><td><input name="user" data-maxlength="80" 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"]); ?>" autocomplete="new-password">
|
||||
<?php if (!$row["hashed"]) { echo script("typePassword(qs('#pass'));"); } ?>
|
||||
<?php echo checkbox("hashed", 1, $row["hashed"], lang('Hashed'), "typePassword(this.form['pass'], this.checked);"); ?>
|
||||
@@ -165,7 +165,7 @@ foreach (array(
|
||||
$name = "'grants[$i][" . h(strtoupper($privilege)) . "]'";
|
||||
$value = $grant[strtoupper($privilege)];
|
||||
if ($context == "Server Admin" && $object != (isset($grants["*.*"]) ? "*.*" : ".*")) {
|
||||
echo "<td> ";
|
||||
echo "<td>";
|
||||
} 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 {
|
||||
|
@@ -10,7 +10,7 @@ if (!$variables) {
|
||||
foreach ($variables as $key => $val) {
|
||||
echo "<tr>";
|
||||
echo "<th><code class='jush-" . $jush . ($status ? "status" : "set") . "'>" . h($key) . "</code>";
|
||||
echo "<td>" . nbsp($val);
|
||||
echo "<td>" . h($val);
|
||||
}
|
||||
echo "</table>\n";
|
||||
}
|
||||
|
@@ -48,7 +48,7 @@ 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">
|
||||
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" data-maxlength="64" autocapitalize="off">
|
||||
<?php echo (support("materializedview") ? " " . checkbox("materialized", 1, $row["materialized"], lang('Materialized view')) : ""); ?>
|
||||
<p><?php textarea("select", $row["select"]); ?>
|
||||
<p>
|
||||
|
49
changes.txt
49
changes.txt
@@ -1,7 +1,54 @@
|
||||
Adminer 4.7.1 (released 2019-01-24):
|
||||
Display the tables scrollbar (bug #647)
|
||||
Remember visible columns in Create Table form (bug #493)
|
||||
Add autocomplete attributes to login form
|
||||
PHP <5.4 compatibility even with ClickHouse enabled (regression from 4.7.0)
|
||||
SQLite: Hide server field in login form
|
||||
Editor: Allow disabling boolean fields in PostgreSQL (bug #640)
|
||||
|
||||
Adminer 4.7.0 (released 2018-11-24):
|
||||
Simplify storing executed SQL queries to bookmarks
|
||||
Warn when using password with leading or trailing spaces
|
||||
Hide import from server if importServerPath() returns an empty string
|
||||
Fix inline editing of empty cells (regression from 4.6.3)
|
||||
Allow adding more than two indexes and forign key columns at a time (regression from 4.4.0)
|
||||
Avoid overwriting existing tables when copying tables (bug #642)
|
||||
Fix function change with set data type
|
||||
Increase username maxlength to 80 (bug #623)
|
||||
Make maxlength in all fields a soft limit
|
||||
Make tables horizontally scrollable
|
||||
MySQL: Support foreign keys created with ANSI quotes (bug #620)
|
||||
MySQL: Recognize ON UPDATE current_timestamp() (bug #632, bug #638)
|
||||
MySQL: Descending indexes in MySQL 8 (bug #643)
|
||||
PostgreSQL: Quote array values in export (bug #621)
|
||||
PostgreSQL: Export DESC indexes (bug #639)
|
||||
PostgreSQL: Support GENERATED BY DEFAULT AS IDENTITY in PostgreSQL 10
|
||||
MS SQL: Pass database when connecting
|
||||
ClickHouse: Connect, databases list, tables list, select, SQL command
|
||||
Georgian translation
|
||||
|
||||
Adminer 4.6.3 (released 2018-06-28):
|
||||
Disallow using password-less databases
|
||||
Copy triggers when copying table
|
||||
Stop session before connecting
|
||||
Simplify running slow queries
|
||||
Decrease timeout for running slow queries from 5 seconds to 2 seconds
|
||||
Fix displaying info about non-alphabetical objects (bug #599)
|
||||
Use secure cookies on HTTP if session.cookie_secure is set
|
||||
PDO: Support binary fields download
|
||||
MySQL: Disallow LOAD DATA LOCAL INFILE
|
||||
MySQL: Use CONVERT() only when searching for non-ASCII (bug #603)
|
||||
MySQL: Order database names in MySQL 8 (bug #613)
|
||||
PostgreSQL: Fix editing data in views (bug #605, regression from 4.6.0)
|
||||
PostgreSQL: Do not cast date/time/number/uuid searches to text (bug #608)
|
||||
PostgreSQL: Export false as 0 in PDO (bug #619)
|
||||
MS SQL: Support port with sqlsrv
|
||||
Editor: Do not check boolean checkboxes with false in PostgreSQL (bug #607)
|
||||
|
||||
Adminer 4.6.2 (released 2018-02-20):
|
||||
Semi-transparent border on table actions
|
||||
Shorten JSON values in select (bug #594)
|
||||
Speed up alter table (regression from 4.4.0)
|
||||
Speed up alter table form (regression from 4.4.0)
|
||||
Store current version without authentication and in Editor
|
||||
PostgreSQL: Fix exporting string default values
|
||||
PostgreSQL: Fix exporting sequences in PostgreSQL 10
|
||||
|
47
compile.php
47
compile.php
@@ -36,11 +36,26 @@ function lang_ids($match) {
|
||||
}
|
||||
|
||||
function put_file($match) {
|
||||
global $project;
|
||||
global $project, $VERSION;
|
||||
if (basename($match[2]) == '$LANG.inc.php') {
|
||||
return $match[0]; // processed later
|
||||
}
|
||||
$return = file_get_contents(dirname(__FILE__) . "/$project/$match[2]");
|
||||
if (basename($match[2]) == "file.inc.php") {
|
||||
$return = str_replace("\n// caching headers added in compile.php", (preg_match('~-dev$~', $VERSION) ? '' : '
|
||||
if ($_SERVER["HTTP_IF_MODIFIED_SINCE"]) {
|
||||
header("HTTP/1.1 304 Not Modified");
|
||||
exit;
|
||||
}
|
||||
|
||||
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");
|
||||
'), $return, $count);
|
||||
if (!$count) {
|
||||
echo "adminer/file.inc.php: Caching headers placeholder not found\n";
|
||||
}
|
||||
}
|
||||
if (basename($match[2]) != "lang.inc.php" || !$_SESSION["lang"]) {
|
||||
if (basename($match[2]) == "lang.inc.php") {
|
||||
$return = str_replace('function lang($idf, $number = null) {', 'function lang($idf, $number = null) {
|
||||
@@ -57,7 +72,7 @@ function put_file($match) {
|
||||
}
|
||||
$tokens = token_get_all($return); // to find out the last token
|
||||
return "?>\n$return" . (in_array($tokens[count($tokens) - 1][0], array(T_CLOSE_TAG, T_INLINE_HTML), true) ? "<?php" : "");
|
||||
} elseif (preg_match('~\\s*(\\$pos = (.+\n).+;)~sU', $return, $match2)) {
|
||||
} elseif (preg_match('~\s*(\$pos = (.+\n).+;)~sU', $return, $match2)) {
|
||||
// single language lang() is used for plural
|
||||
return "function get_lang() {
|
||||
return '$_SESSION[lang]';
|
||||
@@ -275,7 +290,7 @@ function php_shrink($input) {
|
||||
}
|
||||
|
||||
function minify_css($file) {
|
||||
return lzw_compress(preg_replace('~\\s*([:;{},])\\s*~', '\\1', preg_replace('~/\\*.*\\*/~sU', '', $file)));
|
||||
return lzw_compress(preg_replace('~\s*([:;{},])\s*~', '\1', preg_replace('~/\*.*\*/~sU', '', $file)));
|
||||
}
|
||||
|
||||
function minify_js($file) {
|
||||
@@ -337,7 +352,7 @@ if ($_SERVER["argv"][1]) {
|
||||
// check function definition in drivers
|
||||
$file = file_get_contents(dirname(__FILE__) . "/adminer/drivers/mysql.inc.php");
|
||||
$file = preg_replace('~class Min_Driver.*\n\t}~sU', '', $file);
|
||||
preg_match_all('~\\bfunction ([^(]+)~', $file, $matches); //! respect context (extension, class)
|
||||
preg_match_all('~\bfunction ([^(]+)~', $file, $matches); //! respect context (extension, class)
|
||||
$functions = array_combine($matches[1], $matches[0]);
|
||||
//! do not warn about functions without declared support()
|
||||
unset($functions["__construct"], $functions["__destruct"], $functions["set_charset"]);
|
||||
@@ -372,12 +387,12 @@ if ($driver) {
|
||||
$file = str_replace("if (isset(\$_GET[\"callf\"])) {\n\t\$_GET[\"call\"] = \$_GET[\"callf\"];\n}\nif (isset(\$_GET[\"function\"])) {\n\t\$_GET[\"procedure\"] = \$_GET[\"function\"];\n}\n", "", $file);
|
||||
}
|
||||
}
|
||||
$file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file);
|
||||
$file = preg_replace_callback('~\b(include|require) "([^"]*)";~', 'put_file', $file);
|
||||
$file = str_replace('include "../adminer/include/coverage.inc.php";', '', $file);
|
||||
if ($driver) {
|
||||
$file = preg_replace('(include "../adminer/drivers/(?!' . preg_quote($driver) . '\.).*\\s*)', '', $file);
|
||||
$file = preg_replace('(include "../adminer/drivers/(?!' . preg_quote($driver) . '\.).*\s*)', '', $file);
|
||||
}
|
||||
$file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file); // bootstrap.inc.php
|
||||
$file = preg_replace_callback('~\b(include|require) "([^"]*)";~', 'put_file', $file); // bootstrap.inc.php
|
||||
if ($driver) {
|
||||
foreach ($features as $feature) {
|
||||
if (!support($feature)) {
|
||||
@@ -390,11 +405,11 @@ if ($driver) {
|
||||
$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);
|
||||
$file = preg_replace('~;?../externals/jush/modules/jush[^.]*.js~', '', $file);
|
||||
$file = preg_replace('~;.\.\/externals/jush/jush\.css~', '', $file);
|
||||
$file = preg_replace('~compile_file\(\'\.\./(externals/jush/modules/jush\.js|adminer/static/[^.]+\.gif)[^)]+\)~', "''", $file);
|
||||
}
|
||||
$file = preg_replace_callback("~lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])~s", 'lang_ids', $file);
|
||||
$file = preg_replace_callback('~\\b(include|require) "([^"]*\\$LANG.inc.php)";~', 'put_file_lang', $file);
|
||||
$file = preg_replace_callback('~\b(include|require) "([^"]*\$LANG.inc.php)";~', 'put_file_lang', $file);
|
||||
$file = str_replace("\r", "", $file);
|
||||
if ($_SESSION["lang"]) {
|
||||
// single language version
|
||||
@@ -403,14 +418,14 @@ if ($_SESSION["lang"]) {
|
||||
$file = str_replace('<?php echo $LANG; ?>', $_SESSION["lang"], $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 = 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 = '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);
|
||||
$replace = 'preg_replace("~\\\\\\\\?.*~", "", ME) . "?file=\1&version=' . $VERSION . '"';
|
||||
$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);
|
||||
|
||||
|
@@ -46,8 +46,8 @@ 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,#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}
|
||||
#menu p,#logins,#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;line-height:40px;padding:0;z-index:1;margin:0}
|
||||
#breadcrumb a{color:#ff9}
|
||||
#breadcrumb a:hover{background:transparent;color:#ff9;border-color:#ff9}
|
||||
#schema .table{padding:4px 8px;background:#f3f3f3}
|
||||
|
@@ -339,7 +339,7 @@ border: 1px solid #E3E3E3;
|
||||
#menu form {
|
||||
margin: 0;
|
||||
}
|
||||
#menu p, #tables {
|
||||
#menu p, #logins, #tables {
|
||||
padding-left: 8px;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
@@ -173,7 +173,7 @@ h3{
|
||||
margin:0;}
|
||||
#menu form{
|
||||
margin:0;}
|
||||
#menu p,#tables{
|
||||
#menu p,#logins,#tables{
|
||||
padding-left:8px;
|
||||
border-bottom:none;}
|
||||
#menu form p{
|
||||
|
@@ -733,7 +733,7 @@ legend{
|
||||
}
|
||||
|
||||
/* tables */
|
||||
#tables{
|
||||
#logins, #tables{
|
||||
border-bottom: none;
|
||||
line-height: 20px;
|
||||
padding: 18px 0;
|
||||
@@ -759,12 +759,20 @@ legend{
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#logins a {
|
||||
display: block;
|
||||
padding: 5px 18px 9px;
|
||||
color: inherit;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#tables a.select.active,
|
||||
#tables a.select:hover
|
||||
{
|
||||
color: #fba;
|
||||
}
|
||||
|
||||
#logins a:hover,
|
||||
#tables a[title]:hover,
|
||||
#tables a.active,
|
||||
#tables a.select:hover + a,
|
||||
@@ -979,4 +987,4 @@ code.jush-sql ~ a:first-of-type::before{
|
||||
|
||||
body > form{
|
||||
position: absolute;
|
||||
}
|
||||
}
|
||||
|
@@ -3,15 +3,15 @@
|
||||
*
|
||||
* Klemens Häckel [http://clickdimension.wordpress.com/]
|
||||
*
|
||||
* update 2018-02
|
||||
* adapted for adminer 4.6.1
|
||||
*
|
||||
* new remaster based on style for WT-NMP 13.12
|
||||
*
|
||||
* Created by Miroslav Pokorný [http://fuch.cz].
|
||||
* Icons by Yusuke Kamiyamane [http://p.yusukekamiyamane.com/] (some of them were modified).
|
||||
* Slightly inspired by themes created by Martin Hořínek and Klemens Häckel.
|
||||
*
|
||||
* updated 2018-02 by Jan [http://cloux.org]
|
||||
* - fixes and usability improvements for Adminer 4.6.1
|
||||
*
|
||||
*/
|
||||
|
||||
/*** Fonts ***/
|
||||
@@ -139,10 +139,15 @@ html>/**/body #menu li a[href*="&select="]:link:hover {
|
||||
|
||||
/* Menu - Show structure */
|
||||
html>/**/body #menu li a[href*="&table="] {
|
||||
width: 263px;
|
||||
width: 280px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
/* Hide "new version" link in the top bar */
|
||||
/*
|
||||
html>body #menu h1 a#version {
|
||||
display: none;
|
||||
}
|
||||
*/
|
||||
|
||||
/*** Tables and views ***/
|
||||
/* set default alignment to left */
|
||||
@@ -172,7 +177,8 @@ html> body #content form table thead span.column > a.text {
|
||||
html>/**/body #content th a[href*="&db="], /* Databases and Table column */
|
||||
html>/**/body #content td a[href*="&view="], /* Alter view */
|
||||
html>/**/body #content td a[href*="&select="], /* Select view */
|
||||
html>/**/body #content table a[href*="&table="] { /* Show structure */
|
||||
html>/**/body #content table a[href*="&table="], /* Show structure */
|
||||
html>/**/body #content table td a[href*="&edit="][href*="&where"] { /* Modify single rows (without icon, after executing SQL) */
|
||||
float: left;
|
||||
width: 100%;
|
||||
height: 17px;
|
||||
@@ -206,7 +212,7 @@ html>/**/body #content form table thead>tr>td a[href*="&select="] {
|
||||
float: none;
|
||||
}
|
||||
/* Modify single rows (icon in each row) */
|
||||
html>/**/body #content table a[href*="&edit="][href*="&where"] {
|
||||
html>/**/body #content table a.edit[href*="&edit="][href*="&where"] {
|
||||
display: inline-block;
|
||||
width: 0px;
|
||||
height: 19px;
|
||||
@@ -387,7 +393,7 @@ h2 {
|
||||
display: none;
|
||||
}
|
||||
#content {
|
||||
margin-left: 325px;
|
||||
margin-left: 355px;
|
||||
}
|
||||
.tabs {
|
||||
margin: 12px auto 10px auto;
|
||||
@@ -428,7 +434,7 @@ td, th {
|
||||
border-width: 0 1px 1px 0;
|
||||
font-size: 0.83em; /* x-small; font size */
|
||||
}
|
||||
#tables a {
|
||||
#logins a, #tables a {
|
||||
height: 18px;
|
||||
line-height: 18px;
|
||||
}
|
||||
@@ -457,7 +463,7 @@ a:link:hover, a:visited:hover {
|
||||
#menu {
|
||||
background-color: #f8f8f8;
|
||||
box-shadow: 0px 0px 3px rgba(0,0,0,0.50) !important;
|
||||
width: 310px;
|
||||
width: 330px;
|
||||
margin: 0;
|
||||
top: 0;
|
||||
padding-bottom: 0;
|
||||
|
@@ -18,10 +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, #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; }
|
||||
#menu p, #logins li, #tables li { text-align: center; font-size: 11px; }
|
||||
#menu p a, #logins li a, #tables li a { color: black; }
|
||||
#menu p a:hover, #logins li a:hover, #tables li a:hover { color: #626262; text-decoration: none; }
|
||||
#logins a, #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, #tables {padding-left: 8px; font-size: 10pt; border-bottom: none;}
|
||||
#menu p, #logins, #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;}
|
||||
|
@@ -12,13 +12,14 @@ Icons from http://FlatIcon.com:
|
||||
|
||||
Background from "All Work and No Play", http://thenewcode.com/1008/SVG-Movie-Backgrounds-Andys-Room-and-Overlook-Hotel
|
||||
*/
|
||||
|
||||
html,
|
||||
body {
|
||||
html {
|
||||
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");
|
||||
min-height: 100%;
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
background: #41658a;
|
||||
}
|
||||
p {
|
||||
margin-right: 0;
|
||||
@@ -37,7 +38,7 @@ a:visited:focus {
|
||||
text-decoration: underline;
|
||||
outline: none;
|
||||
}
|
||||
:-moz-focus-inner {
|
||||
::-moz-focus-inner {
|
||||
border: 0;
|
||||
}
|
||||
#noindex {
|
||||
@@ -48,14 +49,14 @@ input:not([type="image"]),
|
||||
select,
|
||||
textarea,
|
||||
fieldset {
|
||||
border: 1px solid rgba(65, 101, 138, 0.3);
|
||||
border: thin solid rgba(65, 101, 138, 0.3);
|
||||
}
|
||||
label {
|
||||
white-space: nowrap;
|
||||
}
|
||||
.sqlarea {
|
||||
background: #fff;
|
||||
border: 1px solid rgba(65, 101, 138, 0.3) !important;
|
||||
border: thin solid rgba(65, 101, 138, 0.3) !important;
|
||||
width: auto !important;
|
||||
}
|
||||
legend {
|
||||
@@ -73,7 +74,8 @@ input[type="button"] {
|
||||
margin-right: 0;
|
||||
color: #fff;
|
||||
}
|
||||
.error, .error b {
|
||||
.error,
|
||||
.error b {
|
||||
background: #ae1010;
|
||||
}
|
||||
.error b {
|
||||
@@ -134,9 +136,6 @@ code.jush-sql {
|
||||
-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;
|
||||
@@ -145,31 +144,38 @@ th > code {
|
||||
color: #fff;
|
||||
white-space: nowrap;
|
||||
}
|
||||
/*
|
||||
html:lang(en) .version:before,
|
||||
html:lang(en) #version:before {
|
||||
content: 'v';
|
||||
}
|
||||
*/
|
||||
#version:empty {
|
||||
display: none;
|
||||
#content,
|
||||
#content > form:last-of-type,
|
||||
#menu {
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
#content,
|
||||
#menu {
|
||||
padding: 0 20px 2em;
|
||||
#menu,
|
||||
.rtl #content,
|
||||
.rtl #menu {
|
||||
margin: 0;
|
||||
box-sizing: border-box;
|
||||
padding: 0 20px 1.5em;
|
||||
}
|
||||
#content {
|
||||
min-height: 100%;
|
||||
padding-bottom: 3em;
|
||||
border-left: 20em solid #41658a;
|
||||
order: 2;
|
||||
flex: 1 1 auto;
|
||||
overflow: auto;
|
||||
background: #fff 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");
|
||||
}
|
||||
.rtl #content {
|
||||
margin: 0;
|
||||
padding: 0 20px 3em;
|
||||
border-left-style: none;
|
||||
border-right: 20em solid #41658a;
|
||||
#content > *,
|
||||
#content > form:last-of-type > *,
|
||||
#menu > * {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
#content > form:last-of-type {
|
||||
flex: 1 0 auto;
|
||||
}
|
||||
#content > .scrollable,
|
||||
#content > form:last-of-type > .scrollable {
|
||||
flex: 1 1 2em;
|
||||
overflow: auto;
|
||||
}
|
||||
#breadcrumb {
|
||||
position: relative;
|
||||
@@ -197,11 +203,15 @@ thead a:visited,
|
||||
}
|
||||
h1,
|
||||
h2 {
|
||||
margin: 0 -20px 1em;
|
||||
padding: 2em 20px 0.5em;
|
||||
border-bottom-style: none;
|
||||
color: #fff;
|
||||
}
|
||||
h1,
|
||||
h2,
|
||||
.rtl h2 {
|
||||
margin: 0 -20px 1em;
|
||||
}
|
||||
#h1,
|
||||
h2 a {
|
||||
color: inherit;
|
||||
@@ -214,19 +224,19 @@ h2 {
|
||||
background: #79b473;
|
||||
position: relative;
|
||||
}
|
||||
.rtl h2 {
|
||||
margin: 0 -20px 1em;
|
||||
}
|
||||
#content > form {
|
||||
overflow: auto;
|
||||
position: relative;
|
||||
margin-top: 1em;
|
||||
}
|
||||
#content > form > :first-child {
|
||||
h2 + *,
|
||||
h2 + .hidden + *,
|
||||
h2 + * > :first-child,
|
||||
h2 + .hidden + * > :first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
h3 {
|
||||
font-size: 110%;
|
||||
font-weight: bold;
|
||||
}
|
||||
fieldset {
|
||||
display: inline-block;
|
||||
align-self: flex-start;
|
||||
}
|
||||
.rtl fieldset {
|
||||
margin-right: 0;
|
||||
@@ -237,7 +247,7 @@ input.default {
|
||||
box-shadow: none;
|
||||
}
|
||||
input.required {
|
||||
outline: 1px dashed #ec5f12;
|
||||
outline: thin dashed #ec5f12;
|
||||
outline-offset: 1px;
|
||||
box-shadow: none;
|
||||
}
|
||||
@@ -247,35 +257,33 @@ table {
|
||||
}
|
||||
td,
|
||||
th {
|
||||
border-bottom-style: none;
|
||||
border-right-color: #dde5ef;
|
||||
border-color: #dde5ef;
|
||||
border-width: 0 thin 0 0;
|
||||
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;
|
||||
border-width: 0 0 0 thin;
|
||||
}
|
||||
td a,
|
||||
th a {
|
||||
vertical-align: inherit;
|
||||
}
|
||||
th {
|
||||
background: rgba(65, 64, 115, 0.02);
|
||||
}
|
||||
td:last-child,
|
||||
th:last-child {
|
||||
border-right-style: none;
|
||||
border-width: 0;
|
||||
}
|
||||
thead th,
|
||||
thead td {
|
||||
border-right-color: #fff;
|
||||
border-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;
|
||||
@@ -346,52 +354,26 @@ tbody tr:nth-child(n):hover th {
|
||||
background: #4c3957 center no-repeat;
|
||||
background-size: 66%;
|
||||
}
|
||||
.icon[src*="plus.gif"] {
|
||||
.icon[src*="file=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"] {
|
||||
.icon[src*="file=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"] {
|
||||
.icon[src*="file=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"] {
|
||||
.icon[src*="file=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"] {
|
||||
.icon[src*="file=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;
|
||||
}
|
||||
@@ -399,13 +381,14 @@ tbody tr:nth-child(n):hover th {
|
||||
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;
|
||||
.footer {
|
||||
position: static;
|
||||
margin: 0.8em 0 0;
|
||||
border-style: none;
|
||||
}
|
||||
.footer > div {
|
||||
background: transparent;
|
||||
padding: 0;
|
||||
}
|
||||
#lang,
|
||||
.logout {
|
||||
@@ -466,16 +449,12 @@ tbody tr:nth-child(n):hover th {
|
||||
background-color: #ec5f12;
|
||||
}
|
||||
#menu {
|
||||
top: 0;
|
||||
width: 20em;
|
||||
background: #41658a;
|
||||
}
|
||||
.rtl #menu {
|
||||
left: auto;
|
||||
right: 0;
|
||||
position: static;
|
||||
flex: 0 0 20em;
|
||||
}
|
||||
h1 {
|
||||
background: #414073;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
#h1 {
|
||||
font-style: normal;
|
||||
@@ -500,9 +479,11 @@ h1 {
|
||||
#dbs span {
|
||||
display: none;
|
||||
}
|
||||
#menu p, #tables {
|
||||
padding: 0;
|
||||
#menu p,
|
||||
#logins,
|
||||
#tables {
|
||||
margin: 1.5em 0 0;
|
||||
padding: 0;
|
||||
border-bottom-style: none;
|
||||
}
|
||||
#menu .message,
|
||||
@@ -551,33 +532,29 @@ button:disabled {
|
||||
font-weight: normal;
|
||||
background-color: #414073;
|
||||
}
|
||||
#menu .links {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin: 1em -5px -5px;
|
||||
}
|
||||
#menu .links:after {
|
||||
content: " ";
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
#menu .links a {
|
||||
float: left;
|
||||
box-sizing: border-box;
|
||||
width: 48%;
|
||||
width: calc(50% - 5px);
|
||||
flex: 1 1 35%;
|
||||
margin: 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,
|
||||
#tables {
|
||||
flex: 1 1 2em;
|
||||
overflow: auto !important;
|
||||
}
|
||||
#logins a,
|
||||
#tables a,
|
||||
#tables span {
|
||||
background: #41658a;
|
||||
background: transparent;
|
||||
color: #fff;
|
||||
}
|
||||
#logins {
|
||||
@@ -592,20 +569,12 @@ button:disabled {
|
||||
background: transparent;
|
||||
color: transparent;
|
||||
position: relative;
|
||||
margin-right: 0.3em;
|
||||
margin: 0.3em;
|
||||
margin-left: 0;
|
||||
}
|
||||
.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;
|
||||
margin-right: 0;
|
||||
}
|
||||
#tables a.select:after {
|
||||
content: ' ';
|
||||
@@ -618,6 +587,14 @@ button:disabled {
|
||||
left: 0;
|
||||
top: -0.1em;
|
||||
}
|
||||
#tables a.select:hover,
|
||||
#tables a.select:focus,
|
||||
#tables a.select.active {
|
||||
background-color: #ec5f12;
|
||||
}
|
||||
#tables a.select.active ~ .structure {
|
||||
font-weight: bold;
|
||||
}
|
||||
#routines + .links a {
|
||||
margin-right: 0.45em;
|
||||
}
|
||||
@@ -638,16 +615,15 @@ button:disabled {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
@media all and (max-device-width:880px) {
|
||||
@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;
|
||||
body,
|
||||
#content,
|
||||
#content > form:last-of-type,
|
||||
#menu {
|
||||
display: block;
|
||||
}
|
||||
.rtl #content,
|
||||
.rtl #menu,
|
||||
@@ -665,6 +641,8 @@ button:disabled {
|
||||
overflow: auto;
|
||||
position: static;
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.rtl #breadcrumb {
|
||||
padding: 0 10px 0 0;
|
||||
@@ -690,13 +668,6 @@ button:disabled {
|
||||
-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;
|
||||
|
@@ -794,7 +794,7 @@ legend{
|
||||
}
|
||||
|
||||
/* tables */
|
||||
#tables{
|
||||
#logins, #tables{
|
||||
border-bottom: none;
|
||||
line-height: 20px;
|
||||
padding: 18px 0;
|
||||
@@ -820,12 +820,21 @@ legend{
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#logins a {
|
||||
display: block;
|
||||
padding: 5px 18px;
|
||||
line-height: 14px;
|
||||
color: #F1E5B3;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#tables a.select.active,
|
||||
#tables a.select:hover
|
||||
{
|
||||
color: red;
|
||||
}
|
||||
|
||||
#logins a:hover,
|
||||
#tables a[title]:hover,
|
||||
#tables a.active,
|
||||
#tables a.select:hover + a,
|
||||
|
818
designs/mvt/adminer.css
Normal file
818
designs/mvt/adminer.css
Normal file
@@ -0,0 +1,818 @@
|
||||
/**
|
||||
* Adminer theme by Aleksey M. (alekseymvt@gmail.com)
|
||||
* @link https://github.com/alekseymvt/Adminer.theme
|
||||
* @link https://github.com/vrana/adminer/
|
||||
* @link https://www.adminer.org/
|
||||
* -----------
|
||||
* Based on work by:
|
||||
* FLAT UI Flavored Adminer Theme by M. Mahbubur Rahman (mahbub@mahbubblog.com)
|
||||
* designs/pappu687/adminer.css
|
||||
* -----------
|
||||
* Based on work by : Lukáš Brandejs
|
||||
* https://raw.github.com/vrana/adminer/master/designs/ng9/adminer.css
|
||||
*/
|
||||
|
||||
/*! normalize.css v4.2.0 | MIT License | github.com/necolas/normalize.css */
|
||||
|
||||
html {
|
||||
font-family: sans-serif;
|
||||
line-height: 1.15;
|
||||
-ms-text-size-adjust: 100%;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
article,
|
||||
aside,
|
||||
details,
|
||||
figcaption,
|
||||
figure,
|
||||
footer,
|
||||
header,
|
||||
hgroup,
|
||||
main,
|
||||
menu,
|
||||
nav,
|
||||
section,
|
||||
summary {
|
||||
display: block;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin: .67em 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
box-sizing: content-box;
|
||||
height: 1px;
|
||||
border: 0;
|
||||
background: gray;
|
||||
}
|
||||
|
||||
a {
|
||||
background-color: transparent;
|
||||
-webkit-text-decoration-skip: objects;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
a:active, a:hover {
|
||||
outline-width: 0;
|
||||
}
|
||||
|
||||
abbr[title] {
|
||||
border-bottom: none;
|
||||
text-decoration: underline dotted;
|
||||
}
|
||||
|
||||
code, kbd, pre, samp {
|
||||
font-family: monospace, monospace;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
dfn {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
mark {
|
||||
background-color: #ff0;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
sub, sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -.5em;
|
||||
}
|
||||
|
||||
audio,
|
||||
video {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
audio:not([controls]) {
|
||||
display: none;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
img {
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
svg:not(:root) {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
font: inherit;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
button,
|
||||
input {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
button,
|
||||
[type="button"],
|
||||
[type="reset"],
|
||||
[type="submit"] {
|
||||
-webkit-appearance: button;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
button::-moz-focus-inner,
|
||||
[type="button"]::-moz-focus-inner,
|
||||
[type="reset"]::-moz-focus-inner,
|
||||
[type="submit"]::-moz-focus-inner {
|
||||
border-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
button:-moz-focusring,
|
||||
[type="button"]:-moz-focusring,
|
||||
[type="reset"]:-moz-focusring,
|
||||
[type="submit"]:-moz-focusring {
|
||||
outline: 1px dotted ButtonText;
|
||||
}
|
||||
|
||||
input[type=date]::-webkit-inner-spin-button,
|
||||
input[type=date]::-webkit-clear-button {
|
||||
display: none;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
border: 1px solid #c0c0c0;
|
||||
margin: 0 2px;
|
||||
padding: .35em .625em .75em;
|
||||
}
|
||||
|
||||
legend {
|
||||
color: inherit;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
textarea {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
[type="checkbox"],
|
||||
[type="radio"] {
|
||||
box-sizing: border-box;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
[type="number"]::-webkit-inner-spin-button,
|
||||
[type="number"]::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type="search"] {
|
||||
-webkit-appearance: textfield;
|
||||
outline-offset: -2px;
|
||||
}
|
||||
|
||||
[type="search"]::-webkit-search-cancel-button,
|
||||
[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
-webkit-appearance: button;
|
||||
font: inherit;
|
||||
}
|
||||
|
||||
details,
|
||||
menu {
|
||||
display: block;
|
||||
}
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
[hidden], template {
|
||||
display: none;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
td, th {
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
/** -------------- Adminer.css ---------------*/
|
||||
|
||||
html {
|
||||
font-size: 14px
|
||||
}
|
||||
|
||||
*, :after, :before {
|
||||
box-sizing: border-box
|
||||
}
|
||||
|
||||
body, html {
|
||||
margin: 0;
|
||||
padding: 0
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
margin: 0
|
||||
}
|
||||
|
||||
body {
|
||||
background: #eef0f0;
|
||||
font: 14px/1.36 Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: inherit;
|
||||
}
|
||||
|
||||
a, a:visited {
|
||||
color: #2980b9;
|
||||
text-decoration: none;
|
||||
padding: 3px 1px
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 1.5em;
|
||||
font-weight: normal;
|
||||
background: #fff;
|
||||
color: #1e5eb6;
|
||||
border-bottom: 1px solid #55708b;
|
||||
padding: 20px
|
||||
}
|
||||
|
||||
.error, .message, h2, h3, th a {
|
||||
font-weight: bold
|
||||
}
|
||||
|
||||
h2, h3 {
|
||||
font-size: 1.7em;
|
||||
background: 0 0;
|
||||
color: #34495e;
|
||||
border-bottom: 1px solid #f4f4f4;
|
||||
padding: 10px 0
|
||||
}
|
||||
|
||||
fieldset {
|
||||
padding: 5px;
|
||||
border: 1px solid #dedede
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
border: 1px solid #dedede;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
padding: 5px
|
||||
}
|
||||
|
||||
input[type=submit] {
|
||||
background: #27ae60;
|
||||
cursor: pointer
|
||||
}
|
||||
|
||||
input[type=submit]:hover {
|
||||
background: #2c3e50
|
||||
}
|
||||
|
||||
input[type=checkbox] {
|
||||
margin-right: 5px
|
||||
}
|
||||
|
||||
input[type=image] {
|
||||
border: 1px solid #d0cdc4
|
||||
}
|
||||
|
||||
input[type=checkbox], input[type=radio] {
|
||||
border: 1px solid #e5e5e5;
|
||||
padding: 2px 5px
|
||||
}
|
||||
|
||||
input[name*=length], input[name=limit] {
|
||||
width: 5em;
|
||||
}
|
||||
|
||||
input[name=text_length] {
|
||||
width: 5em
|
||||
}
|
||||
|
||||
code {
|
||||
background: #f0ffe1;
|
||||
border: 1px dashed #d5f1b9;
|
||||
padding: 2px 4px;
|
||||
font-family: Monaco, "Courier New", monospace;
|
||||
}
|
||||
|
||||
code a:hover {
|
||||
background: 0 0
|
||||
}
|
||||
|
||||
table {
|
||||
margin: 10px 0;
|
||||
border: 1px solid #e6e6e6;
|
||||
background-color: #fff;
|
||||
position: relative;
|
||||
box-shadow: 0 0 10px rgba(119, 119, 119, .2)
|
||||
}
|
||||
|
||||
td, th {
|
||||
border: 1px solid #e9e9e9;
|
||||
padding: 3px 6px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
th {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
th a {
|
||||
padding-bottom: 0;
|
||||
text-shadow: 1px 1px 1px #fff
|
||||
}
|
||||
|
||||
tbody tr:hover td, tbody tr:hover th {
|
||||
background: #edf4ff
|
||||
}
|
||||
|
||||
thead td, thead th {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
font-weight: bold;
|
||||
white-space: nowrap;
|
||||
border-right: 1px solid #fff;
|
||||
background: #31587d;
|
||||
color: #fff;
|
||||
padding: 7px 2px;
|
||||
}
|
||||
|
||||
thead td acronym, thead td sup, thead th acronym, thead th sup {
|
||||
color: #cdf
|
||||
}
|
||||
|
||||
tr.odd td {
|
||||
background: #fcfaf5
|
||||
}
|
||||
|
||||
.nowrap td, .nowrap th, td.nowrap, p.nowrap {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.error, .message {
|
||||
padding: 0;
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.error {
|
||||
color: #c00;
|
||||
}
|
||||
|
||||
.message {
|
||||
color: #090;
|
||||
}
|
||||
|
||||
.js .hidden {
|
||||
display: initial;
|
||||
}
|
||||
|
||||
.js input.hidden, .js td.hidden {
|
||||
display: none
|
||||
}
|
||||
|
||||
.logout {
|
||||
top: 28px;
|
||||
}
|
||||
|
||||
.js .column {
|
||||
background: #ecf0f1
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline
|
||||
}
|
||||
|
||||
input[name=logout] {
|
||||
color: #fce2e2;
|
||||
background: #d73e3e
|
||||
}
|
||||
|
||||
input[name=drop] {
|
||||
background-color: #c0392b
|
||||
}
|
||||
|
||||
input[name=logout]:hover {
|
||||
background: #ea0202
|
||||
}
|
||||
|
||||
input[type=submit] {
|
||||
border-radius: 2px;
|
||||
border: 0;
|
||||
padding: 5px 15px;
|
||||
text-decoration: none;
|
||||
background-color: #65adc3;
|
||||
color: #fff;
|
||||
text-shadow: 0 1px 0 #287ace;
|
||||
box-shadow: inset 0 0 0 0 #cae3fc
|
||||
}
|
||||
|
||||
input[type=submit]:hover {
|
||||
background-color: #34495e;
|
||||
text-shadow: 0 1px 0 #000
|
||||
}
|
||||
|
||||
input[type=submit]:active {
|
||||
position: relative;
|
||||
top: 1px
|
||||
}
|
||||
|
||||
table tbody input[name*=check] {
|
||||
display: block;
|
||||
float: left
|
||||
}
|
||||
|
||||
table thead a[href*="&modify"] {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC) right bottom no-repeat;
|
||||
padding-right: 18px
|
||||
}
|
||||
|
||||
table thead input ~ a[href*="&modify"] {
|
||||
width: 0;
|
||||
display: inline-block;
|
||||
height: 16px;
|
||||
overflow: hidden;
|
||||
text-decoration: none;
|
||||
padding: 0 0 0 18px;
|
||||
background-position: 2px bottom
|
||||
}
|
||||
|
||||
table tbody a[href*="&edit="][href*="&where"] {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC) right bottom no-repeat;
|
||||
padding-right: 18px
|
||||
}
|
||||
|
||||
table tbody input ~ a[href*="&edit="][href*="&where"] {
|
||||
width: 0;
|
||||
display: inline-block;
|
||||
height: 16px;
|
||||
overflow: hidden;
|
||||
text-decoration: none;
|
||||
padding: 0 0 0 18px;
|
||||
background-position: 2px bottom
|
||||
}
|
||||
|
||||
#schema .table {
|
||||
padding: 5px;
|
||||
background: #fcfaf5;
|
||||
border: 1px solid #d0cdc4
|
||||
}
|
||||
|
||||
#schema .table b {
|
||||
color: #006aeb;
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#schema .table b:hover {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
#dbs input[name=db] {
|
||||
background: inherit;
|
||||
color: #fff;
|
||||
padding: 3px;
|
||||
width: 10rem;
|
||||
}
|
||||
|
||||
#dbs input[name=db] + input {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
#dbs span {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
#breadcrumb, #breadcrumb a {
|
||||
font-weight: bold;
|
||||
color: #ecf0f1
|
||||
}
|
||||
|
||||
#breadcrumb, #lang {
|
||||
z-index: 2;
|
||||
padding: 5px
|
||||
}
|
||||
|
||||
#lang {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: auto;
|
||||
line-height: 1;
|
||||
left: initial;
|
||||
font-size: 11px
|
||||
}
|
||||
|
||||
#lang select {
|
||||
font-size: inherit
|
||||
}
|
||||
|
||||
#breadcrumb {
|
||||
left: 21.5rem;
|
||||
background: #31587d;
|
||||
right: 0;
|
||||
height: auto;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
#logins, #tables {
|
||||
padding: 0 0 0 5px;
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#menu {
|
||||
background: #213d58;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
color: #fff;
|
||||
padding: 0;
|
||||
bottom: 0;
|
||||
overflow: auto;
|
||||
left: 0;
|
||||
width: 20rem;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#menu h1 {
|
||||
padding: 0 10px;
|
||||
background: 0 0
|
||||
}
|
||||
|
||||
#menu .links {
|
||||
padding: 5px;
|
||||
line-height: 1;
|
||||
text-align: center;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
#menu a, #logins a, #tables .select {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-right: 5px
|
||||
}
|
||||
|
||||
#menu select {
|
||||
background: inherit;
|
||||
color: #fff;
|
||||
padding: 3px;
|
||||
width: 15rem;
|
||||
}
|
||||
|
||||
#menu select option {
|
||||
background: #fff;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
#menu p {
|
||||
border-bottom: 1px solid #55708b;
|
||||
padding: .8em .5em
|
||||
}
|
||||
|
||||
#menu a {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#logins a, #tables a {
|
||||
background: 0 0
|
||||
}
|
||||
|
||||
#logout {
|
||||
color: #fff;
|
||||
text-decoration: none
|
||||
}
|
||||
|
||||
#logout:hover {
|
||||
color: red
|
||||
}
|
||||
|
||||
#version, .version {
|
||||
font-size: 50%
|
||||
}
|
||||
|
||||
#h1:hover {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
#tables .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=) left center no-repeat;
|
||||
height: 15px;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
width: 15px;
|
||||
text-decoration: none;
|
||||
line-height: 1;
|
||||
color: transparent;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
/* editor */
|
||||
#tables .select[title] {
|
||||
height: auto;
|
||||
padding: 3px 20px;
|
||||
overflow: visible;
|
||||
width: auto;
|
||||
text-decoration: none;
|
||||
line-height: inherit;
|
||||
color: white;
|
||||
}
|
||||
|
||||
#tables .structure {
|
||||
min-width: calc(100% - 5px - 25px);
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
#tables .structure.active, #tables .select.active + .structure {
|
||||
background-color: #1a5fa5;
|
||||
}
|
||||
|
||||
#menu a[href$="sql="] {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHGSURBVHjaxFPNLkNREP5aB6WhaKLSVtKFiIUqK1sLT2DhTXgDL2FlxSOw8FOLRiyQWhDRiKSEhKQJou49P9fMnFsLsevCJCcz594z3/m+mTmJKIrQjSXRpXUNoGqbm39qcMbAkbyIvbVwYQhD3tIeWsOQ1+QVH86Xyz+JXJPIOb9iAI4ZpOMd/yN/vb/vAdiC93cP0El2dNA6z4RjYyW2MaPU0BB0u+0BOGGsVML49LSA3J+cYDCblb0l6jeHBwg/26isrOB0a8uzYBlBgKShgD8M53J4aTTQqFaRSCYl+WxnG83zcxTmKpKg+vtFu9W8NDQDMCXW+VivYyAzjKmlJahUSpiYUKPVbCKTz0sCGzOyOpBLzdcXlCMdDDIxO4vboyoyhQIKlYocLi0uIjczIyBcA98dYqx9NywxUEyDi/P29IyF1VU5dFeroS+dRnF+Xvajk5N0ayjx8tq6+FuSyiwUF4LRHi/reLg4o9ijs6xG9RjWGowUi/h4fcXexoa0L4oc0mNZuVgFzID09VKBnFXoUb7Pnb5zQrvVovpkZC4QzwfiN6QM1eBqdxcmnq6IAA395Mlz8eTxTZwg/pcl/v01fgswAESqYZbsIsnLAAAAAElFTkSuQmCC) left center no-repeat;
|
||||
display: inline-block;
|
||||
color: transparent;
|
||||
overflow: hidden;
|
||||
width: 18px;
|
||||
}
|
||||
|
||||
#menu a[href$="import="] {
|
||||
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=) left center no-repeat;
|
||||
display: inline-block;
|
||||
padding-left: 20px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#menu a[href*="dump="] {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJrSURBVHjajFPPaxNREP72V8ymTbGQbRB/IT0otdV6CcWTgqCoUFQQEXoSEQ/+AypK755E1KsULIpGgw1F9KC22lgstFgQLdoWhSab2PRHTNrs7nvObGhSsRa/ZXjv7c6b+eabWUVKiX9AJQuRRci2k+260N91VwgJIQSEV1mVnjf5axTjvCfFFn7hCcBlBzJNVRA0gAZTQ1ODgXC4gDtjV9AW2QNFUTA0/Q66kPLSqVg4shYF8vEdKQ7mln+i+/VVRM0oFpbmETLq/SS6J4R/OfHtHmV24XouHFo94REDAyE9hMZgBMkvT2GZFqxQE6by0/g4P74SoKLB2ZZzWA8ffqRQLBcxNTuFjRTwxpmbfad7Oo/rHhdN6B20/6JvaKyBCnODhqNbL+PRxHXUGXWINV5kl9TDrkQct/pnZKHkyPsDGcl4MJiWq5Ecsf84LxTL8nbyK2+Pke3XHWJAQkLXgMdDNjRNRTxlQ6UmakRD0vN8NEd7EBsFO6Impu1fzGCCrOSXwCro5HEiZiExnEVnrKlaypNhG4fba02aTC8ik1/ibZrM9RlIkkGnjH0jWWJQWRn8TpLI8fcZ6MSA1WrZFERx2eHPTEPqjksBqASDLh7ZZ+HlWA6H9tYyvhjNomNnI8Km7p8/f5+HGdB46/lJeOoYPHV8mbGy8gA59HngU74asNkKYKVzlQCuW9GA6B5si+DVeA4HWmsM4qksTnZY1TMz0NRauysaUAmt2+oxM1tCM6k8mS74WXjIdm8O+JdWg36oKgXqgnzb3TvRXvZEneN6YPNIFw7MY70W5haXnlUHbp3f+b/wW4ABAAtWTLcKdqLcAAAAAElFTkSuQmCC) left center no-repeat;
|
||||
display: inline-block;
|
||||
padding-left: 20px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#menu 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) left center no-repeat;
|
||||
display: inline-block;
|
||||
color: transparent;
|
||||
overflow: hidden;
|
||||
vertical-align: middle;
|
||||
width: 18px;
|
||||
}
|
||||
|
||||
#content {
|
||||
margin: 0 0 0 20rem;
|
||||
padding: 35px 5px 20px .5rem;
|
||||
}
|
||||
|
||||
#content table thead a.text:hover {
|
||||
text-decoration: none
|
||||
}
|
||||
|
||||
#content table thead a, #content table thead span {
|
||||
font-weight: bold;
|
||||
color: #fff;
|
||||
text-shadow: 0 1px 0 #000;
|
||||
background: 0 0;
|
||||
white-space: nowrap;
|
||||
position: static
|
||||
}
|
||||
|
||||
#content table thead a:hover {
|
||||
background: 0 0;
|
||||
text-decoration: underline;
|
||||
color: #000
|
||||
}
|
||||
|
||||
#content tbody tr.checked td, tr.checked.odd td {
|
||||
background: #fbe2e2;
|
||||
color: red
|
||||
}
|
||||
|
||||
#content 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=) left center no-repeat;
|
||||
padding-left: 22px
|
||||
}
|
||||
|
||||
#content p a[href*="&page="] {
|
||||
background-image: none;
|
||||
padding-left: 0
|
||||
}
|
||||
|
||||
#content p a[href$="?database="] {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIkSURBVDjLpVNNiFJRFP7eU1E0KSLTMpAwYSxyaidDtChm0WYQ3NSutv2s2kwwm2igNgMtooUQEQhhA9GqhSDTQsZZFDbNDBgVg5bSw9J8rzFF33udc+HGg0ladOHj3nPe+b7zc99VbNvG/yy30yiVSl4SnCNcsixrivYEgY7WJu0faX9EKGUyGVNyFFkBkY/T+WkoFEpFIhEEAgH4/X7w916vB8Mw0Gg00G63y+S7mM1mm4LIAYxisbhSr9c5nT1pjUYju1qt2oVC4YnkqbIUMk6Ew+F/9hyNRkFJLuyaATmFoqZp8Pl88Hq98Hg8wtfv99HpdNBsNhGPx0XsRAG3241ut4vBYCDs8XgMXdcxHA7FN/b9VUD25HK5RAUczKC+hYgcNpNN05xcAQdLkqIoIlj6VFWdXIEUkAQGV8M2k2vaG3z6sYGfVR39XzsHlm/dX3h5d31xlwAHM5goBd5+LuO75z3OnU3jyP4EVrZeKGub2p309cP7VKcAQ2Znoiz3deMVTk1Nw1RNTB+ahamMkD45w7RrfwSYwFdFf6K4Quf6pmvwKHswl7wh7Jvnc4gfTPHR52zhcqVSeZZMJgOxWEyI8BC5CmOnh63WKtZbZczPPsa94hX4XCLJQHG+xnw+f5SEFghZmvhefgvcTqn2HN3gBmZSZ5CInMaHr1Wsvivjy3ZvSZn0nHO5XJDIxwgWDbW2vL10m9xXCUGCQXi49qA1/xvyq6BCh7yZeQAAAABJRU5ErkJggg==) 2px bottom no-repeat;
|
||||
padding-left: 22px
|
||||
}
|
||||
|
||||
#content p a[href*="&edit="] {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJvSURBVDjLpZPrS5NhGIf9W7YvBYOkhlkoqCklWChv2WyKik7blnNris72bi6dus0DLZ0TDxW1odtopDs4D8MDZuLU0kXq61CijSIIasOvv94VTUfLiB74fXngup7nvrnvJABJ/5PfLnTTdcwOj4RsdYmo5glBWP6iOtzwvIKSWstI0Wgx80SBblpKtE9KQs/We7EaWoT/8wbWP61gMmCH0lMDvokT4j25TiQU/ITFkek9Ow6+7WH2gwsmahCPdwyw75uw9HEO2gUZSkfyI9zBPCJOoJ2SMmg46N61YO/rNoa39Xi41oFuXysMfh36/Fp0b7bAfWAH6RGi0HglWNCbzYgJaFjRv6zGuy+b9It96N3SQvNKiV9HvSaDfFEIxXItnPs23BzJQd6DDEVM0OKsoVwBG/1VMzpXVWhbkUM2K4oJBDYuGmbKIJ0qxsAbHfRLzbjcnUbFBIpx/qH3vQv9b3U03IQ/HfFkERTzfFj8w8jSpR7GBE123uFEYAzaDRIqX/2JAtJbDat/COkd7CNBva2cMvq0MGxp0PRSCPF8BXjWG3FgNHc9XPT71Ojy3sMFdfJRCeKxEsVtKwFHwALZfCUk3tIfNR8XiJwc1LmL4dg141JPKtj3WUdNFJqLGFVPC4OkR4BxajTWsChY64wmCnMxsWPCHcutKBxMVp5mxA1S+aMComToaqTRUQknLTH62kHOVEE+VQnjahscNCy0cMBWsSI0TCQcZc5ALkEYckL5A5noWSBhfm2AecMAjbcRWV0pUTh0HE64TNf0mczcnnQyu/MilaFJCae1nw2fbz1DnVOxyGTlKeZft/Ff8x1BRssfACjTwQAAAABJRU5ErkJggg==) left center no-repeat;
|
||||
padding-left: 22px
|
||||
}
|
||||
|
||||
#content p a[href*="&table="].jush-custom {
|
||||
font-weight: bold
|
||||
}
|
||||
|
||||
#content p.links a[href*="&table="] {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJcSURBVDjLpZPtT5JhFMafrW997I9rscA+FFu2QRurtlw5cQ4InLpwBogIPNFSiNJ4C+JVkj0QTBHQKFPQlJfwlanY1tXz3ARkn2jd27Wz++yc33XOvd0UAOp/RNGR/X5zeH9rOlTDVKAK3fsqJrxlqN27GHPuYHh+G4rXRQzZNjEws47Hli/oo/PxNsAU3qvWT3/gX3TPuHrWBhiC30nSktXDtKLB1NI4NKkxqBMqjDByPFkcxNBCPwbCfXgUeEBq705m0AZM+qsk2e3hau88W+4ANOy+XPLFQrkrcbW31KkOYJx9rBaAOzPR0gVHW6x593q9cDgcqB6e4sZoogMYdXzD0ck5ZhfLsHGKVfAqVoadKcMdzcLr82PuwwZCoRACgQCWVzdhoK2gaVpDAMNzWzhkAXamQpze/I4t13w+j2AwiFwuh7W1NXg8HmQyGSgUCshkssuU3F7AQf0c84kK3n68KFc4hXQ6DavVCqlUCqVSSdaIx+NQq9UGMsHg7Ab2jxtwp5rOvqUqia3CUqnEObWn0mp1KBaLcLlckMvloPpfrhOAl230/SGLxQK3241CoQC9Xg9nskKk1emQzWZZkBZCoRBU3/NP2GMBgXTTObjSjI1GA8lkEgzDwO/3E4iObXY6nYhEIhCJRHoWcIW6b1pF7egMlYNT7NROUKzU8XX3GJ+3D2E0GgmAm4Zbh2s0mUyIRqMcAGKx+BIlMeSiYu1K/fbEMm4+TaFnJIHrSgZX5TFIZNPo7e1Fj9QOs9kMlUqFaw9pCASCnzwe7x15xG6/rUQiAZ/Px9/5XyhZOMVGKlOdAAAAAElFTkSuQmCC) left center no-repeat;
|
||||
padding-left: 22px
|
||||
}
|
||||
|
||||
#content p.links a[href*="&create="],
|
||||
#content p.links a[href*="&view="] {
|
||||
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) left center no-repeat;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
#content a[href*="&database="] {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKRSURBVDjLhVNLTBNRFD3TTju1FCcBaxuaQEr94ydiZIHGpcFISBOi0YREZWHCVoyRxKUxxq0LXcACQyLsjO6KjSEiDfHDz0S0CLSxlFKd2g7MTDudGd+bMAQCxJucuXfuu+fcO/PeYwzDALVoNMqRuI3guq7rR4g/SEBC/Svxc8T3EUTD4bCGTcZQAUI+RvxLr9d70u/3o6KiAm63G3Qtn89DFEUkk0lks9lRkrvW3t6e2lCgRZFI5F0ikaDtjN1MVVVjYmLCGBoa6qccC7Z1kQafz4f/WSAQAGlyaXOOpQ+SNNUymQxcLhc4joPD4TBzkiRBEASkUimEQiGzdlcBlmWRy+WgKIr5Xi6XUSgUUCwWzTVN+IAzeOOde71orP0eAaOkbrDWf6Cw2+3mBLSYgny3KULXPOUY2BUB/hMd4IOn8XfhMGYjvU+2TECLLRLDMNA0zYw5JYa6Ghke/hyEn9/gZEqo3OuHp7qW3yJgESjoNPSdlb8gWCOCr29BMT0Ip5tBYnIWqlL6o8irzVsEaHcKSqQCen4cweok+FAblNRz2JxlODx1cEkzGWmVbTl7Z/jHhgCF1Z3GYjIKf+U8+ANhQn4Gm6OMUiGI9MhHg5Gl1sbu8UnKNc8B7Ui3ipxEcwvlpVFw6hz2N1xGabkXdqeBYqEOmfefEZWac4e6xz9Z22hbn+BmLBZbi8fjEBdG4NF/QdUDSM88hQ4FawKJR6cxLDZl86qzZdtdoDYwMBAkQg/2LL/ovNLVh++Dd7G0OAau9hTkrKgnnE39GW3f/Z6enpUdBSx7ePu4eq+zi4VNw+TbV0gsxFd5b9X5i4+mpnY63tsErl6okhvrfWzT0SAMR3FMXsnean08Pb/b/fgHqpjCspi90kkAAAAASUVORK5CYII=) 2px bottom no-repeat;
|
||||
padding-left: 22px
|
||||
}
|
||||
|
||||
#content p a[href*="&schema="] {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFOSURBVDjLtVK7SgNRED0b9iuM2lr4QK1DQIyk0FZsJAj+gH+ilRZb2NjaRHTLmA9QFKz9huzm7t37Hu+u7IJgQjR6YLjDzOXMmcMERIR5EE5qXA4z4sqACYWEC5wfLQXf/WtMIuDSoL0A7DZDjBj/uYI0l8jzEEJYJMkvCEZM4PqZIxlzpGk+kSCY18TGtGYcx9Tv96dOqBUMBgNyzsFaC621312Ac+59yJFlGRhj5VvVoigKvniglEK32w1mkd3r9ejPPAjOhqdknYX18p1/rzo3pYqTh0OSRkJI5UMgPn4s61sX66SkhtEGcISGsQad5gH2FvehfV5BaIF2cwet5RZyKeu68pe5ubKG7dUNP5AQGltMN57Mosgr5EIiVQmYGvtc1PVicqHY+dXpk8Dg7v22XKFo1ARe9v1bDOlXKKKCs4Sn1xdU1v3vIc2CD3bN4xJjfJWvAAAAAElFTkSuQmCC) 2px bottom no-repeat;
|
||||
padding-left: 22px
|
||||
}
|
||||
|
||||
#content p a[href*="&sql="] {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ5SURBVHjapFNLaxNRFP4mnZmQZtKYpJ2I8ZE0NSbSWKpgBYNUhIJQUDddCaILwb34C0RcCi60vpa14sZFoSjxUWxTFEubFkxf9kFS+7Jp0yQmM5mH905SF9pSwQt3vnPnnvPNd86cA13Xsds+23XKsdMdQx//s0z/6hi54he3e8/0d3ZuK0FTFGhUJkVVhSbLUAiq5IxSCQrBEkGWOu8Lh38HGrlpWnlXCKhNSbZQo3cEE9FomYAuKZstE2wFa8RR1cpKqK2o4JhxmLVJVAlh5Df6IFj5MgENcHq9EAMBg2RucBDVLpdxVon0iXdvIf8sQHRIsNReht3XjI3ZI8iuPAOrkDyorBq3G6vT08ikUuAsFiN46HkXXL56eI41QV1/BMF+GulvCfCMDFvNXtSIHrC0KDTPhXgc7lAQdQ2thk2XIpewnkzCJvTA4T8PabEbfDWD+ZFxyEUdX94sw6QVCkZlxWAQU+8/YGZgALV+v0HgbWmBNzQMR0M7it8fg+HWwQk2cLkkcvJh5NNFsCVJMgq1ubiE5o4OI5CS8FYrya8b9saLKC48gIlTIG/6sBaLw3PpHrTEMrSXr4kPIaAKFkbjSA0PEVuFlB+DO8Ah2HoB8tITVPE6iplDWOn7jLn0CSQevoDV6TI+zEpUASkkZzaTYrLIrH3C/qMCFEbE4th9OEQexfQBrPYP44d+DuY91eBp+1dGgFVIDb729kKpdJfQtIy2yFNMdN/E5McYzAebUEhOYjZuQXaj5+9W/nOYbl9vLN26doOFScVI9BXmZ6dy9jpnpO1O5dfsRtBxxlk4Xu9mT4Z80DkpVlhZvdp+d3RmpyH7JcAAnHiAVYWMsdkAAAAASUVORK5CYII=) 2px bottom no-repeat;
|
||||
padding-left: 24px
|
||||
}
|
||||
|
||||
#table input {
|
||||
padding: 3px 5px;
|
||||
}
|
||||
|
||||
#edit-fields tbody th, #edit-fields tbody td {
|
||||
border: 0;
|
||||
border-right: 1px solid #213d58;
|
||||
padding: 1px;
|
||||
vertical-align: top;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#edit-fields tbody th:last-child, #edit-fields tbody td:last-child {
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
#edit-fields .icon {
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
#partition-table.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#partition-table td {
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
.footer {
|
||||
border-top: 1px solid #dedede;
|
||||
border-bottom: 1px solid #dedede;
|
||||
border-image: none;
|
||||
margin: .5rem 0;
|
||||
margin-right: initial;
|
||||
}
|
||||
|
||||
.footer > div {
|
||||
padding: 5px;
|
||||
}
|
@@ -282,7 +282,7 @@ table code {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
#tables a {
|
||||
#logins a, #tables a {
|
||||
padding: 1px 2px;
|
||||
}
|
||||
|
||||
@@ -290,7 +290,7 @@ table code {
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
#menu p, #tables {
|
||||
#menu p, #logins, #tables {
|
||||
border: none;
|
||||
margin: 0 0 4px;
|
||||
padding: 0 0 4px;
|
||||
@@ -383,7 +383,7 @@ a[href$="dump="] {
|
||||
}
|
||||
|
||||
select[name="db"] {
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll left center white;
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll 90% center white;
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
|
@@ -268,7 +268,7 @@ td.nowrap {
|
||||
padding: 0 0 30px 0;
|
||||
background: #f1f1f1;
|
||||
}
|
||||
#menu p, #tables {
|
||||
#menu p, #logins, #tables {
|
||||
margin: 0;
|
||||
padding: .8em 1em;
|
||||
border-bottom: 1px solid #c7c7c7;
|
||||
|
@@ -232,7 +232,7 @@ tr.odd td {
|
||||
border-right:2px solid #34495e;
|
||||
}
|
||||
|
||||
#menu p, #tables{
|
||||
#menu p, #logins, #tables{
|
||||
border-bottom:1px solid rgb(85, 112, 139);
|
||||
}
|
||||
|
||||
|
@@ -177,11 +177,11 @@ h3 {
|
||||
top: 38px;
|
||||
width: 180px;
|
||||
background-color: #DEF; }
|
||||
#menu p, #tables {
|
||||
#menu p, #logins, #tables {
|
||||
padding-left: 8px;
|
||||
font-size: 10pt;
|
||||
border-bottom: none; }
|
||||
#tables a, #tables span {
|
||||
#logins a, #tables a, #tables span {
|
||||
background: #DEF;
|
||||
}
|
||||
|
||||
|
@@ -51,11 +51,17 @@
|
||||
width: 270px;
|
||||
}
|
||||
|
||||
#tables li {
|
||||
#logins li, #tables li {
|
||||
position: relative;
|
||||
height: 23px;
|
||||
}
|
||||
|
||||
#logins a {
|
||||
display: block;
|
||||
margin-top: 5px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
#tables a {
|
||||
display: block;
|
||||
margin: 0;
|
||||
|
@@ -125,7 +125,6 @@ html>/**/body #tables a[href*="&select="], html>/**/body .tabs 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 #tables a[href*="&select="] {
|
||||
clear: left;
|
||||
display: block;
|
||||
float: left;
|
||||
height: 18px;
|
||||
@@ -245,10 +244,13 @@ td, th {
|
||||
border-color: #bbb;
|
||||
border-width: 0 1px 1px 0;
|
||||
}
|
||||
#tables a {
|
||||
#logins a, #tables a {
|
||||
height: 18px;
|
||||
line-height: 18px;
|
||||
}
|
||||
#tables li {
|
||||
clear: left;
|
||||
}
|
||||
/*** Links ***/
|
||||
a:hover {
|
||||
color: #3b82ca
|
||||
@@ -268,7 +270,7 @@ a, a:visited {
|
||||
padding-bottom: 0;
|
||||
top: 0;
|
||||
}
|
||||
#tables a, #tables span {
|
||||
#logins a, #tables a, #tables span {
|
||||
background: #fafafa;
|
||||
}
|
||||
/*** Forms ***/
|
||||
|
File diff suppressed because one or more lines are too long
@@ -7,6 +7,7 @@ if ($adminer->homepage()) {
|
||||
if ($_POST["query"] != "") {
|
||||
search_tables();
|
||||
}
|
||||
echo "<div class='scrollable'>\n";
|
||||
echo "<table cellspacing='0' class='nowrap checkable'>\n";
|
||||
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
|
||||
echo '<thead><tr class="wrap">';
|
||||
@@ -26,6 +27,7 @@ if ($adminer->homepage()) {
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
echo "</div>\n";
|
||||
echo "</form>\n";
|
||||
echo script("tableCheck();");
|
||||
}
|
||||
|
@@ -71,17 +71,18 @@ class Adminer {
|
||||
}
|
||||
|
||||
function loginForm() {
|
||||
?>
|
||||
<table cellspacing="0">
|
||||
<tr><th><?php echo lang('Username'); ?><td><input type="hidden" name="auth[driver]" value="server"><input name="auth[username]" id="username" value="<?php echo h($_GET["username"]); ?>" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
|
||||
</table>
|
||||
<?php
|
||||
echo script("focus(qs('#username'));");
|
||||
echo "<table cellspacing='0' class='layout'>\n";
|
||||
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input type="hidden" name="auth[driver]" value="server"><input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocomplete="username" autocapitalize="off">' . script("focus(qs('#username'));"));
|
||||
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]" autocomplete="current-password">' . "\n");
|
||||
echo "</table>\n";
|
||||
echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
|
||||
echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
|
||||
}
|
||||
|
||||
function loginFormField($name, $heading, $value) {
|
||||
return $heading . $value;
|
||||
}
|
||||
|
||||
function login($login, $password) {
|
||||
return true;
|
||||
}
|
||||
@@ -189,7 +190,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
}
|
||||
|
||||
function selectVal($val, $link, $field, $original) {
|
||||
$return = ($val === null ? " " : $val);
|
||||
$return = $val;
|
||||
$link = h($link);
|
||||
if (preg_match('~blob|bytea~', $field["type"]) && !is_utf8($val)) {
|
||||
$return = lang('%d byte(s)', strlen($original));
|
||||
@@ -197,7 +198,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
$return = "<img src='$link' alt='$return'>";
|
||||
}
|
||||
}
|
||||
if (like_bool($field) && $return != " ") { // bool
|
||||
if (like_bool($field) && $return != "") { // bool
|
||||
$return = (preg_match('~^(1|t|true|y|yes|on)$~i', $val) ? lang('yes') : lang('no'));
|
||||
}
|
||||
if ($link) {
|
||||
@@ -213,7 +214,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
|
||||
function editVal($val, $field) {
|
||||
if (preg_match('~date|timestamp~', $field["type"]) && $val !== null) {
|
||||
return preg_replace('~^(\\d{2}(\\d+))-(0?(\\d+))-(0?(\\d+))~', lang('$1-$3-$5'), $val);
|
||||
return preg_replace('~^(\d{2}(\d+))-(0?(\d+))-(0?(\d+))~', lang('$1-$3-$5'), $val);
|
||||
}
|
||||
return $val;
|
||||
}
|
||||
@@ -418,7 +419,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
$field = idf_escape($_POST["email_field"]);
|
||||
$subject = $_POST["email_subject"];
|
||||
$message = $_POST["email_message"];
|
||||
preg_match_all('~\\{\\$([a-z0-9_]+)\\}~i', "$subject.$message", $matches); // allows {$name} in subject or message
|
||||
preg_match_all('~\{\$([a-z0-9_]+)\}~i', "$subject.$message", $matches); // allows {$name} in subject or message
|
||||
$rows = get_rows("SELECT DISTINCT $field" . ($matches[1] ? ", " . implode(", ", array_map('idf_escape', array_unique($matches[1]))) : "") . " FROM " . table($_GET["select"])
|
||||
. " WHERE $field IS NOT NULL AND $field != ''"
|
||||
. ($where ? " AND " . implode(" AND ", $where) : "")
|
||||
@@ -484,7 +485,7 @@ qsl('div').onclick = whisperClick;", "")
|
||||
);
|
||||
}
|
||||
if (like_bool($field)) {
|
||||
return '<input type="checkbox" value="' . h($value ? $value : 1) . '"' . ($value ? ' checked' : '') . "$attrs>";
|
||||
return '<input type="checkbox" value="1"' . (preg_match('~^(1|t|true|y|yes|on)$~i', $value) ? ' checked' : '') . "$attrs>";
|
||||
}
|
||||
$hint = "";
|
||||
if (preg_match('~time~', $field["type"])) {
|
||||
@@ -511,12 +512,12 @@ qsl('div').onclick = whisperClick;", "")
|
||||
return "$function()";
|
||||
}
|
||||
$return = $value;
|
||||
if (preg_match('~date|timestamp~', $field["type"]) && preg_match('(^' . str_replace('\\$1', '(?P<p1>\\d*)', preg_replace('~(\\\\\\$([2-6]))~', '(?P<p\\2>\\d{1,2})', preg_quote(lang('$1-$3-$5')))) . '(.*))', $value, $match)) {
|
||||
if (preg_match('~date|timestamp~', $field["type"]) && preg_match('(^' . str_replace('\$1', '(?P<p1>\d*)', preg_replace('~(\\\\\\$([2-6]))~', '(?P<p\2>\d{1,2})', preg_quote(lang('$1-$3-$5')))) . '(.*))', $value, $match)) {
|
||||
$return = ($match["p1"] != "" ? $match["p1"] : ($match["p2"] != "" ? ($match["p2"] < 70 ? 20 : 19) . $match["p2"] : gmdate("Y"))) . "-$match[p3]$match[p4]-$match[p5]$match[p6]" . end($match);
|
||||
}
|
||||
$return = ($field["type"] == "bit" && preg_match('~^[0-9]+$~', $value) ? $return : q($return));
|
||||
if ($value == "" && like_bool($field)) {
|
||||
$return = "0";
|
||||
$return = "'0'";
|
||||
} elseif ($value == "" && ($field["null"] || !preg_match('~char|text~', $field["type"]))) {
|
||||
$return = "NULL";
|
||||
} elseif (preg_match('~^(md5|sha1)$~', $function)) {
|
||||
@@ -585,11 +586,11 @@ qsl('div').onclick = whisperClick;", "")
|
||||
foreach ($servers[""] as $username => $password) {
|
||||
if ($password !== null) {
|
||||
if ($first) {
|
||||
echo "<p id='logins'>";
|
||||
echo "<ul id='logins'>";
|
||||
echo script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
$first = false;
|
||||
}
|
||||
echo "<a href='" . h(auth_url($vendor, "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a><br>\n";
|
||||
echo "<li><a href='" . h(auth_url($vendor, "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -25,7 +25,7 @@ function send_mail($email, $subject, $message, $from = "", $files = array()) {
|
||||
if (!$val) {
|
||||
$attachments .= "--$boundary$eol"
|
||||
. "Content-Type: " . str_replace("\n", "", $files["type"][$key]) . $eol
|
||||
. "Content-Disposition: attachment; filename=\"" . preg_replace('~["\\n]~', '', $files["name"][$key]) . "\"$eol"
|
||||
. "Content-Disposition: attachment; filename=\"" . preg_replace('~["\n]~', '', $files["name"][$key]) . "\"$eol"
|
||||
. "Content-Transfer-Encoding: base64$eol$eol"
|
||||
. chunk_split(base64_encode(file_get_contents($files["tmp_name"][$key])), 76, $eol) . $eol
|
||||
;
|
||||
|
@@ -55,8 +55,8 @@ function whisperClick(event) {
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function emailFileChange() {
|
||||
this.onchange = function () { };
|
||||
var el = this.cloneNode(true);
|
||||
this.onchange = function () { };
|
||||
el.value = '';
|
||||
this.parentNode.appendChild(el);
|
||||
}
|
||||
|
@@ -30,7 +30,7 @@ CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN
|
||||
IF NOT done THEN
|
||||
CASE _table_name";
|
||||
foreach (get_rows($query) as $row) {
|
||||
$comment = q($row["ENGINE"] == "InnoDB" ? preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["TABLE_COMMENT"]) : $row["TABLE_COMMENT"]);
|
||||
$comment = q($row["ENGINE"] == "InnoDB" ? preg_replace('~(?:(.+); )?InnoDB free: .*~', '\1', $row["TABLE_COMMENT"]) : $row["TABLE_COMMENT"]);
|
||||
echo "
|
||||
WHEN " . q($row["TABLE_NAME"]) . " THEN
|
||||
" . (isset($row["ENGINE"]) ? "IF _engine != '$row[ENGINE]' OR _table_collation != '$row[TABLE_COLLATION]' OR _table_comment != $comment THEN
|
||||
|
@@ -44,7 +44,7 @@ class AdminerEditCalendar {
|
||||
if (preg_match("~date|time~", $field["type"])) {
|
||||
$dateFormat = "changeYear: true, dateFormat: 'yy-mm-dd'"; //! yy-mm-dd regional
|
||||
$timeFormat = "showSecond: true, timeFormat: 'HH:mm:ss', timeInput: true";
|
||||
return "<input id='fields-" . h($field["field"]) . "' value='" . h($value) . "'" . (@+$field["length"] ? " maxlength='" . (+$field["length"]) . "'" : "") . "$attrs>" . script(
|
||||
return "<input id='fields-" . h($field["field"]) . "' value='" . h($value) . "'" . (@+$field["length"] ? " data-maxlength='" . (+$field["length"]) . "'" : "") . "$attrs>" . script(
|
||||
"jQuery('#fields-" . js_escape($field["field"]) . "')."
|
||||
. ($field["type"] == "time" ? "timepicker({ $timeFormat })"
|
||||
: (preg_match("~time~", $field["type"]) ? "datetimepicker({ $dateFormat, $timeFormat })"
|
||||
|
@@ -45,7 +45,7 @@ class AdminerFileUpload {
|
||||
}
|
||||
|
||||
function selectVal($val, &$link, $field, $original) {
|
||||
if ($val != " " && preg_match('~(.*)_path$~', $field["field"], $regs)) {
|
||||
if ($val != "" && preg_match('~(.*)_path$~', $field["field"], $regs)) {
|
||||
$link = "$this->displayPath$_GET[select]/$regs[1]-$val";
|
||||
}
|
||||
}
|
||||
|
55
plugins/login-otp.php
Normal file
55
plugins/login-otp.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
/** Require One-Time Password at login
|
||||
* You can generate the secret and install it into Google Authenticator e.g. with https://github.com/sonata-project/GoogleAuthenticator
|
||||
* @link https://www.adminer.org/plugins/#use
|
||||
* @author Jakub Vrana, https://www.vrana.cz/
|
||||
* @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)
|
||||
*/
|
||||
class AdminerLoginOtp {
|
||||
/** @access protected */
|
||||
var $secret;
|
||||
|
||||
/**
|
||||
* @param string decoded secret, e.g. base32_decode("SECRET")
|
||||
*/
|
||||
function __construct($secret) {
|
||||
$this->secret = $secret;
|
||||
if ($_POST["auth"]) {
|
||||
$_SESSION["otp"] = (string) $_POST["auth"]["otp"];
|
||||
}
|
||||
}
|
||||
|
||||
function loginFormField($name, $heading, $value) {
|
||||
if ($name == 'password') {
|
||||
return $heading . $value
|
||||
. "<tr><th><acronym title='One Time Password' lang='en'>OTP</acronym>"
|
||||
. "<td><input type='number' name='auth[otp]' value='" . h($_SESSION["otp"]) . "' size='6' autocomplete='off'>\n"
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
function login($login, $password) {
|
||||
if (isset($_SESSION["otp"])) {
|
||||
$timeSlot = floor(time() / 30);
|
||||
foreach (array(0, -1, 1) as $skew) {
|
||||
if ($_SESSION["otp"] == $this->getOtp($timeSlot + $skew)) {
|
||||
restart_session();
|
||||
unset($_SESSION["otp"]);
|
||||
stop_session();
|
||||
return;
|
||||
}
|
||||
}
|
||||
return 'Invalid OTP.';
|
||||
}
|
||||
}
|
||||
|
||||
function getOtp($timeSlot) {
|
||||
$data = str_pad(pack('N', $timeSlot), 8, "\0", STR_PAD_LEFT);
|
||||
$hash = hash_hmac('sha1', $data, $this->secret, true);
|
||||
$offset = ord(substr($hash, -1)) & 0xF;
|
||||
$unpacked = unpack('N', substr($hash, $offset, 4));
|
||||
return ($unpacked[1] & 0x7FFFFFFF) % 1e6;
|
||||
}
|
||||
}
|
@@ -1,29 +1,31 @@
|
||||
<?php
|
||||
|
||||
/** Enable login for SQLite
|
||||
/** Enable login for password-less database
|
||||
* @link https://www.adminer.org/plugins/#use
|
||||
* @author Jakub Vrana, https://www.vrana.cz/
|
||||
* @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)
|
||||
*/
|
||||
class AdminerLoginSqlite {
|
||||
class AdminerLoginPasswordLess {
|
||||
/** @access protected */
|
||||
var $login, $password_hash;
|
||||
var $password_hash;
|
||||
|
||||
/** Set allowed credentials
|
||||
* @param string
|
||||
/** Set allowed password
|
||||
* @param string result of password_hash
|
||||
*/
|
||||
function __construct($login, $password_hash) {
|
||||
$this->login = $login;
|
||||
function __construct($password_hash) {
|
||||
$this->password_hash = $password_hash;
|
||||
}
|
||||
|
||||
function credentials() {
|
||||
$password = get_password();
|
||||
return array(SERVER, $_GET["username"], (password_verify($password, $this->password_hash) ? "" : $password));
|
||||
}
|
||||
|
||||
function login($login, $password) {
|
||||
if (DRIVER != "sqlite" && DRIVER != "sqlite2") {
|
||||
if ($password != "") {
|
||||
return true;
|
||||
}
|
||||
return $this->login == $login && password_verify($password, $this->password_hash);
|
||||
}
|
||||
|
||||
}
|
@@ -8,48 +8,35 @@
|
||||
*/
|
||||
class AdminerLoginServers {
|
||||
/** @access protected */
|
||||
var $servers, $driver;
|
||||
var $servers;
|
||||
|
||||
/** Set supported servers
|
||||
* @param array array($domain) or array($domain => $description) or array($category => array())
|
||||
* @param string
|
||||
* @param array array($description => array("server" => , "driver" => "server|pgsql|sqlite|..."))
|
||||
*/
|
||||
function __construct($servers, $driver = "server") {
|
||||
function __construct($servers) {
|
||||
$this->servers = $servers;
|
||||
$this->driver = $driver;
|
||||
if ($_POST["auth"]) {
|
||||
$key = $_POST["auth"]["server"];
|
||||
$_POST["auth"]["driver"] = $this->servers[$key]["driver"];
|
||||
}
|
||||
}
|
||||
|
||||
function serverName($server) {
|
||||
return h($this->servers[$server]);
|
||||
function credentials() {
|
||||
return array($this->servers[SERVER]["server"], $_GET["username"], get_password());
|
||||
}
|
||||
|
||||
function login($login, $password) {
|
||||
// check if server is allowed
|
||||
foreach ($this->servers as $key => $val) {
|
||||
$servers = $val;
|
||||
if (!is_array($val)) {
|
||||
$servers = array($key => $val);
|
||||
}
|
||||
foreach ($servers as $k => $v) {
|
||||
if ((is_string($k) ? $k : $v) == SERVER) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!$this->servers[SERVER]) {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function loginForm() {
|
||||
?>
|
||||
<table cellspacing="0">
|
||||
<tr><th><?php echo lang('Server'); ?><td><input type="hidden" name="auth[driver]" value="<?php echo $this->driver; ?>"><select name="auth[server]"><?php echo optionlist($this->servers, SERVER); ?></select>
|
||||
<tr><th><?php echo lang('Username'); ?><td><input id="username" name="auth[username]" value="<?php echo h($_GET["username"]); ?>">
|
||||
<tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
|
||||
</table>
|
||||
<p><input type="submit" value="<?php echo lang('Login'); ?>">
|
||||
<?php
|
||||
echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
|
||||
return true;
|
||||
function loginFormField($name, $heading, $value) {
|
||||
if ($name == 'driver') {
|
||||
return '';
|
||||
} elseif ($name == 'server') {
|
||||
return $heading . "<select name='auth[server]'>" . optionlist(array_keys($this->servers), SERVER) . "</select>\n";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -160,6 +160,11 @@ class AdminerPlugin extends Adminer {
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
}
|
||||
|
||||
function loginFormField($name, $heading, $value) {
|
||||
$args = func_get_args();
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
}
|
||||
|
||||
function login($login, $password) {
|
||||
$args = func_get_args();
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
|
40
plugins/pretty-json-column.php
Normal file
40
plugins/pretty-json-column.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/** Pretty print JSON values in edit
|
||||
*/
|
||||
class AdminerPrettyJsonColumn {
|
||||
/** @var AdminerPlugin */
|
||||
protected $adminer;
|
||||
|
||||
public function __construct($adminer) {
|
||||
$this->adminer = $adminer;
|
||||
}
|
||||
|
||||
private function _testJson($value) {
|
||||
if ((substr($value, 0, 1) == '{' || substr($value, 0, 1) == '[') && ($json = json_decode($value, true))) {
|
||||
return $json;
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
|
||||
function editInput($table, $field, $attrs, $value) {
|
||||
$json = $this->_testJson($value);
|
||||
if ($json !== $value) {
|
||||
$jsonText = json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
return <<<HTML
|
||||
<textarea $attrs cols="50" rows="20">$jsonText</textarea>
|
||||
HTML;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
function processInput($field, $value, $function = '') {
|
||||
if ($function === '') {
|
||||
$json = $this->_testJson($value);
|
||||
if ($json !== $value) {
|
||||
$value = json_encode($json);
|
||||
}
|
||||
}
|
||||
return $this->adminer->_callParent('processInput', array($field, $value, $function));
|
||||
}
|
||||
}
|
@@ -34,7 +34,7 @@ class AdminerSlugify {
|
||||
}
|
||||
$slug = $slugify[$field["field"]];
|
||||
if ($slug !== null) {
|
||||
return "<input value='" . h($value) . "' maxlength='$field[length]' size='40'$attrs>"
|
||||
return "<input value='" . h($value) . "' data-maxlength='$field[length]' size='40'$attrs>"
|
||||
. script("qsl('input').onchange = function () {
|
||||
var find = '$this->from';
|
||||
var repl = '$this->to';
|
||||
|
@@ -13,6 +13,7 @@ class AdminerTableStructure {
|
||||
* @return bool
|
||||
*/
|
||||
function tableStructurePrint($fields) {
|
||||
echo "<div class='scrollable'>\n";
|
||||
echo "<table cellspacing='0' class='nowrap'>\n";
|
||||
echo "<thead><tr><th>" . lang('Column') . "<th>" . lang('Type') . "<th>" . lang('Nullable') . "<th>" . lang('Default') . (support("comment") ? "<th>" . lang('Comment') : "") . "</thead>\n";
|
||||
foreach ($fields as $field) {
|
||||
@@ -21,11 +22,12 @@ class AdminerTableStructure {
|
||||
echo ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : "");
|
||||
echo ($field["collation"] ? " <i>" . h($field["collation"]) . "</i>" : "");
|
||||
echo "<td>" . ($field["null"] ? lang('Yes') : lang('No'));
|
||||
echo "<td>" . (isset($field["default"]) ? h($field["default"]) : " ");
|
||||
echo (support("comment") ? "<td>" . nbsp($field["comment"]) : "");
|
||||
echo "<td>" . h($field["default"]);
|
||||
echo (support("comment") ? "<td>" . h($field["comment"]) : "");
|
||||
echo "\n";
|
||||
}
|
||||
echo "</table>\n";
|
||||
echo "</div>\n";
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -27,8 +27,17 @@ function tablesFilter(){
|
||||
}
|
||||
var tables = qsa('li', qs('#tables'));
|
||||
for (var i = 0; i < tables.length; i++) {
|
||||
var a = qsa('a', tables[i])[1];
|
||||
var a = null;
|
||||
var text = tables[i].getAttribute('data-table-name');
|
||||
if (text == null) {
|
||||
a = qsa('a', tables[i])[1];
|
||||
text = a.innerHTML.trim();
|
||||
|
||||
tables[i].setAttribute('data-table-name', text);
|
||||
a.setAttribute('data-link', 'main');
|
||||
} else {
|
||||
a = qs('a[data-link="main"]', tables[i]);
|
||||
}
|
||||
if (value == '') {
|
||||
tables[i].className = '';
|
||||
a.innerHTML = text;
|
||||
@@ -44,7 +53,7 @@ function tablesFilterInput() {
|
||||
tablesFilterTimeout = window.setTimeout(tablesFilter, 200);
|
||||
}
|
||||
|
||||
if (sessionStorage){
|
||||
sessionStorage && document.addEventListener('DOMContentLoaded', function () {
|
||||
var db = qs('#dbs').querySelector('select');
|
||||
db = db.options[db.selectedIndex].text;
|
||||
if (db == sessionStorage.getItem('adminer_tables_filter_db') && sessionStorage.getItem('adminer_tables_filter')){
|
||||
@@ -52,25 +61,9 @@ if (sessionStorage){
|
||||
tablesFilter();
|
||||
}
|
||||
sessionStorage.setItem('adminer_tables_filter_db', db);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<p class="jsonly"><input id="filter-field" autocomplete="off"><?php echo script("qs('#filter-field').oninput = tablesFilterInput;"); ?>
|
||||
<ul id='tables'>
|
||||
<?php
|
||||
echo script("mixin(qs('#tables'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
foreach ($tables as $table => $status) {
|
||||
echo '<li data-table-name="' . h($table) . '"><a href="' . h(ME) . 'select=' . urlencode($table) . '"' . bold($_GET["select"] == $table || $_GET["edit"] == $table, "select") . ">" . lang('select') . "</a> ";
|
||||
$name = h($status["Name"]);
|
||||
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"))
|
||||
. " title='" . lang('Show structure') . "'>$name</a>"
|
||||
: "<span>$name</span>"
|
||||
) . "\n";
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
<?php
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -39,20 +39,22 @@ tinyMCE.init({
|
||||
}
|
||||
|
||||
function selectVal(&$val, $link, $field, $original) {
|
||||
if (preg_match("~_html~", $field["field"]) && $val != ' ') {
|
||||
$shortened = (substr($val, -10) == "<i>...</i>");
|
||||
if (preg_match("~_html~", $field["field"]) && $val != '') {
|
||||
$ellipsis = "<i>…</i>";
|
||||
$length = strlen($ellipsis);
|
||||
$shortened = (substr($val, -$length) == $ellipsis);
|
||||
if ($shortened) {
|
||||
$val = substr($val, 0, -10);
|
||||
$val = substr($val, 0, -$length);
|
||||
}
|
||||
//! shorten with regard to HTML tags - http://php.vrana.cz/zkraceni-textu-s-xhtml-znackami.php
|
||||
$val = preg_replace('~<[^>]*$~', '', html_entity_decode($val, ENT_QUOTES)); // remove ending incomplete tag (text can be shortened)
|
||||
if ($shortened) {
|
||||
$val .= "<i>...</i>";
|
||||
$val .= $ellipsis;
|
||||
}
|
||||
if (class_exists('DOMDocument')) { // close all opened tags
|
||||
$dom = new DOMDocument;
|
||||
if (@$dom->loadHTML("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'></head>$val")) { // @ - $val can contain errors
|
||||
$val = preg_replace('~.*<body[^>]*>(.*)</body>.*~is', '\\1', $dom->saveHTML());
|
||||
$val = preg_replace('~.*<body[^>]*>(.*)</body>.*~is', '\1', $dom->saveHTML());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -28,20 +28,22 @@ class AdminerWymeditor {
|
||||
|
||||
function selectVal(&$val, $link, $field, $original) {
|
||||
// copied from tinymce.php
|
||||
if (preg_match("~_html~", $field["field"]) && $val != ' ') {
|
||||
$shortened = (substr($val, -10) == "<i>...</i>");
|
||||
if (preg_match("~_html~", $field["field"]) && $val != '') {
|
||||
$ellipsis = "<i>…</i>";
|
||||
$length = strlen($ellipsis);
|
||||
$shortened = (substr($val, -$length) == $ellipsis);
|
||||
if ($shortened) {
|
||||
$val = substr($val, 0, -10);
|
||||
$val = substr($val, 0, -$length);
|
||||
}
|
||||
//! shorten with regard to HTML tags - http://php.vrana.cz/zkraceni-textu-s-xhtml-znackami.php
|
||||
$val = preg_replace('~<[^>]*$~', '', html_entity_decode($val, ENT_QUOTES)); // remove ending incomplete tag (text can be shortened)
|
||||
if ($shortened) {
|
||||
$val .= "<i>...</i>";
|
||||
$val .= $ellipsis;
|
||||
}
|
||||
if (class_exists('DOMDocument')) { // close all opened tags
|
||||
$dom = new DOMDocument;
|
||||
if (@$dom->loadHTML("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'></head>$val")) { // @ - $val can contain errors
|
||||
$val = preg_replace('~.*<body[^>]*>(.*)</body>.*~is', '\\1', $dom->saveHTML());
|
||||
$val = preg_replace('~.*<body[^>]*>(.*)</body>.*~is', '\1', $dom->saveHTML());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user