mirror of
https://github.com/vrana/adminer.git
synced 2025-08-31 01:59:59 +02:00
Compare commits
145 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
81e337bed1 | ||
|
18ddbf1d60 | ||
|
e4235d21e5 | ||
|
10dfc54bf4 | ||
|
af3c863be3 | ||
|
6cd5495c1b | ||
|
78ad8381ab | ||
|
87fc82f88e | ||
|
0519a0b985 | ||
|
f61cf1ba0c | ||
|
fc2e025603 | ||
|
659e72b692 | ||
|
123373ca82 | ||
|
e99f2d90cf | ||
|
bdabc5aa13 | ||
|
92f3e0ca00 | ||
|
aa1266e4f2 | ||
|
b7bbd07155 | ||
|
1ff6f246e8 | ||
|
555e2e76b7 | ||
|
7883e0bd99 | ||
|
18e26a3b68 | ||
|
25a1ccf75b | ||
|
b9cdf52ec5 | ||
|
7997331b77 | ||
|
3bb75dc036 | ||
|
441e7f050c | ||
|
c41cb51ede | ||
|
42d92875c5 | ||
|
df0e5b59bb | ||
|
de9f572112 | ||
|
dd9a4a2b65 | ||
|
91d44f4a9f | ||
|
f993acb538 | ||
|
a87b606918 | ||
|
3e81c3871f | ||
|
13752c0498 | ||
|
e378f7d817 | ||
|
6f789eac0a | ||
|
9ed4c859ed | ||
|
62246338bf | ||
|
e5a7f75807 | ||
|
279337aa65 | ||
|
bf1d16cdb7 | ||
|
1de9275f11 | ||
|
0f2e04730f | ||
|
ae629f8ac7 | ||
|
0797cb6a10 | ||
|
dd122a1056 | ||
|
96c0177422 | ||
|
7d6c7998d8 | ||
|
3df88d4a24 | ||
|
2d4b73653b | ||
|
a63fadd503 | ||
|
a494827dc5 | ||
|
8ac486a57c | ||
|
bfcc6d8297 | ||
|
29fd200ef5 | ||
|
b6058368d3 | ||
|
fd38c4261a | ||
|
507f335371 | ||
|
ea314b8103 | ||
|
e250470768 | ||
|
2fa42d50eb | ||
|
a366b7af09 | ||
|
b039a39e4d | ||
|
08e48c8641 | ||
|
78c2041cfd | ||
|
5d7c5fa268 | ||
|
8f1db4cf6f | ||
|
9daa88acca | ||
|
aa519b78ca | ||
|
aee800efed | ||
|
06d0f957d5 | ||
|
3f0bc24e01 | ||
|
4863f48d33 | ||
|
9ea8f44919 | ||
|
fa791b5461 | ||
|
203162b203 | ||
|
e4e76b6384 | ||
|
353cd452a3 | ||
|
5bc4ac6c18 | ||
|
aec8275502 | ||
|
7d5077e687 | ||
|
91d0d8538f | ||
|
2439369143 | ||
|
d5bce9b3e9 | ||
|
b42762e4dc | ||
|
695a720403 | ||
|
e6fdf2b400 | ||
|
b542b6613c | ||
|
374b8ed6a6 | ||
|
58cca3f951 | ||
|
5eecb8e6a3 | ||
|
0d0936550c | ||
|
c4ed9500a1 | ||
|
0863766970 | ||
|
146a24efad | ||
|
00b9fbda08 | ||
|
8ea329538f | ||
|
a3428cc7ff | ||
|
2a01969c96 | ||
|
9b8d14c3ee | ||
|
2ce88d9bdc | ||
|
593c8e5bcc | ||
|
a134193afa | ||
|
8a60243459 | ||
|
b94636f8a7 | ||
|
47ccfa2a2e | ||
|
949b39b191 | ||
|
09a946cb99 | ||
|
13258de188 | ||
|
5fe25fca67 | ||
|
a693e75e32 | ||
|
de7dd4b64f | ||
|
8a70474651 | ||
|
43a0305a23 | ||
|
bff6f8ca93 | ||
|
f38c0a1f13 | ||
|
835c10674b | ||
|
fc5a46549e | ||
|
898dc9e25e | ||
|
32160b48ae | ||
|
6beb07a181 | ||
|
ee42077e54 | ||
|
c3e2e6c58f | ||
|
49effeff09 | ||
|
857cbf03f2 | ||
|
e8c9164a77 | ||
|
01fe709b7a | ||
|
90addc5e78 | ||
|
b71a456514 | ||
|
4d7642a624 | ||
|
9f8dadbb40 | ||
|
9968851f1e | ||
|
a5780e58af | ||
|
e8b40e3b9d | ||
|
35afd4f88c | ||
|
38e4b51256 | ||
|
55a7d3864f | ||
|
e69583a800 | ||
|
338c81e2a3 | ||
|
9eb4d00564 | ||
|
1c5947de50 | ||
|
5cfd48bb68 |
20
.editorconfig
Normal file
20
.editorconfig
Normal file
@@ -0,0 +1,20 @@
|
||||
# https://editorconfig.org/
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.{php,css,js}]
|
||||
indent_style = tab
|
||||
|
||||
[*.json]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.md]
|
||||
indent_style = space
|
||||
trim_trailing_whitespace = false
|
||||
max_line_length = 120
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,3 +3,4 @@
|
||||
/editor*.php
|
||||
/vendor/
|
||||
/composer.lock
|
||||
/temp
|
||||
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@@ -1,9 +1,3 @@
|
||||
[submodule "jush"]
|
||||
path = externals/jush
|
||||
url = https://github.com/vrana/jush
|
||||
[submodule "JsShrink"]
|
||||
path = externals/JsShrink
|
||||
url = https://github.com/vrana/JsShrink
|
||||
[submodule "designs/hydra"]
|
||||
path = designs/hydra
|
||||
url = https://github.com/Niyko/Hydra-Dark-Theme-for-Adminer
|
||||
|
1064
CHANGELOG.md
Normal file
1064
CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
7
LICENSE.md
Normal file
7
LICENSE.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Licenses
|
||||
|
||||
You may use Adminer under the terms of either the Apache License Version 2.0
|
||||
or the GNU General Public License (GPL) version 2.
|
||||
|
||||
- [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
|
||||
- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html)
|
153
README.md
Normal file
153
README.md
Normal file
@@ -0,0 +1,153 @@
|
||||
# Adminer
|
||||
|
||||
**Adminer** is a full-featured database management tool written in PHP. It consists of a single file ready to deploy to
|
||||
the target server. As a companion, **Adminer Editor** offers data manipulation for end-users.
|
||||
|
||||
Supported database drivers:
|
||||
- MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, MongoDB
|
||||
- With plugin: SimpleDB, Elasticsearch (beta), Firebird (alpha), ClickHouse (alpha)
|
||||
|
||||
## Requirements
|
||||
|
||||
- PHP 5.6+ with enabled sessions.
|
||||
|
||||
## Migration from original Adminer
|
||||
|
||||
No action is needed for now. But please, read 👉 **[What to expect](#what-to-expect)** section before you decide to
|
||||
switch to this project.
|
||||
|
||||
## Usage
|
||||
|
||||
Download one for the latest [release files](https://github.com/pematon/adminer/releases), upload to the HTTP server
|
||||
with PHP and enjoy 😉 If you are not satisfied with any combination of the database driver and language, you can
|
||||
download the source code and compile your own Adminer:
|
||||
|
||||
- Download the source code.
|
||||
- Run `composer install` to install dependencies.
|
||||
- Run compile.php:
|
||||
|
||||
```shell
|
||||
# Adminer
|
||||
php compile.php <driver> <language>
|
||||
|
||||
# Editor
|
||||
php compile.php editor <driver> <language>
|
||||
```
|
||||
|
||||
For example:
|
||||
```shell
|
||||
php compile.php pgsql cs
|
||||
```
|
||||
|
||||
[Available drivers](https://github.com/pematon/adminer/tree/master/adminer/drivers),
|
||||
[languages](https://github.com/pematon/adminer/tree/master/adminer/lang).
|
||||
|
||||
## Security
|
||||
|
||||
Adminer does not allow connecting to databases without a password and it rate-limits the connection attempts to protect
|
||||
against brute-force attacks. Still, it is highly recommended to 🔒 **restrict access to Adminer** 🔒 by whitelisting IP
|
||||
addresses allowed to connect to it, by password-protecting the access in your web server or by enabling security plugins
|
||||
(e.g. to require an OTP).
|
||||
|
||||
## Plugins
|
||||
|
||||
* Download plugins you want and place them into the `plugins` folder.
|
||||
* Create `index.php` file specifying which plugins do you want to use.
|
||||
|
||||
File structure will be:
|
||||
|
||||
```
|
||||
- plugins
|
||||
- drivers
|
||||
- elastic.php
|
||||
- dump-xml.php
|
||||
- tinymce.php
|
||||
- file-upload.php
|
||||
- ...
|
||||
- adminer.php
|
||||
- index.php
|
||||
```
|
||||
|
||||
Index.php:
|
||||
```php
|
||||
<?php
|
||||
function adminer_object() {
|
||||
// Required to run any plugin.
|
||||
include_once "./plugins/plugin.php";
|
||||
|
||||
// Autoloader.
|
||||
foreach (glob("plugins/*.php") as $filename) {
|
||||
include_once "./$filename";
|
||||
}
|
||||
|
||||
// Enable extra drivers just by including them.
|
||||
include_once "./plugins/drivers/elastic.php";
|
||||
|
||||
// Specify enabled plugins.
|
||||
$plugins = [
|
||||
new AdminerDumpXml(),
|
||||
new AdminerTinymce(),
|
||||
new AdminerFileUpload("data/"),
|
||||
// ...
|
||||
];
|
||||
|
||||
// It is possible to combine customization and plugins.
|
||||
// class AdminerCustomization extends AdminerPlugin {
|
||||
// }
|
||||
// return new AdminerCustomization($plugins);
|
||||
|
||||
return new AdminerPlugin($plugins);
|
||||
}
|
||||
|
||||
// Include original Adminer or Adminer Editor.
|
||||
include "./adminer.php";
|
||||
```
|
||||
|
||||
[Available plugins](https://github.com/pematon/adminer/tree/master/plugins).
|
||||
|
||||
## Main project files
|
||||
- adminer/index.php - Run development version of Adminer.
|
||||
- editor/index.php - Run development version of Adminer Editor.
|
||||
- editor/example.php - Example customization.
|
||||
- plugins/readme.txt - Plugins for Adminer and Adminer Editor.
|
||||
- adminer/plugin.php - Plugin demo.
|
||||
- adminer/sqlite.php - Development version of Adminer with SQLite allowed.
|
||||
- editor/sqlite.php - Development version of Editor with SQLite allowed.
|
||||
- adminer/designs.php - Development version of Adminer with adminer.css switcher.
|
||||
- compile.php - Create a single file version.
|
||||
- lang.php - Update translations.
|
||||
- tests/katalon.html - Katalon Automation Recorder test suite.
|
||||
|
||||
## Project history
|
||||
|
||||
Adminer was originally developed by Jakub Vrana, and it can be still found on [official pages](https://www.adminer.org/).
|
||||
Unfortunately, it is not maintained for several years. In the meantime, I (@peterpp) created for my company a set of
|
||||
custom plugins, modern theme, fixed some bugs and practically rewrote the Elasticsearch driver. I also looked closely
|
||||
and contributed to the [AdminerEvo](https://www.adminerevo.org/) project that looked promising. However, I finally
|
||||
decided to continue working on this fork and fulfill my own vision.
|
||||
|
||||
## What to expect
|
||||
|
||||
Our top priority is fixing the security issues and reported bugs. But we really want to move forward and transform
|
||||
Adminer to a tool that will keep its simplicity, yet looks much better, is even easier to use and can be configured
|
||||
without requirement of additional plugins.
|
||||
|
||||
### Version 4.x
|
||||
Original design and backward compatibility is kept. Many issues were fixed, and we introduced several functional and
|
||||
UI improvements.
|
||||
|
||||
### Version 5
|
||||
Bridges will be burned 🔥🔥🔥. It's in development already, so you [can check](https://github.com/pematon/adminer/tree/version-5)
|
||||
what's going on. Or you can become the early adopter and help us with testing 😉
|
||||
|
||||
Our goals are:
|
||||
|
||||
- **Requirements** - Bump minimal PHP to 7.1, maybe even higher.
|
||||
- **Themes** – Modernize the current old-school theme, add new default theme based on our [Adminer theme](https://github.com/pematon/adminer-theme),
|
||||
support dark mode, configurable color variants for production/devel environment. All current designs will be removed.
|
||||
- **Plugins** - Integrate several basic plugins, enable them by optional configuration.
|
||||
- **Codebase** - Prefer code readability before minimalism, use PER coding style, add namespaces.
|
||||
- **Compilation** - Allow to export selected drivers, themes, languages and plugins into a single adminer.php file.
|
||||
|
||||
We are also thinking to change the project's name, so people will clearly distinguish between original Adminer and
|
||||
other forks. Any suggestions are welcome.
|
14
SECURITY.md
14
SECURITY.md
@@ -1,11 +1,11 @@
|
||||
# Security Policy
|
||||
# Reporting security issues
|
||||
|
||||
## Supported Versions
|
||||
To report a security issue, please [open a draft security advisory](https://github.com/pematon/adminer/security/advisories).
|
||||
|
||||
I support only the last published version and the last development version (last commit).
|
||||
Security issues are handled with top priority. Once acknowledged, a fix should be available and new version released
|
||||
as soon as possible. Security advisories will be made public after a fix and new version have been released,
|
||||
or the advisory has been declined.
|
||||
|
||||
## Reporting a Vulnerability
|
||||
## Supported versions
|
||||
|
||||
To report a vulnerability, create a private bug at https://sourceforge.net/p/adminer/bugs-and-features/new/?private=1.
|
||||
|
||||
I handle security issues with top priority. If you don't hear from me in a week then please ping the bug. Once I accept the bug, the fix should be available and new version released within days. I will mark the bug as public after releasing a new version or declining the bug.
|
||||
Only the last published version and the last development version (last commit) are supported.
|
||||
|
@@ -82,20 +82,39 @@ if ($_POST && !process_fields($row["fields"]) && !$error) {
|
||||
}
|
||||
|
||||
$partitioning = "";
|
||||
if ($partition_by[$row["partition_by"]]) {
|
||||
$partitions = array();
|
||||
if ($row["partition_by"] == 'RANGE' || $row["partition_by"] == 'LIST') {
|
||||
foreach (array_filter($row["partition_names"]) as $key => $val) {
|
||||
$value = $row["partition_values"][$key];
|
||||
$partitions[] = "\n PARTITION " . idf_escape($val) . " VALUES " . ($row["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection
|
||||
if (support("partitioning")) {
|
||||
if (isset($partition_by[$row["partition_by"]])) {
|
||||
$params = array_filter($row, function ($key) {
|
||||
return preg_match('~^partition~', $key);
|
||||
}, ARRAY_FILTER_USE_KEY);
|
||||
|
||||
foreach ($params["partition_names"] as $key => $name) {
|
||||
if ($name === "") {
|
||||
unset($params["partition_names"][$key]);
|
||||
unset($params["partition_values"][$key]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($params != get_partitions_info($TABLE)) {
|
||||
$partitions = [];
|
||||
if ($params["partition_by"] == 'RANGE' || $params["partition_by"] == 'LIST') {
|
||||
foreach ($params["partition_names"] as $key => $name) {
|
||||
$value = $params["partition_values"][$key];
|
||||
$partitions[] = "\n PARTITION " . idf_escape($name) . " VALUES " . ($params["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection
|
||||
}
|
||||
}
|
||||
|
||||
// $params["partition"] can be expression, not only column
|
||||
$partitioning .= "\nPARTITION BY {$params["partition_by"]}({$params["partition"]})";
|
||||
if ($partitions) {
|
||||
$partitioning .= " (" . implode(",", $partitions) . "\n)";
|
||||
} elseif ($params["partitions"]) {
|
||||
$partitioning .= " PARTITIONS " . (int)$params["partitions"];
|
||||
}
|
||||
}
|
||||
} elseif (preg_match("~partitioned~", $table_status["Create_options"])) {
|
||||
$partitioning .= "\nREMOVE PARTITIONING";
|
||||
}
|
||||
$partitioning .= "\nPARTITION BY $row[partition_by]($row[partition])" . ($partitions // $row["partition"] can be expression, not only column
|
||||
? " (" . implode(",", $partitions) . "\n)"
|
||||
: ($row["partitions"] ? " PARTITIONS " . (+$row["partitions"]) : "")
|
||||
);
|
||||
} elseif (support("partitioning") && preg_match("~partitioned~", $table_status["Create_options"])) {
|
||||
$partitioning .= "\nREMOVE PARTITIONING";
|
||||
}
|
||||
|
||||
$message = lang('Table has been altered.');
|
||||
@@ -141,13 +160,9 @@ if (!$_POST) {
|
||||
}
|
||||
|
||||
if (support("partitioning")) {
|
||||
$from = "FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = " . q(DB) . " AND TABLE_NAME = " . q($TABLE);
|
||||
$result = $connection->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $from ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");
|
||||
list($row["partition_by"], $row["partitions"], $row["partition"]) = $result->fetch_row();
|
||||
$partitions = get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $from AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");
|
||||
$partitions[""] = "";
|
||||
$row["partition_names"] = array_keys($partitions);
|
||||
$row["partition_values"] = array_values($partitions);
|
||||
$row += get_partitions_info($TABLE);
|
||||
$row["partition_names"][] = "";
|
||||
$row["partition_values"][] = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -167,8 +182,8 @@ foreach ($engines as $engine) {
|
||||
<p>
|
||||
<?php if (support("columns") || $TABLE == "") { ?>
|
||||
<?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 if ($TABLE == "" && !$_POST) { echo script("focus(gid('form')['name']);"); } ?>
|
||||
<?php echo ($engines ? "<select name='Engine'>" . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "</select>" . help_script_command("value", true) : ""); ?>
|
||||
<?php echo ($collations && !preg_match("~sqlite|mssql~", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php } ?>
|
||||
@@ -184,7 +199,6 @@ edit_fields($row["fields"], $collations, "TABLE", $foreign_keys);
|
||||
</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"] : adminer_setting("defaults")), lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
|
||||
<?php
|
||||
$comments = ($_POST ? $_POST["comments"] : adminer_setting("comments"));
|
||||
echo (support("comment")
|
||||
@@ -207,7 +221,7 @@ if (support("partitioning")) {
|
||||
print_fieldset("partition", lang('Partition by'), $row["partition_by"]);
|
||||
?>
|
||||
<p>
|
||||
<?php echo "<select name='partition_by'>" . optionlist(array("" => "") + $partition_by, $row["partition_by"]) . "</select>" . on_help("getTarget(event).value.replace(/./, 'PARTITION BY \$&')", 1) . script("qsl('select').onchange = partitionByChange;"); ?>
|
||||
<?php echo "<select name='partition_by'>" . optionlist(array("" => "") + $partition_by, $row["partition_by"]) . "</select>" . help_script_command("value.replace(/./, 'PARTITION BY \$&')", true) . script("qsl('select').onchange = partitionByChange;"); ?>
|
||||
(<input name="partition" value="<?php echo h($row["partition"]); ?>">)
|
||||
<?php echo lang('Partitions'); ?>: <input type="number" name="partitions" class="size<?php echo ($partition_table || !$row["partition_by"] ? " hidden" : ""); ?>" value="<?php echo h($row["partitions"]); ?>">
|
||||
<table cellspacing="0" id="partition-table"<?php echo ($partition_table ? "" : " class='hidden'"); ?>>
|
||||
|
@@ -66,7 +66,7 @@ echo ($_POST["add_x"] || strpos($name, "\n")
|
||||
'mariadb' => "supported-character-sets-and-collations/",
|
||||
'mssql' => "ms187963.aspx",
|
||||
)) : "");
|
||||
echo script("focus(qs('#name'));");
|
||||
echo script("focus(gid('name'));");
|
||||
?>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php
|
||||
|
@@ -47,7 +47,28 @@ if ($tables_views && !$error && !$_POST["search"]) {
|
||||
page_header(($_GET["ns"] == "" ? lang('Database') . ": " . h(DB) : lang('Schema') . ": " . h($_GET["ns"])), $error, true);
|
||||
|
||||
if ($adminer->homepage()) {
|
||||
if ($_GET["ns"] !== "") {
|
||||
if ($_GET["ns"] === "") {
|
||||
echo "<h3 id='schemas'>" . lang('Schemas') . "</h3>\n";
|
||||
$schemas = schemas();
|
||||
if (!$schemas) {
|
||||
echo "<p class='message'>" . lang('No schemas.') . "\n";
|
||||
} else {
|
||||
// TODO: Checkboxes for batch dropping of schemas.
|
||||
echo "<div class='scrollable'>\n",
|
||||
"<table class='nowrap'>\n",
|
||||
'<thead><tr class="wrap">',
|
||||
'<th>', lang('Schema'), "</th>",
|
||||
'</tr></thead>';
|
||||
|
||||
foreach ($schemas as $name) {
|
||||
echo "<tr", odd(), ">",
|
||||
"<th><a href='", h(ME), "ns=" . urlencode($name), "' title='", lang('Show schema'), "'>" . h($name) . "</a></th>",
|
||||
"</tr>";
|
||||
}
|
||||
|
||||
echo '</table></div>';
|
||||
}
|
||||
} else {
|
||||
echo "<h3 id='tables-views'>" . lang('Tables and views') . "</h3>\n";
|
||||
$tables_list = tables_list();
|
||||
if (!$tables_list) {
|
||||
@@ -59,9 +80,13 @@ if ($adminer->homepage()) {
|
||||
echo "<input type='search' name='query' value='" . h($_POST["query"]) . "'>";
|
||||
echo script("qsl('input').onkeydown = partialArg(bodyKeydown, 'search');", "");
|
||||
echo " <input type='submit' name='search' value='" . lang('Search') . "'>\n";
|
||||
if ($adminer->operator_regexp !== null) {
|
||||
echo "<p><label><input type='checkbox' name='regexp' value='1'" . (empty($_POST['regexp']) ? '' : ' checked') . '>' . lang('as a regular expression') . '</label>';
|
||||
echo doc_link(['sql' => 'regexp.html', 'pgsql' => 'functions-matching.html#FUNCTIONS-POSIX-REGEXP', 'elastic' => "regexp-syntax.html"]) . "</p>\n";
|
||||
}
|
||||
echo "</div></fieldset>\n";
|
||||
if ($_POST["search"] && $_POST["query"] != "") {
|
||||
$_GET["where"][0]["op"] = "LIKE %%";
|
||||
$_GET["where"][0]["op"] = $adminer->operator_regexp !== null && !empty($_POST['regexp']) ? $adminer->operator_regexp : $adminer->operator_like;
|
||||
search_tables();
|
||||
}
|
||||
}
|
||||
@@ -69,7 +94,7 @@ if ($adminer->homepage()) {
|
||||
echo "<table cellspacing='0' class='nowrap checkable'>\n";
|
||||
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
|
||||
echo '<thead><tr class="wrap">';
|
||||
echo '<td><input id="check-all" type="checkbox" class="jsonly">' . script("qs('#check-all').onclick = partial(formCheck, /^(tables|views)\[/);", "");
|
||||
echo '<td><input id="check-all" type="checkbox" class="jsonly">' . script("gid('check-all').onclick = partial(formCheck, /^(tables|views)\[/);", "");
|
||||
echo '<th>' . lang('Table');
|
||||
echo '<td>' . lang('Engine') . doc_link(array('sql' => 'storage-engines.html'));
|
||||
echo '<td>' . lang('Collation') . doc_link(array('sql' => 'charset-charsets.html', 'mariadb' => 'supported-character-sets-and-collations/'));
|
||||
@@ -122,17 +147,17 @@ if ($adminer->homepage()) {
|
||||
echo "</div>\n";
|
||||
if (!information_schema(DB)) {
|
||||
echo "<div class='footer'><div>\n";
|
||||
$vacuum = "<input type='submit' value='" . lang('Vacuum') . "'> " . on_help("'VACUUM'");
|
||||
$optimize = "<input type='submit' name='optimize' value='" . lang('Optimize') . "'> " . on_help($jush == "sql" ? "'OPTIMIZE TABLE'" : "'VACUUM OPTIMIZE'");
|
||||
$vacuum = "<input type='submit' value='" . lang('Vacuum') . "'> " . help_script("VACUUM");
|
||||
$optimize = "<input type='submit' name='optimize' value='" . lang('Optimize') . "'> " . help_script($jush == "sql" ? "OPTIMIZE TABLE" : "VACUUM OPTIMIZE");
|
||||
echo "<fieldset><legend>" . lang('Selected') . " <span id='selected'></span></legend><div>"
|
||||
. ($jush == "sqlite" ? $vacuum
|
||||
: ($jush == "pgsql" ? $vacuum . $optimize
|
||||
: ($jush == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'> " . on_help("'ANALYZE TABLE'") . $optimize
|
||||
. "<input type='submit' name='check' value='" . lang('Check') . "'> " . on_help("'CHECK TABLE'")
|
||||
. "<input type='submit' name='repair' value='" . lang('Repair') . "'> " . on_help("'REPAIR TABLE'")
|
||||
: ($jush == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'> " . help_script("ANALYZE TABLE") . $optimize
|
||||
. "<input type='submit' name='check' value='" . lang('Check') . "'> " . help_script("CHECK TABLE")
|
||||
. "<input type='submit' name='repair' value='" . lang('Repair') . "'> " . help_script("REPAIR TABLE")
|
||||
: "")))
|
||||
. "<input type='submit' name='truncate' value='" . lang('Truncate') . "'> " . on_help($jush == "sqlite" ? "'DELETE'" : "'TRUNCATE" . ($jush == "pgsql" ? "'" : " TABLE'")) . confirm()
|
||||
. "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . on_help("'DROP TABLE'") . confirm() . "\n";
|
||||
. "<input type='submit' name='truncate' value='" . lang('Truncate') . "'> " . help_script($jush == "sqlite" ? "DELETE" : ("TRUNCATE" . ($jush == "pgsql" ? "" : " TABLE"))) . confirm()
|
||||
. "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . help_script("DROP TABLE") . confirm() . "\n";
|
||||
$databases = (support("scheme") ? $adminer->schemas() : $adminer->databases());
|
||||
if (count($databases) != 1 && $jush != "sqlite") {
|
||||
$db = (isset($_POST["target"]) ? $_POST["target"] : (support("scheme") ? $_GET["ns"] : DB));
|
||||
@@ -159,7 +184,7 @@ if ($adminer->homepage()) {
|
||||
echo "<h3 id='routines'>" . lang('Routines') . "</h3>\n";
|
||||
$routines = routines();
|
||||
if ($routines) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<table>\n";
|
||||
echo '<thead><tr><th>' . lang('Name') . '<td>' . lang('Type') . '<td>' . lang('Return type') . "<td></thead>\n";
|
||||
odd('');
|
||||
foreach ($routines as $row) {
|
||||
@@ -182,12 +207,16 @@ if ($adminer->homepage()) {
|
||||
echo "<h3 id='sequences'>" . lang('Sequences') . "</h3>\n";
|
||||
$sequences = get_vals("SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = current_schema() ORDER BY sequence_name");
|
||||
if ($sequences) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
|
||||
echo "<table>\n",
|
||||
"<thead><tr><th>", lang('Name'), "</th><td></td></tr></thead>\n";
|
||||
|
||||
odd('');
|
||||
foreach ($sequences as $val) {
|
||||
echo "<tr" . odd() . "><th><a href='" . h(ME) . "sequence=" . urlencode($val) . "'>" . h($val) . "</a>\n";
|
||||
echo "<tr", odd(), ">",
|
||||
"<th>", h($val), "</th>",
|
||||
"<td><a href='", h(ME), "sequence=", urlencode($val), "'>", lang('Alter'), "</a></td>\n";
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
}
|
||||
echo "<p class='links'><a href='" . h(ME) . "sequence='>" . lang('Create sequence') . "</a>\n";
|
||||
@@ -197,12 +226,16 @@ if ($adminer->homepage()) {
|
||||
echo "<h3 id='user-types'>" . lang('User types') . "</h3>\n";
|
||||
$user_types = types();
|
||||
if ($user_types) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
|
||||
echo "<table>\n",
|
||||
"<thead><tr><th>", lang('Name'), "</th><td></td></tr></thead>\n";
|
||||
|
||||
odd('');
|
||||
foreach ($user_types as $val) {
|
||||
echo "<tr" . odd() . "><th><a href='" . h(ME) . "type=" . urlencode($val) . "'>" . h($val) . "</a>\n";
|
||||
echo "<tr", odd(), ">",
|
||||
"<th>", h($val), "</th>",
|
||||
"<td><a href='", h(ME), "type=", urlencode($val), "'>", lang('Alter'), "</a></td>\n";
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
}
|
||||
echo "<p class='links'><a href='" . h(ME) . "type='>" . lang('Create type') . "</a>\n";
|
||||
@@ -212,7 +245,7 @@ if ($adminer->homepage()) {
|
||||
echo "<h3 id='events'>" . lang('Events') . "</h3>\n";
|
||||
$rows = get_rows("SHOW EVENTS");
|
||||
if ($rows) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<table>\n";
|
||||
echo "<thead><tr><th>" . lang('Name') . "<td>" . lang('Schedule') . "<td>" . lang('Start') . "<td>" . lang('End') . "<td></thead>\n";
|
||||
foreach ($rows as $row) {
|
||||
echo "<tr>";
|
||||
|
@@ -24,7 +24,7 @@ if (isset($_GET["mongo"])) {
|
||||
$this->error = $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function query($query) {
|
||||
return false;
|
||||
}
|
||||
@@ -109,7 +109,7 @@ if (isset($_GET["mongo"])) {
|
||||
|
||||
class Min_Driver extends Min_SQL {
|
||||
public $primary = "_id";
|
||||
|
||||
|
||||
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
|
||||
$select = ($select == array("*")
|
||||
? array()
|
||||
@@ -127,7 +127,7 @@ if (isset($_GET["mongo"])) {
|
||||
->skip($page * $limit)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
function insert($table, $set) {
|
||||
try {
|
||||
$return = $this->_conn->_db->selectCollection($table)->insert($set);
|
||||
@@ -206,6 +206,7 @@ if (isset($_GET["mongo"])) {
|
||||
}
|
||||
|
||||
$operators = array("=");
|
||||
$operator_regexp = null;
|
||||
|
||||
} elseif (class_exists('MongoDB\Driver\Manager')) {
|
||||
class Min_DB {
|
||||
@@ -219,7 +220,7 @@ if (isset($_GET["mongo"])) {
|
||||
$this->_link = new $class($uri, $options);
|
||||
$this->executeCommand('admin', array('ping' => 1));
|
||||
}
|
||||
|
||||
|
||||
function executeCommand($db, $command) {
|
||||
$class = 'MongoDB\Driver\Command';
|
||||
try {
|
||||
@@ -229,7 +230,7 @@ if (isset($_GET["mongo"])) {
|
||||
return array();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function executeBulkWrite($namespace, $bulk, $counter) {
|
||||
try {
|
||||
$results = $this->_link->executeBulkWrite($namespace, $bulk);
|
||||
@@ -463,6 +464,8 @@ if (isset($_GET["mongo"])) {
|
||||
"insert" => 1,
|
||||
"select" => 1,
|
||||
"update" => 1,
|
||||
"where" => 1,
|
||||
"order" => 1,
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -575,7 +578,8 @@ if (isset($_GET["mongo"])) {
|
||||
"(date)>=",
|
||||
"(date)<=",
|
||||
);
|
||||
|
||||
|
||||
$operator_regexp = 'regex';
|
||||
}
|
||||
|
||||
function table($idf) {
|
||||
@@ -732,11 +736,13 @@ if (isset($_GET["mongo"])) {
|
||||
}
|
||||
|
||||
function driver_config() {
|
||||
global $operators;
|
||||
global $operators, $operator_regexp;
|
||||
return array(
|
||||
'possible_drivers' => array("mongo", "mongodb"),
|
||||
'jush' => "mongo",
|
||||
'operators' => $operators,
|
||||
'operator_like' => "LIKE %%", // TODO: LIKE operator is not listed in operators.
|
||||
'operator_regexp' => $operator_regexp,
|
||||
'functions' => array(),
|
||||
'grouping' => array(),
|
||||
'edit_functions' => array(array("json")),
|
||||
|
@@ -40,7 +40,8 @@ if (isset($_GET["mssql"])) {
|
||||
}
|
||||
|
||||
function quote($string) {
|
||||
return "'" . str_replace("'", "''", $string) . "'";
|
||||
$unicode = strlen($string) != strlen(utf8_decode($string));
|
||||
return ($unicode ? "N" : "") . "'" . str_replace("'", "''", $string) . "'";
|
||||
}
|
||||
|
||||
function select_db($database) {
|
||||
@@ -163,7 +164,8 @@ if (isset($_GET["mssql"])) {
|
||||
}
|
||||
|
||||
function quote($string) {
|
||||
return "'" . str_replace("'", "''", $string) . "'";
|
||||
$unicode = strlen($string) != strlen(utf8_decode($string));
|
||||
return ($unicode ? "N" : "") . "'" . str_replace("'", "''", $string) . "'";
|
||||
}
|
||||
|
||||
function select_db($database) {
|
||||
@@ -387,7 +389,7 @@ WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U',
|
||||
"null" => $row["is_nullable"],
|
||||
"auto_increment" => $row["is_identity"],
|
||||
"collation" => $row["collation_name"],
|
||||
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
|
||||
"privileges" => array("insert" => 1, "select" => 1, "update" => 1, "where" => 1, "order" => 1),
|
||||
"primary" => $row["is_identity"], //! or indexes.is_primary_key
|
||||
"comment" => $comments[$row["name"]],
|
||||
);
|
||||
@@ -432,7 +434,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
|
||||
|
||||
function error() {
|
||||
global $connection;
|
||||
return nl_br(h(preg_replace('~^(\[[^]]*])+~m', '', $connection->error)));
|
||||
return nl2br(h(preg_replace('~^(\[[^]]*])+~m', '', $connection->error)));
|
||||
}
|
||||
|
||||
function create_database($db, $collation) {
|
||||
@@ -630,6 +632,17 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
function is_strict_mode() {
|
||||
return false;
|
||||
}
|
||||
|
||||
function is_c_style_escapes() {
|
||||
return true;
|
||||
}
|
||||
|
||||
function show_status() {
|
||||
return array();
|
||||
}
|
||||
@@ -664,6 +677,7 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
|
||||
'structured_types' => $structured_types,
|
||||
'unsigned' => array(),
|
||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"),
|
||||
'operator_like' => "LIKE %%",
|
||||
'functions' => array("len", "lower", "round", "upper"),
|
||||
'grouping' => array("avg", "count", "count distinct", "max", "min", "sum"),
|
||||
'edit_functions' => array(
|
||||
|
@@ -14,12 +14,19 @@ if (!defined("DRIVER")) {
|
||||
|
||||
function connect($server = "", $username = "", $password = "", $database = null, $port = null, $socket = null) {
|
||||
global $adminer;
|
||||
mysqli_report(MYSQLI_REPORT_OFF); // stays between requests, not required since PHP 5.3.4
|
||||
mysqli_report(MYSQLI_REPORT_OFF);
|
||||
list($host, $port) = explode(":", $server, 2); // part after : is used for port or socket
|
||||
|
||||
$ssl = $adminer->connectSsl();
|
||||
if ($ssl) {
|
||||
$this->ssl_set($ssl['key'], $ssl['cert'], $ssl['ca'], '', '');
|
||||
if (isset($ssl['key']) || isset($ssl['cert']) || isset($ssl['ca'])) {
|
||||
$this->ssl_set(
|
||||
isset($ssl['key']) ? $ssl['key'] : null,
|
||||
isset($ssl['cert']) ? $ssl['cert'] : null,
|
||||
isset($ssl['ca']) ? $ssl['ca'] : null,
|
||||
null, null
|
||||
);
|
||||
}
|
||||
|
||||
$return = @$this->real_connect(
|
||||
($server != "" ? $host : ini_get("mysqli.default_host")),
|
||||
($server . $username != "" ? $username : ini_get("mysqli.default_user")),
|
||||
@@ -27,7 +34,7 @@ if (!defined("DRIVER")) {
|
||||
$database,
|
||||
(is_numeric($port) ? $port : ini_get("mysqli.default_port")),
|
||||
(!is_numeric($port) ? $port : $socket),
|
||||
($ssl ? 64 : 0) // 64 - MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT (not available before PHP 5.6.16)
|
||||
($ssl ? MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT : 0)
|
||||
);
|
||||
$this->options(MYSQLI_OPT_LOCAL_INFILE, false);
|
||||
return $return;
|
||||
@@ -50,7 +57,7 @@ if (!defined("DRIVER")) {
|
||||
$row = $result->fetch_array();
|
||||
return $row[$field];
|
||||
}
|
||||
|
||||
|
||||
function quote($string) {
|
||||
return "'" . $this->escape_string($string) . "'";
|
||||
}
|
||||
@@ -234,30 +241,28 @@ if (!defined("DRIVER")) {
|
||||
|
||||
function connect($server, $username, $password) {
|
||||
global $adminer;
|
||||
$options = array(PDO::MYSQL_ATTR_LOCAL_INFILE => false);
|
||||
|
||||
$dsn = "mysql:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\d)~', ';port=\1', $server));
|
||||
|
||||
$options = [PDO::MYSQL_ATTR_LOCAL_INFILE => false];
|
||||
$ssl = $adminer->connectSsl();
|
||||
if ($ssl) {
|
||||
if (!empty($ssl['key'])) {
|
||||
$options[PDO::MYSQL_ATTR_SSL_KEY] = $ssl['key'];
|
||||
}
|
||||
if (!empty($ssl['cert'])) {
|
||||
$options[PDO::MYSQL_ATTR_SSL_CERT] = $ssl['cert'];
|
||||
}
|
||||
if (!empty($ssl['ca'])) {
|
||||
$options[PDO::MYSQL_ATTR_SSL_CA] = $ssl['ca'];
|
||||
}
|
||||
if (isset($ssl['key'])) {
|
||||
$options[PDO::MYSQL_ATTR_SSL_KEY] = $ssl['key'];
|
||||
}
|
||||
$this->dsn(
|
||||
"mysql:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\d)~', ';port=\1', $server)),
|
||||
$username,
|
||||
$password,
|
||||
$options
|
||||
);
|
||||
if (isset($ssl['cert'])) {
|
||||
$options[PDO::MYSQL_ATTR_SSL_CERT] = $ssl['cert'];
|
||||
}
|
||||
if (isset($ssl['ca'])) {
|
||||
$options[PDO::MYSQL_ATTR_SSL_CA] = $ssl['ca'];
|
||||
}
|
||||
|
||||
$this->dsn($dsn, $username, $password, $options);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function set_charset($charset) {
|
||||
$this->query("SET NAMES $charset"); // charset in DSN is ignored before PHP 5.3.6
|
||||
$this->query("SET NAMES $charset");
|
||||
}
|
||||
|
||||
function select_db($database) {
|
||||
@@ -305,7 +310,7 @@ 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)) {
|
||||
@@ -316,13 +321,13 @@ if (!defined("DRIVER")) {
|
||||
}
|
||||
}
|
||||
|
||||
function convertSearch($idf, $val, $field) {
|
||||
return (preg_match('~char|text|enum|set~', $field["type"]) && !preg_match("~^utf8~", $field["collation"]) && preg_match('~[\x80-\xFF]~', $val['val'])
|
||||
function convertSearch($idf, array $where, array $field) {
|
||||
return (preg_match('~char|text|enum|set~', $field["type"]) && !preg_match("~^utf8~", $field["collation"]) && preg_match('~[\x80-\xFF]~', $where['val'])
|
||||
? "CONVERT($idf USING " . charset($this->_conn) . ")"
|
||||
: $idf
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
function warnings() {
|
||||
$result = $this->_conn->query("SHOW WARNINGS");
|
||||
if ($result && $result->num_rows) {
|
||||
@@ -370,7 +375,7 @@ if (!defined("DRIVER")) {
|
||||
$connection = new Min_DB;
|
||||
$credentials = $adminer->credentials();
|
||||
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
|
||||
$connection->set_charset(charset($connection)); // available in MySQLi since PHP 5.0.5
|
||||
$connection->set_charset(charset($connection));
|
||||
$connection->query("SET sql_quote_show_create = 1, autocommit = 1");
|
||||
if (min_version('5.7.8', 10.2, $connection)) {
|
||||
$structured_types[lang('Strings')][] = "json";
|
||||
@@ -495,11 +500,14 @@ if (!defined("DRIVER")) {
|
||||
* @return array array($name => array("Name" => , "Engine" => , "Comment" => , "Oid" => , "Rows" => , "Collation" => , "Auto_increment" => , "Data_length" => , "Index_length" => , "Data_free" => )) or only inner array with $name
|
||||
*/
|
||||
function table_status($name = "", $fast = false) {
|
||||
$return = array();
|
||||
foreach (get_rows($fast && min_version(5)
|
||||
? "SELECT TABLE_NAME AS Name, ENGINE AS Engine, TABLE_COMMENT AS Comment FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() " . ($name != "" ? "AND TABLE_NAME = " . q($name) : "ORDER BY Name")
|
||||
: "SHOW TABLE STATUS" . ($name != "" ? " LIKE " . q(addcslashes($name, "%_\\")) : "")
|
||||
) as $row) {
|
||||
if ($fast && min_version(5)) {
|
||||
$query = "SELECT TABLE_NAME AS Name, ENGINE AS Engine, CREATE_OPTIONS AS Create_options, TABLE_COMMENT AS Comment FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() " . ($name != "" ? "AND TABLE_NAME = " . q($name) : "ORDER BY Name");
|
||||
} else {
|
||||
$query = "SHOW TABLE STATUS" . ($name != "" ? " LIKE " . q(addcslashes($name, "%_\\")) : "");
|
||||
}
|
||||
|
||||
$tables = [];
|
||||
foreach (get_rows($query) as $row) {
|
||||
if ($row["Engine"] == "InnoDB") {
|
||||
// ignore internal comment, unnecessary since MySQL 5.1.21
|
||||
$row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\1', $row["Comment"]);
|
||||
@@ -508,11 +516,15 @@ if (!defined("DRIVER")) {
|
||||
$row["Comment"] = "";
|
||||
}
|
||||
if ($name != "") {
|
||||
// MariaDB: Table name is returned as lowercase on macOS, so we fix it here.
|
||||
$row["Name"] = $name;
|
||||
return $row;
|
||||
}
|
||||
$return[$row["Name"]] = $row;
|
||||
|
||||
$tables[$row["Name"]] = $row;
|
||||
}
|
||||
return $return;
|
||||
|
||||
return $tables;
|
||||
}
|
||||
|
||||
/** Find out whether the identifier is view
|
||||
@@ -551,7 +563,7 @@ if (!defined("DRIVER")) {
|
||||
"auto_increment" => ($row["Extra"] == "auto_increment"),
|
||||
"on_update" => (preg_match('~^on update (.+)~i', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23
|
||||
"collation" => $row["Collation"],
|
||||
"privileges" => array_flip(preg_split('~, *~', $row["Privileges"])),
|
||||
"privileges" => array_flip(preg_split('~, *~', $row["Privileges"])) + ["where" => 1, "order" => 1],
|
||||
"comment" => $row["Comment"],
|
||||
"primary" => ($row["Key"] == "PRI"),
|
||||
// https://mariadb.com/kb/en/library/show-columns/, https://github.com/vrana/adminer/pull/359#pullrequestreview-276677186
|
||||
@@ -1056,6 +1068,29 @@ if (!defined("DRIVER")) {
|
||||
return get_key_vals("SHOW VARIABLES");
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
function is_strict_mode() {
|
||||
static $strictMode = null;
|
||||
|
||||
if ($strictMode === null) {
|
||||
$strictMode = (bool)preg_match('~STRICT_(TRANS|ALL)_TABLES~', get_key_vals("SHOW VARIABLES LIKE 'sql_mode'")["sql_mode"]);
|
||||
}
|
||||
|
||||
return $strictMode;
|
||||
}
|
||||
|
||||
function is_c_style_escapes() {
|
||||
static $c_style = null;
|
||||
|
||||
if ($c_style === null) {
|
||||
$c_style = strpos(get_key_vals("SHOW VARIABLES LIKE 'sql_mode'")["sql_mode"], 'NO_BACKSLASH_ESCAPES') === false;
|
||||
}
|
||||
|
||||
return $c_style;
|
||||
}
|
||||
|
||||
/** Get process list
|
||||
* @return array ($row)
|
||||
*/
|
||||
@@ -1160,7 +1195,9 @@ if (!defined("DRIVER")) {
|
||||
'structured_types' => $structured_types,
|
||||
'unsigned' => array("unsigned", "zerofill", "unsigned zerofill"), ///< @var array number variants
|
||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "FIND_IN_SET", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL"), ///< @var array operators used in select
|
||||
'functions' => array("char_length", "date", "from_unixtime", "lower", "round", "floor", "ceil", "sec_to_time", "time_to_sec", "upper"), ///< @var array functions used in select
|
||||
'operator_like' => "LIKE %%",
|
||||
'operator_regexp' => 'REGEXP',
|
||||
'functions' => array("char_length", "date", "from_unixtime", "unix_timestamp", "lower", "round", "floor", "ceil", "sec_to_time", "time_to_sec", "upper"), ///< @var array functions used in select
|
||||
'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(
|
||||
|
@@ -167,7 +167,14 @@ if (isset($_GET["oracle"])) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string $hostPath
|
||||
* @return bool
|
||||
*/
|
||||
function is_server_host_valid($hostPath) {
|
||||
// EasyConnect host+path format: host[/[service_name][:server_type][/instance_name]]
|
||||
return (bool)preg_match('~^[^/]+(/([^/:]+)?(:[^/:]+)?(/[^/:]+)?)?$~', $hostPath);
|
||||
}
|
||||
|
||||
function idf_escape($idf) {
|
||||
return '"' . str_replace('"', '""', $idf) . '"';
|
||||
@@ -297,7 +304,7 @@ ORDER BY 1"
|
||||
"null" => ($row["NULLABLE"] == "Y"),
|
||||
//! "auto_increment" => false,
|
||||
//! "collation" => $row["CHARACTER_SET_NAME"],
|
||||
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
|
||||
"privileges" => array("insert" => 1, "select" => 1, "update" => 1, "where" => 1, "order" => 1),
|
||||
//! "comment" => $row["Comment"],
|
||||
//! "primary" => ($row["Key"] == "PRI"),
|
||||
);
|
||||
@@ -479,6 +486,17 @@ AND c_src.TABLE_NAME = " . q($table);
|
||||
return get_key_vals('SELECT name, display_value FROM v$parameter');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
function is_strict_mode() {
|
||||
return false;
|
||||
}
|
||||
|
||||
function is_c_style_escapes() {
|
||||
return true;
|
||||
}
|
||||
|
||||
function process_list() {
|
||||
return get_rows('SELECT sess.process AS "process", sess.username AS "user", sess.schemaname AS "schema", sess.status AS "status", sess.wait_class AS "wait_class", sess.seconds_in_wait AS "seconds_in_wait", sql.sql_text AS "sql_text", sess.machine AS "machine", sess.port AS "port"
|
||||
FROM v$session sess LEFT OUTER JOIN v$sql sql
|
||||
@@ -523,6 +541,7 @@ ORDER BY PROCESS
|
||||
'structured_types' => $structured_types,
|
||||
'unsigned' => array(),
|
||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL"),
|
||||
'operator_like' => "LIKE %%",
|
||||
'functions' => array("length", "lower", "round", "upper"),
|
||||
'grouping' => array("avg", "count", "count distinct", "max", "min", "sum"),
|
||||
'edit_functions' => array(
|
||||
|
@@ -19,7 +19,14 @@ if (isset($_GET["pgsql"])) {
|
||||
global $adminer;
|
||||
$db = $adminer->database();
|
||||
set_error_handler(array($this, '_error'));
|
||||
|
||||
$this->_string = "host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' user='" . addcslashes($username, "'\\") . "' password='" . addcslashes($password, "'\\") . "'";
|
||||
|
||||
$ssl = $adminer->connectSsl();
|
||||
if (isset($ssl["mode"])) {
|
||||
$this->_string .= " sslmode='" . $ssl["mode"] . "'";
|
||||
}
|
||||
|
||||
$this->_link = @pg_connect("$this->_string dbname='" . ($db != "" ? addcslashes($db, "'\\") : "postgres") . "'", PGSQL_CONNECT_FORCE_NEW);
|
||||
if (!$this->_link && $db != "") {
|
||||
// try to connect directly with database for performance
|
||||
@@ -36,7 +43,7 @@ if (isset($_GET["pgsql"])) {
|
||||
}
|
||||
|
||||
function quote($string) {
|
||||
return "'" . pg_escape_string($this->_link, $string) . "'";
|
||||
return pg_escape_literal($this->_link, $string);
|
||||
}
|
||||
|
||||
function value($val, $field) {
|
||||
@@ -148,9 +155,19 @@ if (isset($_GET["pgsql"])) {
|
||||
|
||||
function connect($server, $username, $password) {
|
||||
global $adminer;
|
||||
|
||||
$db = $adminer->database();
|
||||
$this->dsn("pgsql:host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' client_encoding=utf8 dbname='" . ($db != "" ? addcslashes($db, "'\\") : "postgres") . "'", $username, $password); //! client_encoding is supported since 9.1 but we can't yet use min_version here
|
||||
//! connect without DB in case of an error
|
||||
|
||||
//! client_encoding is supported since 9.1, but we can't yet use min_version here
|
||||
$dsn = "pgsql:host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' client_encoding=utf8 dbname='" . ($db != "" ? addcslashes($db, "'\\") : "postgres") . "'";
|
||||
|
||||
$ssl = $adminer->connectSsl();
|
||||
if (isset($ssl["mode"])) {
|
||||
$dsn .= " sslmode='" . $ssl["mode"] . "'";
|
||||
}
|
||||
|
||||
$this->dsn($dsn, $username, $password);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -212,13 +229,13 @@ if (isset($_GET["pgsql"])) {
|
||||
return $query;
|
||||
}
|
||||
|
||||
function convertSearch($idf, $val, $field) {
|
||||
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 convertSearch($idf, array $where, array $field) {
|
||||
$textTypes = "char|text";
|
||||
if (strpos($where["op"], "LIKE") === false) {
|
||||
$textTypes .= "|date|time(stamp)?|boolean|uuid|inet|cidr|macaddr|" . number_type();
|
||||
}
|
||||
|
||||
return (preg_match("~$textTypes~", $field["type"]) ? $idf : "CAST($idf AS text)");
|
||||
}
|
||||
|
||||
function quoteBinary($s) {
|
||||
@@ -274,7 +291,9 @@ if (isset($_GET["pgsql"])) {
|
||||
}
|
||||
|
||||
function get_databases() {
|
||||
return get_vals("SELECT datname FROM pg_database WHERE has_database_privilege(datname, 'CONNECT') ORDER BY datname");
|
||||
return get_vals("SELECT d.datname FROM pg_database d JOIN pg_roles r ON d.datdba = r.oid
|
||||
WHERE d.datallowconn = TRUE AND has_database_privilege(d.datname, 'CONNECT') AND pg_has_role(r.rolname, 'USAGE')
|
||||
ORDER BY d.datname");
|
||||
}
|
||||
|
||||
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
|
||||
@@ -322,7 +341,7 @@ ORDER BY 1";
|
||||
|
||||
function table_status($name = "") {
|
||||
$return = array();
|
||||
foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_total_relation_size(c.oid) - pg_relation_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", " . (min_version(12) ? "''" : "CASE WHEN c.relhasoids THEN 'oid' ELSE '' END") . " AS \"Oid\", c.reltuples as \"Rows\", n.nspname
|
||||
foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_table_size(c.oid) AS \"Data_length\", pg_indexes_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", " . (min_version(12) ? "''" : "CASE WHEN c.relhasoids THEN 'oid' ELSE '' END") . " AS \"Oid\", c.reltuples as \"Rows\", n.nspname
|
||||
FROM pg_class c
|
||||
JOIN pg_namespace n ON(n.nspname = current_schema() AND n.oid = c.relnamespace)
|
||||
WHERE relkind IN ('r', 'm', 'v', 'f', 'p')
|
||||
@@ -376,7 +395,7 @@ ORDER BY a.attnum"
|
||||
}
|
||||
$row["null"] = !$row["attnotnull"];
|
||||
$row["auto_increment"] = $row['attidentity'] || preg_match('~^nextval\(~i', $row["default"]);
|
||||
$row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
|
||||
$row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1, "where" => 1, "order" => 1);
|
||||
if (preg_match('~(.+)::[^,)]+(.*)~', $row["default"], $match)) {
|
||||
$row["default"] = ($match[1] == "NULL" ? null : idf_unescape($match[1]) . $match[2]);
|
||||
}
|
||||
@@ -469,7 +488,7 @@ ORDER BY connamespace, conname") as $row) {
|
||||
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);
|
||||
return nl2br($return);
|
||||
}
|
||||
|
||||
function create_database($db, $collation) {
|
||||
@@ -773,7 +792,7 @@ AND typelem = 0"
|
||||
$return = "CREATE TABLE " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " (\n ";
|
||||
|
||||
// fields' definitions
|
||||
foreach ($fields as $field_name => $field) {
|
||||
foreach ($fields as $field) {
|
||||
$part = idf_escape($field['field']) . ' ' . $field['full_type']
|
||||
. default_value($field)
|
||||
. ($field['attnotnull'] ? " NOT NULL" : "");
|
||||
@@ -782,10 +801,11 @@ AND typelem = 0"
|
||||
// sequences for fields
|
||||
if (preg_match('~nextval\(\'([^\']+)\'\)~', $field['default'], $matches)) {
|
||||
$sequence_name = $matches[1];
|
||||
$sq = reset(get_rows(min_version(10)
|
||||
? "SELECT *, cache_size AS cache_value FROM pg_sequences WHERE schemaname = current_schema() AND sequencename = " . q($sequence_name)
|
||||
$rows = get_rows(min_version(10)
|
||||
? "SELECT *, cache_size AS cache_value FROM pg_sequences WHERE schemaname = current_schema() AND sequencename = " . q(idf_unescape($sequence_name))
|
||||
: "SELECT * FROM $sequence_name"
|
||||
));
|
||||
);
|
||||
$sq = reset($rows);
|
||||
$sequences[] = ($style == "DROP+CREATE" ? "DROP SEQUENCE IF EXISTS $sequence_name;\n" : "")
|
||||
. "CREATE SEQUENCE $sequence_name INCREMENT $sq[increment_by] MINVALUE $sq[min_value] MAXVALUE $sq[max_value]" . ($auto_increment && $sq['last_value'] ? " START $sq[last_value]" : "") . " CACHE $sq[cache_value];";
|
||||
}
|
||||
@@ -858,6 +878,23 @@ AND typelem = 0"
|
||||
return get_key_vals("SHOW ALL");
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
function is_strict_mode() {
|
||||
return false;
|
||||
}
|
||||
|
||||
function is_c_style_escapes() {
|
||||
static $c_style = null;
|
||||
|
||||
if ($c_style === null) {
|
||||
$c_style = get_vals("SHOW standard_conforming_strings")[0] == "off";
|
||||
}
|
||||
|
||||
return $c_style;
|
||||
}
|
||||
|
||||
function process_list() {
|
||||
return get_rows("SELECT * FROM pg_stat_activity ORDER BY " . (min_version(9.2) ? "pid" : "procpid"));
|
||||
}
|
||||
@@ -897,7 +934,7 @@ AND typelem = 0"
|
||||
lang('Date and time') => array("date" => 13, "time" => 17, "timestamp" => 20, "timestamptz" => 21, "interval" => 0),
|
||||
lang('Strings') => array("character" => 0, "character varying" => 0, "text" => 0, "tsquery" => 0, "tsvector" => 0, "uuid" => 0, "xml" => 0),
|
||||
lang('Binary') => array("bit" => 0, "bit varying" => 0, "bytea" => 0),
|
||||
lang('Network') => array("cidr" => 43, "inet" => 43, "macaddr" => 17, "txid_snapshot" => 0),
|
||||
lang('Network') => array("cidr" => 43, "inet" => 43, "macaddr" => 17, "macaddr8" => 23, "txid_snapshot" => 0),
|
||||
lang('Geometry') => array("box" => 0, "circle" => 0, "line" => 0, "lseg" => 0, "path" => 0, "point" => 0, "polygon" => 0),
|
||||
) as $key => $val) { //! can be retrieved from pg_type
|
||||
$types += $val;
|
||||
@@ -909,7 +946,9 @@ AND typelem = 0"
|
||||
'types' => $types,
|
||||
'structured_types' => $structured_types,
|
||||
'unsigned' => array(),
|
||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"), // no "SQL" to avoid CSRF
|
||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "~", "~*", "!~", "!~*", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"), // no "SQL" to avoid CSRF
|
||||
'operator_like' => "LIKE %%",
|
||||
'operator_regexp' => '~*',
|
||||
'functions' => array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper"),
|
||||
'grouping' => array("avg", "count", "count distinct", "max", "min", "sum"),
|
||||
'edit_functions' => array(
|
||||
@@ -922,6 +961,7 @@ AND typelem = 0"
|
||||
"char|text" => "||",
|
||||
)
|
||||
),
|
||||
'c_style_escapes' => true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -321,7 +321,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
"full_type" => $type,
|
||||
"default" => (preg_match("~'(.*)'~", $default, $match) ? str_replace("''", "'", $match[1]) : ($default == "NULL" ? null : $default)),
|
||||
"null" => !$row["notnull"],
|
||||
"privileges" => array("select" => 1, "insert" => 1, "update" => 1),
|
||||
"privileges" => array("select" => 1, "insert" => 1, "update" => 1, "where" => 1, "order" => 1),
|
||||
"primary" => $row["pk"],
|
||||
);
|
||||
if ($row["pk"]) {
|
||||
@@ -764,6 +764,17 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
function is_strict_mode() {
|
||||
return false;
|
||||
}
|
||||
|
||||
function is_c_style_escapes() {
|
||||
return true;
|
||||
}
|
||||
|
||||
function show_status() {
|
||||
$return = array();
|
||||
foreach (get_vals("PRAGMA compile_options") as $option) {
|
||||
@@ -793,6 +804,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
'structured_types' => array_keys($types),
|
||||
'unsigned' => array(),
|
||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"), // REGEXP can be user defined function
|
||||
'operator_like' => "LIKE %%",
|
||||
'functions' => array("hex", "length", "lower", "round", "unixepoch", "upper"),
|
||||
'grouping' => array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"),
|
||||
'edit_functions' => array(
|
||||
|
@@ -147,16 +147,14 @@ if ($jush == "sql") { //! use insertUpdate() in all drivers
|
||||
}
|
||||
parse_str($_COOKIE["adminer_export"], $row);
|
||||
if (!$row) {
|
||||
$row = array("output" => "text", "format" => "sql", "db_style" => (DB != "" ? "" : "CREATE"), "table_style" => "DROP+CREATE", "data_style" => "INSERT");
|
||||
$row = array("output" => "file", "format" => "sql", "db_style" => (DB != "" ? "" : "CREATE"), "table_style" => "DROP+CREATE", "data_style" => "INSERT");
|
||||
}
|
||||
if (!isset($row["events"])) { // backwards compatibility
|
||||
$row["routines"] = $row["events"] = ($_GET["dump"] == "");
|
||||
$row["triggers"] = $row["table_style"];
|
||||
}
|
||||
|
||||
echo "<tr><th>" . lang('Output') . "<td>" . html_select("output", $adminer->dumpOutput(), $row["output"], 0) . "\n"; // 0 - radio
|
||||
|
||||
echo "<tr><th>" . lang('Format') . "<td>" . html_select("format", $adminer->dumpFormat(), $row["format"], 0) . "\n"; // 0 - radio
|
||||
echo "<tr><th>" . lang('Format') . "<td>" . html_select("format", $adminer->dumpFormat(), $row["format"], false) . "\n"; // false = radio
|
||||
|
||||
echo ($jush == "sqlite" ? "" : "<tr><th>" . lang('Database') . "<td>" . html_select('db_style', $db_style, $row["db_style"])
|
||||
. (support("routine") ? checkbox("routines", 1, $row["routines"], lang('Routines')) : "")
|
||||
@@ -169,6 +167,9 @@ echo "<tr><th>" . lang('Tables') . "<td>" . html_select('table_style', $table_st
|
||||
;
|
||||
|
||||
echo "<tr><th>" . lang('Data') . "<td>" . html_select('data_style', $data_style, $row["data_style"]);
|
||||
|
||||
echo "<tr><th>" . lang('Output') . "<td>" . html_select("output", $adminer->dumpOutput(), $row["output"], false) . "\n"; // false = radio
|
||||
|
||||
?>
|
||||
</table>
|
||||
<p><input type="submit" value="<?php echo lang('Export'); ?>">
|
||||
@@ -181,8 +182,8 @@ $prefixes = array();
|
||||
if (DB != "") {
|
||||
$checked = ($TABLE != "" ? "" : " checked");
|
||||
echo "<thead><tr>";
|
||||
echo "<th style='text-align: left;'><label class='block'><input type='checkbox' id='check-tables'$checked>" . lang('Tables') . "</label>" . script("qs('#check-tables').onclick = partial(formCheck, /^tables\\[/);", "");
|
||||
echo "<th style='text-align: right;'><label class='block'>" . lang('Data') . "<input type='checkbox' id='check-data'$checked></label>" . script("qs('#check-data').onclick = partial(formCheck, /^data\\[/);", "");
|
||||
echo "<th style='text-align: left;'><label class='block'><input type='checkbox' id='check-tables'$checked>" . lang('Tables') . "</label>" . script("gid('check-tables').onclick = partial(formCheck, /^tables\\[/);", "");
|
||||
echo "<th style='text-align: right;'><label class='block'>" . lang('Data') . "<input type='checkbox' id='check-data'$checked></label>" . script("gid('check-data').onclick = partial(formCheck, /^data\\[/);", "");
|
||||
echo "</thead>\n";
|
||||
|
||||
$views = "";
|
||||
@@ -207,7 +208,7 @@ if (DB != "") {
|
||||
} else {
|
||||
echo "<thead><tr><th style='text-align: left;'>";
|
||||
echo "<label class='block'><input type='checkbox' id='check-databases'" . ($TABLE == "" ? " checked" : "") . ">" . lang('Database') . "</label>";
|
||||
echo script("qs('#check-databases').onclick = partial(formCheck, /^databases\\[/);", "");
|
||||
echo script("gid('check-databases').onclick = partial(formCheck, /^databases\\[/);", "");
|
||||
echo "</thead>\n";
|
||||
$databases = $adminer->databases();
|
||||
if ($databases) {
|
||||
|
13
adminer/elastic.php
Normal file
13
adminer/elastic.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
function adminer_object() {
|
||||
include_once "../plugins/plugin.php";
|
||||
include_once "../plugins/login-password-less.php";
|
||||
include_once "../plugins/drivers/elastic.php";
|
||||
include_once "../plugins/drivers/elastic5.php";
|
||||
return new AdminerPlugin([
|
||||
// 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";
|
@@ -6,13 +6,13 @@ if ($_GET["file"] == "favicon.ico") {
|
||||
echo lzw_decompress(compile_file('../adminer/static/favicon.ico', 'lzw_compress'));
|
||||
} elseif ($_GET["file"] == "default.css") {
|
||||
header("Content-Type: text/css; charset=utf-8");
|
||||
echo lzw_decompress(compile_file('../adminer/static/default.css;../externals/jush/jush.css', 'minify_css'));
|
||||
echo lzw_decompress(compile_file('../adminer/static/default.css;../vendor/vrana/jush/jush.css', 'minify_css'));
|
||||
} elseif ($_GET["file"] == "functions.js") {
|
||||
header("Content-Type: text/javascript; charset=utf-8");
|
||||
echo lzw_decompress(compile_file('../adminer/static/functions.js;static/editing.js', 'minify_js'));
|
||||
} elseif ($_GET["file"] == "jush.js") {
|
||||
header("Content-Type: text/javascript; charset=utf-8");
|
||||
echo lzw_decompress(compile_file('../externals/jush/modules/jush.js;../externals/jush/modules/jush-textarea.js;../externals/jush/modules/jush-txt.js;../externals/jush/modules/jush-js.js;../externals/jush/modules/jush-sql.js;../externals/jush/modules/jush-pgsql.js;../externals/jush/modules/jush-sqlite.js;../externals/jush/modules/jush-mssql.js;../externals/jush/modules/jush-oracle.js;../externals/jush/modules/jush-simpledb.js', 'minify_js'));
|
||||
echo lzw_decompress(compile_file('../vendor/vrana/jush/modules/jush.js;../vendor/vrana/jush/modules/jush-textarea.js;../vendor/vrana/jush/modules/jush-txt.js;../vendor/vrana/jush/modules/jush-js.js;../vendor/vrana/jush/modules/jush-sql.js;../vendor/vrana/jush/modules/jush-pgsql.js;../vendor/vrana/jush/modules/jush-sqlite.js;../vendor/vrana/jush/modules/jush-mssql.js;../vendor/vrana/jush/modules/jush-oracle.js;../vendor/vrana/jush/modules/jush-simpledb.js', 'minify_js'));
|
||||
} else {
|
||||
header("Content-Type: image/gif");
|
||||
switch ($_GET["file"]) {
|
||||
|
@@ -3,7 +3,11 @@
|
||||
|
||||
class Adminer {
|
||||
/** @var array operators used in select, null for all operators */
|
||||
var $operators;
|
||||
var $operators = null;
|
||||
/** @var string operator for LIKE condition */
|
||||
var $operator_like = null;
|
||||
/** @var string operator for regular expression condition */
|
||||
var $operator_regexp = null;
|
||||
|
||||
/** Name in title and navigation
|
||||
* @return string HTML code
|
||||
@@ -25,12 +29,16 @@ class Adminer {
|
||||
function connectSsl() {
|
||||
}
|
||||
|
||||
/** Get key used for permanent login
|
||||
* @param bool
|
||||
* @return string cryptic string which gets combined with password or false in case of an error
|
||||
*/
|
||||
/**
|
||||
* Gets a private key used for permanent login.
|
||||
*
|
||||
* @param bool $create
|
||||
*
|
||||
* @return string|false Cryptic string which gets combined with password or false in case of an error.
|
||||
* @throws \Random\RandomException
|
||||
*/
|
||||
function permanentLogin($create = false) {
|
||||
return password_file($create);
|
||||
return get_private_key($create);
|
||||
}
|
||||
|
||||
/** Return key used to group brute force attacks; behind a reverse proxy, you want to return the last part of X-Forwarded-For
|
||||
@@ -39,7 +47,7 @@ class Adminer {
|
||||
function bruteForceKey() {
|
||||
return $_SERVER["REMOTE_ADDR"];
|
||||
}
|
||||
|
||||
|
||||
/** Get server name displayed in breadcrumbs
|
||||
* @param string
|
||||
* @return string HTML code or null
|
||||
@@ -96,7 +104,7 @@ class Adminer {
|
||||
*/
|
||||
function head() {
|
||||
?>
|
||||
<link rel="stylesheet" type="text/css" href="../externals/jush/jush.css">
|
||||
<link rel="stylesheet" type="text/css" href="../vendor/vrana/jush/jush.css">
|
||||
<?php
|
||||
return true;
|
||||
}
|
||||
@@ -121,14 +129,14 @@ class Adminer {
|
||||
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('username', '<tr><th>' . lang('Username') . '<td>', '<input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocomplete="username" autocapitalize="off">' . script("focus(gid('username')); gid('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
|
||||
@@ -231,17 +239,25 @@ class Adminer {
|
||||
*/
|
||||
function selectQuery($query, $start, $failed = false) {
|
||||
global $jush, $driver;
|
||||
$return = "</p>\n"; // required for IE9 inline edit
|
||||
|
||||
$supportSql = support("sql");
|
||||
|
||||
$result = "<p>"
|
||||
. "<code class='jush-$jush'>" . h(str_replace("\n", " ", $query)) . "</code> "
|
||||
. "<span class='time'>(" . format_time($start) . ")</span>"
|
||||
. ($supportSql ? " <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a>" : "");
|
||||
|
||||
if (!$failed && ($warnings = $driver->warnings())) {
|
||||
$id = "warnings";
|
||||
$return = ", <a href='#$id'>" . lang('Warnings') . "</a>" . script("qsl('a').onclick = partial(toggle, '$id');", "")
|
||||
. "$return<div id='$id' class='hidden'>\n$warnings</div>\n"
|
||||
;
|
||||
$result .= ($supportSql ? "," : "")
|
||||
. " <a href='#$id'>" . lang('Warnings') . "</a>" . script("qsl('a').onclick = partial(toggle, '$id');", "")
|
||||
. "</p>\n"
|
||||
. "<div id='$id' class='hidden'>\n$warnings</div>\n";
|
||||
} else {
|
||||
$result .= "</p>\n";
|
||||
}
|
||||
return "<p><code class='jush-$jush'>" . h(str_replace("\n", " ", $query)) . "</code> <span class='time'>(" . format_time($start) . ")</span>"
|
||||
. (support("sql") ? " <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a>" : "")
|
||||
. $return
|
||||
;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/** Query printed in SQL command before execution
|
||||
@@ -293,7 +309,7 @@ class Adminer {
|
||||
if (preg_match('~json~', $field["type"])) {
|
||||
$return = "<code class='jush-js'>$return</code>";
|
||||
}
|
||||
return ($link ? "<a href='" . h($link) . "'" . (is_url($link) ? target_blank() : "") . ">$return</a>" : $return);
|
||||
return ($link ? "<a href='" . h($link) . "'" . (is_web_url($link) ? target_blank() : "") . ">$return</a>" : $return);
|
||||
}
|
||||
|
||||
/** Value conversion used in select and edit
|
||||
@@ -302,6 +318,11 @@ class Adminer {
|
||||
* @return string
|
||||
*/
|
||||
function editVal($val, $field) {
|
||||
// Format Elasticsearch boolean value, but do not touch PostgreSQL boolean that use string value 't' or 'f'.
|
||||
if ($field["type"] == "boolean" && is_bool($val)) {
|
||||
return $val ? "true" : "false";
|
||||
}
|
||||
|
||||
return $val;
|
||||
}
|
||||
|
||||
@@ -326,15 +347,40 @@ class Adminer {
|
||||
echo "</div>\n";
|
||||
}
|
||||
|
||||
function tablePartitionsPrint($partition_info) {
|
||||
$showList = $partition_info["partition_by"] == "RANGE" || $partition_info["partition_by"] == "LIST";
|
||||
|
||||
echo "<p>";
|
||||
echo "<code>{$partition_info["partition_by"]} ({$partition_info["partition"]})</code>";
|
||||
if (!$showList) {
|
||||
echo " " . lang('Partitions') . ": " . h($partition_info["partitions"]);
|
||||
}
|
||||
echo "</p>";
|
||||
|
||||
if ($showList) {
|
||||
echo "<table>\n";
|
||||
echo "<thead><tr><th>" . lang('Partition') . "</th><td>" . lang('Values') . "</td></tr></thead>\n";
|
||||
|
||||
foreach ($partition_info["partition_names"] as $key => $name) {
|
||||
echo "<tr><th>" . h($name) . "</th><td>" . h($partition_info["partition_values"][$key]) . "\n";
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
}
|
||||
}
|
||||
|
||||
/** Print list of indexes on table in tabular format
|
||||
* @param array data about all indexes on a table
|
||||
* @return null
|
||||
*/
|
||||
function tableIndexesPrint($indexes) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<table>\n";
|
||||
echo "<thead><tr><th>" . lang('Type') . "</th><td>" . lang('Column (length)') . "</td></tr></thead>\n";
|
||||
|
||||
foreach ($indexes as $name => $index) {
|
||||
ksort($index["columns"]); // enforce correct columns order
|
||||
$print = array();
|
||||
$print = [];
|
||||
|
||||
foreach ($index["columns"] as $key => $val) {
|
||||
$print[] = "<i>" . h($val) . "</i>"
|
||||
. ($index["lengths"][$key] ? "(" . $index["lengths"][$key] . ")" : "")
|
||||
@@ -343,92 +389,127 @@ class Adminer {
|
||||
}
|
||||
echo "<tr title='" . h($name) . "'><th>$index[type]<td>" . implode(", ", $print) . "\n";
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
}
|
||||
|
||||
/** Print columns box in select
|
||||
* @param array result of selectColumnsProcess()[0]
|
||||
* @param array selectable columns
|
||||
* @return null
|
||||
*/
|
||||
/**
|
||||
* Prints columns box in select filter.
|
||||
*
|
||||
* @param array $select result of selectColumnsProcess()[0]
|
||||
* @param array $columns selectable columns
|
||||
*/
|
||||
function selectColumnsPrint($select, $columns) {
|
||||
global $functions, $grouping;
|
||||
print_fieldset("select", lang('Select'), $select);
|
||||
|
||||
print_fieldset("select", lang('Select'), $select, true);
|
||||
|
||||
$_GET["columns"][""] = [];
|
||||
$i = 0;
|
||||
$select[""] = array();
|
||||
foreach ($select as $key => $val) {
|
||||
$val = $_GET["columns"][$key];
|
||||
|
||||
foreach ($_GET["columns"] as $key => $val) {
|
||||
if ($key != "" && $val["col"] == "") continue;
|
||||
|
||||
$column = select_input(
|
||||
" name='columns[$i][col]'",
|
||||
"name='columns[$i][col]'",
|
||||
$columns,
|
||||
$val["col"],
|
||||
($key !== "" ? "selectFieldChange" : "selectAddRow")
|
||||
$key !== "" ? "selectFieldChange" : "selectAddRow"
|
||||
);
|
||||
echo "<div>" . ($functions || $grouping ? "<select name='columns[$i][fun]'>"
|
||||
. optionlist(array(-1 => "") + array_filter(array(lang('Functions') => $functions, lang('Aggregation') => $grouping)), $val["fun"]) . "</select>"
|
||||
. on_help("getTarget(event).value && getTarget(event).value.replace(/ |\$/, '(') + ')'", 1)
|
||||
. script("qsl('select').onchange = function () { helpClose();" . ($key !== "" ? "" : " qsl('select, input', this.parentNode).onchange();") . " };", "")
|
||||
. "($column)" : $column) . "</div>\n";
|
||||
|
||||
echo "<div ", ($key != "" ? "" : "class='no-sort'"), ">",
|
||||
"<span class='jsonly handle'></span>";
|
||||
|
||||
if ($functions || $grouping) {
|
||||
echo "<select name='columns[$i][fun]'>",
|
||||
optionlist([-1 => ""] + array_filter([lang('Functions') => $functions, lang('Aggregation') => $grouping]), $val["fun"]),
|
||||
"</select>",
|
||||
help_script_command("value && value.replace(/ |\$/, '(') + ')'", true),
|
||||
script("qsl('select').onchange = (event) => { " . ($key !== "" ? "" : " qsl('select, input:not(.remove)', event.target.parentNode).onchange();") . " };", ""),
|
||||
"($column)";
|
||||
} else {
|
||||
echo $column;
|
||||
}
|
||||
|
||||
echo " <input type='image' src='../adminer/static/cross.gif' class='jsonly icon remove' title='" . h(lang('Remove')) . "' alt='x'>",
|
||||
script("qsl('#fieldset-select .remove').onclick = selectRemoveRow;", ""),
|
||||
"</div>\n";
|
||||
|
||||
$i++;
|
||||
}
|
||||
echo "</div></fieldset>\n";
|
||||
|
||||
echo "</div>", script("initSortable('#fieldset-select');"), "</fieldset>\n";
|
||||
}
|
||||
|
||||
/** Print search box in select
|
||||
* @param array result of selectSearchProcess()
|
||||
* @param array selectable columns
|
||||
* @param array
|
||||
* @return null
|
||||
*/
|
||||
/**
|
||||
* Prints search box in select.
|
||||
*
|
||||
* @param array $where result of selectSearchProcess()
|
||||
* @param array $columns selectable columns
|
||||
*/
|
||||
function selectSearchPrint($where, $columns, $indexes) {
|
||||
print_fieldset("search", lang('Search'), $where);
|
||||
|
||||
foreach ($indexes as $i => $index) {
|
||||
if ($index["type"] == "FULLTEXT") {
|
||||
echo "<div>(<i>" . implode("</i>, <i>", array_map('h', $index["columns"])) . "</i>) AGAINST";
|
||||
echo " <input type='search' name='fulltext[$i]' value='" . h($_GET["fulltext"][$i]) . "'>";
|
||||
echo script("qsl('input').oninput = selectFieldChange;", "");
|
||||
echo checkbox("boolean[$i]", 1, isset($_GET["boolean"][$i]), "BOOL");
|
||||
echo "</div>\n";
|
||||
echo "<div>(<i>" . implode("</i>, <i>", array_map('h', $index["columns"])) . "</i>) AGAINST",
|
||||
" <input type='search' name='fulltext[$i]' value='" . h($_GET["fulltext"][$i]) . "'>",
|
||||
script("qsl('input').oninput = selectFieldChange;", ""),
|
||||
checkbox("boolean[$i]", 1, isset($_GET["boolean"][$i]), "BOOL"),
|
||||
"</div>\n";
|
||||
}
|
||||
}
|
||||
|
||||
$change_next = "this.parentNode.firstChild.onchange();";
|
||||
foreach (array_merge((array) $_GET["where"], array(array())) as $i => $val) {
|
||||
if (!$val || ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators))) {
|
||||
echo "<div>" . select_input(
|
||||
" name='where[$i][col]'",
|
||||
$columns,
|
||||
$val["col"],
|
||||
($val ? "selectFieldChange" : "selectAddRow"),
|
||||
"(" . lang('anywhere') . ")"
|
||||
);
|
||||
echo html_select("where[$i][op]", $this->operators, $val["op"], $change_next);
|
||||
echo "<input type='search' name='where[$i][val]' value='" . h($val["val"]) . "'>";
|
||||
echo script("mixin(qsl('input'), {oninput: function () { $change_next }, onkeydown: selectSearchKeydown, onsearch: selectSearchSearch});", "");
|
||||
echo "</div>\n";
|
||||
echo "<div>",
|
||||
select_input(
|
||||
" name='where[$i][col]'",
|
||||
$columns,
|
||||
$val["col"],
|
||||
($val ? "selectFieldChange" : "selectAddRow"),
|
||||
"(" . lang('anywhere') . ")"
|
||||
),
|
||||
html_select("where[$i][op]", $this->operators, $val["op"], $change_next),
|
||||
"<input type='search' name='where[$i][val]' value='" . h($val["val"]) . "'>",
|
||||
script("mixin(qsl('input'), {oninput: function () { $change_next }, onkeydown: selectSearchKeydown, onsearch: selectSearchSearch});", ""),
|
||||
" <input type='image' src='../adminer/static/cross.gif' class='jsonly icon remove' title='" . h(lang('Remove')) . "' alt='x'>",
|
||||
script('qsl("#fieldset-search .remove").onclick = selectRemoveRow;', ""),
|
||||
"</div>\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
|
||||
/** Print order box in select
|
||||
* @param array result of selectOrderProcess()
|
||||
* @param array selectable columns
|
||||
* @param array
|
||||
* @return null
|
||||
*/
|
||||
/**
|
||||
* Prints order box in select filter.
|
||||
*
|
||||
* @param array $order result of selectOrderProcess()
|
||||
* @param array $columns selectable columns
|
||||
*/
|
||||
function selectOrderPrint($order, $columns, $indexes) {
|
||||
print_fieldset("sort", lang('Sort'), $order);
|
||||
print_fieldset("sort", lang('Sort'), $order, true);
|
||||
|
||||
$_GET["order"][""] = "";
|
||||
$i = 0;
|
||||
|
||||
foreach ((array) $_GET["order"] as $key => $val) {
|
||||
if ($val != "") {
|
||||
echo "<div>" . select_input(" name='order[$i]'", $columns, $val, "selectFieldChange");
|
||||
echo checkbox("desc[$i]", 1, isset($_GET["desc"][$key]), lang('descending')) . "</div>\n";
|
||||
$i++;
|
||||
}
|
||||
if ($key != "" && $val == "") continue;
|
||||
|
||||
echo "<div ", ($key != "" ? "" : "class='no-sort'"), ">",
|
||||
"<span class='jsonly handle'></span>",
|
||||
select_input("name='order[$i]'", $columns, $val, $key !== "" ? "selectFieldChange" : "selectAddRow"),
|
||||
checkbox("desc[$i]", 1, isset($_GET["desc"][$key]), lang('descending')),
|
||||
" <input type='image' src='../adminer/static/cross.gif' class='jsonly icon remove' title='" . h(lang('Remove')) . "' alt='x'>",
|
||||
script('qsl("#fieldset-sort .remove").onclick = selectRemoveRow;', ""),
|
||||
"</div>\n";
|
||||
|
||||
$i++;
|
||||
}
|
||||
echo "<div>" . select_input(" name='order[$i]'", $columns, "", "selectAddRow");
|
||||
echo checkbox("desc[$i]", 1, false, lang('descending')) . "</div>\n";
|
||||
echo "</div></fieldset>\n";
|
||||
|
||||
echo "</div>", script("initSortable('#fieldset-sort');"), "</fieldset>\n";
|
||||
}
|
||||
|
||||
/** Print limit box in select
|
||||
@@ -476,11 +557,11 @@ class Adminer {
|
||||
json_row($key);
|
||||
}
|
||||
echo ";\n";
|
||||
echo "selectFieldChange.call(qs('#form')['select']);\n";
|
||||
echo "selectFieldChange.call(gid('form')['select']);\n";
|
||||
echo "</script>\n";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
|
||||
|
||||
/** Print command box in select
|
||||
* @return bool whether to print default commands
|
||||
*/
|
||||
@@ -529,49 +610,62 @@ class Adminer {
|
||||
* @return array expressions to join by AND
|
||||
*/
|
||||
function selectSearchProcess($fields, $indexes) {
|
||||
global $connection, $driver;
|
||||
$return = array();
|
||||
global $driver;
|
||||
|
||||
$return = [];
|
||||
|
||||
foreach ($indexes as $i => $index) {
|
||||
if ($index["type"] == "FULLTEXT" && $_GET["fulltext"][$i] != "") {
|
||||
$return[] = "MATCH (" . implode(", ", array_map('idf_escape', $index["columns"])) . ") AGAINST (" . q($_GET["fulltext"][$i]) . (isset($_GET["boolean"][$i]) ? " IN BOOLEAN MODE" : "") . ")";
|
||||
}
|
||||
}
|
||||
foreach ((array) $_GET["where"] as $key => $val) {
|
||||
if ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators)) {
|
||||
|
||||
foreach ((array) $_GET["where"] as $where) {
|
||||
$col = $where["col"];
|
||||
$op = $where["op"];
|
||||
$val = $where["val"];
|
||||
|
||||
if ("$col$val" != "" && in_array($op, $this->operators)) {
|
||||
$prefix = "";
|
||||
$cond = " $val[op]";
|
||||
if (preg_match('~IN$~', $val["op"])) {
|
||||
$in = process_length($val["val"]);
|
||||
$cond = " $op";
|
||||
|
||||
if (preg_match('~IN$~', $op)) {
|
||||
$in = process_length($val);
|
||||
$cond .= " " . ($in != "" ? $in : "(NULL)");
|
||||
} elseif ($val["op"] == "SQL") {
|
||||
$cond = " $val[val]"; // SQL injection
|
||||
} elseif ($val["op"] == "LIKE %%") {
|
||||
$cond = " LIKE " . $this->processInput($fields[$val["col"]], "%$val[val]%");
|
||||
} elseif ($val["op"] == "ILIKE %%") {
|
||||
$cond = " ILIKE " . $this->processInput($fields[$val["col"]], "%$val[val]%");
|
||||
} elseif ($val["op"] == "FIND_IN_SET") {
|
||||
$prefix = "$val[op](" . q($val["val"]) . ", ";
|
||||
} elseif ($op == "SQL") {
|
||||
$cond = " $val"; // SQL injection
|
||||
} elseif ($op == "LIKE %%") {
|
||||
$cond = " LIKE " . $this->processInput($fields[$col], "%$val%");
|
||||
} elseif ($op == "ILIKE %%") {
|
||||
$cond = " ILIKE " . $this->processInput($fields[$col], "%$val%");
|
||||
} elseif ($op == "FIND_IN_SET") {
|
||||
$prefix = "$op(" . q($val) . ", ";
|
||||
$cond = ")";
|
||||
} elseif (!preg_match('~NULL$~', $val["op"])) {
|
||||
$cond .= " " . $this->processInput($fields[$val["col"]], $val["val"]);
|
||||
} elseif (!preg_match('~NULL$~', $op)) {
|
||||
$cond .= " " . $this->processInput($fields[$col], $val);
|
||||
}
|
||||
if ($val["col"] != "") {
|
||||
$return[] = $prefix . $driver->convertSearch(idf_escape($val["col"]), $val, $fields[$val["col"]]) . $cond;
|
||||
|
||||
if ($col != "") {
|
||||
$return[] = $prefix . $driver->convertSearch(idf_escape($col), $where, $fields[$col]) . $cond;
|
||||
} else {
|
||||
// find anywhere
|
||||
$cols = array();
|
||||
foreach ($fields as $name => $field) {
|
||||
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"]))
|
||||
&& (!preg_match('~date|timestamp~', $field["type"]) || preg_match('~^\d+-\d+-\d+~', $val["val"]))
|
||||
if (isset($field["privileges"]["where"])
|
||||
&& (preg_match('~^[-\d.' . (preg_match('~IN$~', $op) ? ',' : '') . ']+$~', $val) || !preg_match('~' . number_type() . '|bit~', $field["type"]))
|
||||
&& (!preg_match("~[\x80-\xFF]~", $val) || preg_match('~char|text|enum|set~', $field["type"]))
|
||||
&& (!preg_match('~date|timestamp~', $field["type"]) || preg_match('~^\d+-\d+-\d+~', $val))
|
||||
&& (!preg_match('~^elastic~', DRIVER) || $field["type"] != "boolean" || preg_match('~true|false~', $val)) // Elasticsearch needs boolean value properly formatted.
|
||||
&& (!preg_match('~^elastic~', DRIVER) || strpos($op, "regexp") === false || preg_match('~text|keyword~', $field["type"])) // Elasticsearch can use regexp only on text and keyword fields.
|
||||
) {
|
||||
$cols[] = $prefix . $driver->convertSearch(idf_escape($name), $val, $field) . $cond;
|
||||
$cols[] = $prefix . $driver->convertSearch(idf_escape($name), $where, $field) . $cond;
|
||||
}
|
||||
}
|
||||
$return[] = ($cols ? "(" . implode(" OR ", $cols) . ")" : "1 = 0");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
@@ -702,7 +796,7 @@ class Adminer {
|
||||
* @param string
|
||||
* @return string custom input field or empty string for default
|
||||
*/
|
||||
function editInput($table, $field, $attrs, $value) {
|
||||
function editInput($table, $field, $attrs, $value, $function) {
|
||||
if ($field["type"] == "enum") {
|
||||
return (isset($_GET["select"]) ? "<label><input type='radio'$attrs value='-1' checked><i>" . lang('original') . "</i></label> " : "")
|
||||
. ($field["null"] ? "<label><input type='radio'$attrs value=''" . ($value !== null || isset($_GET["select"]) ? "" : " checked") . "><i>NULL</i></label> " : "")
|
||||
@@ -754,10 +848,11 @@ class Adminer {
|
||||
* @return array
|
||||
*/
|
||||
function dumpOutput() {
|
||||
$return = array('text' => lang('open'), 'file' => lang('save'));
|
||||
$return = array('file' => lang('save'), 'text' => lang('open'));
|
||||
if (function_exists('gzencode')) {
|
||||
$return['gz'] = 'gzip';
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
@@ -831,6 +926,7 @@ class Adminer {
|
||||
$insert = "";
|
||||
$buffer = "";
|
||||
$keys = array();
|
||||
$generatedKeys = array();
|
||||
$suffix = "";
|
||||
$fetch_function = ($table != '' ? 'fetch_assoc' : 'fetch_row');
|
||||
while ($row = $result->$fetch_function()) {
|
||||
@@ -838,6 +934,10 @@ class Adminer {
|
||||
$values = array();
|
||||
foreach ($row as $val) {
|
||||
$field = $result->fetch_field();
|
||||
if (!empty($fields[$field->name]['generated'])) {
|
||||
$generatedKeys[$field->name] = true;
|
||||
continue;
|
||||
}
|
||||
$keys[] = $field->name;
|
||||
$key = idf_escape($field->name);
|
||||
$values[] = "$key = VALUES($key)";
|
||||
@@ -855,6 +955,10 @@ class Adminer {
|
||||
$insert = "INSERT INTO " . table($table) . " (" . implode(", ", array_map('idf_escape', $keys)) . ") VALUES";
|
||||
}
|
||||
foreach ($row as $key => $val) {
|
||||
if (isset($generatedKeys[$key])) {
|
||||
unset($row[$key]);
|
||||
continue;
|
||||
}
|
||||
$field = $fields[$key];
|
||||
$row[$key] = ($val !== null
|
||||
? unconvert_field($field, preg_match(number_type(), $field["type"]) && !preg_match('~\[~', $field["full_type"]) && is_numeric($val) ? $val : q(($val === false ? 0 : $val)))
|
||||
@@ -908,9 +1012,11 @@ class Adminer {
|
||||
return $ext;
|
||||
}
|
||||
|
||||
/** Set the path of the file for webserver load
|
||||
* @return string path of the sql dump file
|
||||
*/
|
||||
/**
|
||||
* Gets the path of the file for webserver load.
|
||||
*
|
||||
* @return string Path of the sql import file.
|
||||
*/
|
||||
function importServerPath() {
|
||||
return "adminer.sql";
|
||||
}
|
||||
@@ -934,8 +1040,15 @@ class Adminer {
|
||||
global $VERSION, $jush, $drivers, $connection;
|
||||
?>
|
||||
<h1>
|
||||
<?php echo $this->name(); ?> <span class="version"><?php echo $VERSION; ?></span>
|
||||
<a href="https://www.adminer.org/#download"<?php echo target_blank(); ?> id="version"><?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?></a>
|
||||
<?php echo $this->name(); ?>
|
||||
<?php if ($missing != "auth"): ?>
|
||||
<span class="version">
|
||||
<?php echo $VERSION; ?>
|
||||
<a href="https://github.com/pematon/adminer/releases"<?php echo target_blank(); ?> id="version">
|
||||
<?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?>
|
||||
</a>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</h1>
|
||||
<?php
|
||||
if ($missing == "auth") {
|
||||
@@ -946,14 +1059,21 @@ class Adminer {
|
||||
if ($password !== null) {
|
||||
$dbs = $_SESSION["db"][$vendor][$server][$username];
|
||||
foreach (($dbs ? array_keys($dbs) : array("")) as $db) {
|
||||
$output .= "<li><a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@" . $this->serverName($server) : "") . ($db != "" ? " - $db" : "")) . "</a>\n";
|
||||
$output .= "<li><a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>"
|
||||
. h($drivers[$vendor])
|
||||
. ($username != "" || $server != "" ? " - " : "")
|
||||
. h($username)
|
||||
. ($username != "" && $server != "" ? "@" : "")
|
||||
. ($server != "" ? h($this->serverName($server)) : "")
|
||||
. ($db != "" ? h(" - $db") : "")
|
||||
. "</a></li>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($output) {
|
||||
echo "<ul id='logins'>\n$output</ul>\n" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
echo "<ul id='logins'>\n$output</ul>\n" . script("mixin(gid('logins'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
}
|
||||
} else {
|
||||
$tables = array();
|
||||
@@ -961,12 +1081,12 @@ class Adminer {
|
||||
$connection->select_db(DB);
|
||||
$tables = table_status('', true);
|
||||
}
|
||||
echo script_src("../externals/jush/modules/jush.js");
|
||||
echo script_src("../externals/jush/modules/jush-textarea.js");
|
||||
echo script_src("../externals/jush/modules/jush-txt.js");
|
||||
echo script_src("../externals/jush/modules/jush-js.js");
|
||||
echo script_src("../vendor/vrana/jush/modules/jush.js");
|
||||
echo script_src("../vendor/vrana/jush/modules/jush-textarea.js");
|
||||
echo script_src("../vendor/vrana/jush/modules/jush-txt.js");
|
||||
echo script_src("../vendor/vrana/jush/modules/jush-js.js");
|
||||
if (support("sql")) {
|
||||
echo script_src("../externals/jush/modules/jush-$jush.js");
|
||||
echo script_src("../vendor/vrana/jush/modules/jush-$jush.js");
|
||||
?>
|
||||
<script<?php echo nonce(); ?>>
|
||||
<?php
|
||||
@@ -986,84 +1106,128 @@ bodyLoad('<?php echo (is_object($connection) ? preg_replace('~^(\d\.?\d).*~s', '
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
|
||||
$this->databasesPrint($missing);
|
||||
|
||||
$actions = [];
|
||||
if (DB == "" || !$missing) {
|
||||
echo "<p class='links'>" . (support("sql") ? "<a href='" . h(ME) . "sql='" . bold(isset($_GET["sql"]) && !isset($_GET["import"])) . ">" . lang('SQL command') . "</a>\n<a href='" . h(ME) . "import='" . bold(isset($_GET["import"])) . ">" . lang('Import') . "</a>\n" : "") . "";
|
||||
if (support("sql")) {
|
||||
$actions[] = "<a href='" . h(ME) . "sql='" . bold(isset($_GET["sql"]) && !isset($_GET["import"])) . ">" . lang('SQL command') . "</a>";
|
||||
$actions[] = "<a href='" . h(ME) . "import='" . bold(isset($_GET["import"])) . ">" . lang('Import') . "</a>";
|
||||
}
|
||||
if (support("dump")) {
|
||||
echo "<a href='" . h(ME) . "dump=" . urlencode(isset($_GET["table"]) ? $_GET["table"] : $_GET["select"]) . "' id='dump'" . bold(isset($_GET["dump"])) . ">" . lang('Export') . "</a>\n";
|
||||
$actions[] = "<a href='" . h(ME) . "dump=" . urlencode(isset($_GET["table"]) ? $_GET["table"] : $_GET["select"]) . "' id='dump'" . bold(isset($_GET["dump"])) . ">" . lang('Export') . "</a>";
|
||||
}
|
||||
}
|
||||
if ($_GET["ns"] !== "" && !$missing && DB != "") {
|
||||
echo '<a href="' . h(ME) . 'create="' . bold($_GET["create"] === "") . ">" . lang('Create table') . "</a>\n";
|
||||
if (!$tables) {
|
||||
echo "<p class='message'>" . lang('No tables.') . "\n";
|
||||
} else {
|
||||
$actions[] = '<a href="' . h(ME) . 'create="' . bold($_GET["create"] === "") . ">" . lang('Create table') . "</a>\n";
|
||||
}
|
||||
if ($actions) {
|
||||
echo "<p class='links'>" . implode("\n", $actions) . "</p>";
|
||||
}
|
||||
|
||||
if ($_GET["ns"] !== "" && !$missing && DB != "") {
|
||||
if ($tables) {
|
||||
$this->printTablesFilter();
|
||||
$this->tablesPrint($tables);
|
||||
} else {
|
||||
echo "<p class='message'>" . lang('No tables.') . "</p>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Prints databases list in menu
|
||||
* @param string
|
||||
* @return null
|
||||
*/
|
||||
/**
|
||||
* Prints databases select in menu.
|
||||
*
|
||||
* @param $missing string
|
||||
* @return null
|
||||
*/
|
||||
function databasesPrint($missing) {
|
||||
global $adminer, $connection;
|
||||
|
||||
$databases = $this->databases();
|
||||
if (DB && $databases && !in_array(DB, $databases)) {
|
||||
array_unshift($databases, DB);
|
||||
}
|
||||
?>
|
||||
<form action="">
|
||||
<p id="dbs">
|
||||
<?php
|
||||
|
||||
echo "<form action=''><p id='dbs'>";
|
||||
hidden_fields_get();
|
||||
$db_events = script("mixin(qsl('select'), {onmousedown: dbMouseDown, onchange: dbChange});");
|
||||
echo "<span title='" . lang('database') . "'>" . lang('DB') . "</span>: " . ($databases
|
||||
? "<select name='db'>" . optionlist(array("" => "") + $databases, DB) . "</select>$db_events"
|
||||
: "<input name='db' value='" . h(DB) . "' autocapitalize='off'>\n"
|
||||
);
|
||||
|
||||
if ($databases) {
|
||||
echo "<select id='database-select' name='db'>" . optionlist(["" => lang('Database')] + $databases, DB) . "</select>"
|
||||
. script("mixin(gid('database-select'), {onmousedown: dbMouseDown, onchange: dbChange});");
|
||||
} else {
|
||||
echo "<input id='database-select' name='db' value='" . h(DB) . "' autocapitalize='off'>\n";
|
||||
}
|
||||
echo "<input type='submit' value='" . lang('Use') . "'" . ($databases ? " class='hidden'" : "") . ">\n";
|
||||
if (support("scheme")) {
|
||||
if ($missing != "db" && DB != "" && $connection->select_db(DB)) {
|
||||
echo "<br>" . lang('Schema') . ": <select name='ns'>" . optionlist(array("" => "") + $adminer->schemas(), $_GET["ns"]) . "</select>$db_events";
|
||||
if ($_GET["ns"] != "") {
|
||||
set_schema($_GET["ns"]);
|
||||
}
|
||||
|
||||
if (support("scheme") && $missing != "db" && DB != "" && $connection->select_db(DB)) {
|
||||
echo "<br><select id='scheme-select' name='ns'>" . optionlist(["" => lang('Schema')] + $adminer->schemas(), $_GET["ns"]) . "</select>"
|
||||
. script("mixin(gid('scheme-select'), {onmousedown: dbMouseDown, onchange: dbChange});");
|
||||
|
||||
if ($_GET["ns"] != "") {
|
||||
set_schema($_GET["ns"]);
|
||||
}
|
||||
}
|
||||
foreach (array("import", "sql", "schema", "dump", "privileges") as $val) {
|
||||
|
||||
foreach (["import", "sql", "schema", "dump", "privileges"] as $val) {
|
||||
if (isset($_GET[$val])) {
|
||||
echo "<input type='hidden' name='$val' value=''>";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
echo "</p></form>\n";
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Prints table list in menu
|
||||
* @param array result of table_status('', true)
|
||||
* @return null
|
||||
*/
|
||||
function printTablesFilter()
|
||||
{
|
||||
global $adminer;
|
||||
|
||||
echo "<div class='tables-filter jsonly'>"
|
||||
. "<input id='tables-filter' autocomplete='off' placeholder='" . lang('Table') . "'>"
|
||||
. script("initTablesFilter(" . json_encode($adminer->database()) . ");")
|
||||
. "</div>\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints table list in menu.
|
||||
*
|
||||
* @param array $tables Result of table_status('', true)
|
||||
* @return null
|
||||
*/
|
||||
function tablesPrint($tables) {
|
||||
echo "<ul id='tables'>" . script("mixin(qs('#tables'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
echo "<ul id='tables'>" . script("mixin(gid('tables'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
|
||||
foreach ($tables as $table => $status) {
|
||||
$name = $this->tableName($status);
|
||||
if ($name != "") {
|
||||
$active = $table == $_GET["select"] || $table == $_GET["edit"];
|
||||
|
||||
echo '<li><a href="' . h(ME) . 'select=' . urlencode($table) . '"'
|
||||
. bold($_GET["select"] == $table || $_GET["edit"] == $table, "select")
|
||||
. " title='" . lang('Select data') . "'>" . lang('select') . "</a> "
|
||||
;
|
||||
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";
|
||||
. bold($active, "select")
|
||||
. " title='" . lang('Select data') . "'>" . lang('select') . "</a> ";
|
||||
|
||||
if (support("table") || support("indexes")) {
|
||||
$active = in_array($table, [$_GET["table"], $_GET["create"], $_GET["indexes"], $_GET["foreign"], $_GET["trigger"]]);
|
||||
$class = is_view($status) ? "view" : "structure";
|
||||
|
||||
echo '<a href="' . h(ME) . 'table=' . urlencode($table) . '"' . bold($active, $class)
|
||||
. " title='" . lang('Show structure') . "' data-main='true'>$name</a>";
|
||||
} else {
|
||||
echo "<span data-main='true'>$name</span>";
|
||||
}
|
||||
|
||||
echo "</li>\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "</ul>\n";
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
$connection = '';
|
||||
|
||||
$has_token = $_SESSION["token"];
|
||||
@@ -15,13 +16,78 @@ if ($_COOKIE["adminer_permanent"]) {
|
||||
}
|
||||
}
|
||||
|
||||
function add_invalid_login() {
|
||||
global $adminer;
|
||||
$fp = file_open_lock(get_temp_dir() . "/adminer.invalid");
|
||||
if (!$fp) {
|
||||
function validate_server_input() {
|
||||
if (SERVER == "") {
|
||||
return;
|
||||
}
|
||||
$invalids = unserialize(stream_get_contents($fp));
|
||||
|
||||
$parts = parse_url(SERVER);
|
||||
if (!$parts) {
|
||||
auth_error(lang('Invalid server or credentials.'));
|
||||
}
|
||||
|
||||
// Check proper URL parts.
|
||||
if (isset($parts['user']) || isset($parts['pass']) || isset($parts['query']) || isset($parts['fragment'])) {
|
||||
auth_error(lang('Invalid server or credentials.'));
|
||||
}
|
||||
|
||||
// Allow only HTTP/S scheme.
|
||||
if (isset($parts['scheme']) && !preg_match('~^(https?)$~i', $parts['scheme'])) {
|
||||
auth_error(lang('Invalid server or credentials.'));
|
||||
}
|
||||
|
||||
// Note that "localhost" and IP address without a scheme is parsed as a path.
|
||||
$hostPath = (isset($parts['host']) ? $parts['host'] : '') . (isset($parts['path']) ? $parts['path'] : '');
|
||||
|
||||
// Validate host.
|
||||
if (!is_server_host_valid($hostPath)) {
|
||||
auth_error(lang('Invalid server or credentials.'));
|
||||
}
|
||||
|
||||
// Check privileged ports.
|
||||
if (isset($parts['port']) && ($parts['port'] < 1024 || $parts['port'] > 65535)) {
|
||||
auth_error(lang('Connecting to privileged ports is not allowed.'));
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('is_server_host_valid')) {
|
||||
/**
|
||||
* @param string $hostPath
|
||||
* @return bool
|
||||
*/
|
||||
function is_server_host_valid($hostPath)
|
||||
{
|
||||
return strpos($hostPath, '/') === false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $server
|
||||
* @param string $username
|
||||
* @param string $password
|
||||
* @param string $defaultServer
|
||||
* @param int|null $defaultPort
|
||||
* @return string
|
||||
*/
|
||||
function build_http_url($server, $username, $password, $defaultServer, $defaultPort = null) {
|
||||
if (!preg_match('~^(https?://)?([^:]*)(:\d+)?$~', rtrim($server, '/'), $matches)) {
|
||||
auth_error(lang('Invalid server or credentials.'));
|
||||
return false;
|
||||
}
|
||||
|
||||
return ($matches[1] ?: "http://") .
|
||||
($username !== "" || $password !== "" ? "$username:$password@" : "") .
|
||||
($matches[2] !== "" ? $matches[2] : $defaultServer) .
|
||||
(isset($matches[3]) ? $matches[3] : ($defaultPort ? ":$defaultPort" : ""));
|
||||
}
|
||||
|
||||
function add_invalid_login() {
|
||||
global $adminer;
|
||||
$file = open_file_with_lock(get_temp_dir() . "/adminer.invalid");
|
||||
if (!$file) {
|
||||
return;
|
||||
}
|
||||
$invalids = unserialize(stream_get_contents($file));
|
||||
$time = time();
|
||||
if ($invalids) {
|
||||
foreach ($invalids as $ip => $val) {
|
||||
@@ -35,13 +101,16 @@ function add_invalid_login() {
|
||||
$invalid = array($time + 30*60, 0); // active for 30 minutes
|
||||
}
|
||||
$invalid[1]++;
|
||||
file_write_unlock($fp, serialize($invalids));
|
||||
write_and_unlock_file($file, serialize($invalids));
|
||||
}
|
||||
|
||||
function check_invalid_login() {
|
||||
global $adminer;
|
||||
$invalids = unserialize(@file_get_contents(get_temp_dir() . "/adminer.invalid")); // @ - may not exist
|
||||
$invalid = ($invalids ? $invalids[$adminer->bruteForceKey()] : array());
|
||||
|
||||
$filename = get_temp_dir() . "/adminer.invalid";
|
||||
$invalids = file_exists($filename) ? unserialize(file_get_contents($filename)) : [];
|
||||
$invalid = ($invalids ? $invalids[$adminer->bruteForceKey()] : []);
|
||||
|
||||
$next_attempt = ($invalid[1] > 29 ? $invalid[0] - time() : 0); // allow 30 invalid attempts
|
||||
if ($next_attempt > 0) { //! do the same with permanent login
|
||||
auth_error(lang('Too many unsuccessful logins, try again in %d minute(s).', ceil($next_attempt / 60)));
|
||||
@@ -52,7 +121,7 @@ $auth = $_POST["auth"];
|
||||
if ($auth) {
|
||||
session_regenerate_id(); // defense against session fixation
|
||||
$vendor = $auth["driver"];
|
||||
$server = $auth["server"];
|
||||
$server = trim($auth["server"]);
|
||||
$username = $auth["username"];
|
||||
$password = (string) $auth["password"];
|
||||
$db = $auth["db"];
|
||||
@@ -72,14 +141,14 @@ if ($auth) {
|
||||
) {
|
||||
redirect(auth_url($vendor, $server, $username, $db));
|
||||
}
|
||||
|
||||
|
||||
} elseif ($_POST["logout"] && (!$has_token || verify_token())) {
|
||||
foreach (array("pwds", "db", "dbs", "queries") as $key) {
|
||||
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="https://www.adminer.org/en/donation/">donating</a>.'));
|
||||
|
||||
|
||||
} elseif ($permanent && !$_SESSION["pwds"]) {
|
||||
session_regenerate_id();
|
||||
$private = $adminer->permanentLogin();
|
||||
@@ -103,9 +172,10 @@ function unset_permanent() {
|
||||
}
|
||||
|
||||
/** Renders an error message and a login form
|
||||
* @param string plain text
|
||||
* @return null exits
|
||||
*/
|
||||
* @param string plain text
|
||||
* @return null exits
|
||||
* @throws \Random\RandomException
|
||||
*/
|
||||
function auth_error($error) {
|
||||
global $adminer, $has_token;
|
||||
$session_name = session_name();
|
||||
@@ -130,7 +200,7 @@ function auth_error($error) {
|
||||
$error = lang('Session support must be enabled.');
|
||||
}
|
||||
$params = session_get_cookie_params();
|
||||
cookie("adminer_key", ($_COOKIE["adminer_key"] ? $_COOKIE["adminer_key"] : rand_string()), $params["lifetime"]);
|
||||
cookie("adminer_key", ($_COOKIE["adminer_key"] ?: get_random_string()), $params["lifetime"]);
|
||||
page_header(lang('Login'), $error, null);
|
||||
echo "<form action='' method='post'>\n";
|
||||
echo "<div>";
|
||||
@@ -155,18 +225,16 @@ if (isset($_GET["username"]) && !class_exists("Min_DB")) {
|
||||
stop_session(true);
|
||||
|
||||
if (isset($_GET["username"]) && is_string(get_password())) {
|
||||
list($host, $port) = explode(":", SERVER, 2);
|
||||
if (preg_match('~^\s*([-+]?\d+)~', $port, $match) && ($match[1] < 1024 || $match[1] > 65535)) { // is_numeric('80#') would still connect to port 80
|
||||
auth_error(lang('Connecting to privileged ports is not allowed.'));
|
||||
}
|
||||
validate_server_input();
|
||||
check_invalid_login();
|
||||
|
||||
$connection = connect();
|
||||
$driver = new Min_Driver($connection);
|
||||
}
|
||||
|
||||
$login = null;
|
||||
if (!is_object($connection) || ($login = $adminer->login($_GET["username"], get_password())) !== true) {
|
||||
$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 server or credentials.')));
|
||||
auth_error($error . (preg_match('~^ | $~', get_password()) ? '<br>' . lang('There is a space in the input password which might be the cause.') : ''));
|
||||
}
|
||||
|
||||
@@ -199,7 +267,7 @@ if ($_POST) {
|
||||
: lang('Invalid CSRF token. Send the form again.') . ' ' . lang('If you did not send this request from Adminer then close this page.')
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
} elseif ($_SERVER["REQUEST_METHOD"] == "POST") {
|
||||
// posted form with no data means that post_max_size exceeded because Adminer always sends token at least
|
||||
$error = lang('Too big POST data. Reduce the data or increase the %s configuration directive.', "'post_max_size'");
|
||||
|
@@ -1,11 +1,12 @@
|
||||
<?php
|
||||
function adminer_errors($errno, $errstr) {
|
||||
return !!preg_match('~^(Trying to access array offset on value of type null|Undefined array key)~', $errstr);
|
||||
return (bool)preg_match('~^(Trying to access array offset on( value of type)? null|Undefined array key)~', $errstr);
|
||||
}
|
||||
|
||||
error_reporting(6135); // errors and warnings
|
||||
set_error_handler('adminer_errors', E_WARNING);
|
||||
|
||||
include "../adminer/include/debug.inc.php";
|
||||
include "../adminer/include/coverage.inc.php";
|
||||
|
||||
// disable filter.default
|
||||
@@ -31,9 +32,9 @@ if (isset($_GET["file"])) {
|
||||
}
|
||||
|
||||
if ($_GET["script"] == "version") {
|
||||
$fp = file_open_lock(get_temp_dir() . "/adminer.version");
|
||||
if ($fp) {
|
||||
file_write_unlock($fp, serialize(array("signature" => $_POST["signature"], "version" => $_POST["version"])));
|
||||
$file = open_file_with_lock(get_temp_dir() . "/adminer.version");
|
||||
if ($file) {
|
||||
write_and_unlock_file($file, serialize(["version" => $_POST["version"]]));
|
||||
}
|
||||
exit;
|
||||
}
|
||||
@@ -81,7 +82,6 @@ include "../adminer/drivers/pgsql.inc.php";
|
||||
include "../adminer/drivers/oracle.inc.php";
|
||||
include "../adminer/drivers/mssql.inc.php";
|
||||
include "../adminer/drivers/mongo.inc.php";
|
||||
include "../adminer/drivers/elastic.inc.php";
|
||||
include "./include/adminer.inc.php";
|
||||
$adminer = (function_exists('adminer_object') ? adminer_object() : new Adminer);
|
||||
include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
|
||||
@@ -93,11 +93,16 @@ $types = $config['types'];
|
||||
$structured_types = $config['structured_types'];
|
||||
$unsigned = $config['unsigned'];
|
||||
$operators = $config['operators'];
|
||||
$operator_like = $config['operator_like'];
|
||||
$operator_regexp = $config['operator_regexp'];
|
||||
$functions = $config['functions'];
|
||||
$grouping = $config['grouping'];
|
||||
$edit_functions = $config['edit_functions'];
|
||||
|
||||
if ($adminer->operators === null) {
|
||||
$adminer->operators = $operators;
|
||||
$adminer->operator_like = $operator_like;
|
||||
$adminer->operator_regexp = $operator_regexp;
|
||||
}
|
||||
|
||||
define("SERVER", $_GET[DRIVER]); // read from pgsql=localhost
|
||||
|
14
adminer/include/debug.inc.php
Normal file
14
adminer/include/debug.inc.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
function dump($value)
|
||||
{
|
||||
echo "<pre>";
|
||||
var_export($value);
|
||||
echo "</pre>\n";
|
||||
}
|
||||
|
||||
function dumpe($value)
|
||||
{
|
||||
dump($value);
|
||||
exit;
|
||||
}
|
@@ -6,7 +6,7 @@
|
||||
* @param string used after colon in title and heading, should be HTML escaped
|
||||
* @return null
|
||||
*/
|
||||
function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
|
||||
function page_header($title, $error = "", $breadcrumb = [], $title2 = "") {
|
||||
global $LANG, $VERSION, $adminer, $drivers, $jush;
|
||||
page_headers();
|
||||
if (is_ajax() && $error) {
|
||||
@@ -15,15 +15,23 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
|
||||
}
|
||||
$title_all = $title . ($title2 != "" ? ": $title2" : "");
|
||||
$title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name());
|
||||
|
||||
// Load Adminer version from file if cookie is missing.
|
||||
$filename = get_temp_dir() . "/adminer.version";
|
||||
if (!$_COOKIE["adminer_version"] && file_exists($filename) && filemtime($filename) + 86400 > time()) { // 86400 - 1 day in seconds
|
||||
$data = unserialize(file_get_contents($filename));
|
||||
$_COOKIE["adminer_version"] = $data["version"];
|
||||
cookie("adminer_version", $data["version"], 24 * 3600);
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="<?php echo $LANG; ?>" dir="<?php echo lang('ltr'); ?>">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta name="robots" content="noindex">
|
||||
<title><?php echo $title_page; ?></title>
|
||||
<link rel="stylesheet" type="text/css" href="../adminer/static/default.css">
|
||||
<?php echo script_src("../adminer/static/functions.js"); ?>
|
||||
<?php echo script_src("static/editing.js"); ?>
|
||||
<link rel="stylesheet" type="text/css" href="../adminer/static/default.css?<?php echo filemtime("../adminer/static/default.css"); ?>">
|
||||
<?php echo script_src("../adminer/static/functions.js?" . filemtime("../adminer/static/functions.js")); ?>
|
||||
<?php echo script_src("static/editing.js?" . filemtime("../adminer/static/editing.js")); ?>
|
||||
<?php if ($adminer->head()) { ?>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="../adminer/static/favicon.ico">
|
||||
<link rel="apple-touch-icon" href="../adminer/static/favicon.ico">
|
||||
@@ -33,66 +41,64 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
|
||||
<?php } ?>
|
||||
|
||||
<body class="<?php echo lang('ltr'); ?> nojs">
|
||||
<?php
|
||||
$filename = get_temp_dir() . "/adminer.version";
|
||||
if (!$_COOKIE["adminer_version"] && function_exists('openssl_verify') && file_exists($filename) && filemtime($filename) + 86400 > time()) { // 86400 - 1 day in seconds
|
||||
$version = unserialize(file_get_contents($filename));
|
||||
$public = "-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwqWOVuF5uw7/+Z70djoK
|
||||
RlHIZFZPO0uYRezq90+7Amk+FDNd7KkL5eDve+vHRJBLAszF/7XKXe11xwliIsFs
|
||||
DFWQlsABVZB3oisKCBEuI71J4kPH8dKGEWR9jDHFw3cWmoH3PmqImX6FISWbG3B8
|
||||
h7FIx3jEaw5ckVPVTeo5JRm/1DZzJxjyDenXvBQ/6o9DgZKeNDgxwKzH+sw9/YCO
|
||||
jHnq1cFpOIISzARlrHMa/43YfeNRAm/tsBXjSxembBPo7aQZLAWHmaj5+K19H10B
|
||||
nCpz9Y++cipkVEiKRGih4ZEvjoFysEOdRLj6WiD/uUNky4xGeA6LaJqh5XpkFkcQ
|
||||
fQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
";
|
||||
if (openssl_verify($version["version"], base64_decode($version["signature"]), $public) == 1) {
|
||||
$_COOKIE["adminer_version"] = $version["version"]; // doesn't need to send to the browser
|
||||
}
|
||||
}
|
||||
?>
|
||||
<script<?php echo nonce(); ?>>
|
||||
mixin(document.body, {onkeydown: bodyKeydown, onclick: bodyClick<?php
|
||||
echo (isset($_COOKIE["adminer_version"]) ? "" : ", onload: partial(verifyVersion, '$VERSION', '" . js_escape(ME) . "', '" . get_token() . "')"); // $token may be empty in auth.inc.php
|
||||
?>});
|
||||
document.body.className = document.body.className.replace(/ nojs/, ' js');
|
||||
var offlineMessage = '<?php echo js_escape(lang('You are offline.')); ?>';
|
||||
var thousandsSeparator = '<?php echo js_escape(lang(',')); ?>';
|
||||
document.body.onkeydown = bodyKeydown;
|
||||
document.body.onclick = bodyClick;
|
||||
<?php if (!isset($_COOKIE["adminer_version"])): ?>
|
||||
document.body.onload = function () { verifyVersion('<?php echo $VERSION; ?>', '<?php echo js_escape(ME); ?>', '<?php echo get_token(); ?>') };
|
||||
<?php endif; ?>
|
||||
document.body.className = document.body.className.replace(/ nojs/, ' js');
|
||||
|
||||
var offlineMessage = '<?php echo js_escape(lang('You are offline.')); ?>';
|
||||
var thousandsSeparator = '<?php echo js_escape(lang(',')); ?>';
|
||||
</script>
|
||||
|
||||
<div id="help" class="jush-<?php echo $jush; ?> jsonly hidden"></div>
|
||||
<?php echo script("mixin(qs('#help'), {onmouseover: function () { helpOpen = 1; }, onmouseout: helpMouseout});"); ?>
|
||||
<?php echo script("initHelpPopup();"); ?>
|
||||
|
||||
<div id="content">
|
||||
<?php
|
||||
if ($breadcrumb !== null) {
|
||||
echo '<p id="breadcrumb">';
|
||||
|
||||
$link = substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1);
|
||||
echo '<p id="breadcrumb"><a href="' . h($link ? $link : ".") . '">' . $drivers[DRIVER] . '</a> » ';
|
||||
$link = substr(preg_replace('~\b(db|ns)=[^&]*&~', '', ME), 0, -1);
|
||||
$server = $adminer->serverName(SERVER);
|
||||
$server = ($server != "" ? $server : lang('Server'));
|
||||
echo '<a href="' . h($link ?: ".") . '">' . lang('Home') . '</a> » ';
|
||||
|
||||
$server = "";
|
||||
if ($breadcrumb === false) {
|
||||
echo "$server\n";
|
||||
$server .= h($drivers[DRIVER]) . ": ";
|
||||
}
|
||||
|
||||
$server_name = $adminer->serverName(SERVER);
|
||||
$server .= $server_name != "" ? h($server_name) : lang('Server');
|
||||
|
||||
if ($breadcrumb === false) {
|
||||
echo h($server), "\n";
|
||||
} else {
|
||||
echo "<a href='" . h($link) . "' accesskey='1' title='Alt+Shift+1'>$server</a> » ";
|
||||
$link = substr(preg_replace('~\b(db|ns)=[^&]*&~', '', ME), 0, -1);
|
||||
echo "<a href='" . h($link) . "' accesskey='1' title='Alt+Shift+1'>$server</a> » ";
|
||||
|
||||
if ($_GET["ns"] != "" || (DB != "" && is_array($breadcrumb))) {
|
||||
echo '<a href="' . h($link . "&db=" . urlencode(DB) . (support("scheme") ? "&ns=" : "")) . '">' . h(DB) . '</a> » ';
|
||||
echo '<a href="' . h($link . "&db=" . urlencode(DB) . (support("scheme") ? "&ns=" : "")) . '">' . h(DB) . '</a> » ';
|
||||
}
|
||||
|
||||
if (is_array($breadcrumb)) {
|
||||
if ($_GET["ns"] != "") {
|
||||
echo '<a href="' . h(substr(ME, 0, -1)) . '">' . h($_GET["ns"]) . '</a> » ';
|
||||
echo '<a href="' . h(substr(ME, 0, -1)) . '">' . h($_GET["ns"]) . '</a> » ';
|
||||
}
|
||||
|
||||
foreach ($breadcrumb as $key => $val) {
|
||||
$desc = (is_array($val) ? $val[1] : h($val));
|
||||
if ($desc != "") {
|
||||
echo "<a href='" . h(ME . "$key=") . urlencode(is_array($val) ? $val[0] : $val) . "'>$desc</a> » ";
|
||||
echo "<a href='" . h(ME . "$key=") . urlencode(is_array($val) ? $val[0] : $val) . "'>$desc</a> » ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo "$title\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "<h2>$title_all</h2>\n";
|
||||
echo "<div id='ajaxstatus' class='jsonly hidden'></div>\n";
|
||||
restart_session();
|
||||
@@ -126,30 +132,40 @@ function page_headers() {
|
||||
$adminer->headers();
|
||||
}
|
||||
|
||||
/** Get Content Security Policy headers
|
||||
* @return array of arrays with directive name in key, allowed sources in value
|
||||
*/
|
||||
/**
|
||||
* Gets Content Security Policy headers.
|
||||
*
|
||||
* @return array of arrays with directive name in key, allowed sources in value
|
||||
* @throws \Random\RandomException
|
||||
*/
|
||||
function csp() {
|
||||
return array(
|
||||
array(
|
||||
"script-src" => "'self' 'unsafe-inline' 'nonce-" . get_nonce() . "' 'strict-dynamic'", // 'self' is a fallback for browsers not supporting 'strict-dynamic', 'unsafe-inline' is a fallback for browsers not supporting 'nonce-'
|
||||
"connect-src" => "'self'",
|
||||
"frame-src" => "https://www.adminer.org",
|
||||
return [
|
||||
[
|
||||
// 'self' is a fallback for browsers not supporting 'strict-dynamic', 'unsafe-inline' is a fallback for browsers not supporting 'nonce-'
|
||||
"script-src" => "'self' 'unsafe-inline' 'nonce-" . get_nonce() . "' 'strict-dynamic'",
|
||||
"connect-src" => "'self' https://api.github.com/repos/pematon/adminer/releases/latest",
|
||||
"frame-src" => "'self'",
|
||||
"object-src" => "'none'",
|
||||
"base-uri" => "'none'",
|
||||
"form-action" => "'self'",
|
||||
),
|
||||
);
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/** Get a CSP nonce
|
||||
* @return string Base64 value
|
||||
*/
|
||||
function get_nonce() {
|
||||
/**
|
||||
* Gets a CSP nonce.
|
||||
*
|
||||
* @return string Base64 value.
|
||||
* @throws \Random\RandomException
|
||||
*/
|
||||
function get_nonce()
|
||||
{
|
||||
static $nonce;
|
||||
|
||||
if (!$nonce) {
|
||||
$nonce = base64_encode(rand_string());
|
||||
$nonce = base64_encode(get_random_string(true));
|
||||
}
|
||||
|
||||
return $nonce;
|
||||
}
|
||||
|
||||
@@ -169,27 +185,38 @@ function page_messages($error) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Print HTML footer
|
||||
* @param string "auth", "db", "ns"
|
||||
* @return null
|
||||
*/
|
||||
function page_footer($missing = "") {
|
||||
/**
|
||||
* Prints HTML footer.
|
||||
*
|
||||
* @param $missing string "auth", "db", "ns"
|
||||
*/
|
||||
function page_footer($missing = "")
|
||||
{
|
||||
global $adminer, $token;
|
||||
?>
|
||||
</div>
|
||||
|
||||
<?php switch_lang(); ?>
|
||||
<?php if ($missing != "auth") { ?>
|
||||
<form action="" method="post">
|
||||
<p class="logout">
|
||||
<input type="submit" name="logout" value="<?php echo lang('Logout'); ?>" id="logout">
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</p>
|
||||
</form>
|
||||
<?php } ?>
|
||||
<div id="menu">
|
||||
<?php $adminer->navigation($missing); ?>
|
||||
</div>
|
||||
echo "</div>"; // #content
|
||||
|
||||
echo "<div id='footer'>\n";
|
||||
switch_lang();
|
||||
|
||||
if ($missing != "auth") {
|
||||
?>
|
||||
|
||||
<div class="logout">
|
||||
<form action="" method="post">
|
||||
<?php echo h($_GET["username"]); ?>
|
||||
<input type="submit" name="logout" value="<?php echo lang('Logout'); ?>" id="logout">
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
}
|
||||
echo "</div>\n";
|
||||
|
||||
echo "<div id='menu'>\n";
|
||||
$adminer->navigation($missing);
|
||||
echo "</div>\n";
|
||||
|
||||
echo script("setupSubmitHighlight(document);");
|
||||
}
|
||||
|
@@ -11,16 +11,25 @@ function add_driver($id, $name) {
|
||||
$drivers[$id] = $name;
|
||||
}
|
||||
|
||||
/** Get driver name
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function get_driver($id) {
|
||||
global $drivers;
|
||||
return $drivers[$id];
|
||||
}
|
||||
|
||||
/*abstract*/ class Min_SQL {
|
||||
var $_conn;
|
||||
|
||||
|
||||
/** Create object for performing database operations
|
||||
* @param Min_DB
|
||||
*/
|
||||
function __construct($connection) {
|
||||
$this->_conn = $connection;
|
||||
}
|
||||
|
||||
|
||||
/** Select data from table
|
||||
* @param string
|
||||
* @param array result of $adminer->selectColumnsProcess()[0]
|
||||
@@ -52,7 +61,7 @@ function add_driver($id, $name) {
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
|
||||
/** Delete data from table
|
||||
* @param string
|
||||
* @param string " WHERE ..."
|
||||
@@ -63,7 +72,7 @@ function add_driver($id, $name) {
|
||||
$query = "FROM " . table($table);
|
||||
return queries("DELETE" . ($limit ? limit1($table, $query, $queryWhere) : " $query$queryWhere"));
|
||||
}
|
||||
|
||||
|
||||
/** Update data in table
|
||||
* @param string
|
||||
* @param array escaped columns in keys, quoted data in values
|
||||
@@ -80,7 +89,7 @@ function add_driver($id, $name) {
|
||||
$query = table($table) . " SET$separator" . implode(",$separator", $values);
|
||||
return queries("UPDATE" . ($limit ? limit1($table, $query, $queryWhere, $separator) : " $query$queryWhere"));
|
||||
}
|
||||
|
||||
|
||||
/** Insert data into table
|
||||
* @param string
|
||||
* @param array escaped columns in keys, quoted data in values
|
||||
@@ -92,7 +101,7 @@ function add_driver($id, $name) {
|
||||
: " DEFAULT VALUES"
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
/** Insert or update data in table
|
||||
* @param string
|
||||
* @param array
|
||||
@@ -102,28 +111,28 @@ function add_driver($id, $name) {
|
||||
/*abstract*/ function insertUpdate($table, $rows, $primary) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/** Begin transaction
|
||||
* @return bool
|
||||
*/
|
||||
function begin() {
|
||||
return queries("BEGIN");
|
||||
}
|
||||
|
||||
|
||||
/** Commit transaction
|
||||
* @return bool
|
||||
*/
|
||||
function commit() {
|
||||
return queries("COMMIT");
|
||||
}
|
||||
|
||||
|
||||
/** Rollback transaction
|
||||
* @return bool
|
||||
*/
|
||||
function rollback() {
|
||||
return queries("ROLLBACK");
|
||||
}
|
||||
|
||||
|
||||
/** Return query with a timeout
|
||||
* @param string
|
||||
* @param int seconds
|
||||
@@ -131,14 +140,14 @@ function add_driver($id, $name) {
|
||||
*/
|
||||
function slowQuery($query, $timeout) {
|
||||
}
|
||||
|
||||
|
||||
/** Convert column to be searchable
|
||||
* @param string escaped column name
|
||||
* @param array array("op" => , "val" => )
|
||||
* @param array
|
||||
* @return string
|
||||
*/
|
||||
function convertSearch($idf, $val, $field) {
|
||||
function convertSearch($idf, array $where, array $field) {
|
||||
return $idf;
|
||||
}
|
||||
|
||||
@@ -161,19 +170,19 @@ function add_driver($id, $name) {
|
||||
function quoteBinary($s) {
|
||||
return q($s);
|
||||
}
|
||||
|
||||
|
||||
/** Get warnings about the last command
|
||||
* @return string HTML
|
||||
*/
|
||||
function warnings() {
|
||||
return '';
|
||||
}
|
||||
|
||||
|
||||
/** Get help link for table
|
||||
* @param string
|
||||
* @return string relative URL or null
|
||||
*/
|
||||
function tableHelp($name) {
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -21,11 +21,11 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
|
||||
echo "<table cellspacing='0' class='nowrap'>\n";
|
||||
echo "<thead><tr>";
|
||||
for ($j=0; $j < count($row); $j++) {
|
||||
$field = $result->fetch_field();
|
||||
$name = $field->name;
|
||||
$orgtable = $field->orgtable;
|
||||
$orgname = $field->orgname;
|
||||
$return[$field->table] = $orgtable;
|
||||
$field = (array)$result->fetch_field();
|
||||
$name = $field["name"];
|
||||
$orgtable = $field["orgtable"];
|
||||
$orgname = $field["orgname"];
|
||||
$return[$field["table"]] = $orgtable;
|
||||
if ($orgtables && $jush == "sql") { // MySQL EXPLAIN
|
||||
$links[$j] = ($name == "table" ? "table=" : ($name == "possible_keys" ? "indexes=" : null));
|
||||
} elseif ($orgtable != "") {
|
||||
@@ -46,11 +46,11 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
|
||||
$links[$j] = $orgtable;
|
||||
}
|
||||
}
|
||||
if ($field->charsetnr == 63) { // 63 - binary
|
||||
if ($field["charsetnr"] == 63) { // 63 - binary
|
||||
$blobs[$j] = true;
|
||||
}
|
||||
$types[$j] = $field->type;
|
||||
echo "<th" . ($orgtable != "" || $field->name != $orgname ? " title='" . h(($orgtable != "" ? "$orgtable." : "") . $orgname) . "'" : "") . ">" . h($name)
|
||||
$types[$j] = $field["type"];
|
||||
echo "<th" . ($orgtable != "" || $field["name"] != $orgname ? " title='" . h(($orgtable != "" ? "$orgtable." : "") . $orgname) . "'" : "") . ">" . h($name)
|
||||
. ($orgtables ? doc_link(array(
|
||||
'sql' => "explain-output.html#explain_" . strtolower($name),
|
||||
'mariadb' => "explain/#the-columns-in-explain-select",
|
||||
@@ -72,7 +72,7 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
|
||||
$link .= "&where" . urlencode("[" . bracket_escape($col) . "]") . "=" . urlencode($row[$j]);
|
||||
}
|
||||
}
|
||||
} elseif (is_url($val)) {
|
||||
} elseif (is_web_url($val)) {
|
||||
$link = $val;
|
||||
}
|
||||
if ($val === null) {
|
||||
@@ -86,7 +86,7 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
|
||||
}
|
||||
}
|
||||
if ($link) {
|
||||
$val = "<a href='" . h($link) . "'" . (is_url($link) ? target_blank() : '') . ">$val</a>";
|
||||
$val = "<a href='" . h($link) . "'" . (is_web_url($link) ? target_blank() : '') . ">$val</a>";
|
||||
}
|
||||
echo "<td>$val";
|
||||
}
|
||||
@@ -221,12 +221,17 @@ function process_type($field, $collate = "COLLATE") {
|
||||
* @return array array("field", "type", "NULL", "DEFAULT", "ON UPDATE", "COMMENT", "AUTO_INCREMENT")
|
||||
*/
|
||||
function process_field($field, $type_field) {
|
||||
// MariaDB exports CURRENT_TIMESTAMP as a function.
|
||||
if ($field["on_update"]) {
|
||||
$field["on_update"] = str_ireplace("current_timestamp()", "CURRENT_TIMESTAMP", $field["on_update"]);
|
||||
}
|
||||
|
||||
return array(
|
||||
idf_escape(trim($field["field"])),
|
||||
process_type($type_field),
|
||||
($field["null"] ? " NULL" : " NOT NULL"), // NULL for timestamp
|
||||
default_value($field),
|
||||
(preg_match('~timestamp|datetime~', $field["type"]) && $field["on_update"] ? " ON UPDATE $field[on_update]" : ""),
|
||||
(preg_match('~timestamp|datetime~', $field["type"]) && $field["on_update"] ? " ON UPDATE " . $field["on_update"] : ""),
|
||||
(support("comment") && $field["comment"] != "" ? " COMMENT " . q($field["comment"]) : ""),
|
||||
($field["auto_increment"] ? auto_increment() : null),
|
||||
);
|
||||
@@ -238,7 +243,18 @@ function process_field($field, $type_field) {
|
||||
*/
|
||||
function default_value($field) {
|
||||
$default = $field["default"];
|
||||
return ($default === null ? "" : " DEFAULT " . (preg_match('~char|binary|text|enum|set~', $field["type"]) || preg_match('~^(?![a-z])~i', $default) ? q($default) : $default));
|
||||
if ($default === null) return "";
|
||||
|
||||
if (stripos($default, "GENERATED ") === 0) {
|
||||
return " $default";
|
||||
}
|
||||
|
||||
// MariaDB exports CURRENT_TIMESTAMP as a function.
|
||||
$default = str_ireplace("current_timestamp()", "CURRENT_TIMESTAMP", $default);
|
||||
|
||||
$quote = preg_match('~char|binary|text|enum|set~', $field["type"]) || preg_match('~^(?![a-z])~i', $default);
|
||||
|
||||
return " DEFAULT " . ($quote ? q($default) : $default);
|
||||
}
|
||||
|
||||
/** Get type class to use in CSS
|
||||
@@ -258,65 +274,106 @@ function type_class($type) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Print table interior for fields editing
|
||||
* @param array
|
||||
* @param array
|
||||
* @param string TABLE or PROCEDURE
|
||||
* @param array returned by referencable_primary()
|
||||
* @return null
|
||||
*/
|
||||
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array()) {
|
||||
/**
|
||||
* Prints table interior for fields editing.
|
||||
*
|
||||
* @param string $type TABLE, FUNCTION or PROCEDURE
|
||||
* @param array $foreign_keys returned by referencable_primary()
|
||||
*/
|
||||
function edit_fields(array $fields, array $collations, $type = "TABLE", $foreign_keys = []) {
|
||||
global $inout;
|
||||
|
||||
$fields = array_values($fields);
|
||||
$default_class = (($_POST ? $_POST["defaults"] : adminer_setting("defaults")) ? "" : " class='hidden'");
|
||||
$comment_class = (($_POST ? $_POST["comments"] : adminer_setting("comments")) ? "" : " class='hidden'");
|
||||
$comment_class = ($_POST ? $_POST["comments"] : adminer_setting("comments")) ? "" : "class='hidden'";
|
||||
?>
|
||||
|
||||
<thead><tr>
|
||||
<?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'); ?>
|
||||
<td><?php echo lang('Options'); /* no label required, options have their own label */ ?>
|
||||
<?php if ($type == "TABLE") { ?>
|
||||
<td id="label-null">NULL
|
||||
<td><input type="radio" name="auto_increment_col" value=""><acronym id="label-ai" title="<?php echo lang('Auto Increment'); ?>">AI</acronym><?php echo doc_link(array(
|
||||
'sql' => "example-auto-increment.html",
|
||||
'mariadb' => "auto_increment/",
|
||||
'sqlite' => "autoinc.html",
|
||||
'pgsql' => "datatype.html#DATATYPE-SERIAL",
|
||||
'mssql' => "ms186775.aspx",
|
||||
)); ?>
|
||||
<td id="label-default"<?php echo $default_class; ?>><?php echo lang('Default value'); ?>
|
||||
<?php echo (support("comment") ? "<td id='label-comment'$comment_class>" . 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>
|
||||
<tbody>
|
||||
<?php
|
||||
if (support("move_col")) {
|
||||
echo "<td class='jsonly'></td>";
|
||||
}
|
||||
if ($type == "PROCEDURE") {
|
||||
echo "<td></td>";
|
||||
}
|
||||
?>
|
||||
<th id="label-name"><?php echo ($type == "TABLE" ? lang('Column name') : lang('Parameter name')); ?></th>
|
||||
<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("gid('enum-edit').onblur = editingLengthBlur;"); ?></td>
|
||||
<td id="label-length"><?php echo lang('Length'); ?></td>
|
||||
<td><?php echo lang('Options'); /* no label required, options have their own label */ ?></td>
|
||||
<?php if ($type == "TABLE") { ?>
|
||||
<td id="label-null">NULL</td>
|
||||
<td><input type="radio" name="auto_increment_col" value=""><abbr id="label-ai" title="<?php echo lang('Auto Increment'); ?>">AI</abbr><?php echo doc_link([
|
||||
'sql' => "example-auto-increment.html",
|
||||
'mariadb' => "auto_increment/",
|
||||
'sqlite' => "autoinc.html",
|
||||
'pgsql' => "datatype-numeric.html#DATATYPE-SERIAL",
|
||||
'mssql' => "ms186775.aspx",
|
||||
]); ?>
|
||||
</td>
|
||||
<td id="label-default"><?php echo lang('Default value'); ?></td>
|
||||
<?php echo (support("comment") ? "<td id='label-comment' $comment_class>" . lang('Comment') . "</td>" : ""); ?>
|
||||
<?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) . ";"); ?></td>
|
||||
</tr></thead>
|
||||
<?php
|
||||
echo script("mixin(qsl('tbody'), {onclick: editingClick, onkeydown: editingKeydown, oninput: editingInput});");
|
||||
echo "<tbody>\n";
|
||||
|
||||
foreach ($fields as $i => $field) {
|
||||
$i++;
|
||||
$orig = $field[($_POST ? "orig" : "field")];
|
||||
$display = (isset($_POST["add"][$i-1]) || (isset($field["field"]) && !$_POST["drop_col"][$i])) && (support("drop_col") || $orig == "");
|
||||
?>
|
||||
<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"]); ?>" data-maxlength="64" autocapitalize="off" aria-labelledby="label-name"><?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 $default_class; ?>><?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$comment_class><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' data-maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
|
||||
|
||||
$style = $display ? "" : "style='display: none;'";
|
||||
echo "<tr $style>\n";
|
||||
|
||||
if (support("move_col")) {
|
||||
echo "<th class='handle jsonly'></th>";
|
||||
}
|
||||
if ($type == "PROCEDURE") {
|
||||
echo "<td>", html_select("fields[$i][inout]", explode("|", $inout), $field["inout"]), "</td>\n";
|
||||
}
|
||||
|
||||
echo "<th>";
|
||||
if ($display) {
|
||||
echo "<input name='fields[$i][field]' value='", h($field["field"]), "' data-maxlength='64' autocapitalize='off' aria-labelledby='label-name'>";
|
||||
}
|
||||
echo "<input type='hidden' name='fields[$i][orig]' value='", h($orig), "'>";
|
||||
edit_type("fields[$i]", $field, $collations, $foreign_keys);
|
||||
echo "</th>\n";
|
||||
|
||||
if ($type == "TABLE") {
|
||||
echo "<td>", checkbox("fields[$i][null]", 1, $field["null"], "", "", "block", "label-null"), "</td>\n";
|
||||
|
||||
$checked = $field["auto_increment"] ? "checked" : "";
|
||||
echo "<td><label class='block'><input type='radio' name='auto_increment_col' value='$i' $checked aria-labelledby='label-ai'></label></td>\n";
|
||||
|
||||
echo "<td>",
|
||||
checkbox("fields[$i][has_default]", 1, $field["has_default"], "", "", "", "label-default"),
|
||||
"<input name='fields[$i][default]' value='", h($field["default"]), "' aria-labelledby='label-default'>",
|
||||
"</td>\n";
|
||||
|
||||
if (support("comment")) {
|
||||
$max_length = min_version(5.5) ? 1024 : 255;
|
||||
echo "<td $comment_class>",
|
||||
"<input name='fields[$i][comment]' value='", h($field["comment"]), "' data-maxlength='$max_length' aria-labelledby='label-comment'>",
|
||||
"</td>\n";
|
||||
}
|
||||
}
|
||||
|
||||
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') . "'> "
|
||||
: "");
|
||||
echo ($orig == "" || support("drop_col") ? "<input type='image' class='icon' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "'>" : "");
|
||||
if (support("move_col")) {
|
||||
echo "<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'> ",
|
||||
"<input type='image' class='icon hidden' name='up[$i]' src='../adminer/static/up.gif' alt='↑' title='" . lang('Move up') . "'> ",
|
||||
"<input type='image' class='icon hidden' name='down[$i]' src='../adminer/static/down.gif' alt='↓' title='" . lang('Move down') . "'> ";
|
||||
}
|
||||
if ($orig == "" || support("drop_col")) {
|
||||
echo "<input type='image' class='icon' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "'>";
|
||||
}
|
||||
echo "</td>\n</tr>\n";
|
||||
}
|
||||
|
||||
echo "</tbody>";
|
||||
echo script("mixin(qs('#edit-fields tbody'), {onclick: editingClick, onkeydown: editingKeydown, oninput: editingInput}); initSortable('#edit-fields tbody');");
|
||||
}
|
||||
|
||||
/** Move fields up and down or add field
|
||||
@@ -368,25 +425,43 @@ function normalize_enum($match) {
|
||||
return "'" . str_replace("'", "''", addcslashes(stripcslashes(str_replace($match[0][0] . $match[0][0], $match[0][0], substr($match[0], 1, -1))), '\\')) . "'";
|
||||
}
|
||||
|
||||
/** Issue grant or revoke commands
|
||||
* @param string GRANT or REVOKE
|
||||
* @param array
|
||||
* @param string
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function grant($grant, $privileges, $columns, $on) {
|
||||
if (!$privileges) {
|
||||
return true;
|
||||
/**
|
||||
* Issue grant or revoke commands.
|
||||
*
|
||||
* @param bool $grant
|
||||
* @param array $privileges
|
||||
* @param string $columns
|
||||
* @param string $on
|
||||
* @param string $user
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function grant($grant, array $privileges, $columns, $on, $user) {
|
||||
if (!$privileges) return true;
|
||||
|
||||
if ($privileges == ["ALL PRIVILEGES", "GRANT OPTION"]) {
|
||||
if ($grant) {
|
||||
return (bool) queries("GRANT ALL PRIVILEGES ON $on TO $user WITH GRANT OPTION");
|
||||
} else {
|
||||
return queries("REVOKE ALL PRIVILEGES ON $on FROM $user") &&
|
||||
queries("REVOKE GRANT OPTION ON $on FROM $user");
|
||||
}
|
||||
}
|
||||
if ($privileges == array("ALL PRIVILEGES", "GRANT OPTION")) {
|
||||
// can't be granted or revoked together
|
||||
return ($grant == "GRANT"
|
||||
? queries("$grant ALL PRIVILEGES$on WITH GRANT OPTION")
|
||||
: queries("$grant ALL PRIVILEGES$on") && queries("$grant GRANT OPTION$on")
|
||||
);
|
||||
|
||||
if ($privileges == ["GRANT OPTION", "PROXY"]) {
|
||||
if ($grant) {
|
||||
return (bool) queries("GRANT PROXY ON $on TO $user WITH GRANT OPTION");
|
||||
} else {
|
||||
return (bool) queries("REVOKE PROXY ON $on FROM $user");
|
||||
}
|
||||
}
|
||||
return queries("$grant " . preg_replace('~(GRANT OPTION)\([^)]*\)~', '\1', implode("$columns, ", $privileges) . $columns) . $on);
|
||||
|
||||
return (bool) queries(
|
||||
($grant ? "GRANT " : "REVOKE ") .
|
||||
preg_replace('~(GRANT OPTION)\([^)]*\)~', '$1', implode("$columns, ", $privileges) . $columns) .
|
||||
" ON $on " .
|
||||
($grant ? "TO " : "FROM ") . $user
|
||||
);
|
||||
}
|
||||
|
||||
/** Drop old object and create a new one
|
||||
@@ -515,34 +590,46 @@ function tar_file($filename, $tmp_file) {
|
||||
function ini_bytes($ini) {
|
||||
$val = ini_get($ini);
|
||||
switch (strtolower(substr($val, -1))) {
|
||||
case 'g': $val *= 1024; // no break
|
||||
case 'm': $val *= 1024; // no break
|
||||
case 'k': $val *= 1024;
|
||||
case 'g': $val = (int)$val * 1024; // no break
|
||||
case 'm': $val = (int)$val * 1024; // no break
|
||||
case 'k': $val = (int)$val * 1024;
|
||||
}
|
||||
return $val;
|
||||
}
|
||||
|
||||
/** Create link to database documentation
|
||||
* @param array $jush => $path
|
||||
* @param string HTML code
|
||||
* @return string HTML code
|
||||
*/
|
||||
function doc_link($paths, $text = "<sup>?</sup>") {
|
||||
/**
|
||||
* Creates link to database documentation.
|
||||
*
|
||||
* @param array $paths $jush => $path
|
||||
* @param string $text HTML code
|
||||
*
|
||||
* @return string HTML code
|
||||
*/
|
||||
function doc_link(array $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
|
||||
$urls = array(
|
||||
|
||||
$urls = [
|
||||
'sql' => "https://dev.mysql.com/doc/refman/$version/en/",
|
||||
'sqlite' => "https://www.sqlite.org/",
|
||||
'pgsql' => "https://www.postgresql.org/docs/$version/",
|
||||
'mssql' => "https://msdn.microsoft.com/library/",
|
||||
'oracle' => "https://www.oracle.com/pls/topic/lookup?ctx=db" . preg_replace('~^.* (\d+)\.(\d+)\.\d+\.\d+\.\d+.*~s', '\1\2', $server_info) . "&id=",
|
||||
);
|
||||
'elastic' => "https://www.elastic.co/guide/en/elasticsearch/reference/$version/",
|
||||
];
|
||||
|
||||
if (preg_match('~MariaDB~', $server_info)) {
|
||||
$urls['sql'] = "https://mariadb.com/kb/en/library/";
|
||||
$urls['sql'] = "https://mariadb.com/kb/en/";
|
||||
$paths['sql'] = (isset($paths['mariadb']) ? $paths['mariadb'] : str_replace(".html", "/", $paths['sql']));
|
||||
}
|
||||
return ($paths[$jush] ? "<a href='" . h($urls[$jush] . $paths[$jush]) . "'" . target_blank() . ">$text</a>" : "");
|
||||
|
||||
if (!isset($paths[$jush]) || !$paths[$jush] ) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return "<a href='" . h($urls[$jush] . $paths[$jush]) . "'" . target_blank() . ">$text</a>";
|
||||
}
|
||||
|
||||
/** Wrap gzencode() for usage in ob_start()
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
/** Get database connection
|
||||
* @return Min_DB
|
||||
*/
|
||||
@@ -157,14 +158,6 @@ function h($string) {
|
||||
return str_replace("\0", "�", htmlspecialchars($string, ENT_QUOTES, 'utf-8'));
|
||||
}
|
||||
|
||||
/** Convert \n to <br>
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function nl_br($string) {
|
||||
return str_replace("\n", "<br>", $string); // nl2br() uses XHTML before PHP 5.3
|
||||
}
|
||||
|
||||
/** Generate HTML checkbox
|
||||
* @param string
|
||||
* @param string
|
||||
@@ -213,7 +206,7 @@ function optionlist($options, $selected = null, $use_keys = false) {
|
||||
* @param string
|
||||
* @param array
|
||||
* @param string
|
||||
* @param string true for no onchange, false for radio
|
||||
* @param string|bool true for no onchange, false for radio
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
@@ -242,7 +235,7 @@ function html_select($name, $options, $value = "", $onchange = true, $labelled_b
|
||||
*/
|
||||
function select_input($attrs, $options, $value = "", $onchange = "", $placeholder = "") {
|
||||
$tag = ($options ? "select" : "input");
|
||||
return "<$tag$attrs" . ($options
|
||||
return "<$tag $attrs" . ($options
|
||||
? "><option value=''>$placeholder" . optionlist($options, $value, true) . "</select>"
|
||||
: " size='10' value='" . h($value) . "' placeholder='$placeholder'>"
|
||||
) . ($onchange ? script("qsl('$tag').onchange = $onchange;", "") : ""); //! use oninput for input
|
||||
@@ -257,18 +250,17 @@ function confirm($message = "", $selector = "qsl('input')") {
|
||||
return script("$selector.onclick = function () { return confirm('" . ($message ? js_escape($message) : lang('Are you sure?')) . "'); };", "");
|
||||
}
|
||||
|
||||
/** Print header for hidden fieldset (close by </div></fieldset>)
|
||||
* @param string
|
||||
* @param string
|
||||
* @param bool
|
||||
* @return null
|
||||
*/
|
||||
function print_fieldset($id, $legend, $visible = false) {
|
||||
/**
|
||||
* Prints header for hidden fieldset (close by </div></fieldset>)
|
||||
* @param $id string
|
||||
* @param $legend string
|
||||
*/
|
||||
function print_fieldset($id, $legend, $visible = false, $sortable = false) {
|
||||
echo "<fieldset><legend>";
|
||||
echo "<a href='#fieldset-$id'>$legend</a>";
|
||||
echo script("qsl('a').onclick = partial(toggle, 'fieldset-$id');", "");
|
||||
echo "</legend>";
|
||||
echo "<div id='fieldset-$id'" . ($visible ? "" : " class='hidden'") . ">\n";
|
||||
echo "<div id='fieldset-$id' class='" . ($visible ? "" : "hidden") . ($sortable ? " sortable" : "") . "'>\n";
|
||||
}
|
||||
|
||||
/** Return class='active' if $bold is true
|
||||
@@ -477,24 +469,36 @@ function escape_key($key) {
|
||||
*/
|
||||
function where($where, $fields = array()) {
|
||||
global $connection, $jush;
|
||||
$return = array();
|
||||
|
||||
$conditions = [];
|
||||
|
||||
foreach ((array) $where["where"] as $key => $val) {
|
||||
$key = bracket_escape($key, 1); // 1 - back
|
||||
$column = escape_key($key);
|
||||
$return[] = $column
|
||||
. ($jush == "sql" && is_numeric($val) && preg_match('~\.~', $val) ? " LIKE " . q($val) // LIKE because of floats but slow with ints
|
||||
: ($jush == "mssql" ? " LIKE " . q(preg_replace('~[_%[]~', '[\0]', $val)) // LIKE because of text
|
||||
: " = " . unconvert_field($fields[$key], q($val))
|
||||
))
|
||||
; //! enum and set
|
||||
if ($jush == "sql" && preg_match('~char|text~', $fields[$key]["type"]) && preg_match("~[^ -@]~", $val)) { // not just [a-z] to catch non-ASCII characters
|
||||
$return[] = "$column = " . q($val) . " COLLATE " . charset($connection) . "_bin";
|
||||
|
||||
if ($jush == "sql" && $fields[$key]["type"] == "json") {
|
||||
$conditions[] = "$column = CAST(" . q($val) . " AS JSON)";
|
||||
} elseif ($jush == "sql" && is_numeric($val) && strpos($val, ".") !== false) {
|
||||
// LIKE because of floats but slow with ints.
|
||||
$conditions[] = "$column LIKE " . q($val);
|
||||
} elseif ($jush == "mssql") {
|
||||
// LIKE because of text.
|
||||
$conditions[] = "$column LIKE " . q(preg_replace('~[_%[]~', '[\0]', $val));
|
||||
} else {
|
||||
$conditions[] = "$column = " . unconvert_field($fields[$key], q($val));
|
||||
}
|
||||
|
||||
// Not just [a-z] to catch non-ASCII characters.
|
||||
if ($jush == "sql" && preg_match('~char|text~', $fields[$key]["type"]) && preg_match("~[^ -@]~", $val)) {
|
||||
$conditions[] = "$column = " . q($val) . " COLLATE " . charset($connection) . "_bin";
|
||||
}
|
||||
}
|
||||
|
||||
foreach ((array) $where["null"] as $key) {
|
||||
$return[] = escape_key($key) . " IS NULL";
|
||||
$conditions[] = escape_key($key) . " IS NULL";
|
||||
}
|
||||
return implode(" AND ", $return);
|
||||
|
||||
return implode(" AND ", $conditions);
|
||||
}
|
||||
|
||||
/** Create SQL condition from query string
|
||||
@@ -886,7 +890,7 @@ function hidden_fields_get() {
|
||||
*/
|
||||
function table_status1($table, $fast = false) {
|
||||
$return = table_status($table, $fast);
|
||||
return ($return ? $return : array("Name" => $table));
|
||||
return ($return ?: array("Name" => $table));
|
||||
}
|
||||
|
||||
/** Find out foreign keys for each column
|
||||
@@ -914,13 +918,16 @@ function column_foreign_keys($table) {
|
||||
*/
|
||||
function enum_input($type, $attrs, $field, $value, $empty = null) {
|
||||
global $adminer;
|
||||
|
||||
$return = ($empty !== null && !is_strict_mode() ? "<label><input type='$type'$attrs value='$empty'" . ((is_array($value) ? in_array($empty, $value) : $value === 0) ? " checked" : "") . "><i>" . lang('empty') . "</i></label>" : "");
|
||||
|
||||
preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
|
||||
$return = ($empty !== null ? "<label><input type='$type'$attrs value='$empty'" . ((is_array($value) ? in_array($empty, $value) : $value === 0) ? " checked" : "") . "><i>" . lang('empty') . "</i></label>" : "");
|
||||
foreach ($matches[1] as $i => $val) {
|
||||
$val = stripcslashes(str_replace("''", "'", $val));
|
||||
$checked = (is_int($value) ? $value == $i+1 : (is_array($value) ? in_array($i+1, $value) : $value === $val));
|
||||
$return .= " <label><input type='$type'$attrs value='" . ($i+1) . "'" . ($checked ? ' checked' : '') . '>' . h($adminer->editVal($val, $field)) . '</label>';
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
@@ -932,14 +939,15 @@ function enum_input($type, $attrs, $field, $value, $empty = null) {
|
||||
*/
|
||||
function input($field, $value, $function) {
|
||||
global $types, $adminer, $jush;
|
||||
|
||||
$name = h(bracket_escape($field["field"]));
|
||||
echo "<td class='function'>";
|
||||
|
||||
if (is_array($value) && !$function) {
|
||||
$args = array($value);
|
||||
if (version_compare(PHP_VERSION, 5.4) >= 0) {
|
||||
$args[] = JSON_PRETTY_PRINT;
|
||||
}
|
||||
$value = call_user_func_array('json_encode', $args); //! requires PHP 5.2
|
||||
$value = call_user_func_array('json_encode', $args);
|
||||
$function = "json";
|
||||
}
|
||||
$reset = ($jush == "mssql" && $field["auto_increment"]);
|
||||
@@ -947,18 +955,23 @@ function input($field, $value, $function) {
|
||||
$function = null;
|
||||
}
|
||||
$functions = (isset($_GET["select"]) || $reset ? array("orig" => lang('original')) : array()) + $adminer->editFunctions($field);
|
||||
$attrs = " name='fields[$name]'";
|
||||
|
||||
$disabled = stripos($field["default"], "GENERATED ALWAYS AS ") === 0 ? " disabled=''" : "";
|
||||
$attrs = " name='fields[$name]' $disabled";
|
||||
|
||||
echo "<td class='function'>";
|
||||
|
||||
if ($field["type"] == "enum") {
|
||||
echo h($functions[""]) . "<td>" . $adminer->editInput($_GET["edit"], $field, $attrs, $value);
|
||||
echo h($functions[""]) . "<td>" . $adminer->editInput($_GET["edit"], $field, $attrs, $value, $function);
|
||||
} 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)
|
||||
? "<select name='function[$name]' $disabled>" . optionlist($functions, $function === null || $has_function ? $function : "") . "</select>"
|
||||
. help_script_command("value.replace(/^SQL\$/, '')", true)
|
||||
. script("qsl('select').onchange = functionChange;", "")
|
||||
: h(reset($functions))
|
||||
) . '<td>';
|
||||
$input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table
|
||||
$input = $adminer->editInput($_GET["edit"], $field, $attrs, $value, $function); // usage in call is without a table
|
||||
if ($input != "") {
|
||||
echo $input;
|
||||
} elseif (preg_match('~bool~', $field["type"])) {
|
||||
@@ -978,7 +991,7 @@ function input($field, $value, $function) {
|
||||
$attrs .= " cols='50' rows='12'";
|
||||
} else {
|
||||
$rows = min(12, substr_count($value, "\n") + 1);
|
||||
$attrs .= " cols='30' rows='$rows'" . ($rows == 1 ? " style='height: 1.2em;'" : ""); // 1.2em - line-height
|
||||
$attrs .= " cols='30' rows='$rows'";
|
||||
}
|
||||
echo "<textarea$attrs>" . h($value) . '</textarea>';
|
||||
} elseif ($function == "json" || preg_match('~^jsonb?$~', $field["type"])) {
|
||||
@@ -992,7 +1005,8 @@ function input($field, $value, $function) {
|
||||
// type='date' and type='time' display localized value which may be confusing, type='datetime' uses 'T' as date and time separator
|
||||
echo "<input"
|
||||
. ((!$has_function || $function === "") && preg_match('~(?<!o)int(?!er)~', $field["type"]) && !preg_match('~\[\]~', $field["full_type"]) ? " type='number'" : "")
|
||||
. " value='" . h($value) . "'" . ($maxlength ? " data-maxlength='$maxlength'" : "")
|
||||
. ($function != "now" ? " value='" . h($value) . "'" : " data-last-value='" . h($value) . "'")
|
||||
. ($maxlength ? " data-maxlength='$maxlength'" : "")
|
||||
. (preg_match('~char|binary~', $field["type"]) && $maxlength > 20 ? " size='40'" : "")
|
||||
. "$attrs>"
|
||||
;
|
||||
@@ -1006,9 +1020,7 @@ function input($field, $value, $function) {
|
||||
}
|
||||
$first++;
|
||||
}
|
||||
if ($first) {
|
||||
echo script("mixin(qsl('td'), {onchange: partial(skipOriginal, $first), oninput: function () { this.onchange(); }});");
|
||||
}
|
||||
echo script("mixin(qsl('td'), {onchange: partial(skipOriginal, $first), oninput: function () { this.onchange(); }});");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1018,6 +1030,11 @@ function input($field, $value, $function) {
|
||||
*/
|
||||
function process_input($field) {
|
||||
global $adminer, $driver;
|
||||
|
||||
if (stripos($field["default"], "GENERATED ALWAYS AS ") === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$idf = bracket_escape($field["field"]);
|
||||
$function = $_POST["function"][$idf];
|
||||
$value = $_POST["fields"][$idf];
|
||||
@@ -1077,7 +1094,7 @@ function fields_from_edit() {
|
||||
$name = bracket_escape($key, 1); // 1 - back
|
||||
$return[$name] = array(
|
||||
"field" => $name,
|
||||
"privileges" => array("insert" => 1, "update" => 1),
|
||||
"privileges" => array("insert" => 1, "update" => 1, "where" => 1, "order" => 1),
|
||||
"null" => 1,
|
||||
"auto_increment" => ($key == $driver->primary),
|
||||
);
|
||||
@@ -1108,6 +1125,27 @@ function search_tables() {
|
||||
echo ($sep ? "<p class='message'>" . lang('No tables.') : "</ul>") . "\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $table
|
||||
* @return array
|
||||
*/
|
||||
function get_partitions_info($table) {
|
||||
global $connection;
|
||||
|
||||
$from = "FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = " . q(DB) . " AND TABLE_NAME = " . q($table);
|
||||
|
||||
$result = $connection->query("SELECT PARTITION_METHOD, PARTITION_EXPRESSION, PARTITION_ORDINAL_POSITION $from ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");
|
||||
|
||||
$info = [];
|
||||
list($info["partition_by"], $info["partition"], $info["partitions"]) = $result->fetch_row();
|
||||
|
||||
$partitions = get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $from AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");
|
||||
$info["partition_names"] = array_keys($partitions);
|
||||
$info["partition_values"] = array_values($partitions);
|
||||
|
||||
return $info;
|
||||
}
|
||||
|
||||
/** Send headers for export
|
||||
* @param string
|
||||
* @param bool
|
||||
@@ -1168,60 +1206,98 @@ function get_temp_dir() {
|
||||
return $return;
|
||||
}
|
||||
|
||||
/** Open and exclusively lock a file
|
||||
* @param string
|
||||
* @return resource or null for error
|
||||
*/
|
||||
function file_open_lock($filename) {
|
||||
$fp = @fopen($filename, "r+"); // @ - may not exist
|
||||
if (!$fp) { // c+ is available since PHP 5.2.6
|
||||
$fp = @fopen($filename, "w"); // @ - may not be writable
|
||||
if (!$fp) {
|
||||
return;
|
||||
}
|
||||
chmod($filename, 0660);
|
||||
/**
|
||||
* Opens and exclusively lock a file.
|
||||
*
|
||||
* @param string $filename
|
||||
* @return resource|null
|
||||
*/
|
||||
function open_file_with_lock($filename)
|
||||
{
|
||||
$file = fopen($filename, "c+");
|
||||
if (!$file) {
|
||||
return null;
|
||||
}
|
||||
flock($fp, LOCK_EX);
|
||||
return $fp;
|
||||
|
||||
chmod($filename, 0660);
|
||||
|
||||
if (!flock($file, LOCK_EX)) {
|
||||
fclose($file);
|
||||
return null;
|
||||
}
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
/** Write and unlock a file
|
||||
* @param resource
|
||||
* @param string
|
||||
*/
|
||||
function file_write_unlock($fp, $data) {
|
||||
rewind($fp);
|
||||
fwrite($fp, $data);
|
||||
ftruncate($fp, strlen($data));
|
||||
flock($fp, LOCK_UN);
|
||||
fclose($fp);
|
||||
/**
|
||||
* Writes and unlocks a file.
|
||||
*
|
||||
* @param resource $file
|
||||
* @param string $data
|
||||
*/
|
||||
function write_and_unlock_file($file, $data)
|
||||
{
|
||||
rewind($file);
|
||||
fwrite($file, $data);
|
||||
ftruncate($file, strlen($data));
|
||||
|
||||
unlock_file($file);
|
||||
}
|
||||
|
||||
/** Read password from file adminer.key in temporary directory or create one
|
||||
* @param bool
|
||||
* @return string or false if the file can not be created
|
||||
*/
|
||||
function password_file($create) {
|
||||
/**
|
||||
* Unlocks and closes the file.
|
||||
*
|
||||
* @param resource $file
|
||||
*/
|
||||
function unlock_file($file)
|
||||
{
|
||||
flock($file, LOCK_UN);
|
||||
fclose($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads password from file adminer.key in temporary directory or create one.
|
||||
*
|
||||
* @param $create bool
|
||||
* @return string|false Returns false if the file can not be created.
|
||||
* @throws \Random\RandomException
|
||||
*/
|
||||
function get_private_key($create)
|
||||
{
|
||||
$filename = get_temp_dir() . "/adminer.key";
|
||||
$return = @file_get_contents($filename); // @ - may not exist
|
||||
if ($return || !$create) {
|
||||
return $return;
|
||||
|
||||
if (!$create && !file_exists($filename)) {
|
||||
return false;
|
||||
}
|
||||
$fp = @fopen($filename, "w"); // @ - can have insufficient rights //! is not atomic
|
||||
if ($fp) {
|
||||
chmod($filename, 0660);
|
||||
$return = rand_string();
|
||||
fwrite($fp, $return);
|
||||
fclose($fp);
|
||||
|
||||
$file = open_file_with_lock($filename);
|
||||
if (!$file) {
|
||||
return false;
|
||||
}
|
||||
return $return;
|
||||
|
||||
$key = stream_get_contents($file);
|
||||
if (!$key) {
|
||||
$key = get_random_string();
|
||||
write_and_unlock_file($file, $key);
|
||||
} else {
|
||||
unlock_file($file);
|
||||
}
|
||||
|
||||
return $key;
|
||||
}
|
||||
|
||||
/** Get a random string
|
||||
* @return string 32 hexadecimal characters
|
||||
*/
|
||||
function rand_string() {
|
||||
return md5(uniqid(mt_rand(), true));
|
||||
/**
|
||||
* Returns a random 32 characters long string.
|
||||
*
|
||||
* @param $binary bool
|
||||
* @return string
|
||||
* @throws \Random\RandomException
|
||||
*/
|
||||
function get_random_string($binary = false)
|
||||
{
|
||||
$bytes = function_exists('random_bytes') ? random_bytes(32) : uniqid(mt_rand(), true);
|
||||
|
||||
return $binary ? $bytes : md5($bytes);
|
||||
}
|
||||
|
||||
/** Format value to use in select
|
||||
@@ -1241,7 +1317,7 @@ function select_value($val, $link, $field, $text_length) {
|
||||
. "<td>" . select_value($v, $link, $field, $text_length)
|
||||
;
|
||||
}
|
||||
return "<table cellspacing='0'>$return</table>";
|
||||
return "<table>$return</table>";
|
||||
}
|
||||
if (!$link) {
|
||||
$link = $adminer->selectLink($val, $field);
|
||||
@@ -1250,7 +1326,7 @@ function select_value($val, $link, $field, $text_length) {
|
||||
if (is_mail($val)) {
|
||||
$link = "mailto:$val";
|
||||
}
|
||||
if (is_url($val)) {
|
||||
if (is_web_url($val)) {
|
||||
$link = $val; // IE 11 and all modern browsers hide referrer
|
||||
}
|
||||
}
|
||||
@@ -1271,20 +1347,32 @@ function select_value($val, $link, $field, $text_length) {
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function is_mail($email) {
|
||||
$atom = '[-a-z0-9!#$%&\'*+/=?^_`{|}~]'; // characters of local-name
|
||||
$domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component
|
||||
$pattern = "$atom+(\\.$atom+)*@($domain?\\.)+$domain";
|
||||
return is_string($email) && preg_match("(^$pattern(,\\s*$pattern)*\$)i", $email);
|
||||
function is_mail($value) {
|
||||
return is_string($value) && filter_var($value, FILTER_VALIDATE_EMAIL);
|
||||
}
|
||||
|
||||
/** Check whether the string is URL address
|
||||
/** Check whether the string is web URL address
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function is_url($string) {
|
||||
$domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component //! IDN
|
||||
return preg_match("~^(https?)://($domain?\\.)+$domain(:\\d+)?(/.*)?(\\?.*)?(#.*)?\$~i", $string); //! restrict path, query and fragment characters
|
||||
function is_web_url($value) {
|
||||
if (!is_string($value) || !preg_match('~^https?://~i', $value)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$components = parse_url($value);
|
||||
if (!$components) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Encode URL path. If path was encoded already, it will be encoded twice, but we are OK with that.
|
||||
$encodedParts = array_map('urlencode', explode('/', $components['path']));
|
||||
$url = str_replace($components['path'], implode('/', $encodedParts), $value);
|
||||
|
||||
parse_str($components['query'], $params);
|
||||
$url = str_replace($components['query'], http_build_query($params), $url);
|
||||
|
||||
return (bool)filter_var($url, FILTER_VALIDATE_URL);
|
||||
}
|
||||
|
||||
/** Check if field should be shortened
|
||||
@@ -1398,13 +1486,26 @@ function lzw_decompress($binary) {
|
||||
return $return;
|
||||
}
|
||||
|
||||
/** Return events to display help on mouse over
|
||||
* @param string JS expression
|
||||
* @param bool JS expression
|
||||
* @return string
|
||||
*/
|
||||
function on_help($command, $side = 0) {
|
||||
return script("mixin(qsl('select, input'), {onmouseover: function (event) { helpMouseover.call(this, event, $command, $side) }, onmouseout: helpMouseout});", "");
|
||||
/**
|
||||
* @param string $text Help text.
|
||||
* @param bool $side Side position.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function help_script($text, $side = false)
|
||||
{
|
||||
return script("initHelpFor(qsl('select, input'), '" . h($text) . "', $side);", "");
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $command JS expression for returning the help text.
|
||||
* @param bool $side Side position.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function help_script_command($command, $side = false)
|
||||
{
|
||||
return script("initHelpFor(qsl('select, input'), (value) => { return $command; }, $side);", "");
|
||||
}
|
||||
|
||||
/** Print edit data form
|
||||
@@ -1426,6 +1527,7 @@ function edit_form($table, $fields, $row, $update) {
|
||||
$adminer->editRowPrint($table, $fields, $row, $update);
|
||||
if ($row === false) {
|
||||
echo "<p class='error'>" . lang('No rows.') . "\n";
|
||||
return;
|
||||
}
|
||||
?>
|
||||
<form action="" method="post" enctype="multipart/form-data" id="form">
|
||||
@@ -1497,7 +1599,7 @@ function edit_form($table, $fields, $row, $update) {
|
||||
}
|
||||
}
|
||||
echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'>" . confirm() . "\n"
|
||||
: ($_POST || !$fields ? "" : script("focus(qsa('td', qs('#form'))[1].firstChild);"))
|
||||
: ($_POST || !$fields ? "" : script("focus(qsa('td', gid('form'))[1].firstChild);"))
|
||||
);
|
||||
if (isset($_GET["select"])) {
|
||||
hidden_fields(array("check" => (array) $_POST["check"], "clone" => $_POST["clone"], "all" => $_POST["all"]));
|
||||
|
@@ -87,11 +87,11 @@ function lang($idf, $number = null) {
|
||||
|
||||
function switch_lang() {
|
||||
global $LANG, $langs;
|
||||
echo "<form action='' method='post'>\n<div id='lang'>";
|
||||
echo "<div id='lang'><form action='' method='post'>\n";
|
||||
echo lang('Language') . ": " . html_select("lang", $langs, $LANG, "this.form.submit();");
|
||||
echo " <input type='submit' value='" . lang('Use') . "' class='hidden'>\n";
|
||||
echo "<input type='hidden' name='token' value='" . get_token() . "'>\n"; // $token may be empty in auth.inc.php
|
||||
echo "</div>\n</form>\n";
|
||||
echo "</form></div>\n";
|
||||
}
|
||||
|
||||
if (isset($_POST["lang"]) && verify_token()) { // $error not yet available
|
||||
|
@@ -1,2 +1,2 @@
|
||||
<?php
|
||||
$VERSION = "4.8.2";
|
||||
$VERSION = "4.11";
|
||||
|
@@ -1,11 +1,14 @@
|
||||
<?php
|
||||
/** Adminer - Compact database management
|
||||
* @link https://www.adminer.org/
|
||||
* @author Jakub Vrana, https://www.vrana.cz/
|
||||
* @copyright 2007 Jakub Vrana
|
||||
* @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)
|
||||
*/
|
||||
/**
|
||||
* Adminer - Database management in a single PHP file
|
||||
*
|
||||
* @link https://github.com/pematon/adminer
|
||||
* @author Jakub Vrana (https://www.vrana.cz/)
|
||||
* @author Peter Knut
|
||||
* @copyright 2007-2021 Jakub Vrana, 2024 Peter Knut
|
||||
* @license Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
|
||||
* @license GNU General Public License, version 2 (https://www.gnu.org/licenses/gpl-2.0.html)
|
||||
*/
|
||||
|
||||
include "./include/bootstrap.inc.php";
|
||||
include "./include/tmpfile.inc.php";
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'تسجيل الدخول',
|
||||
'Logout successful.' => 'تم تسجيل الخروج بنجاح.',
|
||||
'Invalid credentials.' => 'بيانات الدخول غير صالحة.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'الخادم',
|
||||
'Username' => 'اسم المستخدم',
|
||||
'Password' => 'كلمة المرور',
|
||||
@@ -188,6 +189,7 @@ $translations = array(
|
||||
'Clone' => 'نسخ',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'لقد تجاوزت العدد الأقصى للحقول. يرجى الرفع من %s.',
|
||||
'Partition by' => 'مقسم بواسطة',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'التقسيمات',
|
||||
'Partition name' => 'اسم التقسيم',
|
||||
'Values' => 'القيم',
|
||||
@@ -223,6 +225,7 @@ $translations = array(
|
||||
'Databases have been dropped.' => 'تم حذف قواعد البيانات.',
|
||||
'Database has been dropped.' => 'تم حذف قاعدة البيانات.',
|
||||
'Search data in tables' => 'بحث في الجداول',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'المخطط',
|
||||
'Alter schema' => 'تعديل المخطط',
|
||||
'Create schema' => 'إنشاء مخطط',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Система',
|
||||
'Server' => 'Сървър',
|
||||
'Username' => 'Потребител',
|
||||
@@ -10,7 +11,7 @@ $translations = array(
|
||||
'Logout' => 'Изход',
|
||||
'Logged as: %s' => 'Текущ потребител: %s',
|
||||
'Logout successful.' => 'Излизането е успешно.',
|
||||
'Invalid credentials.' => 'Невалидни потребителски данни.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => array('Прекалено много неуспешни опити за вход, опитайте пак след %d минута.', 'Прекалено много неуспешни опити за вход, опитайте пак след %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' => 'Език',
|
||||
@@ -22,10 +23,10 @@ $translations = array(
|
||||
'Session expired, please login again.' => 'Сесията е изтекла; моля, влезте отново.',
|
||||
'%s version: %s through PHP extension %s' => '%s версия: %s през PHP разширение %s',
|
||||
'Refresh' => 'Обновяване',
|
||||
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'ltr',
|
||||
|
||||
|
||||
'Privileges' => 'Права',
|
||||
'Create user' => 'Създаване на потребител',
|
||||
'User has been dropped.' => 'Потребителя беше премахнат.',
|
||||
@@ -36,14 +37,14 @@ $translations = array(
|
||||
'Routine' => 'Процедура',
|
||||
'Grant' => 'Осигуряване',
|
||||
'Revoke' => 'Отнемане',
|
||||
|
||||
|
||||
'Process list' => 'Списък с процеси',
|
||||
'%d process(es) have been killed.' => array('%d процес беше прекъснат.', '%d процеса бяха прекъснати.'),
|
||||
'Kill' => 'Прекъсване',
|
||||
|
||||
|
||||
'Variables' => 'Променливи',
|
||||
'Status' => 'Състояние',
|
||||
|
||||
|
||||
'SQL command' => 'SQL команда',
|
||||
'%d query(s) executed OK.' => array('%d заявка е изпълнена.', '%d заявки са изпълнени.'),
|
||||
'Query executed OK, %d row(s) affected.' => array('Заявката е изпълнена, %d ред е засегнат.', 'Заявката е изпълнена, %d редове са засегнати.'),
|
||||
@@ -57,7 +58,7 @@ $translations = array(
|
||||
'History' => 'Хронология',
|
||||
'Clear' => 'Изчистване',
|
||||
'Edit all' => 'Редактиране на всички',
|
||||
|
||||
|
||||
'File upload' => 'Прикачване на файл',
|
||||
'From server' => 'От сървър',
|
||||
'Webserver file %s' => 'Сървърен файл %s',
|
||||
@@ -69,14 +70,14 @@ $translations = array(
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Изпратени са прекалено много данни. Намалете обема на данните или увеличете %s управляващата директива.',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => 'Можете да прикачите голям SQL файл чрез FTP и да го импортирате от сървъра.',
|
||||
'You are offline.' => 'Вие сте офлайн.',
|
||||
|
||||
|
||||
'Export' => 'Експорт',
|
||||
'Output' => 'Резултат',
|
||||
'open' => 'показване',
|
||||
'save' => 'запис',
|
||||
'Format' => 'Формат',
|
||||
'Data' => 'Данни',
|
||||
|
||||
|
||||
'Database' => 'База данни',
|
||||
'database' => 'база данни',
|
||||
'Use' => 'Избор',
|
||||
@@ -90,10 +91,10 @@ $translations = array(
|
||||
'Alter database' => 'Промяна на база данни',
|
||||
'Create database' => 'Създаване на база данни',
|
||||
'Database schema' => 'Схема на базата данни',
|
||||
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'Постоянна препратка',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
@@ -116,7 +117,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'Таблиците бяха преместени.',
|
||||
'Copy' => 'Копиране',
|
||||
'Tables have been copied.' => 'Таблиците бяха копирани.',
|
||||
|
||||
|
||||
'Routines' => 'Процедури',
|
||||
'Routine has been called, %d row(s) affected.' => array('Беше приложена процедура, %d ред е засегнат.', 'Беше приложена процедура, %d редове са засегнати.'),
|
||||
'Call' => 'Прилагане',
|
||||
@@ -129,7 +130,7 @@ $translations = array(
|
||||
'Alter function' => 'Промяна на функция',
|
||||
'Alter procedure' => 'Промяна на процедура',
|
||||
'Return type' => 'Резултат',
|
||||
|
||||
|
||||
'Events' => 'Събития',
|
||||
'Event has been dropped.' => 'Събитието беше премахнато.',
|
||||
'Event has been altered.' => 'Събитието беше променено.',
|
||||
@@ -142,7 +143,7 @@ $translations = array(
|
||||
'Start' => 'Начало',
|
||||
'End' => 'Край',
|
||||
'On completion preserve' => 'Запазване след завършване',
|
||||
|
||||
|
||||
'Tables' => 'Таблици',
|
||||
'Tables and views' => 'Таблици и изгледи',
|
||||
'Table' => 'Таблица',
|
||||
@@ -174,12 +175,13 @@ $translations = array(
|
||||
'Move down' => 'Преместване надолу',
|
||||
'Remove' => 'Премахване',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Максималния брой полета е превишен. Моля, увеличете %s.',
|
||||
|
||||
|
||||
'Partition by' => 'Разделяне на',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Раздели',
|
||||
'Partition name' => 'Име на раздела',
|
||||
'Values' => 'Стойности',
|
||||
|
||||
|
||||
'View' => 'Изглед',
|
||||
'Materialized view' => 'Запаметен изглед',
|
||||
'View has been dropped.' => 'Изгледа беше премахнат.',
|
||||
@@ -187,14 +189,14 @@ $translations = array(
|
||||
'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.' => 'Препратката беше премахната.',
|
||||
@@ -210,7 +212,7 @@ $translations = array(
|
||||
'ON DELETE' => 'При изтриване',
|
||||
'ON UPDATE' => 'При промяна',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Колоните източник и цел трябва да са от еднакъв вид, трябва да има индекс на колоните приемник и да има въведени данни.',
|
||||
|
||||
|
||||
'Triggers' => 'Тригери',
|
||||
'Add trigger' => 'Добавяне на тригер',
|
||||
'Trigger has been dropped.' => 'Тригера беше премахнат.',
|
||||
@@ -221,7 +223,7 @@ $translations = array(
|
||||
'Time' => 'Време',
|
||||
'Event' => 'Събитие',
|
||||
'Name' => 'Име',
|
||||
|
||||
|
||||
'select' => 'показване',
|
||||
'Select' => 'Показване',
|
||||
'Select data' => 'Показване на данни',
|
||||
@@ -230,6 +232,7 @@ $translations = array(
|
||||
'Search' => 'Търсене',
|
||||
'anywhere' => 'навсякъде',
|
||||
'Search data in tables' => 'Търсене на данни в таблиците',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Сортиране',
|
||||
'descending' => 'низходящо',
|
||||
'Limit' => 'Редове',
|
||||
@@ -247,16 +250,16 @@ $translations = array(
|
||||
'Loading' => 'Зареждане',
|
||||
'Whole result' => 'Пълен резултат',
|
||||
'%d byte(s)' => array('%d байт', '%d байта'),
|
||||
|
||||
|
||||
'Import' => 'Импорт',
|
||||
'%d row(s) have been imported.' => array('%d ред беше импортиран.', '%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.' => 'Елемента беше изтрит.',
|
||||
@@ -277,14 +280,14 @@ $translations = array(
|
||||
'Clone' => 'Клониране',
|
||||
'Delete' => 'Изтриване',
|
||||
'You have no privileges to update this table.' => 'Нямате праве за обновяване на таблицата.',
|
||||
|
||||
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'От',
|
||||
'Subject' => 'Тема',
|
||||
'Attachments' => 'Прикачени',
|
||||
'Send' => 'Изпращане',
|
||||
'%d e-mail(s) have been sent.' => array('%d писмо беше изпратено.', '%d писма бяха изпратени.'),
|
||||
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Числа',
|
||||
'Date and time' => 'Дата и час',
|
||||
@@ -294,7 +297,7 @@ $translations = array(
|
||||
'Network' => 'Мрежа',
|
||||
'Geometry' => 'Геометрия',
|
||||
'Relations' => 'Зависимости',
|
||||
|
||||
|
||||
'Editor' => 'Редактор',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$1-$3-$5',
|
||||
@@ -305,11 +308,11 @@ $translations = array(
|
||||
'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' => 'Създаване на схема',
|
||||
@@ -318,7 +321,7 @@ $translations = array(
|
||||
'Schema has been altered.' => 'Схемата беше променена.',
|
||||
'Schema' => 'Схема',
|
||||
'Invalid schema.' => 'Невалидна схема.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Последователности',
|
||||
'Create sequence' => 'Създаване на последователност',
|
||||
@@ -326,7 +329,7 @@ $translations = array(
|
||||
'Sequence has been created.' => 'Последователността беше създадена.',
|
||||
'Sequence has been altered.' => 'Последователността беше променена.',
|
||||
'Alter sequence' => 'Промяна на последователност',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'Видове потребители',
|
||||
'Create type' => 'Създаване на вид',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Да',
|
||||
'No' => 'Не',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'লগইন',
|
||||
'Logout successful.' => 'সফলভাবে লগআউট হয়েছে।',
|
||||
'Invalid credentials.' => 'ভুল পাসওয়ার্ড।',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'সার্ভার',
|
||||
'Username' => 'ইউজারের নাম',
|
||||
'Password' => 'পাসওয়ার্ড',
|
||||
@@ -190,6 +191,7 @@ $translations = array(
|
||||
'Clone' => 'ক্লোন',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'অনুমোদিত ফিল্ড এর সর্বাধিক সংখ্যা অতিক্রম করে গেছে। অনুগ্রহপূর্বক %s বৃদ্ধি করুন।',
|
||||
'Partition by' => 'পার্টিশন যার মাধ্যমে',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'পার্টিশন',
|
||||
'Partition name' => 'পার্টিশনের নাম',
|
||||
'Values' => 'মানসমূহ',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'স্থায়ী লগইন',
|
||||
'Databases have been dropped.' => 'ডাটাবেজসমূহ মুছে ফেলা হয়েছে।',
|
||||
'Search data in tables' => 'টেবিলে তথ্য খুঁজুন',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'স্কিমা',
|
||||
'Alter schema' => 'স্কিমা পরিবর্তন করো',
|
||||
'Create schema' => 'স্কিমা তৈরী করো',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Sistem',
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Korisničko ime',
|
||||
@@ -10,7 +11,7 @@ $translations = array(
|
||||
'Logout' => 'Odjava',
|
||||
'Logged as: %s' => 'Prijavi se kao: %s',
|
||||
'Logout successful.' => 'Uspešna odjava.',
|
||||
'Invalid credentials.' => 'Nevažeće dozvole.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Language' => 'Jezik',
|
||||
'Invalid CSRF token. Send the form again.' => 'Nevažeći CSRF kod. Proslijedite ponovo formu.',
|
||||
'No extension' => 'Bez dodataka',
|
||||
@@ -167,6 +168,7 @@ $translations = array(
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Premašen je maksimalni broj dozvoljenih polja. Molim uvećajte %s.',
|
||||
|
||||
'Partition by' => 'Podijeli po',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Podijele',
|
||||
'Partition name' => 'Ime podijele',
|
||||
'Values' => 'Vrijednosti',
|
||||
@@ -221,6 +223,7 @@ $translations = array(
|
||||
'Search' => 'Pretraga',
|
||||
'anywhere' => 'bilo gdje',
|
||||
'Search data in tables' => 'Pretraži podatke u tabelama',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Poređaj',
|
||||
'descending' => 'opadajuće',
|
||||
'Limit' => 'Granica',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Da',
|
||||
'No' => 'Ne',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Inicia la sessió',
|
||||
'Logout successful.' => 'Desconnexió correcta.',
|
||||
'Invalid credentials.' => 'Credencials invàlides.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Servidor',
|
||||
'Username' => 'Nom d\'usuari',
|
||||
'Password' => 'Contrasenya',
|
||||
@@ -189,6 +190,7 @@ $translations = array(
|
||||
'Tables have been dropped.' => 'S\'han suprimit les taules.',
|
||||
'Clone' => 'Clona',
|
||||
'Partition by' => 'Fes particions segons',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Particions',
|
||||
'Partition name' => 'Nom de la partició',
|
||||
'Values' => 'Valors',
|
||||
@@ -251,6 +253,7 @@ $translations = array(
|
||||
'Type has been created.' => 'S\'ha creat el tipus.',
|
||||
'Alter type' => 'Modifica el tipus',
|
||||
'Search data in tables' => 'Cerca dades en les taules',
|
||||
'as a regular expression' => null,
|
||||
'From server' => 'En el servidor',
|
||||
'empty' => 'buit',
|
||||
'now' => 'ara',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => 'Domů',
|
||||
'System' => 'Systém',
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Uživatel',
|
||||
@@ -11,7 +12,7 @@ $translations = array(
|
||||
'Logged as: %s' => 'Přihlášen jako: %s',
|
||||
'Logout successful.' => 'Odhlášení proběhlo v pořádku.',
|
||||
'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.',
|
||||
'Invalid server or credentials.' => 'Neplatný server nebo přihlašovací údaje.',
|
||||
'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.',
|
||||
@@ -29,10 +30,10 @@ $translations = array(
|
||||
'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.',
|
||||
'%s version: %s through PHP extension %s' => 'Verze %s: %s přes PHP rozšíření %s',
|
||||
'Refresh' => 'Obnovit',
|
||||
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'ltr',
|
||||
|
||||
|
||||
'Privileges' => 'Oprávnění',
|
||||
'Create user' => 'Vytvořit uživatele',
|
||||
'User has been dropped.' => 'Uživatel byl odstraněn.',
|
||||
@@ -43,14 +44,14 @@ $translations = array(
|
||||
'Routine' => 'Procedura',
|
||||
'Grant' => 'Povolit',
|
||||
'Revoke' => 'Zakázat',
|
||||
|
||||
|
||||
'Process list' => 'Seznam procesů',
|
||||
'%d process(es) have been killed.' => array('Byl ukončen %d proces.', 'Byly ukončeny %d procesy.', 'Bylo ukončeno %d procesů.'),
|
||||
'Kill' => 'Ukončit',
|
||||
|
||||
|
||||
'Variables' => 'Proměnné',
|
||||
'Status' => 'Stav',
|
||||
|
||||
|
||||
'SQL command' => 'SQL příkaz',
|
||||
'%d query(s) executed OK.' => array('%d příkaz proběhl v pořádku.', '%d příkazy proběhly v pořádku.', '%d příkazů proběhlo v pořádku.'),
|
||||
'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ů.'),
|
||||
@@ -67,7 +68,7 @@ $translations = array(
|
||||
'History' => 'Historie',
|
||||
'Clear' => 'Vyčistit',
|
||||
'Edit all' => 'Upravit vše',
|
||||
|
||||
|
||||
'File upload' => 'Nahrání souboru',
|
||||
'From server' => 'Ze serveru',
|
||||
'Webserver file %s' => 'Soubor %s na webovém serveru',
|
||||
@@ -79,14 +80,14 @@ $translations = array(
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Příliš velká POST data. Zmenšete data nebo zvyšte hodnotu konfigurační direktivy %s.',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => 'Velký SQL soubor můžete nahrát pomocí FTP a importovat ho ze serveru.',
|
||||
'You are offline.' => 'Jste offline.',
|
||||
|
||||
|
||||
'Export' => 'Export',
|
||||
'Output' => 'Výstup',
|
||||
'open' => 'otevřít',
|
||||
'save' => 'uložit',
|
||||
'Format' => 'Formát',
|
||||
'Data' => 'Data',
|
||||
|
||||
|
||||
'Database' => 'Databáze',
|
||||
'database' => 'databáze',
|
||||
'DB' => 'DB',
|
||||
@@ -101,10 +102,10 @@ $translations = array(
|
||||
'Alter database' => 'Pozměnit databázi',
|
||||
'Create database' => 'Vytvořit databázi',
|
||||
'Database schema' => 'Schéma databáze',
|
||||
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'Trvalý odkaz',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ' ',
|
||||
'0123456789' => '0123456789',
|
||||
@@ -128,7 +129,7 @@ $translations = array(
|
||||
'Copy' => 'Zkopírovat',
|
||||
'Tables have been copied.' => 'Tabulky byly zkopírovány.',
|
||||
'overwrite' => 'přepsat',
|
||||
|
||||
|
||||
'Routines' => 'Procedury a funkce',
|
||||
'Routine has been called, %d row(s) affected.' => array('Procedura byla zavolána, byl změněn %d záznam.', 'Procedura byla zavolána, byly změněny %d záznamy.', 'Procedura byla zavolána, bylo změněno %d záznamů.'),
|
||||
'Call' => 'Zavolat',
|
||||
@@ -141,7 +142,7 @@ $translations = array(
|
||||
'Alter function' => 'Změnit funkci',
|
||||
'Alter procedure' => 'Změnit proceduru',
|
||||
'Return type' => 'Návratový typ',
|
||||
|
||||
|
||||
'Events' => 'Události',
|
||||
'Event has been dropped.' => 'Událost byla odstraněna.',
|
||||
'Event has been altered.' => 'Událost byla změněna.',
|
||||
@@ -154,7 +155,7 @@ $translations = array(
|
||||
'Start' => 'Začátek',
|
||||
'End' => 'Konec',
|
||||
'On completion preserve' => 'Po dokončení zachovat',
|
||||
|
||||
|
||||
'Tables' => 'Tabulky',
|
||||
'Tables and views' => 'Tabulky a pohledy',
|
||||
'Table' => 'Tabulka',
|
||||
@@ -187,12 +188,13 @@ $translations = array(
|
||||
'Move down' => 'Přesunout dolů',
|
||||
'Remove' => 'Odebrat',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Byl překročen maximální povolený počet polí. Zvyšte prosím %s.',
|
||||
|
||||
|
||||
'Partition by' => 'Rozdělit podle',
|
||||
'Partition' => 'Oddíl',
|
||||
'Partitions' => 'Oddíly',
|
||||
'Partition name' => 'Název oddílu',
|
||||
'Values' => 'Hodnoty',
|
||||
|
||||
|
||||
'View' => 'Pohled',
|
||||
'Materialized view' => 'Materializovaný pohled',
|
||||
'View has been dropped.' => 'Pohled byl odstraněn.',
|
||||
@@ -200,14 +202,14 @@ $translations = array(
|
||||
'View has been created.' => 'Pohled byl vytvořen.',
|
||||
'Alter view' => 'Pozměnit pohled',
|
||||
'Create view' => 'Vytvořit pohled',
|
||||
|
||||
|
||||
'Indexes' => 'Indexy',
|
||||
'Indexes have been altered.' => 'Indexy byly změněny.',
|
||||
'Alter indexes' => 'Pozměnit indexy',
|
||||
'Add next' => 'Přidat další',
|
||||
'Index Type' => 'Typ indexu',
|
||||
'Column (length)' => 'Sloupec (délka)',
|
||||
|
||||
|
||||
'Foreign keys' => 'Cizí klíče',
|
||||
'Foreign key' => 'Cizí klíč',
|
||||
'Foreign key has been dropped.' => 'Cizí klíč byl odstraněn.',
|
||||
@@ -223,7 +225,7 @@ $translations = array(
|
||||
'ON DELETE' => 'Při smazání',
|
||||
'ON UPDATE' => 'Při změně',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Zdrojové a cílové sloupce musí mít stejný datový typ, nad cílovými sloupci musí být definován index a odkazovaná data musí existovat.',
|
||||
|
||||
|
||||
'Triggers' => 'Triggery',
|
||||
'Add trigger' => 'Přidat trigger',
|
||||
'Trigger has been dropped.' => 'Trigger byl odstraněn.',
|
||||
@@ -234,7 +236,7 @@ $translations = array(
|
||||
'Time' => 'Čas',
|
||||
'Event' => 'Událost',
|
||||
'Name' => 'Název',
|
||||
|
||||
|
||||
'select' => 'vypsat',
|
||||
'Select' => 'Vypsat',
|
||||
'Select data' => 'Vypsat data',
|
||||
@@ -243,6 +245,7 @@ $translations = array(
|
||||
'Search' => 'Vyhledat',
|
||||
'anywhere' => 'kdekoliv',
|
||||
'Search data in tables' => 'Vyhledat data v tabulkách',
|
||||
'as a regular expression' => 'jako regulární výraz',
|
||||
'Sort' => 'Seřadit',
|
||||
'descending' => 'sestupně',
|
||||
'Limit' => 'Limit',
|
||||
@@ -256,20 +259,20 @@ $translations = array(
|
||||
'%d row(s)' => array('%d řádek', '%d řádky', '%d řádků'),
|
||||
'Page' => 'Stránka',
|
||||
'last' => 'poslední',
|
||||
'Load more data' => 'Nahrát další data',
|
||||
'Loading' => 'Nahrává se',
|
||||
'Load more data' => 'Načíst další data',
|
||||
'Loading' => 'Načítá se',
|
||||
'Whole result' => 'Celý výsledek',
|
||||
'%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtů'),
|
||||
|
||||
|
||||
'Import' => 'Import',
|
||||
'%d row(s) have been imported.' => array('Byl importován %d záznam.', 'Byly importovány %d záznamy.', 'Bylo importováno %d záznamů.'),
|
||||
'File must be in UTF-8 encoding.' => 'Soubor musí být v kódování UTF-8.',
|
||||
|
||||
|
||||
// in-place editing in select
|
||||
'Modify' => 'Změnit',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+klikněte na políčko, které chcete změnit.',
|
||||
'Use edit link to modify this value.' => 'Ke změně této hodnoty použijte odkaz upravit.',
|
||||
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => 'Položka%s byla vložena.',
|
||||
'Item has been deleted.' => 'Položka byla smazána.',
|
||||
@@ -290,14 +293,14 @@ $translations = array(
|
||||
'Clone' => 'Klonovat',
|
||||
'Delete' => 'Smazat',
|
||||
'You have no privileges to update this table.' => 'Nemáte oprávnění editovat tuto tabulku.',
|
||||
|
||||
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Odesílatel',
|
||||
'Subject' => 'Předmět',
|
||||
'Attachments' => 'Přílohy',
|
||||
'Send' => 'Odeslat',
|
||||
'%d e-mail(s) have been sent.' => array('Byl odeslán %d e-mail.', 'Byly odeslány %d e-maily.', 'Bylo odesláno %d e-mailů.'),
|
||||
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Čísla',
|
||||
'Date and time' => 'Datum a čas',
|
||||
@@ -307,7 +310,7 @@ $translations = array(
|
||||
'Network' => 'Síť',
|
||||
'Geometry' => 'Geometrie',
|
||||
'Relations' => 'Vztahy',
|
||||
|
||||
|
||||
'Editor' => 'Editor',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$6.$4.$1',
|
||||
@@ -318,11 +321,11 @@ $translations = array(
|
||||
'now' => 'teď',
|
||||
'yes' => 'ano',
|
||||
'no' => 'ne',
|
||||
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => 'Soubor existuje.',
|
||||
'Please use one of the extensions %s.' => 'Prosím použijte jednu z koncovek %s.',
|
||||
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => 'Pozměnit schéma',
|
||||
'Create schema' => 'Vytvořit schéma',
|
||||
@@ -331,7 +334,7 @@ $translations = array(
|
||||
'Schema has been altered.' => 'Schéma bylo změněno.',
|
||||
'Schema' => 'Schéma',
|
||||
'Invalid schema.' => 'Nesprávné schéma.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Sekvence',
|
||||
'Create sequence' => 'Vytvořit sekvenci',
|
||||
@@ -339,11 +342,20 @@ $translations = array(
|
||||
'Sequence has been created.' => 'Sekvence byla vytvořena.',
|
||||
'Sequence has been altered.' => 'Sekvence byla změněna.',
|
||||
'Alter sequence' => 'Pozměnit sekvenci',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'Uživatelské typy',
|
||||
'Create type' => 'Vytvořit typ',
|
||||
'Type has been dropped.' => 'Typ byl odstraněn.',
|
||||
'Type has been created.' => 'Typ byl vytvořen.',
|
||||
'Alter type' => 'Pozměnit typ',
|
||||
|
||||
// Plugins
|
||||
'Columns' => 'Sloupce',
|
||||
'Nullable' => 'Povoleno null',
|
||||
'Default' => 'Výchozí',
|
||||
'Yes' => 'Ano',
|
||||
'No' => 'Ne',
|
||||
'One Time Password' => 'Jednorázové heslo',
|
||||
'Invalid OTP code.' => 'Neplatný kód OTP.',
|
||||
);
|
||||
|
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'System' => 'System',
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Brugernavn',
|
||||
@@ -9,7 +10,7 @@ $translations = array(
|
||||
'Logout' => 'Log ud',
|
||||
'Logged as: %s' => 'Logget ind som: %s',
|
||||
'Logout successful.' => 'Log af vellykket.',
|
||||
'Invalid credentials.' => 'Ugyldige log ind oplysninger.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Master-kodeordet er udløbet. <a href="https://www.adminer.org/en/extension/"%s>Implementer</a> en metode for %s for at gøre det permanent.',
|
||||
'Language' => 'Sprog',
|
||||
'Invalid CSRF token. Send the form again.' => 'Ugyldigt CSRF-token - Genindsend formen.',
|
||||
@@ -151,6 +152,7 @@ $translations = array(
|
||||
'Remove' => 'Fjern',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maksimum antal feltnavne overskredet - øg venligst %s.',
|
||||
'Partition by' => 'Partition ved',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partitioner',
|
||||
'Partition name' => 'Partitionsnavn',
|
||||
'Values' => 'Værdier',
|
||||
@@ -199,6 +201,7 @@ $translations = array(
|
||||
'Search' => 'Søg',
|
||||
'anywhere' => 'hvorsomhelst',
|
||||
'Search data in tables' => 'Søg data i tabeller',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Sorter',
|
||||
'descending' => 'faldende',
|
||||
'Limit' => 'Limit',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Ja',
|
||||
'No' => 'Nej',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,9 +1,10 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Login',
|
||||
'Logout successful.' => 'Abmeldung erfolgreich.',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Danke, dass Sie Adminer genutzt haben. <a href="https://www.adminer.org/de/donation/">Spenden willkommen!</a>',
|
||||
'Invalid credentials.' => 'Ungültige Anmelde-Informationen.',
|
||||
'Invalid server or credentials.' => 'Ungültige Server oder Anmelde-Informationen.',
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Benutzer',
|
||||
'Password' => 'Passwort',
|
||||
@@ -191,6 +192,7 @@ $translations = array(
|
||||
'Clone' => 'Klonen',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Die maximal erlaubte Anzahl der Felder ist überschritten. Bitte %s erhöhen.',
|
||||
'Partition by' => 'Partitionieren um',
|
||||
'Partition' => 'Partition',
|
||||
'Partitions' => 'Partitionen',
|
||||
'Partition name' => 'Name der Partition',
|
||||
'Values' => 'Werte',
|
||||
@@ -225,6 +227,7 @@ $translations = array(
|
||||
'Permanent login' => 'Passwort speichern',
|
||||
'Databases have been dropped.' => 'Datenbanken wurden entfernt.',
|
||||
'Search data in tables' => 'Suche in Tabellen',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'Schema',
|
||||
'Alter schema' => 'Schema ändern',
|
||||
'Create schema' => 'Schema erstellen',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Ja',
|
||||
'No' => 'Nein',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Σύστημα',
|
||||
'Server' => 'Διακομιστής',
|
||||
'Username' => 'Όνομα Χρήστη',
|
||||
@@ -10,7 +11,7 @@ $translations = array(
|
||||
'Logout' => 'Αποσύνδεση',
|
||||
'Logged as: %s' => 'Συνδεθήκατε ως %s',
|
||||
'Logout successful.' => 'Αποσυνδεθήκατε με επιτυχία.',
|
||||
'Invalid credentials.' => 'Εσφαλμένα Διαπιστευτήρια.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => array('Επανειλημμένες ανεπιτυχείς προσπάθειες σύνδεσης, δοκιμάστε ξανά σε %s λεπτό.', 'Επανειλημμένες ανεπιτυχείς προσπάθειες σύνδεσης, δοκιμάστε ξανά σε %s λεπτά.'),
|
||||
'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' => 'Γλώσσα',
|
||||
@@ -22,10 +23,10 @@ $translations = array(
|
||||
'Session expired, please login again.' => 'Η συνεδρία έληξε, παρακαλώ συνδεθείτε ξανά.',
|
||||
'%s version: %s through PHP extension %s' => '%s έκδοση: %s μέσω επέκτασης PHP %s',
|
||||
'Refresh' => 'Ανανέωση',
|
||||
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'ltr',
|
||||
|
||||
|
||||
'Privileges' => 'Δικαιώματα',
|
||||
'Create user' => 'Δημιουργία Χρήστη',
|
||||
'User has been dropped.' => 'Ο Χρήστης διαγράφηκε.',
|
||||
@@ -36,14 +37,14 @@ $translations = array(
|
||||
'Routine' => 'Ρουτίνα',
|
||||
'Grant' => 'Παραχώρηση',
|
||||
'Revoke' => 'Ανάκληση',
|
||||
|
||||
|
||||
'Process list' => 'Λίστα διεργασιών',
|
||||
'%d process(es) have been killed.' => array('Τερματίστηκε %d διεργασία.', 'Τερματίστηκαν %d διεργασίες.'),
|
||||
'Kill' => 'Τερματισμός',
|
||||
|
||||
|
||||
'Variables' => 'Μεταβλητές',
|
||||
'Status' => 'Κατάσταση',
|
||||
|
||||
|
||||
'SQL command' => 'Εντολή SQL',
|
||||
'%d query(s) executed OK.' => array('Το ερώτημα %d εκτελέστηκε ΟΚ.', 'Τα ερώτηματα %d εκτελέστηκαν ΟΚ.'),
|
||||
'Query executed OK, %d row(s) affected.' => array('Το ερώτημα εκτελέστηκε ΟΚ, επηρεάστηκε %d σειρά.', 'Το ερώτημα εκτελέστηκε ΟΚ, επηρεάστηκαν %d σειρές.'),
|
||||
@@ -57,7 +58,7 @@ $translations = array(
|
||||
'History' => 'Ιστορικό',
|
||||
'Clear' => 'Καθαρισμός',
|
||||
'Edit all' => 'Επεξεργασία όλων',
|
||||
|
||||
|
||||
'File upload' => 'Μεταφόρτωση αρχείου',
|
||||
'From server' => 'Από διακομιστή',
|
||||
'Webserver file %s' => 'Αρχείο %s από διακομιστή web',
|
||||
@@ -69,7 +70,7 @@ $translations = array(
|
||||
'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.' => 'Μπορείτε να μεταφορτώσετε ένα μεγάλο αρχείο SQL μέσω FTP και να το εισάγετε από το διακομιστή.',
|
||||
'You are offline.' => 'Βρίσκεστε εκτός σύνδεσης.',
|
||||
|
||||
|
||||
'Export' => 'Εξαγωγή',
|
||||
'Output' => 'Αποτέλεσμα',
|
||||
'open' => 'άνοιγμα',
|
||||
@@ -77,7 +78,7 @@ $translations = array(
|
||||
'Saving' => 'Γίνεται Αποθήκευση',
|
||||
'Format' => 'Μορφή',
|
||||
'Data' => 'Δεδομένα',
|
||||
|
||||
|
||||
'Database' => 'Β. Δεδομένων',
|
||||
'database' => 'β. δεδομένων',
|
||||
'Use' => 'χρήση',
|
||||
@@ -91,10 +92,10 @@ $translations = array(
|
||||
'Alter database' => 'Τροποποίηση Β.Δ.',
|
||||
'Create database' => 'Δημιουργία Β.Δ.',
|
||||
'Database schema' => 'Σχήμα Β.Δ.',
|
||||
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'Μόνιμος Σύνδεσμος',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => '.',
|
||||
'0123456789' => '0123456789',
|
||||
@@ -117,7 +118,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'Οι πίνακες μεταφέρθηκαν.',
|
||||
'Copy' => 'Αντιγραφή',
|
||||
'Tables have been copied.' => 'Οι πίνακες αντιγράφηκαν.',
|
||||
|
||||
|
||||
'Routines' => 'Ρουτίνες',
|
||||
'Routine has been called, %d row(s) affected.' => array('Η ρουτίνα εκτελέστηκε, επηρεάστηκε %d σειρά.', 'Η ρουτίνα εκτελέστηκε, επηρεάστηκαν %d σειρές.'),
|
||||
'Call' => 'Εκτέλεση',
|
||||
@@ -130,7 +131,7 @@ $translations = array(
|
||||
'Alter function' => 'Τροποποίηση λειτουργίας',
|
||||
'Alter procedure' => 'Τροποποίηση διαδικασίας',
|
||||
'Return type' => 'Επιστρεφόμενος τύπος',
|
||||
|
||||
|
||||
'Events' => 'Γεγονός',
|
||||
'Event has been dropped.' => 'Το γεγονός διαγράφηκε.',
|
||||
'Event has been altered.' => 'Το γεγονός τροποποιήθηκε.',
|
||||
@@ -143,7 +144,7 @@ $translations = array(
|
||||
'Start' => 'Έναρξη',
|
||||
'End' => 'Λήξη',
|
||||
'On completion preserve' => 'Κατά την ολοκλήρωση διατήρησε',
|
||||
|
||||
|
||||
'Tables' => 'Πίνακες',
|
||||
'Tables and views' => 'Πίνακες και Προβολές',
|
||||
'Table' => 'Πίνακας',
|
||||
@@ -175,12 +176,13 @@ $translations = array(
|
||||
'Move down' => 'Μετακίνηση προς τα κάτω',
|
||||
'Remove' => 'Αφαίρεση',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Υπέρβαση μέγιστου επιτρεπόμενου αριθμού πεδίων. Παρακαλώ αυξήστε %s.',
|
||||
|
||||
|
||||
'Partition by' => 'Τμηματοποίηση ανά',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Τμήματα',
|
||||
'Partition name' => 'Όνομα Τμήματος',
|
||||
'Values' => 'Τιμές',
|
||||
|
||||
|
||||
'View' => 'Προβολή',
|
||||
'Materialized view' => 'Υλοποιημένη προβολή',
|
||||
'View has been dropped.' => 'Η προβολή διαγράφηκε.',
|
||||
@@ -188,14 +190,14 @@ $translations = array(
|
||||
'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.' => 'Το εξαρτημένο κλειδί διαγράφηκε.',
|
||||
@@ -211,7 +213,7 @@ $translations = array(
|
||||
'ON DELETE' => 'ΚΑΤΑ ΤΗ ΔΙΑΓΡΑΦΗ',
|
||||
'ON UPDATE' => 'ΚΑΤΑ ΤΗΝ ΑΛΛΑΓΗ',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Οι στήλες στην πηγή και το στόχο πρέπει να έχουν τον ίδιο τύπο, πρέπει να υπάρχει δείκτης στη στήλη στόχο και να υπάρχουν εξαρτημένα δεδομένα.',
|
||||
|
||||
|
||||
'Triggers' => 'Εναύσματα',
|
||||
'Add trigger' => 'Προσθήκη εναύσματος',
|
||||
'Trigger has been dropped.' => 'Το έναυσμα διαγράφηκε.',
|
||||
@@ -222,7 +224,7 @@ $translations = array(
|
||||
'Time' => 'Ώρα',
|
||||
'Event' => 'Γεγονός',
|
||||
'Name' => 'Όνομα',
|
||||
|
||||
|
||||
'select' => 'επιλογή',
|
||||
'Select' => 'Επιλογή',
|
||||
'Select data' => 'Επιλέξτε δεδομένα',
|
||||
@@ -231,6 +233,7 @@ $translations = array(
|
||||
'Search' => 'Αναζήτηση',
|
||||
'anywhere' => 'παντού',
|
||||
'Search data in tables' => 'Αναζήτηση δεδομένων στους πίνακες',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Ταξινόμηση',
|
||||
'descending' => 'Φθίνουσα',
|
||||
'Limit' => 'Όριο',
|
||||
@@ -248,16 +251,16 @@ $translations = array(
|
||||
'Loading' => 'Φορτώνει',
|
||||
'Whole result' => 'Όλο το αποτέλεσμα',
|
||||
'%d byte(s)' => array('%d byte', '%d bytes'),
|
||||
|
||||
|
||||
'Import' => 'Εισαγωγή',
|
||||
'%d row(s) have been imported.' => array('$d σειρά εισήχθη.', '%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+click σε μια τιμή για να την τροποποιήσετε.',
|
||||
'Use edit link to modify this value.' => 'Χρησιμοποιήστε το σύνδεσμο επεξεργασία για να τροποποιήσετε την τιμή.',
|
||||
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => 'Η εγγραφή%s εισήχθη.',
|
||||
'Item has been deleted.' => 'Η εγγραφή διαγράφηκε.',
|
||||
@@ -277,14 +280,14 @@ $translations = array(
|
||||
'Clone' => 'Κλωνοποίηση',
|
||||
'Delete' => 'Διαγραφή',
|
||||
'You have no privileges to update this table.' => 'Δεν έχετε δικαίωμα να τροποποιήσετε αυτό τον πίνακα.',
|
||||
|
||||
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Από',
|
||||
'Subject' => 'Θέμα',
|
||||
'Attachments' => 'Συνημμένα',
|
||||
'Send' => 'Αποστολή',
|
||||
'%d e-mail(s) have been sent.' => array('%d e-mail απεστάλη.', '%d e-mail απεστάλησαν.'),
|
||||
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Αριθμοί',
|
||||
'Date and time' => 'Ημερομηνία και ώρα',
|
||||
@@ -294,7 +297,7 @@ $translations = array(
|
||||
'Network' => 'Δίκτυο',
|
||||
'Geometry' => 'Γεωμετρία',
|
||||
'Relations' => 'Συσχετήσεις',
|
||||
|
||||
|
||||
'Editor' => 'Επεξεργαστής',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$5/$3/$1',
|
||||
@@ -305,11 +308,11 @@ $translations = array(
|
||||
'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' => 'Δημιουργία σχήματος',
|
||||
@@ -318,7 +321,7 @@ $translations = array(
|
||||
'Schema has been altered.' => 'Το σχήμα τροποποιήθηκε.',
|
||||
'Schema' => 'Σχήμα',
|
||||
'Invalid schema.' => 'Άκυρο σχήμα.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Αλληλουχία',
|
||||
'Create sequence' => 'Δημιουργία αλληλουχίας',
|
||||
@@ -326,7 +329,7 @@ $translations = array(
|
||||
'Sequence has been created.' => 'Η αλληλουχία δημιουργήθηκε.',
|
||||
'Sequence has been altered.' => 'Η αλληλουχία τροποποιήθηκε.',
|
||||
'Alter sequence' => 'Τροποποίηση αλληλουχίας',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'Τύποι χρήστη',
|
||||
'Create type' => 'Δημιουργία τύπου',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Login',
|
||||
'Logout successful.' => 'Sesión finalizada con éxito.',
|
||||
'Invalid credentials.' => 'Usuario y/o clave de acceso incorrecta.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Servidor',
|
||||
'Username' => 'Usuario',
|
||||
'Password' => 'Contraseña',
|
||||
@@ -190,6 +191,7 @@ $translations = array(
|
||||
'Clone' => 'Clonar',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Excedida la cantidad máxima de campos permitidos. Por favor aumente %s.',
|
||||
'Partition by' => 'Particionar por',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Particiones',
|
||||
'Partition name' => 'Nombre de partición',
|
||||
'Values' => 'Valores',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'Guardar contraseña',
|
||||
'Databases have been dropped.' => 'Bases de datos eliminadas.',
|
||||
'Search data in tables' => 'Buscar datos en tablas',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'Esquema',
|
||||
'Alter schema' => 'Modificar esquema',
|
||||
'Create schema' => 'Crear esquema',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Logi sisse',
|
||||
'Logout successful.' => 'Väljalogimine õnnestus.',
|
||||
'Invalid credentials.' => 'Ebakorrektsed andmed.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Kasutajanimi',
|
||||
'Password' => 'Parool',
|
||||
@@ -190,6 +191,7 @@ $translations = array(
|
||||
'Clone' => 'Kloon',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maksimaalne väljade arv ületatud. Palun suurendage %s.',
|
||||
'Partition by' => 'Partitsiooni',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partitsioonid',
|
||||
'Partition name' => 'Partitsiooni nimi',
|
||||
'Values' => 'Väärtused',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'Jäta mind meelde',
|
||||
'Databases have been dropped.' => 'Andmebaasid on edukalt kustutatud.',
|
||||
'Search data in tables' => 'Otsi kogu andmebaasist',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'Struktuur',
|
||||
'Alter schema' => 'Muuda struktuuri',
|
||||
'Create schema' => 'Loo struktuur',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'سیستم',
|
||||
'Server' => 'سرور',
|
||||
'Username' => 'نام کاربری',
|
||||
@@ -10,7 +11,7 @@ $translations = array(
|
||||
'Logout' => 'خروج',
|
||||
'Logged as: %s' => 'ورود به عنوان: %s',
|
||||
'Logout successful.' => 'با موفقیت خارج شدید.',
|
||||
'Invalid credentials.' => 'اعتبار سنجی نامعتبر.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => array('ورودهای ناموفق بیش از حد، %d دقیقه دیگر تلاش نمایید.', 'ورودهای ناموفق بیش از حد، %d دقیقه دیگر تلاش نمایید.'),
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'رمز اصلی باطل شده است. روش %s را <a href="https://www.adminer.org/en/extension/"%s>پیاده سازی</a> کرده تا آن را دائمی سازید.',
|
||||
'Language' => 'زبان',
|
||||
@@ -21,10 +22,10 @@ $translations = array(
|
||||
'Session expired, please login again.' => 'نشست پایان یافته، لطفا دوباره وارد شوید.',
|
||||
'%s version: %s through PHP extension %s' => 'نسخه %s : %s توسعه پی اچ پی %s',
|
||||
'Refresh' => 'بازیابی',
|
||||
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'rtl',
|
||||
|
||||
|
||||
'Privileges' => 'امتیازات',
|
||||
'Create user' => 'ایجاد کاربر',
|
||||
'User has been dropped.' => 'کاربر حذف شد.',
|
||||
@@ -35,14 +36,14 @@ $translations = array(
|
||||
'Routine' => 'روتین',
|
||||
'Grant' => 'اعطا',
|
||||
'Revoke' => 'لغو کردن',
|
||||
|
||||
|
||||
'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 سطر تغیر کرد.',
|
||||
@@ -56,7 +57,7 @@ $translations = array(
|
||||
'History' => 'تاریخ',
|
||||
'Clear' => 'پاک کردن',
|
||||
'Edit all' => 'ویرایش همه',
|
||||
|
||||
|
||||
'File upload' => 'بارگذاری فایل',
|
||||
'From server' => 'از سرور',
|
||||
'Webserver file %s' => '%s فایل وب سرور',
|
||||
@@ -75,7 +76,7 @@ $translations = array(
|
||||
'save' => 'ذخیره',
|
||||
'Format' => 'حذف',
|
||||
'Data' => 'داده',
|
||||
|
||||
|
||||
'Database' => 'پایگاه داده',
|
||||
'database' => 'پایگاه داده',
|
||||
'Use' => 'استفاده',
|
||||
@@ -89,10 +90,10 @@ $translations = array(
|
||||
'Alter database' => 'ویرایش پایگاه داده',
|
||||
'Create database' => 'ایجاد پایگاه داده',
|
||||
'Database schema' => 'ساختار پایگاه داده',
|
||||
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'ارتباط دائم',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ' ',
|
||||
'0123456789' => '۰۱۲۳۴۵۶۷۸۹',
|
||||
@@ -115,7 +116,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'جدولها انتقال داده شدند.',
|
||||
'Copy' => 'کپی کردن',
|
||||
'Tables have been copied.' => 'جدولها کپی شدند.',
|
||||
|
||||
|
||||
'Routines' => 'روالها',
|
||||
'Routine has been called, %d row(s) affected.' => array('روال فراخوانی شد %d سطر متاثر شد.', 'روال فراخوانی شد %d سطر متاثر شد.'),
|
||||
'Call' => 'صدا زدن',
|
||||
@@ -128,7 +129,7 @@ $translations = array(
|
||||
'Alter function' => 'ویرایش تابع',
|
||||
'Alter procedure' => 'ویرایش زیربرنامه',
|
||||
'Return type' => 'برگرداندن نوع',
|
||||
|
||||
|
||||
'Events' => 'رویدادها',
|
||||
'Event has been dropped.' => 'رویداد حذف شد.',
|
||||
'Event has been altered.' => 'رویداد ویرایش شد.',
|
||||
@@ -141,7 +142,7 @@ $translations = array(
|
||||
'Start' => 'آغاز',
|
||||
'End' => 'پایان',
|
||||
'On completion preserve' => 'تکمیل حفاظت فعال است',
|
||||
|
||||
|
||||
'Tables' => 'جدولها',
|
||||
'Tables and views' => 'جدولها و نمایه ها',
|
||||
'Table' => 'جدول',
|
||||
@@ -173,12 +174,13 @@ $translations = array(
|
||||
'Move down' => 'انتقال به پایین',
|
||||
'Remove' => 'حذف',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'حداکثر تعداد فیلدهای مجاز اشباع شد. لطفا %s را افزایش دهید.',
|
||||
|
||||
|
||||
'Partition by' => 'بخشبندی توسط',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'بخشبندیها',
|
||||
'Partition name' => 'نام بخش',
|
||||
'Values' => 'مقادیر',
|
||||
|
||||
|
||||
'View' => 'نمایش',
|
||||
'Materialized view' => 'نمایه مادی',
|
||||
'View has been dropped.' => 'نمایش حذف شد.',
|
||||
@@ -186,14 +188,14 @@ $translations = array(
|
||||
'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.' => 'کلید خارجی حذف شد.',
|
||||
@@ -209,7 +211,7 @@ $translations = array(
|
||||
'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.' => 'تریگر حذف شد.',
|
||||
@@ -220,7 +222,7 @@ $translations = array(
|
||||
'Time' => 'زمان',
|
||||
'Event' => 'رویداد',
|
||||
'Name' => 'نام',
|
||||
|
||||
|
||||
'select' => 'انتخاب',
|
||||
'Select' => 'انتخاب',
|
||||
'Select data' => 'انتخاب داده',
|
||||
@@ -229,6 +231,7 @@ $translations = array(
|
||||
'Search' => 'جستجو',
|
||||
'anywhere' => 'هرکجا',
|
||||
'Search data in tables' => 'جستجوی داده در جدول',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'مرتب کردن',
|
||||
'descending' => 'نزولی',
|
||||
'Limit' => 'محدودیت',
|
||||
@@ -246,16 +249,16 @@ $translations = array(
|
||||
'Loading' => 'در حال بارگزاری',
|
||||
'Whole result' => 'همه نتایج',
|
||||
'%d byte(s)' => array('%d بایت', '%d بایت'),
|
||||
|
||||
|
||||
'Import' => 'وارد کردن',
|
||||
'%d row(s) have been imported.' => array('%d سطر وارد شد.', '%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+click کنید.',
|
||||
'Use edit link to modify this value.' => 'از لینک ویرایش برای ویرایش این مقدار استفاده کنید.',
|
||||
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => '%s آیتم درج شد.',
|
||||
'Item has been deleted.' => 'آیتم حذف شد.',
|
||||
@@ -275,14 +278,14 @@ $translations = array(
|
||||
'Clone' => 'تکثیر',
|
||||
'Delete' => 'حذف',
|
||||
'You have no privileges to update this table.' => 'شما اختیار ویرایش این جدول را ندارید.',
|
||||
|
||||
|
||||
'E-mail' => 'پست الکترونیک',
|
||||
'From' => 'فرستنده',
|
||||
'Subject' => 'موضوع',
|
||||
'Attachments' => 'پیوست ها',
|
||||
'Send' => 'ارسال',
|
||||
'%d e-mail(s) have been sent.' => array('%d ایمیل ارسال شد.', '%d ایمیل ارسال شد.'),
|
||||
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'اعداد',
|
||||
'Date and time' => 'تاریخ و زمان',
|
||||
@@ -292,7 +295,7 @@ $translations = array(
|
||||
'Network' => 'شبکه',
|
||||
'Geometry' => 'هندسه',
|
||||
'Relations' => 'رابطه ها',
|
||||
|
||||
|
||||
'Editor' => 'ویرایشگر',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$1-$3-$5',
|
||||
@@ -307,7 +310,7 @@ $translations = array(
|
||||
// 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' => 'ایجاد ساختار',
|
||||
@@ -316,7 +319,7 @@ $translations = array(
|
||||
'Schema has been altered.' => 'ساختار ویرایش شد.',
|
||||
'Schema' => 'ساختار',
|
||||
'Invalid schema.' => 'ساختار نامعتبر.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'صف ها',
|
||||
'Create sequence' => 'ایجاد صف',
|
||||
@@ -324,7 +327,7 @@ $translations = array(
|
||||
'Sequence has been created.' => 'صف ایجاد شد.',
|
||||
'Sequence has been altered.' => 'صف ویرایش شد.',
|
||||
'Alter sequence' => 'ویرایش صف',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'انواع کاربر',
|
||||
'Create type' => 'ایجاد نوع',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Järjestelmä',
|
||||
'Server' => 'Palvelin',
|
||||
'Username' => 'Käyttäjänimi',
|
||||
@@ -10,7 +11,7 @@ $translations = array(
|
||||
'Logout' => 'Kirjaudu ulos',
|
||||
'Logged as: %s' => 'Olet kirjautunut käyttäjänä: %s',
|
||||
'Logout successful.' => 'Uloskirjautuminen onnistui.',
|
||||
'Invalid credentials.' => 'Virheelliset kirjautumistiedot.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => array('Liian monta epäonnistunutta sisäänkirjautumisyritystä, kokeile uudestaan %d minuutin kuluttua.', 'Liian monta epäonnistunutta sisäänkirjautumisyritystä, kokeile uudestaan %d minuutin kuluttua.'),
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Master-salasana ei ole enää voimassa. <a href="https://www.adminer.org/en/extension/"%s>Toteuta</a> %s-metodi sen tekemiseksi pysyväksi.',
|
||||
'Language' => 'Kieli',
|
||||
@@ -22,10 +23,10 @@ $translations = array(
|
||||
'Session expired, please login again.' => 'Istunto vanhentunut, kirjaudu uudelleen.',
|
||||
'%s version: %s through PHP extension %s' => '%s versio: %s PHP-laajennuksella %s',
|
||||
'Refresh' => 'Virkistä',
|
||||
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'ltr',
|
||||
|
||||
|
||||
'Privileges' => 'Oikeudet',
|
||||
'Create user' => 'Luo käyttäjä',
|
||||
'User has been dropped.' => 'Käyttäjä poistettiin.',
|
||||
@@ -36,14 +37,14 @@ $translations = array(
|
||||
'Routine' => 'Rutiini',
|
||||
'Grant' => 'Myönnä',
|
||||
'Revoke' => 'Kiellä',
|
||||
|
||||
|
||||
'Process list' => 'Prosessilista',
|
||||
'%d process(es) have been killed.' => array('%d prosessi lopetettu.', '%d prosessia lopetettu..'),
|
||||
'Kill' => 'Lopeta',
|
||||
|
||||
|
||||
'Variables' => 'Muuttujat',
|
||||
'Status' => 'Tila',
|
||||
|
||||
|
||||
'SQL command' => 'SQL-komento',
|
||||
'%d query(s) executed OK.' => array('%d kysely onnistui.', '%d kyselyä onnistui.'),
|
||||
'Query executed OK, %d row(s) affected.' => array('Kysely onnistui, kohdistui %d riviin.', 'Kysely onnistui, kohdistui %d riviin.'),
|
||||
@@ -57,7 +58,7 @@ $translations = array(
|
||||
'History' => 'Historia',
|
||||
'Clear' => 'Tyhjennä',
|
||||
'Edit all' => 'Muokkaa kaikkia',
|
||||
|
||||
|
||||
'File upload' => 'Tiedoston lataus palvelimelle',
|
||||
'From server' => 'Verkkopalvelimella Adminer-kansiossa oleva tiedosto',
|
||||
'Webserver file %s' => 'Verkkopalvelintiedosto %s',
|
||||
@@ -69,7 +70,7 @@ $translations = array(
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Liian suuri POST-datamäärä. Pienennä dataa tai kasvata arvoa %s konfigurointitiedostossa.',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => 'Voit ladata suuren SQL-tiedoston FTP:n kautta ja tuoda sen sitten palvelimelta.',
|
||||
'You are offline.' => 'Olet offline-tilassa.',
|
||||
|
||||
|
||||
'Export' => 'Vienti',
|
||||
'Output' => 'Tulos',
|
||||
'open' => 'avaa',
|
||||
@@ -77,7 +78,7 @@ $translations = array(
|
||||
'Saving' => 'Tallennetaan',
|
||||
'Format' => 'Muoto',
|
||||
'Data' => 'Data',
|
||||
|
||||
|
||||
'Database' => 'Tietokanta',
|
||||
'database' => 'tietokanta',
|
||||
'Use' => 'Käytä',
|
||||
@@ -91,10 +92,10 @@ $translations = array(
|
||||
'Alter database' => 'Muuta tietokantaa',
|
||||
'Create database' => 'Luo tietokanta',
|
||||
'Database schema' => 'Tietokantakaava',
|
||||
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'Pysyvä linkki',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
@@ -117,7 +118,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'Taulut on siirretty.',
|
||||
'Copy' => 'Kopioi',
|
||||
'Tables have been copied.' => 'Taulut on kopioitu.',
|
||||
|
||||
|
||||
'Routines' => 'Rutiinit',
|
||||
'Routine has been called, %d row(s) affected.' => array('Rutiini kutsuttu, kohdistui %d riviin.', 'Rutiini kutsuttu, kohdistui %d riviin.'),
|
||||
'Call' => 'Kutsua',
|
||||
@@ -130,7 +131,7 @@ $translations = array(
|
||||
'Alter function' => 'Muuta funktiota',
|
||||
'Alter procedure' => 'Muuta proseduuria',
|
||||
'Return type' => 'Palautustyyppi',
|
||||
|
||||
|
||||
'Events' => 'Tapahtumat',
|
||||
'Event has been dropped.' => 'Tapahtuma on poistettu.',
|
||||
'Event has been altered.' => 'Tapahtumaa on muutettu.',
|
||||
@@ -143,7 +144,7 @@ $translations = array(
|
||||
'Start' => 'Aloitus',
|
||||
'End' => 'Lopetus',
|
||||
'On completion preserve' => 'Säilytä, kun valmis',
|
||||
|
||||
|
||||
'Tables' => 'Taulut',
|
||||
'Tables and views' => 'Taulut ja näkymät',
|
||||
'Table' => 'Taulu',
|
||||
@@ -175,12 +176,13 @@ $translations = array(
|
||||
'Move down' => 'Siirrä alas',
|
||||
'Remove' => 'Poista',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Kenttien sallittu enimmäismäärä ylitetty. Kasvata arvoa %s.',
|
||||
|
||||
|
||||
'Partition by' => 'Osioi arvolla',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Osiot',
|
||||
'Partition name' => 'Osion nimi',
|
||||
'Values' => 'Arvot',
|
||||
|
||||
|
||||
'View' => 'Näkymä',
|
||||
'Materialized view' => 'Materialisoitunut näkymä',
|
||||
'View has been dropped.' => 'Näkymä on poistettu.',
|
||||
@@ -188,14 +190,14 @@ $translations = array(
|
||||
'View has been created.' => 'Näkymä on luotu.',
|
||||
'Alter view' => 'Muuta näkymää',
|
||||
'Create view' => 'Luo näkymä',
|
||||
|
||||
|
||||
'Indexes' => 'Indeksit',
|
||||
'Indexes have been altered.' => 'Indeksejä on muutettu.',
|
||||
'Alter indexes' => 'Muuta indeksejä',
|
||||
'Add next' => 'Lisää seuraava',
|
||||
'Index Type' => 'Indeksityyppi',
|
||||
'Column (length)' => 'Sarake (pituus)',
|
||||
|
||||
|
||||
'Foreign keys' => 'Vieraat avaimet',
|
||||
'Foreign key' => 'Vieras avain',
|
||||
'Foreign key has been dropped.' => 'Vieras avain on poistettu.',
|
||||
@@ -211,7 +213,7 @@ $translations = array(
|
||||
'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.' => 'Lähde- ja kohdesarakkeiden tulee olla samaa tietotyyppiä, kohdesarakkeisiin tulee olla indeksi ja dataa, johon viitataan, täytyy olla.',
|
||||
|
||||
|
||||
'Triggers' => 'Liipaisimet',
|
||||
'Add trigger' => 'Lisää liipaisin',
|
||||
'Trigger has been dropped.' => 'Liipaisin on poistettu.',
|
||||
@@ -222,7 +224,7 @@ $translations = array(
|
||||
'Time' => 'Aika',
|
||||
'Event' => 'Tapahtuma',
|
||||
'Name' => 'Nimi',
|
||||
|
||||
|
||||
'select' => 'valitse',
|
||||
'Select' => 'Valitse',
|
||||
'Select data' => 'Valitse data',
|
||||
@@ -231,6 +233,7 @@ $translations = array(
|
||||
'Search' => 'Hae',
|
||||
'anywhere' => 'kaikkialta',
|
||||
'Search data in tables' => 'Hae dataa tauluista',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Lajittele',
|
||||
'descending' => 'alenevasti',
|
||||
'Limit' => 'Raja',
|
||||
@@ -248,16 +251,16 @@ $translations = array(
|
||||
'Loading' => 'Ladataan',
|
||||
'Whole result' => 'Koko tulos',
|
||||
'%d byte(s)' => array('%d tavu', '%d tavua'),
|
||||
|
||||
|
||||
'Import' => 'Tuonti',
|
||||
'%d row(s) have been imported.' => array('%d rivi tuotiin.', '%d riviä tuotiin.'),
|
||||
'File must be in UTF-8 encoding.' => 'Tiedoston täytyy olla UTF-8-muodossa.',
|
||||
|
||||
|
||||
// in-place editing in select
|
||||
'Modify' => 'Muuta',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+napsauta arvoa muuttaaksesi.',
|
||||
'Use edit link to modify this value.' => 'Käytä muokkaa-linkkiä muuttaaksesi tätä arvoa.',
|
||||
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => 'Tietue%s lisättiin.',
|
||||
'Item has been deleted.' => 'Tietue poistettiin.',
|
||||
@@ -277,14 +280,14 @@ $translations = array(
|
||||
'Clone' => 'Kloonaa',
|
||||
'Delete' => 'Poista',
|
||||
'You have no privileges to update this table.' => 'Sinulla ei ole oikeutta päivittää tätä taulua.',
|
||||
|
||||
|
||||
'E-mail' => 'S-posti',
|
||||
'From' => 'Lähettäjä',
|
||||
'Subject' => 'Aihe',
|
||||
'Attachments' => 'Liitteet',
|
||||
'Send' => 'Lähetä',
|
||||
'%d e-mail(s) have been sent.' => array('% sähköpostiviestiä lähetetty.', '% sähköpostiviestiä lähetetty.'),
|
||||
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Numerot',
|
||||
'Date and time' => 'Päiväys ja aika',
|
||||
@@ -294,7 +297,7 @@ $translations = array(
|
||||
'Network' => 'Verkko',
|
||||
'Geometry' => 'Geometria',
|
||||
'Relations' => 'Suhteet',
|
||||
|
||||
|
||||
'Editor' => 'Editori',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$5.$3.$1',
|
||||
@@ -305,11 +308,11 @@ $translations = array(
|
||||
'now' => 'nyt',
|
||||
'yes' => 'kyllä',
|
||||
'no' => 'ei',
|
||||
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => 'Tiedosto on olemassa.',
|
||||
'Please use one of the extensions %s.' => 'Käytä jotain %s-laajennuksista.',
|
||||
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => 'Muuta kaavaa',
|
||||
'Create schema' => 'Luo kaava',
|
||||
@@ -318,7 +321,7 @@ $translations = array(
|
||||
'Schema has been altered.' => 'Kaavaa muutettiin.',
|
||||
'Schema' => 'Kaava',
|
||||
'Invalid schema.' => 'Kaava ei kelpaa.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Sekvenssit',
|
||||
'Create sequence' => 'Luo sekvenssi',
|
||||
@@ -326,7 +329,7 @@ $translations = array(
|
||||
'Sequence has been created.' => 'Sekvenssi on luotu.',
|
||||
'Sequence has been altered.' => 'Sekvenssiä on muutettu.',
|
||||
'Alter sequence' => 'Muuta sekvenssiä',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'Käyttäjän tyypit',
|
||||
'Create type' => 'Luo tyyppi',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Unknown error.' => 'Tuntematon virhe.',
|
||||
'Database does not support password.' => 'Tietokanta ei tue salasanaa.',
|
||||
'Disable %s or enable %s or %s extensions.' => 'Poista käytöstä %s tai ota käyttöön laajennus %s tai %s.',
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Kyllä',
|
||||
'No' => 'Ei',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Authentification',
|
||||
'Logout successful.' => 'Au revoir !',
|
||||
'Invalid credentials.' => 'Authentification échouée.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Serveur',
|
||||
'Username' => 'Utilisateur',
|
||||
'Password' => 'Mot de passe',
|
||||
@@ -188,6 +189,7 @@ $translations = array(
|
||||
'Clone' => 'Cloner',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Le nombre maximum de champs est dépassé. Veuillez augmenter %s.',
|
||||
'Partition by' => 'Partitionner par',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partitions',
|
||||
'Partition name' => 'Nom de la partition',
|
||||
'Values' => 'Valeurs',
|
||||
@@ -223,6 +225,7 @@ $translations = array(
|
||||
'Databases have been dropped.' => 'Les bases de données ont été supprimées.',
|
||||
'Database has been dropped.' => 'La base de données a été supprimée.',
|
||||
'Search data in tables' => 'Rechercher dans les tables',
|
||||
'as a regular expression' => 'sous forme d\'expression régulière',
|
||||
'Schema' => 'Schéma',
|
||||
'Alter schema' => 'Modifier le schéma',
|
||||
'Create schema' => 'Créer un schéma',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Unknown error.' => 'Erreur inconnue',
|
||||
'Database does not support password.' => 'La base de données ne support pas les mots de passe',
|
||||
'Disable %s or enable %s or %s extensions.' => 'Désactiver %s ou activer %s or %s extensions.',
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Oui',
|
||||
'No' => 'Non',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Conectar',
|
||||
'Logout successful.' => 'Pechouse a sesión con éxito.',
|
||||
'Invalid credentials.' => 'Credenciais (usuario e/ou contrasinal) inválidos.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Servidor',
|
||||
'Username' => 'Usuario',
|
||||
'Password' => 'Contrasinal',
|
||||
@@ -190,6 +191,7 @@ $translations = array(
|
||||
'Clone' => 'Clonar',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Excedida o número máximo de campos permitidos. Por favor aumente %s.',
|
||||
'Partition by' => 'Particionar por',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Particións',
|
||||
'Partition name' => 'Nome da Partición',
|
||||
'Values' => 'Valores',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'Permanecer conectado',
|
||||
'Databases have been dropped.' => 'Elimináronse as bases de datos.',
|
||||
'Search data in tables' => 'Buscar datos en táboas',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'Esquema',
|
||||
'Alter schema' => 'Modificar esquema',
|
||||
'Create schema' => 'Crear esquema',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Si',
|
||||
'No' => 'Non',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'התחברות',
|
||||
'Logout successful.' => 'ההתחברות הצליחה',
|
||||
'Invalid credentials.' => 'פרטי התחברות שגויים',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'שרת',
|
||||
'Username' => 'שם משתמש',
|
||||
'Password' => 'סיסמה',
|
||||
@@ -188,6 +189,7 @@ $translations = array(
|
||||
'Clone' => 'שכפל',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'הגעת למספר השדות המרבי. בבקשה הגדל את %s',
|
||||
'Partition by' => 'מחיצות ע"י',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'מחיצות',
|
||||
'Partition name' => 'שם מחיצה',
|
||||
'Values' => 'ערכים',
|
||||
@@ -223,6 +225,7 @@ $translations = array(
|
||||
'Databases have been dropped.' => 'מסד הנתונים הושלך',
|
||||
'Database has been dropped.' => 'מסד הנתונים הושלך',
|
||||
'Search data in tables' => 'חפש מידע בטבלאות',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'סכמה',
|
||||
'Alter schema' => 'שנה סכמה',
|
||||
'Create schema' => 'צור סכמה',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Belépés',
|
||||
'Logout successful.' => 'Sikeres kilépés.',
|
||||
'Invalid credentials.' => 'Érvénytelen adatok.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Szerver',
|
||||
'Username' => 'Felhasználó',
|
||||
'Password' => 'Jelszó',
|
||||
@@ -189,6 +190,7 @@ $translations = array(
|
||||
'Tables have been dropped.' => 'Táblák eldobva.',
|
||||
'Clone' => 'Klónoz',
|
||||
'Partition by' => 'Particionálás ezzel',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Particiók',
|
||||
'Partition name' => 'Partició neve',
|
||||
'Values' => 'Értékek',
|
||||
@@ -250,6 +252,7 @@ $translations = array(
|
||||
'Type has been created.' => 'Típus létrehozva.',
|
||||
'Alter type' => 'Típus módosítása',
|
||||
'Search data in tables' => 'Keresés a táblákban',
|
||||
'as a regular expression' => null,
|
||||
'From server' => 'Szerverről',
|
||||
'empty' => 'üres',
|
||||
'now' => 'most',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Sistem',
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Pengguna',
|
||||
@@ -10,7 +11,7 @@ $translations = array(
|
||||
'Logout' => 'Keluar',
|
||||
'Logged as: %s' => 'Masuk sebagai: %s',
|
||||
'Logout successful.' => 'Berhasil keluar.',
|
||||
'Invalid credentials.' => 'Akses tidak sah.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Language' => 'Bahasa',
|
||||
'Invalid CSRF token. Send the form again.' => 'Token CSRF tidak sah. Kirim ulang formulir.',
|
||||
'No extension' => 'Ekstensi tidak ada',
|
||||
@@ -167,6 +168,7 @@ $translations = array(
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Sudah lebih dumlah ruas maksimum yang diizinkan. Harap naikkan %s.',
|
||||
|
||||
'Partition by' => 'Partisi menurut',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partisi',
|
||||
'Partition name' => 'Nama partisi',
|
||||
'Values' => 'Nilai',
|
||||
@@ -220,6 +222,7 @@ $translations = array(
|
||||
'Search' => 'Cari',
|
||||
'anywhere' => 'di mana pun',
|
||||
'Search data in tables' => 'Cari data dalam tabel',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Urutkan',
|
||||
'descending' => 'menurun',
|
||||
'Limit' => 'Batas',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Autenticazione',
|
||||
'Logout successful.' => 'Uscita effettuata con successo.',
|
||||
'Invalid credentials.' => 'Credenziali non valide.',
|
||||
'Invalid server or credentials.' => 'Server o credenziali non valide.',
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Utente',
|
||||
'Password' => 'Password',
|
||||
@@ -190,6 +191,7 @@ $translations = array(
|
||||
'Clone' => 'Clona',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Troppi campi. Per favore aumentare %s.',
|
||||
'Partition by' => 'Partiziona per',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partizioni',
|
||||
'Partition name' => 'Nome partizione',
|
||||
'Values' => 'Valori',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'Login permanente',
|
||||
'Databases have been dropped.' => 'Database eliminati.',
|
||||
'Search data in tables' => 'Cerca nelle tabelle',
|
||||
'as a regular expression' => 'come espressione regolare',
|
||||
'Schema' => 'Schema',
|
||||
'Alter schema' => 'Modifica schema',
|
||||
'Create schema' => 'Crea schema',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => 'Disabilita %s o abilita %s oppure %s estensioni.',
|
||||
'yes' => 'si',
|
||||
'no' => 'no',
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Si',
|
||||
'No' => 'No',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'ログイン',
|
||||
'Logout successful.' => 'ログアウト',
|
||||
'Invalid credentials.' => '不正なログイン',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'サーバ',
|
||||
'Username' => 'ユーザ名',
|
||||
'Password' => 'パスワード',
|
||||
@@ -189,6 +190,7 @@ $translations = array(
|
||||
'Clone' => 'クローン',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => '定義可能な最大フィールド数を越えました。%s を増やしてください。',
|
||||
'Partition by' => 'パーティション',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'パーティション',
|
||||
'Partition name' => 'パーティション名',
|
||||
'Values' => '値',
|
||||
@@ -225,6 +227,7 @@ $translations = array(
|
||||
'Permanent login' => '永続的にログイン',
|
||||
'Databases have been dropped.' => 'データベースを削除しました',
|
||||
'Search data in tables' => 'データを検索する',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'スキーマ',
|
||||
'Alter schema' => 'スキーマ変更',
|
||||
'Create schema' => 'スキーマ追加',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'შესვლა',
|
||||
'Logout successful.' => 'გამოხვედით სისტემიდან.',
|
||||
'Invalid credentials.' => 'არასწორი მომხმარებელი ან პაროლი.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'სერვერი',
|
||||
'Username' => 'მომხმარებელი',
|
||||
'Password' => 'პაროლი',
|
||||
@@ -187,6 +188,7 @@ $translations = array(
|
||||
'Tables have been dropped.' => 'ცხრილები წაიშალა.',
|
||||
'Clone' => 'კლონირება',
|
||||
'Partition by' => 'დაყოფა',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'დანაყოფები',
|
||||
'Partition name' => 'დანაყოფის სახელი',
|
||||
'Values' => 'პარამეტრები',
|
||||
@@ -220,6 +222,7 @@ $translations = array(
|
||||
'Permanent login' => 'სისტემაში დარჩენა',
|
||||
'Databases have been dropped.' => 'ბაზა წაიშალა.',
|
||||
'Search data in tables' => 'ცხრილებში ძებნა',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'სქემა',
|
||||
'Alter schema' => 'სქემის შეცვლა',
|
||||
'Create schema' => 'ახალი სქემა',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => 'გათიშეთ %s ან ჩართეთ %s ან %s გაფართოება.',
|
||||
|
||||
'overwrite' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'$1-$3-$5' => '$1-$3-$5',
|
||||
'%.3f s' => '%.3f 초',
|
||||
'%d byte(s)' => '%d 바이트',
|
||||
@@ -121,7 +122,7 @@ $translations = array(
|
||||
'Indexes have been altered.' => '색인을 변경했습니다.',
|
||||
'Indexes' => '색인',
|
||||
'Insert' => '삽입',
|
||||
'Invalid credentials.' => '잘못된 로그인',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Invalid CSRF token. Send the form again.' => '잘못된 CSRF 토큰입니다. 다시 보내주십시오.',
|
||||
'Invalid database.' => '잘못된 데이터베이스입니다.',
|
||||
'Invalid schema.' => '잘못된 스키마입니다.',
|
||||
@@ -172,6 +173,7 @@ $translations = array(
|
||||
'Parameter name' => '매개변수 이름',
|
||||
'Partition by' => '파티션',
|
||||
'Partition name' => '파티션 이름',
|
||||
'Partition' => null,
|
||||
'Partitions' => '파티션',
|
||||
'Password' => '비밀번호',
|
||||
'Permanent link' => '영구적으로 링크',
|
||||
@@ -204,6 +206,7 @@ $translations = array(
|
||||
'Schema has been dropped.' => '스키마를 삭제했습니다.',
|
||||
'Schema' => '스키마',
|
||||
'Search data in tables' => '테이블 내 데이터 검색',
|
||||
'as a regular expression' => null,
|
||||
'Search' => '검색',
|
||||
'Select data' => '데이터를 선택하십시오.',
|
||||
'Select database' => '데이터베이스를 선택하십시오.',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
'no' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Sistema',
|
||||
'Server' => 'Serveris',
|
||||
'Username' => 'Vartotojas',
|
||||
@@ -10,7 +11,7 @@ $translations = array(
|
||||
'Logout' => 'Atsijungti',
|
||||
'Logged as: %s' => 'Prisijungęs kaip: %s',
|
||||
'Logout successful.' => 'Jūs atsijungėte nuo sistemos.',
|
||||
'Invalid credentials.' => 'Neteisingi prisijungimo duomenys.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Language' => 'Kalba',
|
||||
'Invalid CSRF token. Send the form again.' => 'Neteisingas CSRF tokenas. Bandykite siųsti formos duomenis dar kartą.',
|
||||
'No extension' => 'Nėra plėtiio',
|
||||
@@ -19,10 +20,10 @@ $translations = array(
|
||||
'Session expired, please login again.' => 'Sesijos galiojimas baigėsi. Prisijunkite iš naujo.',
|
||||
'%s version: %s through PHP extension %s' => '%s versija: %s per PHP plėtinį %s',
|
||||
'Refresh' => 'Atnaujinti',
|
||||
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'ltr',
|
||||
|
||||
|
||||
'Privileges' => 'Privilegijos',
|
||||
'Create user' => 'Sukurti vartotoją',
|
||||
'User has been dropped.' => 'Vartotojas ištrintas.',
|
||||
@@ -33,14 +34,14 @@ $translations = array(
|
||||
'Routine' => 'Procedūra',
|
||||
'Grant' => 'Suteikti',
|
||||
'Revoke' => 'Atšaukti',
|
||||
|
||||
|
||||
'Process list' => 'Procesų sąrašas',
|
||||
'%d process(es) have been killed.' => array('%d procesas nutrauktas.', '%d procesai nutraukti.', '%d procesų nutraukta.'),
|
||||
'Kill' => 'Nutraukti',
|
||||
|
||||
|
||||
'Variables' => 'Kintamieji',
|
||||
'Status' => 'Būsena',
|
||||
|
||||
|
||||
'SQL command' => 'SQL užklausa',
|
||||
'%d query(s) executed OK.' => array('%d užklausa įvykdyta.', '%d užklausos įvykdytos.', '%d užklausų įvykdyta.'),
|
||||
'Query executed OK, %d row(s) affected.' => array('Užklausa įvykdyta. Pakeistas %d įrašas.', 'Užklausa įvykdyta. Pakeisti %d įrašai.', 'Užklausa įvykdyta. Pakeista %d įrašų.'),
|
||||
@@ -54,7 +55,7 @@ $translations = array(
|
||||
'History' => 'Istorija',
|
||||
'Clear' => 'Išvalyti',
|
||||
'Edit all' => 'Redaguoti visus',
|
||||
|
||||
|
||||
'File upload' => 'Failo įkėlimas',
|
||||
'From server' => 'Iš serverio',
|
||||
'Webserver file %s' => 'Failas %s iš serverio',
|
||||
@@ -64,14 +65,14 @@ $translations = array(
|
||||
'Unable to upload a file.' => 'Nepavyko įkelti failo.',
|
||||
'Maximum allowed file size is %sB.' => 'Maksimalus failo dydis - %sB.',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Per daug POST duomenų. Sumažinkite duomenų kiekį arba padidinkite konfigūracijos nustatymą %s.',
|
||||
|
||||
|
||||
'Export' => 'Eksportas',
|
||||
'Output' => 'Išvestis',
|
||||
'open' => 'atidaryti',
|
||||
'save' => 'išsaugoti',
|
||||
'Format' => 'Formatas',
|
||||
'Data' => 'Duomenys',
|
||||
|
||||
|
||||
'Database' => 'Duomenų bazė',
|
||||
'database' => 'duomenų bazė',
|
||||
'Use' => 'Naudoti',
|
||||
@@ -85,10 +86,10 @@ $translations = array(
|
||||
'Alter database' => 'Redaguoti duomenų bazę',
|
||||
'Create database' => 'Sukurti duomenų bazę',
|
||||
'Database schema' => 'Duomenų bazės schema',
|
||||
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'Pastovi nuoroda',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ' ',
|
||||
'0123456789' => '0123456789',
|
||||
@@ -110,7 +111,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'Lentelės perkeltos.',
|
||||
'Copy' => 'Kopijuoti',
|
||||
'Tables have been copied.' => 'Lentelės nukopijuotos.',
|
||||
|
||||
|
||||
'Routines' => 'Procedūros',
|
||||
'Routine has been called, %d row(s) affected.' => array('Procedūra įvykdyta. %d įrašas pakeistas.', 'Procedūra įvykdyta. %d įrašai pakeisti.', 'Procedūra įvykdyta. %d įrašų pakeista.'),
|
||||
'Call' => 'Vykdyti',
|
||||
@@ -123,7 +124,7 @@ $translations = array(
|
||||
'Alter function' => 'Keisti funkciją',
|
||||
'Alter procedure' => 'Keiskti procedūrą',
|
||||
'Return type' => 'Grąžinimo tipas',
|
||||
|
||||
|
||||
'Events' => 'Įvykiai',
|
||||
'Event has been dropped.' => 'Įvykis pašalintas.',
|
||||
'Event has been altered.' => 'Įvykis pakeistas.',
|
||||
@@ -136,7 +137,7 @@ $translations = array(
|
||||
'Start' => 'Pradžia',
|
||||
'End' => 'Pabaiga',
|
||||
'On completion preserve' => 'Įvykdžius išsaugoti',
|
||||
|
||||
|
||||
'Tables' => 'Lentelės',
|
||||
'Tables and views' => 'Lentelės ir vaizdai',
|
||||
'Table' => 'Lentelė',
|
||||
@@ -164,26 +165,27 @@ $translations = array(
|
||||
'Move down' => 'Perkelti žemyn',
|
||||
'Remove' => 'Pašalinti',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Viršytas maksimalus leidžiamų stulpelių kiekis. Padidinkite %s.',
|
||||
|
||||
|
||||
'Partition by' => 'Skirstyti pagal',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Skirsniai',
|
||||
'Partition name' => 'Skirsnio pavadinimas',
|
||||
'Values' => 'Reikšmės',
|
||||
|
||||
|
||||
'View' => 'Vaizdas',
|
||||
'View has been dropped.' => 'Vaizdas pašalintas.',
|
||||
'View has been altered.' => 'Vaizdas pakeistas.',
|
||||
'View has been created.' => 'Vaizdas sukurtas.',
|
||||
'Alter view' => 'Redaguoti vaizdą',
|
||||
'Create view' => 'Sukurti vaizdą',
|
||||
|
||||
|
||||
'Indexes' => 'Indeksai',
|
||||
'Indexes have been altered.' => 'Indeksai pakeisti.',
|
||||
'Alter indexes' => 'Redaguoti indeksus',
|
||||
'Add next' => 'Pridėti kitą',
|
||||
'Index Type' => 'Indekso tipas',
|
||||
'Column (length)' => 'Stulpelis (ilgis)',
|
||||
|
||||
|
||||
'Foreign keys' => 'Išoriniai raktai',
|
||||
'Foreign key' => 'Išorinis raktas',
|
||||
'Foreign key has been dropped.' => 'Išorinis raktas pašalintas.',
|
||||
@@ -199,7 +201,7 @@ $translations = array(
|
||||
'ON DELETE' => 'Ištrinant',
|
||||
'ON UPDATE' => 'Atnaujinant',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Šaltinio ir tikslinis stulpelis turi būti to paties tipo, tiksliniame stulpelyje turi būti naudojamas indeksas ir duomenys turi egzistuoti.',
|
||||
|
||||
|
||||
'Triggers' => 'Trigeriai',
|
||||
'Add trigger' => 'Pridėti trigerį',
|
||||
'Trigger has been dropped.' => 'Trigeris pašalintas.',
|
||||
@@ -210,7 +212,7 @@ $translations = array(
|
||||
'Time' => 'Laikas',
|
||||
'Event' => 'Įvykis',
|
||||
'Name' => 'Pavadinimas',
|
||||
|
||||
|
||||
'select' => 'atrinkti',
|
||||
'Select' => 'Atrinkti',
|
||||
'Select data' => 'Atrinkti duomenis',
|
||||
@@ -219,6 +221,7 @@ $translations = array(
|
||||
'Search' => 'Ieškoti',
|
||||
'anywhere' => 'visur',
|
||||
'Search data in tables' => 'Ieškoti duomenų lentelėse',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Rikiuoti',
|
||||
'descending' => 'mažėjimo tvarka',
|
||||
'Limit' => 'Limitas',
|
||||
@@ -231,13 +234,13 @@ $translations = array(
|
||||
'last' => 'paskutinis',
|
||||
'Whole result' => 'Visas rezultatas',
|
||||
'%d byte(s)' => array('%d baitas', '%d baigai', '%d baitų'),
|
||||
|
||||
|
||||
'Import' => 'Importas',
|
||||
'%d row(s) have been imported.' => array('%d įrašas įkelta.', '%d įrašai įkelti.', '%d įrašų įkelta.'),
|
||||
|
||||
|
||||
// in-place editing in select
|
||||
'Use edit link to modify this value.' => 'Norėdami redaguoti reikšmę naudokite redagavimo nuorodą.',
|
||||
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => 'Įrašas%s sukurtas.',
|
||||
'Item has been deleted.' => 'Įrašas ištrintas.',
|
||||
@@ -255,14 +258,14 @@ $translations = array(
|
||||
'Save and insert next' => 'Išsaugoti ir įrašyti kitą',
|
||||
'Clone' => 'Klonuoti',
|
||||
'Delete' => 'Trinti',
|
||||
|
||||
|
||||
'E-mail' => 'El. paštas',
|
||||
'From' => 'Nuo',
|
||||
'Subject' => 'Antraštė',
|
||||
'Attachments' => 'Priedai',
|
||||
'Send' => 'Siųsti',
|
||||
'%d e-mail(s) have been sent.' => array('Išsiųstas %d laiškas.', 'Išsiųsti %d laiškai.', 'Išsiųsta %d laiškų.'),
|
||||
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Skaičiai',
|
||||
'Date and time' => 'Data ir laikas',
|
||||
@@ -272,7 +275,7 @@ $translations = array(
|
||||
'Network' => 'Tinklas',
|
||||
'Geometry' => 'Geometrija',
|
||||
'Relations' => 'Ryšiai',
|
||||
|
||||
|
||||
'Editor' => 'Redaktorius',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$1-$3-$5',
|
||||
@@ -281,11 +284,11 @@ $translations = array(
|
||||
// hint for time format - use language equivalents for hour, minute and second shortcuts
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
'now' => 'dabar',
|
||||
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => 'Failas egzistuoja.',
|
||||
'Please use one of the extensions %s.' => 'Naudokite vieną iš plėtinių %s.',
|
||||
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => 'Keisti schemą',
|
||||
'Create schema' => 'Sukurti schemą',
|
||||
@@ -294,7 +297,7 @@ $translations = array(
|
||||
'Schema has been altered.' => 'Schema pakeista.',
|
||||
'Schema' => 'Schema',
|
||||
'Invalid schema.' => 'Neteisinga schema.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Sekos',
|
||||
'Create sequence' => 'Sukurti seką',
|
||||
@@ -302,7 +305,7 @@ $translations = array(
|
||||
'Sequence has been created.' => 'Seka sukurta.',
|
||||
'Sequence has been altered.' => 'Seka pakeista.',
|
||||
'Alter sequence' => 'Keisti seką',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'Vartotojų tipai',
|
||||
'Create type' => 'Sukurti tipą',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Ieiet',
|
||||
'Logout successful.' => 'Jūs veiksmīgi izgājāt no sistēmas.',
|
||||
'Invalid credentials.' => 'Nepareizs lietotāja vārds vai parole.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Serveris',
|
||||
'Username' => 'Lietotājs',
|
||||
'Password' => 'Parole',
|
||||
@@ -189,6 +190,7 @@ $translations = array(
|
||||
'Tables have been dropped.' => 'Tabulas dzēstas.',
|
||||
'Clone' => 'Klonēt',
|
||||
'Partition by' => 'Sadalīt pēc',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partīcijas',
|
||||
'Partition name' => 'Partīcijas nosaukums',
|
||||
'Values' => 'Vērtības',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'Atcerēties mani',
|
||||
'Databases have been dropped.' => 'Datubāzes dzēstas.',
|
||||
'Search data in tables' => 'Meklēt tabulās',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'Shēma',
|
||||
'Alter schema' => 'Izmainīt shēmu',
|
||||
'Create schema' => 'Jauna shēma',
|
||||
@@ -285,10 +288,10 @@ $translations = array(
|
||||
'Size' => 'Izmērs',
|
||||
'Compute' => 'Izskaitļot',
|
||||
'You are offline.' => 'Jūs est bezsasaistē.',
|
||||
'You have no privileges to update this table.' => 'jums nav pieejas labot šo tabulu.',
|
||||
'You have no privileges to update this table.' => 'Jums nav pieejas labot šo tabulu.',
|
||||
'Saving' => 'Saglabāšana',
|
||||
'yes' => 'Jā',
|
||||
'no' => 'Nē',
|
||||
'yes' => 'jā',
|
||||
'no' => 'nē',
|
||||
'Drop %s?' => 'Dzēst %s?',
|
||||
'overwrite' => 'pārrakstīt',
|
||||
'DB' => 'DB',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Database does not support password.' => 'Datubāze neatbalsta paroli.',
|
||||
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Jā',
|
||||
'No' => 'Nē',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Sistem',
|
||||
'Server' => 'Pelayan',
|
||||
'Username' => 'Nama pengguna',
|
||||
@@ -11,7 +12,7 @@ $translations = array(
|
||||
'Logged as: %s' => 'Log masuk sebagai: %s',
|
||||
'Logout successful.' => 'Log keluar berjaya.',
|
||||
'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.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'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',
|
||||
@@ -181,6 +182,7 @@ $translations = array(
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Bilangan medan telah melebihi had yang dibenarkan. Sila tingkatkan %s.',
|
||||
|
||||
'Partition by' => 'Partition mengikut',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partition',
|
||||
'Partition name' => 'Nama partition',
|
||||
'Values' => 'Nilai',
|
||||
@@ -235,6 +237,7 @@ $translations = array(
|
||||
'Search' => 'Cari',
|
||||
'anywhere' => 'di mana-mana',
|
||||
'Search data in tables' => 'Cari data dalam jadual',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Susun',
|
||||
'descending' => 'menurun',
|
||||
'Limit' => 'Had',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Ya',
|
||||
'No' => 'Tidak',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Aanmelden',
|
||||
'Logout successful.' => 'Successvol afgemeld.',
|
||||
'Invalid credentials.' => 'Ongeldige gebruikersgegevens.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Gebruikersnaam',
|
||||
'Password' => 'Wachtwoord',
|
||||
@@ -191,6 +192,7 @@ $translations = array(
|
||||
'Clone' => 'Dupliceer',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maximum aantal velden bereikt. Verhoog %s.',
|
||||
'Partition by' => 'Partitioneren op',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partities',
|
||||
'Partition name' => 'Partitie naam',
|
||||
'Values' => 'Waarden',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'%d in total' => '%d in totaal',
|
||||
'Permanent login' => 'Blijf aangemeld',
|
||||
'Search data in tables' => 'Zoeken in database',
|
||||
'as a regular expression' => 'als een regular expression',
|
||||
'Schema' => 'Schema',
|
||||
'Alter schema' => 'Schema wijzigen',
|
||||
'Create schema' => 'Schema maken',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => 'Schakel %s uit or schakel extensies %s of %s in.',
|
||||
'yes' => 'ja',
|
||||
'no' => 'neen',
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Ja',
|
||||
'No' => 'Neen',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'System' => 'System',
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Brukernavn',
|
||||
@@ -9,7 +10,7 @@ $translations = array(
|
||||
'Logout' => 'Logg ut',
|
||||
'Logged as: %s' => 'Logget inn som: %s',
|
||||
'Logout successful.' => 'Utlogging vellykket.',
|
||||
'Invalid credentials.' => 'Ugylding innloggingsinformasjon.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Master-passord er utløpt. <a href="https://www.adminer.org/en/extension/"%s>Implementer</a> en metode for %s for å gjøre det permanent.',
|
||||
'Language' => 'Språk',
|
||||
'Invalid CSRF token. Send the form again.' => 'Ugylding CSRF-token - Send inn skjemaet igjen.',
|
||||
@@ -151,6 +152,7 @@ $translations = array(
|
||||
'Remove' => 'Fjern',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maksimum antall feltnavn overskredet - venligst øk %s.',
|
||||
'Partition by' => 'Partisjoner ved',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partisjoner',
|
||||
'Partition name' => 'Partisjonsnavn',
|
||||
'Values' => 'Verdier',
|
||||
@@ -199,6 +201,7 @@ $translations = array(
|
||||
'Search' => 'Søk',
|
||||
'anywhere' => 'hvorsomhelst',
|
||||
'Search data in tables' => 'Søk data i tabeller',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Sorter',
|
||||
'descending' => 'minkende',
|
||||
'Limit' => 'Skranke',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Ja',
|
||||
'No' => 'Nei',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Rodzaj bazy',
|
||||
'Server' => 'Serwer',
|
||||
'Username' => 'Użytkownik',
|
||||
@@ -11,7 +12,7 @@ $translations = array(
|
||||
'Logged as: %s' => 'Zalogowany jako: %s',
|
||||
'Logout successful.' => 'Wylogowano pomyślnie.',
|
||||
'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.',
|
||||
'Invalid server or credentials.' => 'Nieprawidłowy serwer lub dane logowania.',
|
||||
'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',
|
||||
@@ -42,10 +43,10 @@ $translations = array(
|
||||
'Process list' => 'Lista procesów',
|
||||
'%d process(es) have been killed.' => array('Przerwano %d wątek.', 'Przerwano %d wątki.', 'Przerwano %d wątków.'),
|
||||
'Kill' => 'Przerwij wykonywanie',
|
||||
|
||||
|
||||
'Variables' => 'Zmienne',
|
||||
'Status' => 'Status',
|
||||
|
||||
|
||||
'SQL command' => 'Zapytanie SQL',
|
||||
'%d query(s) executed OK.' => array('Pomyślnie wykonano %d zapytanie.', 'Pomyślnie wykonano %d zapytania.', 'Pomyślnie wykonano %d zapytań.'),
|
||||
'Query executed OK, %d row(s) affected.' => array('Zapytanie wykonane pomyślnie, zmieniono %d rekord.', 'Zapytanie wykonane pomyślnie, zmieniono %d rekordy.', 'Zapytanie wykonane pomyślnie, zmieniono %d rekordów.'),
|
||||
@@ -60,7 +61,7 @@ $translations = array(
|
||||
'History' => 'Historia',
|
||||
'Clear' => 'Wyczyść',
|
||||
'Edit all' => 'Edytuj wszystkie',
|
||||
|
||||
|
||||
'File upload' => 'Wgranie pliku',
|
||||
'From server' => 'Z serwera',
|
||||
'Webserver file %s' => 'Plik %s na serwerze',
|
||||
@@ -72,14 +73,14 @@ $translations = array(
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Przesłano zbyt dużo danych. Zmniejsz objętość danych lub zwiększ zmienną konfiguracyjną %s.',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => 'Większe pliki SQL możesz wgrać na serwer poprzez FTP przed zaimportowaniem.',
|
||||
'You are offline.' => 'Jesteś offline.',
|
||||
|
||||
|
||||
'Export' => 'Eksport',
|
||||
'Output' => 'Rezultat',
|
||||
'open' => 'otwórz',
|
||||
'save' => 'zapisz',
|
||||
'Format' => 'Format',
|
||||
'Data' => 'Dane',
|
||||
|
||||
|
||||
'Database' => 'Baza danych',
|
||||
'database' => 'baza danych',
|
||||
'Use' => 'Wybierz',
|
||||
@@ -93,10 +94,10 @@ $translations = array(
|
||||
'Alter database' => 'Zmień bazę danych',
|
||||
'Create database' => 'Utwórz bazę danych',
|
||||
'Database schema' => 'Schemat bazy danych',
|
||||
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'Trwały link',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ' ',
|
||||
'0123456789' => '0123456789',
|
||||
@@ -119,7 +120,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'Tabele zostały przeniesione.',
|
||||
'Copy' => 'Kopiuj',
|
||||
'Tables have been copied.' => 'Tabele zostały skopiowane.',
|
||||
|
||||
|
||||
'Routines' => 'Procedury i funkcje',
|
||||
'Routine has been called, %d row(s) affected.' => array('Procedura została uruchomiona, zmieniono %d rekord.', 'Procedura została uruchomiona, zmieniono %d rekordy.', 'Procedura została uruchomiona, zmieniono %d rekordów.'),
|
||||
'Call' => 'Uruchom',
|
||||
@@ -132,7 +133,7 @@ $translations = array(
|
||||
'Alter function' => 'Zmień funkcję',
|
||||
'Alter procedure' => 'Zmień procedurę',
|
||||
'Return type' => 'Zwracany typ',
|
||||
|
||||
|
||||
'Events' => 'Wydarzenia',
|
||||
'Event has been dropped.' => 'Wydarzenie zostało usunięte.',
|
||||
'Event has been altered.' => 'Wydarzenie zostało zmienione.',
|
||||
@@ -145,7 +146,7 @@ $translations = array(
|
||||
'Start' => 'Początek',
|
||||
'End' => 'Koniec',
|
||||
'On completion preserve' => 'Nie kasuj wydarzenia po przeterminowaniu',
|
||||
|
||||
|
||||
'Tables' => 'Tabele',
|
||||
'Tables and views' => 'Tabele i perspektywy',
|
||||
'Table' => 'Tabela',
|
||||
@@ -178,12 +179,13 @@ $translations = array(
|
||||
'Move down' => 'Przesuń w dół',
|
||||
'Remove' => 'Usuń',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Przekroczono maksymalną liczbę pól. Zwiększ %s.',
|
||||
|
||||
|
||||
'Partition by' => 'Partycjonowanie',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partycje',
|
||||
'Partition name' => 'Nazwa partycji',
|
||||
'Values' => 'Wartości',
|
||||
|
||||
|
||||
'View' => 'Perspektywa',
|
||||
'Materialized view' => 'Zmaterializowana perspektywa',
|
||||
'View has been dropped.' => 'Perspektywa została usunięta.',
|
||||
@@ -191,14 +193,14 @@ $translations = array(
|
||||
'View has been created.' => 'Perspektywa została utworzona.',
|
||||
'Alter view' => 'Zmień perspektywę',
|
||||
'Create view' => 'Utwórz perspektywę',
|
||||
|
||||
|
||||
'Indexes' => 'Indeksy',
|
||||
'Indexes have been altered.' => 'Indeksy zostały zmienione.',
|
||||
'Alter indexes' => 'Zmień indeksy',
|
||||
'Add next' => 'Dodaj następny',
|
||||
'Index Type' => 'Typ indeksu',
|
||||
'Column (length)' => 'Kolumna (długość)',
|
||||
|
||||
|
||||
'Foreign keys' => 'Klucze obce',
|
||||
'Foreign key' => 'Klucz obcy',
|
||||
'Foreign key has been dropped.' => 'Klucz obcy został usunięty.',
|
||||
@@ -214,7 +216,7 @@ $translations = array(
|
||||
'ON DELETE' => 'W przypadku usunięcia',
|
||||
'ON UPDATE' => 'W przypadku zmiany',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Źródłowa i docelowa kolumna muszą być tego samego typu, powinien istnieć indeks na docelowej kolumnie oraz muszą istnieć dane referencyjne.',
|
||||
|
||||
|
||||
'Triggers' => 'Wyzwalacze',
|
||||
'Add trigger' => 'Dodaj wyzwalacz',
|
||||
'Trigger has been dropped.' => 'Wyzwalacz został usunięty.',
|
||||
@@ -225,7 +227,7 @@ $translations = array(
|
||||
'Time' => 'Czas',
|
||||
'Event' => 'Wydarzenie',
|
||||
'Name' => 'Nazwa',
|
||||
|
||||
|
||||
'select' => 'przeglądaj',
|
||||
'Select' => 'pokaż',
|
||||
'Select data' => 'Pokaż dane',
|
||||
@@ -234,6 +236,7 @@ $translations = array(
|
||||
'Search' => 'Szukaj',
|
||||
'anywhere' => 'gdziekolwiek',
|
||||
'Search data in tables' => 'Wyszukaj we wszystkich tabelach',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Sortuj',
|
||||
'descending' => 'malejąco',
|
||||
'Limit' => 'Limit',
|
||||
@@ -251,16 +254,16 @@ $translations = array(
|
||||
'Loading' => 'Wczytywanie',
|
||||
'Whole result' => 'Wybierz wszystkie',
|
||||
'%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtów'),
|
||||
|
||||
|
||||
'Import' => 'Import',
|
||||
'%d row(s) have been imported.' => array('%d rekord został zaimportowany.', '%d rekordy zostały zaimportowane.', '%d rekordów zostało zaimportowanych.'),
|
||||
'File must be in UTF-8 encoding.' => 'Kodowanie pliku musi być ustawione na UTF-8.',
|
||||
|
||||
|
||||
// in-place editing in select
|
||||
'Modify' => 'Zmień',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+kliknij wartość, aby ją edytować.',
|
||||
'Use edit link to modify this value.' => 'Użyj linku edycji aby zmienić tę wartość.',
|
||||
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => 'Rekord%s został dodany.',
|
||||
'Item has been deleted.' => 'Rekord został usunięty.',
|
||||
@@ -281,14 +284,14 @@ $translations = array(
|
||||
'Clone' => 'Duplikuj',
|
||||
'Delete' => 'Usuń',
|
||||
'You have no privileges to update this table.' => 'Brak uprawnień do edycji tej tabeli',
|
||||
|
||||
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Nadawca',
|
||||
'Subject' => 'Temat',
|
||||
'Attachments' => 'Załączniki',
|
||||
'Send' => 'Wyślij',
|
||||
'%d e-mail(s) have been sent.' => array('Wysłano %d e-mail.', 'Wysłano %d e-maile.', 'Wysłano %d e-maili.'),
|
||||
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Numeryczne',
|
||||
'Date and time' => 'Data i czas',
|
||||
@@ -298,7 +301,7 @@ $translations = array(
|
||||
'Network' => 'Sieć',
|
||||
'Geometry' => 'Geometria',
|
||||
'Relations' => 'Relacje',
|
||||
|
||||
|
||||
'Editor' => 'Edytor',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$6.$4.$1',
|
||||
@@ -309,11 +312,11 @@ $translations = array(
|
||||
'now' => 'teraz',
|
||||
'yes' => 'tak',
|
||||
'no' => 'nie',
|
||||
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => 'Plik już istnieje.',
|
||||
'Please use one of the extensions %s.' => 'Proszę użyć jednego z rozszerzeń: %s.',
|
||||
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => 'Zmień schemat',
|
||||
'Create schema' => 'Utwórz schemat',
|
||||
@@ -322,7 +325,7 @@ $translations = array(
|
||||
'Schema has been altered.' => 'Schemat został zmieniony.',
|
||||
'Schema' => 'Schemat',
|
||||
'Invalid schema.' => 'Nieprawidłowy schemat.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Sekwencje',
|
||||
'Create sequence' => 'Utwórz sekwencję',
|
||||
@@ -330,7 +333,7 @@ $translations = array(
|
||||
'Sequence has been created.' => 'Sekwencja została utworzona.',
|
||||
'Sequence has been altered.' => 'Sekwencja została zmieniona.',
|
||||
'Alter sequence' => 'Zmień sekwencję',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'Typy użytkownika',
|
||||
'Create type' => 'Utwórz typ',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Tak',
|
||||
'No' => 'Nie',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Entrar',
|
||||
'Logout successful.' => 'Saída bem sucedida.',
|
||||
'Invalid credentials.' => 'Identificação inválida.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Servidor',
|
||||
'Username' => 'Usuário',
|
||||
'Password' => 'Senha',
|
||||
@@ -190,6 +191,7 @@ $translations = array(
|
||||
'Clone' => 'Clonar',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s.',
|
||||
'Partition by' => 'Particionar por',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partições',
|
||||
'Partition name' => 'Nome da Partição',
|
||||
'Values' => 'Valores',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'Login permanente',
|
||||
'Databases have been dropped.' => 'A Base de dados foi apagada.',
|
||||
'Search data in tables' => 'Buscar dados nas Tabelas',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'Esquema',
|
||||
'Alter schema' => 'Alterar esquema',
|
||||
'Create schema' => 'Criar esquema',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
'HH:MM:SS' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Entrar',
|
||||
'Logout successful.' => 'Sessão terminada com sucesso.',
|
||||
'Invalid credentials.' => 'Identificação inválida.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Servidor',
|
||||
'Username' => 'Nome de utilizador',
|
||||
'Password' => 'Senha',
|
||||
@@ -190,6 +191,7 @@ $translations = array(
|
||||
'Clone' => 'Clonar',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s.',
|
||||
'Partition by' => 'Particionar por',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partições',
|
||||
'Partition name' => 'Nome da Partição',
|
||||
'Values' => 'Valores',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'Memorizar a senha',
|
||||
'Databases have been dropped.' => 'Bases de dados eliminadas.',
|
||||
'Search data in tables' => 'Pesquisar dados nas Tabelas',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'Esquema',
|
||||
'Alter schema' => 'Modificar esquema',
|
||||
'Create schema' => 'Criar esquema',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
'HH:MM:SS' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Intră',
|
||||
'Logout successful.' => 'Ați ieșit cu succes.',
|
||||
'Invalid credentials.' => 'Numele de utilizator sau parola este greșită.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Nume de utilizator',
|
||||
'Password' => 'Parola',
|
||||
@@ -189,6 +190,7 @@ $translations = array(
|
||||
'Tables have been dropped.' => 'Tabelele au fost șterse.',
|
||||
'Clone' => 'Clonează',
|
||||
'Partition by' => 'Împarte',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Secțiuni',
|
||||
'Partition name' => 'Denumirea secțiunii',
|
||||
'Values' => 'Parametru',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'Logare permanentă',
|
||||
'Databases have been dropped.' => 'Bazele de date au fost șterse.',
|
||||
'Search data in tables' => 'Caută în tabele',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'Schema',
|
||||
'Alter schema' => 'Modifică schema',
|
||||
'Create schema' => 'Crează o schemă',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'Войти',
|
||||
'Logout successful.' => 'Вы успешно покинули систему.',
|
||||
'Invalid credentials.' => 'Неправильное имя пользователя или пароль.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'Сервер',
|
||||
'Username' => 'Имя пользователя',
|
||||
'Password' => 'Пароль',
|
||||
@@ -189,6 +190,7 @@ $translations = array(
|
||||
'Tables have been dropped.' => 'Таблицы были удалены.',
|
||||
'Clone' => 'Клонировать',
|
||||
'Partition by' => 'Разделить по',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Разделы',
|
||||
'Partition name' => 'Название раздела',
|
||||
'Values' => 'Параметры',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'Оставаться в системе',
|
||||
'Databases have been dropped.' => 'Базы данных удалены.',
|
||||
'Search data in tables' => 'Поиск в таблицах',
|
||||
'as a regular expression' => 'как регулярное выражение',
|
||||
'Schema' => 'Схема',
|
||||
'Alter schema' => 'Изменить схему',
|
||||
'Create schema' => 'Новая схема',
|
||||
@@ -287,8 +290,8 @@ $translations = array(
|
||||
'You are offline.' => 'Вы не выполнили вход.',
|
||||
'You have no privileges to update this table.' => 'У вас нет прав на обновление этой таблицы.',
|
||||
'Saving' => 'Сохранение',
|
||||
'yes' => 'Да',
|
||||
'no' => 'Нет',
|
||||
'yes' => 'да',
|
||||
'no' => 'нет',
|
||||
'Drop %s?' => 'Удалить %s?',
|
||||
'overwrite' => 'перезаписать',
|
||||
'DB' => 'DB',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Database does not support password.' => 'База данных не поддерживает пароль.',
|
||||
|
||||
'Disable %s or enable %s or %s extensions.' => 'Отключите %s или включите расширения %s или %s.',
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Да',
|
||||
'No' => 'Нет',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => 'Domov',
|
||||
'Login' => 'Prihlásiť sa',
|
||||
'Logout successful.' => 'Odhlásenie prebehlo v poriadku.',
|
||||
'Invalid credentials.' => 'Neplatné prihlasovacie údaje.',
|
||||
'Invalid server or credentials.' => 'Neplatný server alebo prihlasovacie údaje.',
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Používateľ',
|
||||
'Password' => 'Heslo',
|
||||
@@ -190,6 +191,7 @@ $translations = array(
|
||||
'Whole result' => 'Celý výsledok',
|
||||
'Clone' => 'Klonovať',
|
||||
'Partition by' => 'Rozdeliť podľa',
|
||||
'Partition' => 'Oddiel',
|
||||
'Partitions' => 'Oddiely',
|
||||
'Partition name' => 'Názov oddielu',
|
||||
'Values' => 'Hodnoty',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'Trvalé prihlásenie',
|
||||
'%d in total' => '%d celkom',
|
||||
'Search data in tables' => 'Vyhľadať dáta v tabuľkách',
|
||||
'as a regular expression' => 'ako regulárny výraz',
|
||||
'Alter schema' => 'Pozmeniť schému',
|
||||
'Create schema' => 'Vytvoriť schému',
|
||||
'Schema has been dropped.' => 'Schéma bola odstránená.',
|
||||
@@ -265,7 +268,6 @@ $translations = array(
|
||||
'Permanent link' => 'Permanentný odkaz',
|
||||
'Edit all' => 'Upraviť všetko',
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
|
||||
'Drop %s?' => 'Odstrániť %s?',
|
||||
'Tables have been optimized.' => 'Tabuľky boli optimalizované.',
|
||||
'Materialized view' => 'Materializovaný pohľad',
|
||||
@@ -275,8 +277,8 @@ $translations = array(
|
||||
'DB' => 'DB',
|
||||
'File must be in UTF-8 encoding.' => 'Súbor musí byť v kódovaní UTF-8.',
|
||||
'Modify' => 'Zmeniť',
|
||||
'Load more data' => 'Nahráť ďalšie dáta',
|
||||
'Loading' => 'Nahráva sa',
|
||||
'Load more data' => 'Načítať ďalšie dáta',
|
||||
'Loading' => 'Načítava sa',
|
||||
'ATTACH queries are not supported.' => 'Dotazy ATTACH nie sú podporované.',
|
||||
'Warnings' => 'Varovania',
|
||||
'%d / ' => '%d / ',
|
||||
@@ -302,4 +304,11 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => 'Zakážte %s alebo povoľte rozšírenie %s alebo %s.',
|
||||
'yes' => 'áno',
|
||||
'no' => 'nie',
|
||||
'Yes' => 'Áno',
|
||||
'No' => 'Nie',
|
||||
'Columns' => 'Stĺpce',
|
||||
'Nullable' => 'Povolené null',
|
||||
'Default' => 'Predvolené',
|
||||
'One Time Password' => 'Jednorázové heslo',
|
||||
'Invalid OTP code.' => 'Neplatný kód OTP.',
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Sistem',
|
||||
'Server' => 'Strežnik',
|
||||
'Username' => 'Uporabniško ime',
|
||||
@@ -10,7 +11,7 @@ $translations = array(
|
||||
'Logout' => 'Odjavi se',
|
||||
'Logged as: %s' => 'Prijavljen kot: %s',
|
||||
'Logout successful.' => 'Prijava uspešna.',
|
||||
'Invalid credentials.' => 'Neveljavne pravice.',
|
||||
'Invalid server or credentials.' => 'Neveljaven strežnik ali pravice.',
|
||||
'Language' => 'Jezik',
|
||||
'Invalid CSRF token. Send the form again.' => 'Neveljaven token CSRF. Pošljite formular še enkrat.',
|
||||
'No extension' => 'Brez dodatkov',
|
||||
@@ -19,10 +20,10 @@ $translations = array(
|
||||
'Session expired, please login again.' => 'Seja je potekla. Prosimo, ponovno se prijavite.',
|
||||
'%s version: %s through PHP extension %s' => 'Verzija %s: %s preko dodatka za PHP %s',
|
||||
'Refresh' => 'Osveži',
|
||||
|
||||
|
||||
// text direction
|
||||
'ltr' => 'ltr',
|
||||
|
||||
|
||||
'Privileges' => 'Pravice',
|
||||
'Create user' => 'Ustvari uporabnika',
|
||||
'User has been dropped.' => 'Uporabnik je odstranjen.',
|
||||
@@ -33,14 +34,14 @@ $translations = array(
|
||||
'Routine' => 'Postopek',
|
||||
'Grant' => 'Dovoli',
|
||||
'Revoke' => 'Odvzemi',
|
||||
|
||||
|
||||
'Process list' => 'Seznam procesov',
|
||||
'%d process(es) have been killed.' => array('Končan je %d proces.', 'Končana sta %d procesa.', 'Končani so %d procesi.', 'Končanih je %d procesov.'),
|
||||
'Kill' => 'Končaj',
|
||||
|
||||
|
||||
'Variables' => 'Spremenljivke',
|
||||
'Status' => 'Stanje',
|
||||
|
||||
|
||||
'SQL command' => 'Ukaz SQL',
|
||||
'%d query(s) executed OK.' => array('Uspešno se je končala %d poizvedba.', 'Uspešno sta se končali %d poizvedbi.', 'Uspešno so se končale %d poizvedbe.', 'Uspešno se je končalo %d poizvedb.'),
|
||||
'Query executed OK, %d row(s) affected.' => array('Poizvedba se je uspešno izvedla, spremenjena je %d vrstica.', 'Poizvedba se je uspešno izvedla, spremenjeni sta %d vrstici.', 'Poizvedba se je uspešno izvedla, spremenjene so %d vrstice.', 'Poizvedba se je uspešno izvedla, spremenjenih je %d vrstic.'),
|
||||
@@ -53,7 +54,7 @@ $translations = array(
|
||||
'%.3f s' => '%.3f s',
|
||||
'History' => 'Zgodovina',
|
||||
'Clear' => 'Počisti',
|
||||
|
||||
|
||||
'File upload' => 'Naloži datoteko',
|
||||
'From server' => 'z strežnika',
|
||||
'Webserver file %s' => 'Datoteka na spletnem strežniku %s',
|
||||
@@ -63,14 +64,14 @@ $translations = array(
|
||||
'Unable to upload a file.' => 'Ne morem naložiti datoteke.',
|
||||
'Maximum allowed file size is %sB.' => 'Največja velikost datoteke je %sB.',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Preveliko podatkov za POST. Zmanjšajte število podatkov ali povečajte nastavitev za %s.',
|
||||
|
||||
|
||||
'Export' => 'Izvozi',
|
||||
'Output' => 'Izhod rezultata',
|
||||
'open' => 'odpri',
|
||||
'save' => 'shrani',
|
||||
'Format' => 'Format',
|
||||
'Data' => 'Podatki',
|
||||
|
||||
|
||||
'Database' => 'Baza',
|
||||
'database' => 'baza',
|
||||
'Use' => 'Uporabi',
|
||||
@@ -84,7 +85,7 @@ $translations = array(
|
||||
'Alter database' => 'Spremeni bazo',
|
||||
'Create database' => 'Ustvari bazo',
|
||||
'Database schema' => 'Shema baze',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ' ',
|
||||
'0123456789' => '0123456789',
|
||||
@@ -106,7 +107,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'Tabele so premaknjene.',
|
||||
'Copy' => 'Kopiraj',
|
||||
'Tables have been copied.' => 'Tabele so kopirane.',
|
||||
|
||||
|
||||
'Routines' => 'Postopki',
|
||||
'Routine has been called, %d row(s) affected.' => array('Klican je bil postopek, spremenjena je %d vrstica.', 'Klican je bil postopek, spremenjeni sta %d vrstici.', 'Klican je bil postopek, spremenjene so %d vrstice.', 'Klican je bil postopek, spremenjenih je %d vrstic.'),
|
||||
'Call' => 'Pokliči',
|
||||
@@ -119,7 +120,7 @@ $translations = array(
|
||||
'Alter function' => 'Spremeni funkcijo',
|
||||
'Alter procedure' => 'Spremeni postopek',
|
||||
'Return type' => 'Vračalni tip',
|
||||
|
||||
|
||||
'Events' => 'Dogodki',
|
||||
'Event has been dropped.' => 'Dogodek je zavržen.',
|
||||
'Event has been altered.' => 'Dogodek je spremenjen.',
|
||||
@@ -132,7 +133,7 @@ $translations = array(
|
||||
'Start' => 'Začetek',
|
||||
'End' => 'Konec',
|
||||
'On completion preserve' => 'Po zaključku ohrani',
|
||||
|
||||
|
||||
'Tables' => 'Tabele',
|
||||
'Tables and views' => 'Tabele in pogledi',
|
||||
'Table' => 'Tabela',
|
||||
@@ -160,26 +161,27 @@ $translations = array(
|
||||
'Move down' => 'Premakni dol',
|
||||
'Remove' => 'Odstrani',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Največje število dovoljenih polje je preseženo. Prosimo, povečajte %s.',
|
||||
|
||||
|
||||
'Partition by' => 'Porazdeli po',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Porazdelitve',
|
||||
'Partition name' => 'Ime porazdelitve',
|
||||
'Values' => 'Vrednosti',
|
||||
|
||||
|
||||
'View' => 'Pogledi',
|
||||
'View has been dropped.' => 'Pogled je zavržen.',
|
||||
'View has been altered.' => 'Pogled je spremenjen.',
|
||||
'View has been created.' => 'Pogled je ustvarjen.',
|
||||
'Alter view' => 'Spremeni pogled',
|
||||
'Create view' => 'Ustvari pogled',
|
||||
|
||||
|
||||
'Indexes' => 'Indeksi',
|
||||
'Indexes have been altered.' => 'Indeksi so spremenjeni.',
|
||||
'Alter indexes' => 'Spremeni indekse',
|
||||
'Add next' => 'Dodaj naslednjega',
|
||||
'Index Type' => 'Tip indeksa',
|
||||
'Column (length)' => 'Stolpec (dolžina)',
|
||||
|
||||
|
||||
'Foreign keys' => 'Tuji ključi',
|
||||
'Foreign key' => 'Tuj ključ',
|
||||
'Foreign key has been dropped.' => 'Tuj ključ je zavržen.',
|
||||
@@ -195,7 +197,7 @@ $translations = array(
|
||||
'ON DELETE' => 'pri brisanju',
|
||||
'ON UPDATE' => 'pri posodabljanju',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Izvorni in ciljni stolpec mora imeti isti podatkovni tip. Obstajati mora indeks na ciljnih stolpcih in obstajati morajo referenčni podatki.',
|
||||
|
||||
|
||||
'Triggers' => 'Sprožilniki',
|
||||
'Add trigger' => 'Dodaj sprožilnik',
|
||||
'Trigger has been dropped.' => 'Sprožilnik je odstranjen.',
|
||||
@@ -206,7 +208,7 @@ $translations = array(
|
||||
'Time' => 'Čas',
|
||||
'Event' => 'Dogodek',
|
||||
'Name' => 'Naziv',
|
||||
|
||||
|
||||
'select' => 'izberi',
|
||||
'Select' => 'Izberi',
|
||||
'Select data' => 'Izberi podatke',
|
||||
@@ -215,6 +217,7 @@ $translations = array(
|
||||
'Search' => 'Išči',
|
||||
'anywhere' => 'kjerkoli',
|
||||
'Search data in tables' => 'Išče podatke po tabelah',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Sortiraj',
|
||||
'descending' => 'padajoče',
|
||||
'Limit' => 'Limita',
|
||||
@@ -227,14 +230,14 @@ $translations = array(
|
||||
'last' => 'Zadnja',
|
||||
'Whole result' => 'Cel razultat',
|
||||
'%d byte(s)' => array('%d bajt', '%d bajta', '%d bajti', '%d bajtov'),
|
||||
|
||||
|
||||
'Import' => 'Uvozi',
|
||||
'%d row(s) have been imported.' => array('Uvožena je %d vrstica.', 'Uvoženi sta %d vrstici.', 'Uvožene so %d vrstice.', 'Uvoženih je %d vrstic.'),
|
||||
|
||||
|
||||
// in-place editing in select
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+klik na vrednost za urejanje.',
|
||||
'Use edit link to modify this value.' => 'Uporabite urejanje povezave za spreminjanje te vrednosti.',
|
||||
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => 'Predmet%s je vstavljen.',
|
||||
'Item has been deleted.' => 'Predmet je izbrisan.',
|
||||
@@ -252,14 +255,14 @@ $translations = array(
|
||||
'Save and insert next' => 'Shrani in vstavi tekst',
|
||||
'Clone' => 'Kloniraj',
|
||||
'Delete' => 'Izbriši',
|
||||
|
||||
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Od',
|
||||
'Subject' => 'Zadeva',
|
||||
'Attachments' => 'Priponke',
|
||||
'Send' => 'Pošlji',
|
||||
'%d e-mail(s) have been sent.' => array('Poslan je %d e-mail.', 'Poslana sta %d e-maila.', 'Poslani so %d e-maili.', 'Poslanih je %d e-mailov.'),
|
||||
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Števila',
|
||||
'Date and time' => 'Datum in čas',
|
||||
@@ -269,18 +272,18 @@ $translations = array(
|
||||
'Network' => 'Mrežni',
|
||||
'Geometry' => 'Geometrčni',
|
||||
'Relations' => 'Relacijski',
|
||||
|
||||
|
||||
'Editor' => 'Urejevalnik',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$6.$4.$1',
|
||||
// hint for date format - use language equivalents for day, month and year shortcuts
|
||||
'[yyyy]-mm-dd' => 'd.m.[rrrr]',
|
||||
'now' => 'zdaj',
|
||||
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => 'Datoteka obstaja.',
|
||||
'Please use one of the extensions %s.' => 'Prosim, uporabite enega od dodatkov %s.',
|
||||
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => 'Spremeni shemo',
|
||||
'Create schema' => 'Ustvari shemo',
|
||||
@@ -289,7 +292,7 @@ $translations = array(
|
||||
'Schema has been altered.' => 'Shema je spremenjena.',
|
||||
'Schema' => 'Shema',
|
||||
'Invalid schema.' => 'Neveljavna shema.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Sekvence',
|
||||
'Create sequence' => 'Ustvari sekvenco',
|
||||
@@ -297,7 +300,7 @@ $translations = array(
|
||||
'Sequence has been created.' => 'Sekvence je ustvarjena.',
|
||||
'Sequence has been altered.' => 'Sekvence je spremenjena.',
|
||||
'Alter sequence' => 'Spremni sekvenco',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'Uporabniški tipi',
|
||||
'Create type' => 'Ustvari tip',
|
||||
@@ -344,4 +347,12 @@ $translations = array(
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
'HH:MM:SS' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Систем',
|
||||
'Server' => 'Сервер',
|
||||
'Username' => 'Корисничко име',
|
||||
@@ -10,7 +11,7 @@ $translations = array(
|
||||
'Logout' => 'Одјава',
|
||||
'Logged as: %s' => 'Пријави се као: %s',
|
||||
'Logout successful.' => 'Успешна одјава.',
|
||||
'Invalid credentials.' => 'Неважеће дозволе.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Language' => 'Језик',
|
||||
'Invalid CSRF token. Send the form again.' => 'Неважећи CSRF код. Проследите поново форму.',
|
||||
'No extension' => 'Без додатака',
|
||||
@@ -167,6 +168,7 @@ $translations = array(
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Премашен је максимални број дозвољених поља. Молим увећајте %s.',
|
||||
|
||||
'Partition by' => 'Подели по',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Поделе',
|
||||
'Partition name' => 'Име поделе',
|
||||
'Values' => 'Вредности',
|
||||
@@ -220,6 +222,7 @@ $translations = array(
|
||||
'Search' => 'Претрага',
|
||||
'anywhere' => 'било где',
|
||||
'Search data in tables' => 'Претражи податке у табелама',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Поређај',
|
||||
'descending' => 'опадајуће',
|
||||
'Limit' => 'Граница',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Да',
|
||||
'No' => 'Не',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'System',
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Användarnamn',
|
||||
@@ -11,7 +12,7 @@ $translations = array(
|
||||
'Logged as: %s' => 'Inloggad som: %s',
|
||||
'Logout successful.' => 'Du är nu utloggad.',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Tack för att du använder Adminer, vänligen fundera över att <a href="https://www.adminer.org/en/donation/">donera</a>.',
|
||||
'Invalid credentials.' => 'Ogiltiga inloggningsuppgifter.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'There is a space in the input password which might be the cause.' => 'Det finns ett mellanslag i lösenordet, vilket kan vara anledningen.',
|
||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer tillåter inte att ansluta till en databas utan lösenord. <a href="https://www.adminer.org/en/password/"%s>Mer information</a>.',
|
||||
'Database does not support password.' => 'Databasen stödjer inte lösenord.',
|
||||
@@ -190,6 +191,7 @@ $translations = array(
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Högsta nummer tillåtna fält är överskridet. Vänligen höj %s.',
|
||||
|
||||
'Partition by' => 'Partitionera om',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Partitioner',
|
||||
'Partition name' => 'Partition',
|
||||
'Values' => 'Värden',
|
||||
@@ -244,6 +246,7 @@ $translations = array(
|
||||
'Search' => 'Sök',
|
||||
'anywhere' => 'överallt',
|
||||
'Search data in tables' => 'Sök data i tabeller',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Sortera',
|
||||
'descending' => 'Fallande',
|
||||
'Limit' => 'Begränsning',
|
||||
@@ -346,4 +349,12 @@ $translations = array(
|
||||
'Type has been dropped.' => 'Typ har, typ, tagits bort.',
|
||||
'Type has been created.' => 'Typ har skapats.',
|
||||
'Alter type' => 'Ändra typ',
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Ja',
|
||||
'No' => 'Nej',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'நுழை',
|
||||
'Logout successful.' => 'வெற்றிகரமாய் வெளியேறியாயிற்று.',
|
||||
'Invalid credentials.' => 'சரியான விபரங்கள் இல்லை.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'வழங்கி (Server)',
|
||||
'Username' => 'பயனாளர் (User)',
|
||||
'Password' => 'கடவுச்சொல்',
|
||||
@@ -187,6 +188,7 @@ $translations = array(
|
||||
'Clone' => 'நகலி (Clone)',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'அனுமதிக்கப்பட்ட அதிகபட்ச கோப்புகளின் எண்ணிக்கை மீறப்பட்டது. தயவு செய்து %s மற்றும் %s யை அதிகரிக்கவும்.',
|
||||
'Partition by' => 'பிரித்தது',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'பிரிவுகள்',
|
||||
'Partition name' => 'பிரிவின் பெயர்',
|
||||
'Values' => 'மதிப்புகள்',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Alter schema' => 'அமைப்புமுறையை மாற்று',
|
||||
'Create schema' => 'அமைப்புமுறையை உருவாக்கு',
|
||||
'Search data in tables' => 'தகவலை அட்டவணையில் தேடு',
|
||||
'as a regular expression' => null,
|
||||
'Sequences' => 'வரிசைமுறை',
|
||||
'Create sequence' => 'வரிசைமுறையை உருவாக்கு',
|
||||
'User types' => 'பயனாளர் வகைகள்',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Home' => null,
|
||||
'Login' => 'เข้าสู่ระบบ',
|
||||
'Logout successful.' => 'ออกจากระบบเรียบร้อยแล้ว.',
|
||||
'Invalid credentials.' => 'ข้อมูลไม่ถูกต้อง.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Server' => 'เซอเวอร์',
|
||||
'Username' => 'ชื่อผู้ใช้งาน',
|
||||
'Password' => 'รหัสผ่าน',
|
||||
@@ -190,6 +191,7 @@ $translations = array(
|
||||
'Clone' => 'ทำซ้ำ',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'จำนวนสูงสุดของฟิลด์อนุญาตให้เกิน กรุณาเพิ่มอีก %s.',
|
||||
'Partition by' => 'พาร์ทิชันโดย',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'พาร์ทิชัน',
|
||||
'Partition name' => 'ชื่อของพาร์ทิชัน',
|
||||
'Values' => 'ค่า',
|
||||
@@ -224,6 +226,7 @@ $translations = array(
|
||||
'Permanent login' => 'จดจำการเข้าสู่ระบบตลอดไป',
|
||||
'Databases have been dropped.' => 'ฐานข้อมูลถูกลบแล้ว.',
|
||||
'Search data in tables' => 'ค้นหาในตาราง',
|
||||
'as a regular expression' => null,
|
||||
'Schema' => 'Schema',
|
||||
'Alter schema' => 'เปลี่ยนแปลง schema',
|
||||
'Create schema' => 'สร้าง schema',
|
||||
@@ -302,4 +305,12 @@ $translations = array(
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
'yes' => null,
|
||||
'no' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Sistem',
|
||||
'Server' => 'Sunucu',
|
||||
'Username' => 'Kullanıcı',
|
||||
@@ -11,7 +12,7 @@ $translations = array(
|
||||
'Logged as: %s' => '%s olarak giriş yapıldı.',
|
||||
'Logout successful.' => 'Oturum başarıyla sonlandı.',
|
||||
'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.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'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',
|
||||
@@ -184,6 +185,7 @@ $translations = array(
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'İzin verilen en fazla alan sayısı aşıldı. Lütfen %s değerlerini artırın.',
|
||||
|
||||
'Partition by' => 'Bununla bölümle',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Bölümler',
|
||||
'Partition name' => 'Bölüm adı',
|
||||
'Values' => 'Değerler',
|
||||
@@ -238,6 +240,7 @@ $translations = array(
|
||||
'Search' => 'Ara',
|
||||
'anywhere' => 'hiçbir yerde',
|
||||
'Search data in tables' => 'Tablolarda veri ara',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Sırala',
|
||||
'descending' => 'Azalan',
|
||||
'Limit' => 'Limit',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Evet',
|
||||
'No' => 'Hayır',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Система Бази Даних',
|
||||
'Server' => 'Сервер',
|
||||
'Username' => 'Користувач',
|
||||
@@ -10,7 +11,7 @@ $translations = array(
|
||||
'Logout' => 'Вийти',
|
||||
'Logged as: %s' => 'Ви увійшли як: %s',
|
||||
'Logout successful.' => 'Ви вдало вийшли з системи.',
|
||||
'Invalid credentials.' => 'Неправильні дані входу.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Language' => 'Мова',
|
||||
'Invalid CSRF token. Send the form again.' => 'Недійсний CSRF токен. Надішліть форму ще раз.',
|
||||
'No extension' => 'Нема розширень',
|
||||
@@ -19,10 +20,10 @@ $translations = array(
|
||||
'Session expired, please login again.' => 'Сесія закінчилась, будь ласка, увійдіть в систему знову.',
|
||||
'%s version: %s through PHP extension %s' => 'Версія %s: %s з PHP-розширенням %s',
|
||||
'Refresh' => 'Оновити',
|
||||
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'ltr',
|
||||
|
||||
|
||||
'Privileges' => 'Привілеї',
|
||||
'Create user' => 'Створити користувача',
|
||||
'User has been dropped.' => 'Користувача було видалено.',
|
||||
@@ -33,14 +34,14 @@ $translations = array(
|
||||
'Routine' => 'Процедура',
|
||||
'Grant' => 'Дозволити',
|
||||
'Revoke' => 'Заборонити',
|
||||
|
||||
|
||||
'Process list' => 'Перелік процесів',
|
||||
'%d process(es) have been killed.' => array('Було завершено %d процес.', 'Було завершено %d процеси.', 'Було завершёно %d процесів.'),
|
||||
'Kill' => 'Завершити процес',
|
||||
|
||||
|
||||
'Variables' => 'Змінні',
|
||||
'Status' => 'Статус',
|
||||
|
||||
|
||||
'SQL command' => 'SQL запит',
|
||||
'%d query(s) executed OK.' => array('%d запит виконано успішно.', '%d запити виконано успішно.', '%d запитів виконано успішно.'),
|
||||
'Query executed OK, %d row(s) affected.' => array('Запит виконано успішно, змінено %d рядок.', 'Запит виконано успішно, змінено %d рядки.', 'Запит виконано успішно, змінено %d рядків.'),
|
||||
@@ -54,7 +55,7 @@ $translations = array(
|
||||
'History' => 'Історія',
|
||||
'Clear' => 'Очистити',
|
||||
'Edit all' => 'Редагувати все',
|
||||
|
||||
|
||||
'File upload' => 'Завантажити файл',
|
||||
'From server' => 'З сервера',
|
||||
'Webserver file %s' => 'Файл %s на вебсервері',
|
||||
@@ -64,14 +65,14 @@ $translations = array(
|
||||
'Unable to upload a file.' => 'Неможливо завантажити файл.',
|
||||
'Maximum allowed file size is %sB.' => 'Максимально допустимий розмір файлу %sБ.',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Занадто великий об\'єм POST-даних. Зменшіть об\'єм або збільшіть параметр директиви %s конфигурації.',
|
||||
|
||||
|
||||
'Export' => 'Експорт',
|
||||
'Output' => 'Вихідні дані',
|
||||
'open' => 'відкрити',
|
||||
'save' => 'зберегти',
|
||||
'Format' => 'Формат',
|
||||
'Data' => 'Дані',
|
||||
|
||||
|
||||
'Database' => 'База даних',
|
||||
'database' => 'база даних',
|
||||
'Use' => 'Обрати',
|
||||
@@ -85,10 +86,10 @@ $translations = array(
|
||||
'Alter database' => 'Змінити базу даних',
|
||||
'Create database' => 'Створити базу даних',
|
||||
'Database schema' => 'Схема бази даних',
|
||||
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'Постійне посилання',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ' ',
|
||||
'0123456789' => '0123456789',
|
||||
@@ -110,7 +111,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'Таблиці було перенесено.',
|
||||
'Copy' => 'копіювати',
|
||||
'Tables have been copied.' => 'Таблиці було зкопійовано.',
|
||||
|
||||
|
||||
'Routines' => 'Збережені процедури',
|
||||
'Routine has been called, %d row(s) affected.' => array('Була викликана процедура, %d запис було змінено.', 'Була викликана процедура, %d записи було змінено.', 'Була викликана процедура, %d записів було змінено.'),
|
||||
'Call' => 'Викликати',
|
||||
@@ -123,7 +124,7 @@ $translations = array(
|
||||
'Alter function' => 'Змінити функцію',
|
||||
'Alter procedure' => 'Змінити процедуру',
|
||||
'Return type' => 'Тип, що повернеться',
|
||||
|
||||
|
||||
'Events' => 'Події',
|
||||
'Event has been dropped.' => 'Подію було видалено.',
|
||||
'Event has been altered.' => 'Подію було змінено.',
|
||||
@@ -136,7 +137,7 @@ $translations = array(
|
||||
'Start' => 'Початок',
|
||||
'End' => 'Кінець',
|
||||
'On completion preserve' => 'Після завершення зберегти',
|
||||
|
||||
|
||||
'Tables' => 'Таблиці',
|
||||
'Tables and views' => 'Таблиці і вигляди',
|
||||
'Table' => 'Таблиця',
|
||||
@@ -165,26 +166,27 @@ $translations = array(
|
||||
'Move down' => 'Пересунути вниз',
|
||||
'Remove' => 'Видалити',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Досягнута максимальна кількість доступних полів. Будь ласка, збільшіть %s.',
|
||||
|
||||
|
||||
'Partition by' => 'Розділити по',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Розділи',
|
||||
'Partition name' => 'Назва розділу',
|
||||
'Values' => 'Значення',
|
||||
|
||||
|
||||
'View' => 'Вигляд',
|
||||
'View has been dropped.' => 'Вигляд було видалено.',
|
||||
'View has been altered.' => 'Вигляд було змінено.',
|
||||
'View has been created.' => 'Вигляд було створено.',
|
||||
'Alter view' => 'Змінити вигляд',
|
||||
'Create view' => 'Створити вигляд',
|
||||
|
||||
|
||||
'Indexes' => 'Індекси',
|
||||
'Indexes have been altered.' => 'Індексування було змінено.',
|
||||
'Alter indexes' => 'Змінити індексування',
|
||||
'Add next' => 'Додати ще',
|
||||
'Index Type' => 'Тип індексу',
|
||||
'Column (length)' => 'Стовпець (довжина)',
|
||||
|
||||
|
||||
'Foreign keys' => 'Зовнішні ключі',
|
||||
'Foreign key' => 'Зовнішній ключ',
|
||||
'Foreign key has been dropped.' => 'Зовнішній ключ було видалено.',
|
||||
@@ -200,7 +202,7 @@ $translations = array(
|
||||
'ON DELETE' => 'ПРИ ВИДАЛЕННІ',
|
||||
'ON UPDATE' => 'ПРИ ЗМІНІ',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Стовпці повинні мати той самий тип даних, цільові стовпці повинні бути проіндексовані і дані, на які посилаються повинні існувати.',
|
||||
|
||||
|
||||
'Triggers' => 'Тригери',
|
||||
'Add trigger' => 'Додати тригер',
|
||||
'Trigger has been dropped.' => 'Тригер було видалено.',
|
||||
@@ -211,7 +213,7 @@ $translations = array(
|
||||
'Time' => 'Час',
|
||||
'Event' => 'Подія',
|
||||
'Name' => 'Назва',
|
||||
|
||||
|
||||
'select' => 'вибрати',
|
||||
'Select' => 'Вибрати',
|
||||
'Select data' => 'Вибрати дані',
|
||||
@@ -220,6 +222,7 @@ $translations = array(
|
||||
'Search' => 'Пошук',
|
||||
'anywhere' => 'будь-де',
|
||||
'Search data in tables' => 'Шукати дані в таблицях',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Сортувати',
|
||||
'descending' => 'по спаданню',
|
||||
'Limit' => 'Обмеження',
|
||||
@@ -232,14 +235,14 @@ $translations = array(
|
||||
'last' => 'остання',
|
||||
'Whole result' => 'Весь результат',
|
||||
'%d byte(s)' => array('%d байт', '%d байта', '%d байтів'),
|
||||
|
||||
|
||||
'Import' => 'Імпортувати',
|
||||
'%d row(s) have been imported.' => array('%d рядок було імпортовано.', '%d рядки було імпортовано.', '%d рядків було імпортовано.'),
|
||||
|
||||
|
||||
// in-place editing in select
|
||||
'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.' => 'Запис було видалено.',
|
||||
@@ -257,14 +260,14 @@ $translations = array(
|
||||
'Save and insert next' => 'Зберегти і вставити знову',
|
||||
'Clone' => 'Клонувати',
|
||||
'Delete' => 'Видалити',
|
||||
|
||||
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Від',
|
||||
'Subject' => 'Заголовок',
|
||||
'Attachments' => 'Додатки',
|
||||
'Send' => 'Надіслати',
|
||||
'%d e-mail(s) have been sent.' => array('Було надіслано %d повідомлення.', 'Було надіслано %d повідомлення.', 'Було надіслано %d повідомлень.'),
|
||||
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Числа',
|
||||
'Date and time' => 'Дата і час',
|
||||
@@ -274,7 +277,7 @@ $translations = array(
|
||||
'Network' => 'Мережа',
|
||||
'Geometry' => 'Геометрія',
|
||||
'Relations' => 'Зв\'язки',
|
||||
|
||||
|
||||
'Editor' => 'Редактор',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$5.$3.$1',
|
||||
@@ -285,11 +288,11 @@ $translations = array(
|
||||
'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' => 'Створити схему',
|
||||
@@ -298,7 +301,7 @@ $translations = array(
|
||||
'Schema has been altered.' => 'Схему було змінено.',
|
||||
'Schema' => 'Схема',
|
||||
'Invalid schema.' => 'Невірна схема.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Послідовності',
|
||||
'Create sequence' => 'Створити послідовність',
|
||||
@@ -306,7 +309,7 @@ $translations = array(
|
||||
'Sequence has been created.' => 'Послідовність було створено.',
|
||||
'Sequence has been altered.' => 'Послідовність було змінено.',
|
||||
'Alter sequence' => 'Змінити послідовність',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'Типи користувачів',
|
||||
'Create type' => 'Створити тип',
|
||||
@@ -347,4 +350,12 @@ $translations = array(
|
||||
'Vacuum' => null,
|
||||
'%d / ' => array(),
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Так',
|
||||
'No' => 'Ні',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => 'Hệ thống',
|
||||
'Server' => 'Máy chủ',
|
||||
'Username' => 'Tên người dùng',
|
||||
@@ -10,7 +11,7 @@ $translations = array(
|
||||
'Logout' => 'Thoát',
|
||||
'Logged as: %s' => 'Vào dưới tên: %s',
|
||||
'Logout successful.' => 'Đã thoát xong.',
|
||||
'Invalid credentials.' => 'Tài khoản sai.',
|
||||
'Invalid server or credentials.' => null,
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => 'Bạn gõ sai tài khoản quá nhiều lần, hãy thử lại sau %d phút nữa.',
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Mật khẩu đã hết hạn. <a href="https://www.adminer.org/en/extension/"%s>Thử cách làm</a> để giữ cố định.',
|
||||
'Language' => 'Ngôn ngữ',
|
||||
@@ -21,10 +22,10 @@ $translations = array(
|
||||
'Session expired, please login again.' => 'Phiên làm việc đã hết, hãy đăng nhập lại.',
|
||||
'%s version: %s through PHP extension %s' => 'Phiên bản %s: %s (PHP extension: %s)',
|
||||
'Refresh' => 'Làm mới',
|
||||
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'ltr',
|
||||
|
||||
|
||||
'Privileges' => 'Quyền truy cập',
|
||||
'Create user' => 'Tạo người dùng',
|
||||
'User has been dropped.' => 'Đã xoá người dùng.',
|
||||
@@ -35,14 +36,14 @@ $translations = array(
|
||||
'Routine' => 'Hàm tích hợp',
|
||||
'Grant' => 'Cấp quyền',
|
||||
'Revoke' => 'Tước quyền',
|
||||
|
||||
|
||||
'Process list' => 'Danh sách tiến trình',
|
||||
'%d process(es) have been killed.' => '%d tiến trình đã dừng.',
|
||||
'Kill' => 'Dừng',
|
||||
|
||||
|
||||
'Variables' => 'Biến',
|
||||
'Status' => 'Trạng thái',
|
||||
|
||||
|
||||
'SQL command' => 'Câu lệnh SQL',
|
||||
'%d query(s) executed OK.' => '%d câu lệnh đã chạy thành công.',
|
||||
'Query executed OK, %d row(s) affected.' => 'Đã thực hiện xong, ảnh hưởng đến %d dòng.',
|
||||
@@ -56,7 +57,7 @@ $translations = array(
|
||||
'History' => 'Lịch sử',
|
||||
'Clear' => 'Xoá',
|
||||
'Edit all' => 'Sửa tất cả',
|
||||
|
||||
|
||||
'File upload' => 'Tải tệp lên',
|
||||
'From server' => 'Dùng tệp trên máy chủ',
|
||||
'Webserver file %s' => 'Tệp trên máy chủ',
|
||||
@@ -67,14 +68,14 @@ $translations = array(
|
||||
'Maximum allowed file size is %sB.' => 'Kích thước tệp tối đa là %sB.',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Dữ liệu tải lên/POST quá lớn. Hãy giảm kích thước tệp hoặc tăng cấu hình (hiện tại %s).',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => 'Bạn có thể tải tệp lên dùng FTP và nhập vào cơ sở dữ liệu.',
|
||||
|
||||
|
||||
'Export' => 'Xuất',
|
||||
'Output' => 'Kết quả',
|
||||
'open' => 'xem',
|
||||
'save' => 'lưu',
|
||||
'Format' => 'Định dạng',
|
||||
'Data' => 'Dữ liệu',
|
||||
|
||||
|
||||
'Database' => 'Cơ sở dữ liệu',
|
||||
'database' => 'cơ sở dữ liệu',
|
||||
'Use' => 'Sử dụng',
|
||||
@@ -88,10 +89,10 @@ $translations = array(
|
||||
'Alter database' => 'Thay đổi CSDL',
|
||||
'Create database' => 'Tạo CSDL',
|
||||
'Database schema' => 'Cấu trúc CSDL',
|
||||
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'Liên kết cố định',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
@@ -114,7 +115,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'Bảng.',
|
||||
'Copy' => 'Sao chép',
|
||||
'Tables have been copied.' => 'Bảng đã được sao chép.',
|
||||
|
||||
|
||||
'Routines' => 'Routines',
|
||||
'Routine has been called, %d row(s) affected.' => 'Đã chạy routine, thay đổi %d dòng.',
|
||||
'Call' => 'Gọi',
|
||||
@@ -139,7 +140,7 @@ $translations = array(
|
||||
'Start' => 'Bắt đầu',
|
||||
'End' => 'Kết thúc',
|
||||
'On completion preserve' => 'Khi kết thúc, duy trì',
|
||||
|
||||
|
||||
'Tables' => 'Các bảng',
|
||||
'Tables and views' => 'Bảng và khung nhìn',
|
||||
'Table' => 'Bảng',
|
||||
@@ -170,26 +171,27 @@ $translations = array(
|
||||
'Move down' => 'Chuyển xuống dưới',
|
||||
'Remove' => 'Xoá',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Thiết lập %s cần tăng thêm. (Đã vượt giới hạnố trường tối đa cho phép trong một biểu mẫu).',
|
||||
|
||||
|
||||
'Partition by' => 'Phân chia bằng',
|
||||
'Partition' => null,
|
||||
'Partitions' => 'Phân hoạch',
|
||||
'Partition name' => 'Tên phân hoạch',
|
||||
'Values' => 'Giá trị',
|
||||
|
||||
|
||||
'View' => 'Khung nhìn',
|
||||
'View has been dropped.' => 'Khung nhìn đã bị xoá.',
|
||||
'View has been altered.' => 'Khung nhìn đã được sửa.',
|
||||
'View has been created.' => 'Khung nhìn đã được tạo.',
|
||||
'Alter view' => 'Sửa khung nhìn',
|
||||
'Create view' => 'Tạo khung nhìn',
|
||||
|
||||
|
||||
'Indexes' => 'Chỉ mục',
|
||||
'Indexes have been altered.' => 'Chỉ mục đã được sửa.',
|
||||
'Alter indexes' => 'Sửa chỉ mục',
|
||||
'Add next' => 'Thêm tiếp',
|
||||
'Index Type' => 'Loại chỉ mục',
|
||||
'Column (length)' => 'Cột (độ dài)',
|
||||
|
||||
|
||||
'Foreign keys' => 'Các khoá ngoại',
|
||||
'Foreign key' => 'Khoá ngoại',
|
||||
'Foreign key has been dropped.' => 'Khoá ngoại đã bị xoá.',
|
||||
@@ -205,7 +207,7 @@ $translations = array(
|
||||
'ON DELETE' => 'Khi xoá',
|
||||
'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' => 'Phản xạ',
|
||||
'Add trigger' => 'Thêm phản xạ',
|
||||
'Trigger has been dropped.' => 'Đã xoá phản xạ.',
|
||||
@@ -216,7 +218,7 @@ $translations = array(
|
||||
'Time' => 'Thời gian',
|
||||
'Event' => 'Sự kiện',
|
||||
'Name' => 'Tên',
|
||||
|
||||
|
||||
'select' => 'xem',
|
||||
'Select' => 'Xem',
|
||||
'Select data' => 'Xem dữ liệu',
|
||||
@@ -225,6 +227,7 @@ $translations = array(
|
||||
'Search' => 'Tìm kiếm',
|
||||
'anywhere' => 'bất cứ đâu',
|
||||
'Search data in tables' => 'Tìm kiếm dữ liệu trong các bảng',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => 'Sắp xếp',
|
||||
'descending' => 'giảm dần',
|
||||
'Limit' => 'Giới hạn',
|
||||
@@ -240,16 +243,16 @@ $translations = array(
|
||||
'Loading' => 'Đang nạp',
|
||||
'Whole result' => 'Toàn bộ kết quả',
|
||||
'%d byte(s)' => '%d byte(s)',
|
||||
|
||||
|
||||
'Import' => 'Nhập khẩu',
|
||||
'%d row(s) have been imported.' => 'Đã nhập % dòng dữ liệu.',
|
||||
'File must be in UTF-8 encoding.' => 'Tệp phải mã hoá bằng chuẩn UTF-8.',
|
||||
|
||||
|
||||
// in-place editing in select
|
||||
'Modify' => 'Sửa',
|
||||
'Ctrl+click on a value to modify it.' => 'Nhấn Ctrl và bấm vào giá trị để sửa.',
|
||||
'Use edit link to modify this value.' => 'Dùng nút sửa để thay đổi giá trị này.',
|
||||
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => 'Đã thêm%s.',
|
||||
'Item has been deleted.' => 'Đã xoá.',
|
||||
@@ -269,14 +272,14 @@ $translations = array(
|
||||
'Clone' => 'Sao chép',
|
||||
'Delete' => 'Xoá',
|
||||
'You have no privileges to update this table.' => 'Bạn không có quyền sửa bảng này.',
|
||||
|
||||
|
||||
'E-mail' => 'Địa chỉ email',
|
||||
'From' => 'Người gửi',
|
||||
'Subject' => 'Chủ đề',
|
||||
'Attachments' => 'Đính kèm',
|
||||
'Send' => 'Gửi',
|
||||
'%d e-mail(s) have been sent.' => '%d thư đã gửi.',
|
||||
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Số',
|
||||
'Date and time' => 'Ngày giờ',
|
||||
@@ -286,7 +289,7 @@ $translations = array(
|
||||
'Network' => 'Mạng',
|
||||
'Geometry' => 'Toạ độ',
|
||||
'Relations' => 'Quan hệ',
|
||||
|
||||
|
||||
'Editor' => 'Biên tập',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$1-$3-$5',
|
||||
@@ -297,11 +300,11 @@ $translations = array(
|
||||
'now' => 'hiện tại',
|
||||
'yes' => 'có',
|
||||
'no' => 'không',
|
||||
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => 'Tệp đã có rồi.',
|
||||
'Please use one of the extensions %s.' => 'Cần phải dùng một trong các phần mở rộng sau: %s.',
|
||||
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => 'Thay đổi schema',
|
||||
'Create schema' => 'Tạo schema',
|
||||
@@ -310,7 +313,7 @@ $translations = array(
|
||||
'Schema has been altered.' => 'Đã thay đổi schema.',
|
||||
'Schema' => 'Schema',
|
||||
'Invalid schema.' => 'Schema không hợp lệ.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Dãy số',
|
||||
'Create sequence' => 'Tạo dãy số',
|
||||
@@ -318,7 +321,7 @@ $translations = array(
|
||||
'Sequence has been created.' => 'Đã tạo dãy số.',
|
||||
'Sequence has been altered.' => 'Đã sửa dãy số.',
|
||||
'Alter sequence' => 'Thay đổi dãy số',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'Kiểu tự định nghĩa',
|
||||
'Create type' => 'Tạo kiểu',
|
||||
@@ -346,4 +349,12 @@ $translations = array(
|
||||
'Unknown error.' => null,
|
||||
'Database does not support password.' => null,
|
||||
'Disable %s or enable %s or %s extensions.' => null,
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => 'Có',
|
||||
'No' => 'Không',
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => 'Xx',
|
||||
'System' => 'Xx',
|
||||
'Server' => 'Xx',
|
||||
'Username' => 'Xx',
|
||||
@@ -11,7 +12,7 @@ $translations = array(
|
||||
'Logged as: %s' => 'Xx: %s',
|
||||
'Logout successful.' => 'Xx.',
|
||||
'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.',
|
||||
'Invalid server or credentials.' => '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.',
|
||||
@@ -29,10 +30,10 @@ $translations = array(
|
||||
'The action will be performed after successful login with the same credentials.' => 'Xx.',
|
||||
'%s version: %s through PHP extension %s' => '%s xx: %s xx %s',
|
||||
'Refresh' => 'Xx',
|
||||
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'xx',
|
||||
|
||||
|
||||
'Privileges' => 'Xx',
|
||||
'Create user' => 'Xx',
|
||||
'User has been dropped.' => 'Xx.',
|
||||
@@ -43,14 +44,14 @@ $translations = array(
|
||||
'Routine' => 'Xx',
|
||||
'Grant' => 'Xx',
|
||||
'Revoke' => 'Xx',
|
||||
|
||||
|
||||
'Process list' => 'Xx',
|
||||
'%d process(es) have been killed.' => array('%d xx.', '%d xx.'),
|
||||
'Kill' => 'Xx',
|
||||
|
||||
|
||||
'Variables' => 'Xx',
|
||||
'Status' => 'Xx',
|
||||
|
||||
|
||||
'SQL command' => 'Xx',
|
||||
'%d query(s) executed OK.' => array('%d xx.', '%d xx.'),
|
||||
'Query executed OK, %d row(s) affected.' => array('Xx, %d.', 'Xx, %d.'),
|
||||
@@ -67,7 +68,7 @@ $translations = array(
|
||||
'History' => 'Xx',
|
||||
'Clear' => 'Xx',
|
||||
'Edit all' => 'Xx',
|
||||
|
||||
|
||||
'File upload' => 'Xx',
|
||||
'From server' => 'Xx',
|
||||
'Webserver file %s' => 'Xx %s',
|
||||
@@ -79,7 +80,7 @@ $translations = array(
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Xx %s.',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => 'Xx.',
|
||||
'You are offline.' => 'Xx.',
|
||||
|
||||
|
||||
'Export' => 'Xx',
|
||||
'Output' => 'Xx',
|
||||
'open' => 'xx',
|
||||
@@ -87,7 +88,7 @@ $translations = array(
|
||||
'Saving' => 'Xx',
|
||||
'Format' => 'Xx',
|
||||
'Data' => 'Xx',
|
||||
|
||||
|
||||
'Database' => 'Xx',
|
||||
'database' => 'xx',
|
||||
'DB' => 'XX',
|
||||
@@ -102,10 +103,10 @@ $translations = array(
|
||||
'Alter database' => 'Xx',
|
||||
'Create database' => 'Xx',
|
||||
'Database schema' => 'Xx',
|
||||
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'Xx',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => 'x',
|
||||
'0123456789' => 'xxxxxxxxxx',
|
||||
@@ -129,7 +130,7 @@ $translations = array(
|
||||
'Copy' => 'Xx',
|
||||
'Tables have been copied.' => 'Xx.',
|
||||
'overwrite' => 'xx',
|
||||
|
||||
|
||||
'Routines' => 'Xx',
|
||||
'Routine has been called, %d row(s) affected.' => array('Xx, %d.', 'Xx, %d.'),
|
||||
'Call' => 'Xx',
|
||||
@@ -142,7 +143,7 @@ $translations = array(
|
||||
'Alter function' => 'Xx',
|
||||
'Alter procedure' => 'Xx',
|
||||
'Return type' => 'Xx',
|
||||
|
||||
|
||||
'Events' => 'Xx',
|
||||
'Event has been dropped.' => 'Xx.',
|
||||
'Event has been altered.' => 'Xx.',
|
||||
@@ -155,7 +156,7 @@ $translations = array(
|
||||
'Start' => 'Xx',
|
||||
'End' => 'Xx',
|
||||
'On completion preserve' => 'Xx',
|
||||
|
||||
|
||||
'Tables' => 'Xx',
|
||||
'Tables and views' => 'Xx',
|
||||
'Table' => 'Xx',
|
||||
@@ -188,12 +189,13 @@ $translations = array(
|
||||
'Move down' => 'Xx',
|
||||
'Remove' => 'Xx',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Xx %s.',
|
||||
|
||||
|
||||
'Partition by' => 'Xx',
|
||||
'Partition' => 'Xx',
|
||||
'Partitions' => 'Xx',
|
||||
'Partition name' => 'Xx',
|
||||
'Values' => 'Xx',
|
||||
|
||||
|
||||
'View' => 'Xx',
|
||||
'Materialized view' => 'Xx',
|
||||
'View has been dropped.' => 'Xx.',
|
||||
@@ -201,14 +203,14 @@ $translations = array(
|
||||
'View has been created.' => 'Xx.',
|
||||
'Alter view' => 'Xx',
|
||||
'Create view' => 'Xx',
|
||||
|
||||
|
||||
'Indexes' => 'Xx',
|
||||
'Indexes have been altered.' => 'Xx.',
|
||||
'Alter indexes' => 'Xx',
|
||||
'Add next' => 'Xx',
|
||||
'Index Type' => 'Xx',
|
||||
'Column (length)' => 'Xx',
|
||||
|
||||
|
||||
'Foreign keys' => 'Xx',
|
||||
'Foreign key' => 'Xx',
|
||||
'Foreign key has been dropped.' => 'Xx.',
|
||||
@@ -224,7 +226,7 @@ $translations = array(
|
||||
'ON DELETE' => 'Xx',
|
||||
'ON UPDATE' => 'Xx',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Xx.',
|
||||
|
||||
|
||||
'Triggers' => 'Xx',
|
||||
'Add trigger' => 'Xx',
|
||||
'Trigger has been dropped.' => 'Xx.',
|
||||
@@ -235,7 +237,7 @@ $translations = array(
|
||||
'Time' => 'Xx',
|
||||
'Event' => 'Xx',
|
||||
'Name' => 'Xx',
|
||||
|
||||
|
||||
'select' => 'xx',
|
||||
'Select' => 'Xx',
|
||||
'Select data' => 'Xx',
|
||||
@@ -244,6 +246,7 @@ $translations = array(
|
||||
'Search' => 'Xx',
|
||||
'anywhere' => 'xx',
|
||||
'Search data in tables' => 'Xx',
|
||||
'as a regular expression' => 'xx',
|
||||
'Sort' => 'Xx',
|
||||
'descending' => 'xx',
|
||||
'Limit' => 'Xx',
|
||||
@@ -261,16 +264,16 @@ $translations = array(
|
||||
'Loading' => 'Xx',
|
||||
'Whole result' => 'Xx',
|
||||
'%d byte(s)' => array('%d xx', '%d xx'),
|
||||
|
||||
|
||||
'Import' => 'Xx',
|
||||
'%d row(s) have been imported.' => array('%d xx.', '%d xx.'),
|
||||
'File must be in UTF-8 encoding.' => 'Xx.',
|
||||
|
||||
|
||||
// in-place editing in select
|
||||
'Modify' => 'Xx',
|
||||
'Ctrl+click on a value to modify it.' => 'Xx.',
|
||||
'Use edit link to modify this value.' => 'Xx.',
|
||||
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => 'Xx%s.',
|
||||
'Item has been deleted.' => 'Xx.',
|
||||
@@ -290,14 +293,14 @@ $translations = array(
|
||||
'Clone' => 'Xx',
|
||||
'Delete' => 'Xx',
|
||||
'You have no privileges to update this table.' => 'Xx.',
|
||||
|
||||
|
||||
'E-mail' => 'Xx',
|
||||
'From' => 'Xx',
|
||||
'Subject' => 'Xx',
|
||||
'Attachments' => 'Xx',
|
||||
'Send' => 'Xx',
|
||||
'%d e-mail(s) have been sent.' => array('%d xx.', '%d xx.'),
|
||||
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Xx',
|
||||
'Date and time' => 'Xx',
|
||||
@@ -307,7 +310,7 @@ $translations = array(
|
||||
'Network' => 'Xx',
|
||||
'Geometry' => 'Xx',
|
||||
'Relations' => 'Xx',
|
||||
|
||||
|
||||
'Editor' => 'Xx',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => 'xx',
|
||||
@@ -318,11 +321,11 @@ $translations = array(
|
||||
'now' => 'xx',
|
||||
'yes' => 'xx',
|
||||
'no' => 'xx',
|
||||
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => 'Xx.',
|
||||
'Please use one of the extensions %s.' => 'Xx %s.',
|
||||
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => 'Xx',
|
||||
'Create schema' => 'Xx',
|
||||
@@ -331,7 +334,7 @@ $translations = array(
|
||||
'Schema has been altered.' => 'Xx.',
|
||||
'Schema' => 'Xx',
|
||||
'Invalid schema.' => 'Xx.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Xx',
|
||||
'Create sequence' => 'Xx',
|
||||
@@ -339,11 +342,20 @@ $translations = array(
|
||||
'Sequence has been created.' => 'Xx.',
|
||||
'Sequence has been altered.' => 'Xx.',
|
||||
'Alter sequence' => 'Xx',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'Xx',
|
||||
'Create type' => 'Xx',
|
||||
'Type has been dropped.' => 'Xx.',
|
||||
'Type has been created.' => 'Xx.',
|
||||
'Alter type' => 'Xx',
|
||||
|
||||
// Plugins
|
||||
'Columns' => 'Xx',
|
||||
'Nullable' => 'Xx',
|
||||
'Default' => 'Xx',
|
||||
'Yes' => 'Xx',
|
||||
'No' => 'Xx',
|
||||
'One Time Password' => 'Xx',
|
||||
'Invalid OTP code.' => 'Xx.',
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => '資料庫系統',
|
||||
'Server' => '伺服器',
|
||||
'Username' => '帳號',
|
||||
@@ -11,7 +12,7 @@ $translations = array(
|
||||
'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.' => '無效的憑證。',
|
||||
'Invalid server or credentials.' => null,
|
||||
'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.' => '資料庫不支援密碼。',
|
||||
@@ -29,10 +30,10 @@ $translations = array(
|
||||
'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.' => '已刪除使用者。',
|
||||
@@ -43,14 +44,14 @@ $translations = array(
|
||||
'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 行受影響。',
|
||||
@@ -67,7 +68,7 @@ $translations = array(
|
||||
'History' => '紀錄',
|
||||
'Clear' => '清除',
|
||||
'Edit all' => '編輯全部',
|
||||
|
||||
|
||||
'File upload' => '檔案上傳',
|
||||
'From server' => '從伺服器',
|
||||
'Webserver file %s' => '網頁伺服器檔案 %s',
|
||||
@@ -79,7 +80,7 @@ $translations = array(
|
||||
'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' => '打開',
|
||||
@@ -87,7 +88,7 @@ $translations = array(
|
||||
'Saving' => '保存中',
|
||||
'Format' => '格式',
|
||||
'Data' => '資料',
|
||||
|
||||
|
||||
'Database' => '資料庫',
|
||||
'database' => '資料庫',
|
||||
'DB' => '資料庫',
|
||||
@@ -102,10 +103,10 @@ $translations = array(
|
||||
'Alter database' => '修改資料庫',
|
||||
'Create database' => '建立資料庫',
|
||||
'Database schema' => '資料庫結構',
|
||||
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => '永久連結',
|
||||
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
@@ -129,7 +130,7 @@ $translations = array(
|
||||
'Copy' => '複製',
|
||||
'Tables have been copied.' => '資料表已經複製',
|
||||
'overwrite' => '覆蓋',
|
||||
|
||||
|
||||
'Routines' => '程序',
|
||||
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d 行被影響',
|
||||
'Call' => '呼叫',
|
||||
@@ -142,7 +143,7 @@ $translations = array(
|
||||
'Alter function' => '修改函式',
|
||||
'Alter procedure' => '修改預存程序',
|
||||
'Return type' => '回傳類型',
|
||||
|
||||
|
||||
'Events' => '事件',
|
||||
'Event has been dropped.' => '已刪除事件。',
|
||||
'Event has been altered.' => '已修改事件。',
|
||||
@@ -155,7 +156,7 @@ $translations = array(
|
||||
'Start' => '開始',
|
||||
'End' => '結束',
|
||||
'On completion preserve' => '在完成後儲存',
|
||||
|
||||
|
||||
'Tables' => '資料表',
|
||||
'Tables and views' => '資料表和檢視表',
|
||||
'Table' => '資料表',
|
||||
@@ -188,12 +189,13 @@ $translations = array(
|
||||
'Move down' => '下移',
|
||||
'Remove' => '移除',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => '超過允許的字段數量的最大值。請增加 %s。',
|
||||
|
||||
|
||||
'Partition by' => '分區類型',
|
||||
'Partition' => null,
|
||||
'Partitions' => '分區',
|
||||
'Partition name' => '分區名稱',
|
||||
'Values' => '值',
|
||||
|
||||
|
||||
'View' => '檢視表',
|
||||
'Materialized view' => '物化視圖',
|
||||
'View has been dropped.' => '已刪除檢視表。',
|
||||
@@ -201,14 +203,14 @@ $translations = array(
|
||||
'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.' => '已刪除外來鍵。',
|
||||
@@ -224,7 +226,7 @@ $translations = array(
|
||||
'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.' => '已刪除觸發器。',
|
||||
@@ -235,7 +237,7 @@ $translations = array(
|
||||
'Time' => '時間',
|
||||
'Event' => '事件',
|
||||
'Name' => '名稱',
|
||||
|
||||
|
||||
'select' => '選擇',
|
||||
'Select' => '選擇',
|
||||
'Select data' => '選擇資料',
|
||||
@@ -244,6 +246,7 @@ $translations = array(
|
||||
'Search' => '搜尋',
|
||||
'anywhere' => '任意位置',
|
||||
'Search data in tables' => '在資料庫搜尋',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => '排序',
|
||||
'descending' => '降冪 (遞減)',
|
||||
'Limit' => '限定',
|
||||
@@ -261,16 +264,16 @@ $translations = array(
|
||||
'Loading' => '載入中',
|
||||
'Whole result' => '所有結果',
|
||||
'%d byte(s)' => '%d byte(s)',
|
||||
|
||||
|
||||
'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.' => '該項目已被刪除',
|
||||
@@ -290,14 +293,14 @@ $translations = array(
|
||||
'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' => '日期時間',
|
||||
@@ -307,7 +310,7 @@ $translations = array(
|
||||
'Network' => '網路',
|
||||
'Geometry' => '幾何',
|
||||
'Relations' => '關聯',
|
||||
|
||||
|
||||
'Editor' => '編輯器',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$1.$3.$5',
|
||||
@@ -318,11 +321,11 @@ $translations = array(
|
||||
'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' => '建立資料表結構',
|
||||
@@ -331,7 +334,7 @@ $translations = array(
|
||||
'Schema has been altered.' => '已修改資料表結構。',
|
||||
'Schema' => '資料表結構',
|
||||
'Invalid schema.' => '無效的資料表結構。',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => '序列',
|
||||
'Create sequence' => '建立序列',
|
||||
@@ -339,11 +342,20 @@ $translations = array(
|
||||
'Sequence has been created.' => '已建立序列。',
|
||||
'Sequence has been altered.' => '已修改序列。',
|
||||
'Alter sequence' => '修改序列',
|
||||
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => '使用者類型',
|
||||
'Create type' => '建立類型',
|
||||
'Type has been dropped.' => '已刪除類型。',
|
||||
'Type has been created.' => '已建立類型。',
|
||||
'Alter type' => '修改類型',
|
||||
|
||||
// Plugins
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'Home' => null,
|
||||
'System' => '系统',
|
||||
'Server' => '服务器',
|
||||
'Username' => '用户名',
|
||||
@@ -11,7 +12,7 @@ $translations = array(
|
||||
'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.' => '无效凭据。',
|
||||
'Invalid server or credentials.' => null,
|
||||
'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.' => '数据库不支持密码。',
|
||||
@@ -29,7 +30,7 @@ $translations = array(
|
||||
'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',
|
||||
|
||||
@@ -190,6 +191,7 @@ $translations = array(
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => '超过最多允许的字段数量。请增加 %s。',
|
||||
|
||||
'Partition by' => '分区类型',
|
||||
'Partition' => null,
|
||||
'Partitions' => '分区',
|
||||
'Partition name' => '分区名',
|
||||
'Values' => '值',
|
||||
@@ -244,6 +246,7 @@ $translations = array(
|
||||
'Search' => '搜索',
|
||||
'anywhere' => '任意位置',
|
||||
'Search data in tables' => '在表中搜索数据',
|
||||
'as a regular expression' => null,
|
||||
'Sort' => '排序',
|
||||
'descending' => '降序',
|
||||
'Limit' => '范围',
|
||||
@@ -346,4 +349,12 @@ $translations = array(
|
||||
'Type has been dropped.' => '已删除类型。',
|
||||
'Type has been created.' => '已创建类型。',
|
||||
'Alter type' => '修改类型',
|
||||
|
||||
'Columns' => null,
|
||||
'Nullable' => null,
|
||||
'Default' => null,
|
||||
'Yes' => null,
|
||||
'No' => null,
|
||||
'One Time Password' => null,
|
||||
'Invalid OTP code.' => null,
|
||||
);
|
||||
|
@@ -14,7 +14,7 @@ echo "<form action=''><p>\n";
|
||||
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 "<table>\n";
|
||||
echo "<thead><tr><th>" . lang('Username') . "<th>" . lang('Server') . "<th></thead>\n";
|
||||
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
|
@@ -39,12 +39,16 @@ $routine_languages = routine_languages();
|
||||
<?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">
|
||||
<table cellspacing="0" class="nowrap" id="edit-fields">
|
||||
<?php
|
||||
edit_fields($row["fields"], $collations, $routine);
|
||||
if (isset($_GET["function"])) {
|
||||
echo "<tr><td>" . lang('Return type');
|
||||
echo "<tbody><tr><th></th>",
|
||||
"<th>", lang('Return type'), "</th>";
|
||||
|
||||
edit_type("returns", $row["returns"], $collations, array(), ($jush == "pgsql" ? array("void", "trigger") : array()));
|
||||
|
||||
echo "<td></td></tr></tbody>\n";
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
|
@@ -50,9 +50,9 @@ foreach (table_status('', true) as $table => $table_status) {
|
||||
?>
|
||||
<div id="schema" style="height: <?php echo $top; ?>em;">
|
||||
<script<?php echo nonce(); ?>>
|
||||
qs('#schema').onselectstart = function () { return false; };
|
||||
gid('schema').onselectstart = function () { return false; };
|
||||
var tablePos = {<?php echo implode(",", $table_pos_js) . "\n"; ?>};
|
||||
var em = qs('#schema').offsetHeight / <?php echo $top; ?>;
|
||||
var em = gid('schema').offsetHeight / <?php echo $top; ?>;
|
||||
document.onmousemove = schemaMousemove;
|
||||
document.onmouseup = partialArg(schemaMouseup, '<?php echo js_escape(DB); ?>');
|
||||
</script>
|
||||
@@ -61,12 +61,12 @@ foreach ($schema as $name => $table) {
|
||||
echo "<div class='table' style='top: " . $table["pos"][0] . "em; left: " . $table["pos"][1] . "em;'>";
|
||||
echo '<a href="' . h(ME) . 'table=' . urlencode($name) . '"><b>' . h($name) . "</b></a>";
|
||||
echo script("qsl('div').onmousedown = schemaMousedown;");
|
||||
|
||||
|
||||
foreach ($table["fields"] as $field) {
|
||||
$val = '<span' . type_class($field["type"]) . ' title="' . h($field["full_type"] . ($field["null"] ? " NULL" : '')) . '">' . h($field["field"]) . '</span>';
|
||||
echo "<br>" . ($field["primary"] ? "<i>$val</i>" : $val);
|
||||
}
|
||||
|
||||
|
||||
foreach ((array) $table["references"] as $target_name => $refs) {
|
||||
foreach ($refs as $left => $ref) {
|
||||
$left1 = $left - $table_pos[$name][1];
|
||||
@@ -76,7 +76,7 @@ foreach ($schema as $name => $table) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
foreach ((array) $referenced[$name] as $target_name => $refs) {
|
||||
foreach ($refs as $left => $columns) {
|
||||
$left1 = $left - $table_pos[$name][1];
|
||||
@@ -86,7 +86,7 @@ foreach ($schema as $name => $table) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
echo "\n</div>\n";
|
||||
}
|
||||
|
||||
|
@@ -27,7 +27,7 @@ if (!$row) {
|
||||
|
||||
<form action="" method="post">
|
||||
<p><input name="name" id="name" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
|
||||
<?php echo script("focus(qs('#name'));"); ?>
|
||||
<?php echo script("focus(gid('name'));"); ?>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php
|
||||
if ($_GET["ns"] != "") {
|
||||
|
@@ -12,7 +12,7 @@ if ($_GET["script"] == "db") {
|
||||
foreach ($sums + array("Auto_increment" => 0, "Rows" => 0) as $key => $val) {
|
||||
if ($table_status[$key] != "") {
|
||||
$val = format_number($table_status[$key]);
|
||||
json_row("$key-$name", ($key == "Rows" && $val && $table_status["Engine"] == ($sql == "pgsql" ? "table" : "InnoDB")
|
||||
json_row("$key-$name", ($key == "Rows" && $val && $table_status["Engine"] == ($jush == "pgsql" ? "table" : "InnoDB")
|
||||
? "~ $val"
|
||||
: $val
|
||||
));
|
||||
|
@@ -9,6 +9,8 @@ parse_str($_COOKIE["adminer_import"], $adminer_import);
|
||||
|
||||
$rights = array(); // privilege => 0
|
||||
$columns = array(); // selectable columns
|
||||
$search_columns = array(); // searchable columns
|
||||
$order_columns = array(); // searchable columns
|
||||
$text_length = null;
|
||||
foreach ($fields as $key => $field) {
|
||||
$name = $adminer->fieldName($field);
|
||||
@@ -18,6 +20,12 @@ foreach ($fields as $key => $field) {
|
||||
$text_length = $adminer->selectLengthProcess();
|
||||
}
|
||||
}
|
||||
if (isset($field["privileges"]["where"]) && $name != "") {
|
||||
$search_columns[$key] = html_entity_decode(strip_tags($name), ENT_QUOTES);
|
||||
}
|
||||
if (isset($field["privileges"]["order"]) && $name != "") {
|
||||
$order_columns[$key] = html_entity_decode(strip_tags($name), ENT_QUOTES);
|
||||
}
|
||||
$rights += $field["privileges"];
|
||||
}
|
||||
|
||||
@@ -224,14 +232,16 @@ if (is_ajax()) {
|
||||
|
||||
$set = null;
|
||||
if (isset($rights["insert"]) || !support("table")) {
|
||||
$set = "";
|
||||
$params = [];
|
||||
foreach ((array) $_GET["where"] as $val) {
|
||||
if ($foreign_keys[$val["col"]] && count($foreign_keys[$val["col"]]) == 1 && ($val["op"] == "="
|
||||
|| (!$val["op"] && !preg_match('~[_%]~', $val["val"])) // LIKE in Editor
|
||||
if (isset($foreign_keys[$val["col"]]) && count($foreign_keys[$val["col"]]) == 1
|
||||
&& ($val["op"] == "=" || (!$val["op"] && (is_array($val["val"]) || !preg_match('~[_%]~', $val["val"]))) // LIKE in Editor
|
||||
)) {
|
||||
$set .= "&set" . urlencode("[" . bracket_escape($val["col"]) . "]") . "=" . urlencode($val["val"]);
|
||||
$params["set" . "[" . bracket_escape($val["col"]) . "]"] = $val["val"];
|
||||
}
|
||||
}
|
||||
|
||||
$set = $params ? "&" . http_build_query($params) : "";
|
||||
}
|
||||
$adminer->selectLinks($table_status, $set);
|
||||
|
||||
@@ -243,10 +253,11 @@ if (!$columns && support("table")) {
|
||||
hidden_fields_get();
|
||||
echo (DB != "" ? '<input type="hidden" name="db" value="' . h(DB) . '">' . (isset($_GET["ns"]) ? '<input type="hidden" name="ns" value="' . h($_GET["ns"]) . '">' : "") : ""); // not used in Editor
|
||||
echo '<input type="hidden" name="select" value="' . h($TABLE) . '">';
|
||||
echo '<input type="submit" value="' . h(lang('Select')) . '">'; # hidden default submit so filter remove buttons aren't "clicked" on submission from enter key
|
||||
echo "</div>\n";
|
||||
$adminer->selectColumnsPrint($select, $columns);
|
||||
$adminer->selectSearchPrint($where, $columns, $indexes);
|
||||
$adminer->selectOrderPrint($order, $columns, $indexes);
|
||||
$adminer->selectSearchPrint($where, $search_columns, $indexes);
|
||||
$adminer->selectOrderPrint($order, $order_columns, $indexes);
|
||||
$adminer->selectLimitPrint($limit);
|
||||
$adminer->selectLengthPrint($text_length);
|
||||
$adminer->selectActionPrint($indexes);
|
||||
@@ -311,10 +322,10 @@ if (!$columns && support("table")) {
|
||||
|
||||
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 script("mixin(gid('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true), onkeydown: editingKeydown});");
|
||||
echo "<thead><tr>" . (!$group && $select
|
||||
? ""
|
||||
: "<td><input type='checkbox' id='all-page' class='jsonly'>" . script("qs('#all-page').onclick = partial(formCheck, /check/);", "")
|
||||
: "<td><input type='checkbox' id='all-page' class='jsonly'>" . script("gid('all-page').onclick = partial(formCheck, /check/);", "")
|
||||
. " <a href='" . h($_GET["modify"] ? remove_from_uri("modify") : $_SERVER["REQUEST_URI"] . "&modify=1") . "'>" . lang('Modify') . "</a>");
|
||||
$names = array();
|
||||
$functions = array();
|
||||
@@ -331,13 +342,21 @@ if (!$columns && support("table")) {
|
||||
$column = idf_escape($key);
|
||||
$href = remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key);
|
||||
$desc = "&desc%5B0%5D=1";
|
||||
$sortable = isset($field["privileges"]["order"]);
|
||||
echo "<th id='th[" . h(bracket_escape($key)) . "]'>" . script("mixin(qsl('th'), {onmouseover: partial(columnMouse), onmouseout: partial(columnMouse, ' hidden')});", "");
|
||||
echo '<a href="' . h($href . ($order[0] == $column || $order[0] == $key || (!$order && $is_group && $group[0] == $column) ? $desc : '')) . '">'; // $order[0] == $key - COUNT(*)
|
||||
echo apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions
|
||||
if ($sortable) {
|
||||
echo '<a href="' . h($href . ($order[0] == $column || $order[0] == $key || (!$order && $is_group && $group[0] == $column) ? $desc : '')) . '">'; // $order[0] == $key - COUNT(*)
|
||||
}
|
||||
echo apply_sql_function($val["fun"], $name); //! columns looking like functions
|
||||
if ($sortable) {
|
||||
echo "</a>";
|
||||
}
|
||||
echo "<span class='column hidden'>";
|
||||
echo "<a href='" . h($href . $desc) . "' title='" . lang('descending') . "' class='text'> ↓</a>";
|
||||
if (!$val["fun"]) {
|
||||
echo '<a href="#fieldset-search" title="' . lang('Search') . '" class="text jsonly"> =</a>';
|
||||
if ($sortable) {
|
||||
echo "<a href='" . h($href . $desc) . "' title='" . lang('descending') . "' class='text'> ↓</a>";
|
||||
}
|
||||
if (!$val["fun"] && isset($field["privileges"]["where"])) {
|
||||
echo '<a href="#fieldset-search" title="' . lang('Search') . '" class="text jsonly"> =</a>';
|
||||
echo script("qsl('a').onclick = partial(selectSearch, '" . js_escape($key) . "');");
|
||||
}
|
||||
echo "</span>";
|
||||
@@ -430,7 +449,7 @@ if (!$columns && support("table")) {
|
||||
$link .= where_link($i++, $k, $v);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$val = select_value($val, $link, $field, $text_length);
|
||||
$id = h("val[$unique_idf][" . bracket_escape($key) . "]");
|
||||
$value = $_POST["val"][$unique_idf][bracket_escape($key)];
|
||||
@@ -491,7 +510,7 @@ if (!$columns && support("table")) {
|
||||
echo "\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
echo "<div class='footer'><div>\n";
|
||||
if ($rows || $page) {
|
||||
if ($pagination) {
|
||||
@@ -523,7 +542,7 @@ if (!$columns && support("table")) {
|
||||
}
|
||||
echo "</fieldset>\n";
|
||||
}
|
||||
|
||||
|
||||
echo "<fieldset>";
|
||||
echo "<legend>" . lang('Whole result') . "</legend>";
|
||||
$display_rows = ($exact_count ? "" : "~ ") . $found_rows;
|
||||
@@ -552,9 +571,9 @@ if (!$columns && support("table")) {
|
||||
}
|
||||
if ($format) {
|
||||
print_fieldset("export", lang('Export') . " <span id='selected2'></span>");
|
||||
$output = $adminer->dumpOutput();
|
||||
echo ($output ? html_select("output", $output, $adminer_import["output"]) . " " : "");
|
||||
echo html_select("format", $format, $adminer_import["format"]);
|
||||
$output = $adminer->dumpOutput();
|
||||
echo ($output ? " " . html_select("output", $output, $adminer_import["output"]) : "");
|
||||
echo " <input type='submit' name='export' value='" . lang('Export') . "'>\n";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
@@ -570,7 +589,7 @@ if (!$columns && support("table")) {
|
||||
echo script("qsl('a').onclick = partial(toggle, 'import');", "");
|
||||
echo "<span id='import' class='hidden'>: ";
|
||||
echo "<input type='file' name='csv_file'> ";
|
||||
echo html_select("separator", array("csv" => "CSV,", "csv;" => "CSV;", "tsv" => "TSV"), $adminer_import["format"], 1); // 1 - select
|
||||
echo html_select("separator", array("csv" => "CSV,", "csv;" => "CSV;", "tsv" => "TSV"), $adminer_import["format"]);
|
||||
echo " <input type='submit' name='import' value='" . lang('Import') . "'>";
|
||||
echo "</span>";
|
||||
echo "</div>";
|
||||
|
@@ -21,19 +21,25 @@ if (!$error && $_POST) {
|
||||
if (!isset($_GET["import"])) {
|
||||
$query = $_POST["query"];
|
||||
} elseif ($_POST["webfile"]) {
|
||||
$sql_file_path = $adminer->importServerPath();
|
||||
$fp = @fopen((file_exists($sql_file_path)
|
||||
? $sql_file_path
|
||||
: "compress.zlib://$sql_file_path.gz"
|
||||
), "rb");
|
||||
$query = ($fp ? fread($fp, 1e6) : false);
|
||||
$import_file_path = $adminer->importServerPath();
|
||||
if (!$import_file_path) {
|
||||
$fp = false;
|
||||
} elseif (file_exists($import_file_path)) {
|
||||
$fp = fopen($import_file_path, "rb");
|
||||
} elseif (file_exists("$import_file_path.gz")) {
|
||||
$fp = fopen("compress.zlib://$import_file_path.gz", "rb");
|
||||
} else {
|
||||
$fp = false;
|
||||
}
|
||||
|
||||
$query = $fp ? fread($fp, 1e6) : false;
|
||||
} else {
|
||||
$query = get_file("sql_file", true);
|
||||
}
|
||||
|
||||
if (is_string($query)) { // get_file() returns error as number, fread() as false
|
||||
if (function_exists('memory_get_usage')) {
|
||||
@ini_set("memory_limit", max(ini_bytes("memory_limit"), 2 * strlen($query) + memory_get_usage() + 8e6)); // @ - may be disabled, 2 - substr and trim, 8e6 - other variables
|
||||
if (function_exists('memory_get_usage') && ($memory_limit = ini_bytes("memory_limit")) != "-1") {
|
||||
@ini_set("memory_limit", max($memory_limit, 2 * strlen($query) + memory_get_usage() + 8e6)); // @ - may be disabled, 2 - substr and trim, 8e6 - other variables
|
||||
}
|
||||
|
||||
if ($query != "" && strlen($query) < 1e6) { // don't add big queries
|
||||
@@ -81,13 +87,27 @@ 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
|
||||
$c_style_escapes = is_c_style_escapes() || ($jush == "pgsql" && ($pos > 0 && strtolower($query[$pos - 1]) == "e"));
|
||||
|
||||
$pattern = '(';
|
||||
if ($found == '/*') {
|
||||
$pattern .= '\*/';
|
||||
} elseif ($found == '[') {
|
||||
$pattern .= ']';
|
||||
} elseif (preg_match('~^-- |^#~', $found)) {
|
||||
$pattern .= "\n";
|
||||
} else {
|
||||
$pattern .= preg_quote($found) . ($c_style_escapes ? "|\\\\." : "");
|
||||
}
|
||||
$pattern .= '|$)s';
|
||||
|
||||
while (preg_match($pattern, $query, $match, PREG_OFFSET_CAPTURE, $offset)) {
|
||||
$s = $match[0][0];
|
||||
if (!$s && $fp && !feof($fp)) {
|
||||
$query .= fread($fp, 1e5);
|
||||
} else {
|
||||
$offset = $match[0][1] + strlen($s);
|
||||
if ($s[0] != "\\") {
|
||||
if (!isset($s[0]) || $s[0] != "\\") {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -123,7 +143,7 @@ if (!$error && $_POST) {
|
||||
|
||||
if ($connection->error) {
|
||||
echo ($_POST["only_errors"] ? $print : "");
|
||||
echo "<p class='error'>" . lang('Error in query') . ($connection->errno ? " ($connection->errno)" : "") . ": " . error() . "\n";
|
||||
echo "<p class='error'>" . lang('Error in query') . (!empty($connection->errno) ? " ($connection->errno)" : "") . ": " . error() . "\n";
|
||||
$errors[] = " <a href='#sql-$commands'>$commands</a>";
|
||||
if ($_POST["error_stops"]) {
|
||||
break 2;
|
||||
@@ -169,7 +189,8 @@ if (!$error && $_POST) {
|
||||
stop_session();
|
||||
}
|
||||
if (!$_POST["only_errors"]) {
|
||||
echo "<p class='message' title='" . h($connection->info) . "'>" . lang('Query executed OK, %d row(s) affected.', $affected) . "$time\n";
|
||||
$title = isset($connection->info) ? "title='" . h($connection->info) . "'" : "";
|
||||
echo "<p class='message' $title>" . lang('Query executed OK, %d row(s) affected.', $affected) . "$time\n";
|
||||
}
|
||||
}
|
||||
echo ($warnings ? "<div id='$warnings_id' class='hidden'>\n$warnings</div>\n" : "");
|
||||
@@ -222,10 +243,10 @@ if (!isset($_GET["import"])) {
|
||||
}
|
||||
echo "<p>";
|
||||
textarea("query", $q, 20);
|
||||
echo script(($_POST ? "" : "qs('textarea').focus();\n") . "qs('#form').onsubmit = partial(sqlSubmit, qs('#form'), '" . js_escape(remove_from_uri("sql|limit|error_stops|only_errors|history")) . "');");
|
||||
echo script(($_POST ? "" : "qs('textarea').focus();\n") . "gid('form').onsubmit = partial(sqlSubmit, gid('form'), '" . js_escape(remove_from_uri("sql|limit|error_stops|only_errors|history")) . "');");
|
||||
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]" : "");
|
||||
@@ -234,10 +255,10 @@ if (!isset($_GET["import"])) {
|
||||
: lang('File uploads are disabled.')
|
||||
);
|
||||
echo "</div></fieldset>\n";
|
||||
$importServerPath = $adminer->importServerPath();
|
||||
if ($importServerPath) {
|
||||
$import_file_path = $adminer->importServerPath();
|
||||
if ($import_file_path) {
|
||||
echo "<fieldset><legend>" . lang('From server') . "</legend><div>";
|
||||
echo lang('Webserver file %s', "<code>" . h($importServerPath) . "$gz</code>");
|
||||
echo lang('Webserver file %s', "<code>" . h($import_file_path) . "$gz</code>");
|
||||
echo ' <input type="submit" name="webfile" value="' . lang('Run file') . '">';
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
|
@@ -1,8 +1,7 @@
|
||||
/** @author Ondrej Valka, http://valka.info */
|
||||
body { color: #000; background: #fff; font: 90%/1.25 Verdana, Arial, Helvetica, sans-serif; margin: 0; width: -moz-fit-content; width: fit-content; }
|
||||
a { color: blue; text-decoration: none; }
|
||||
a:visited { color: navy; }
|
||||
a:link:hover, a:visited:hover { color: red; text-decoration: underline; }
|
||||
a:link:hover { color: red; text-decoration: underline; }
|
||||
a.text:hover { text-decoration: none; }
|
||||
a.jush-help:hover { color: inherit; }
|
||||
h1 { font-size: 150%; margin: 0; padding: .8em 1em; border-bottom: 1px solid #999; font-weight: normal; color: #777; background: #eee; }
|
||||
@@ -11,7 +10,7 @@ h3 { font-weight: normal; font-size: 130%; margin: 1em 0 0; }
|
||||
form { margin: 0; }
|
||||
td table { width: 100%; margin: 0; }
|
||||
table { margin: 1em 20px 0 0; border-collapse: collapse; font-size: 90%; }
|
||||
td, th { border: 1px solid #999; padding: .2em .3em; }
|
||||
td, th { box-sizing: border-box; border: 1px solid #999; padding: .2em .3em; }
|
||||
th { background: #eee; text-align: left; }
|
||||
thead th { text-align: center; padding: .2em .5em; }
|
||||
thead td, thead th { background: #ddf; } /* position: sticky; causes Firefox to lose borders */
|
||||
@@ -19,20 +18,28 @@ fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: .8e
|
||||
p { margin: .8em 20px 0 0; }
|
||||
img { vertical-align: middle; border: 0; }
|
||||
td img { max-width: 200px; max-height: 200px; }
|
||||
code { background: #eee; }
|
||||
tbody tr:hover td, tbody tr:hover th { background: #eee; }
|
||||
code { font-size: 110%; padding: 1px 2px; background: #eee; }
|
||||
pre { margin: 1em 0 0; }
|
||||
pre, textarea { font: 100%/1.25 monospace; }
|
||||
input, select { vertical-align: middle; }
|
||||
pre code { display: block; font-size: 100%; }
|
||||
pre, textarea { font: 110%/1.25 monospace; }
|
||||
pre.jush { background: #fff; }
|
||||
input, textarea, select { box-sizing: border-box; }
|
||||
input[type="image"] { vertical-align: middle; margin-top: -3px; }
|
||||
input[type="number"] { -moz-appearance: textfield; }
|
||||
input::-webkit-inner-spin-button { -webkit-appearance: none; }
|
||||
input.default { box-shadow: 1px 1px 1px #777; }
|
||||
input.required { box-shadow: 1px 1px 1px red; }
|
||||
input.maxlength { box-shadow: 1px 1px 1px red; }
|
||||
input.wayoff { left: -1000px; position: absolute; }
|
||||
input::placeholder { color: #000; opacity: 0.4; }
|
||||
.center { text-align: center; }
|
||||
.block { display: block; }
|
||||
.version { color: #777; font-size: 67%; }
|
||||
.version { color: #777; font-size: 62%; }
|
||||
.js .hidden, .nojs .jsonly { display: none; }
|
||||
.js .column { position: absolute; background: #ddf; padding: .27em 1ex .3em 0; margin-top: -.27em; }
|
||||
.nowrap td, .nowrap th, td.nowrap, p.nowrap { white-space: pre; }
|
||||
.nowrap { white-space: nowrap; }
|
||||
p.nowrap { white-space: pre; }
|
||||
.wrap td { white-space: normal; }
|
||||
.error { color: red; background: #fee; }
|
||||
.error b { background: #fff; font-weight: normal; }
|
||||
@@ -62,24 +69,37 @@ input.wayoff { left: -1000px; position: absolute; }
|
||||
.footer > div { background: #fff; padding: 0 0 .5em; }
|
||||
.footer fieldset { margin-top: 0; }
|
||||
.links a { white-space: nowrap; margin-right: 20px; }
|
||||
.logout { margin-top: .5em; position: absolute; top: 0; right: 0; }
|
||||
.logout { margin: .5em 20px 0 0; position: absolute; top: 0; right: 0; }
|
||||
.loadmore { margin-left: 1ex; }
|
||||
.tables-filter { padding: .8em 1em 0; }
|
||||
.handle { cursor: grab; vertical-align: middle; }
|
||||
.handle:before { content: "="; display: inline-block; width: 18px; height: 18px; overflow: hidden; font-size: 130%; text-align: center; line-height: 16px; opacity: 0.2; }
|
||||
span.handle { display: inline-block; width: 18px; height: 18px; padding-right: .3em; }
|
||||
th.handle:before { vertical-align: middle; }
|
||||
.no-sort .handle { cursor: default; }
|
||||
.no-sort .handle:before { content: "•"; font-size: 100%; }
|
||||
.placeholder { opacity: 0; }
|
||||
.dragging { position: absolute; margin: 0; background: #fff; }
|
||||
.dragging * { cursor: grabbing; }
|
||||
table.dragging { background: #eee; }
|
||||
/* .edit used in designs */
|
||||
#menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; }
|
||||
#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, #tables { white-space: nowrap; overflow: hidden; }
|
||||
#logins a, #tables a, #tables span { background: #fff; }
|
||||
#content { margin: 2em 0 0 21em; padding: 10px 20px 20px 0; }
|
||||
#lang { position: absolute; top: 0; left: 0; line-height: 1.8em; padding: .3em 1em; }
|
||||
#breadcrumb { white-space: nowrap; position: absolute; top: 0; left: 21em; background: #eee; height: 2em; line-height: 1.8em; padding: 0 1em; margin: 0 0 0 -18px; }
|
||||
#h1 { color: #777; text-decoration: none; font-style: italic; }
|
||||
#version { font-size: 67%; color: red; }
|
||||
#version { color: red; }
|
||||
#schema { margin-left: 60px; position: relative; -moz-user-select: none; -webkit-user-select: none; }
|
||||
#schema .table { border: 1px solid silver; padding: 0 2px; cursor: move; position: absolute; }
|
||||
#schema .references { position: absolute; }
|
||||
#tables-filter, #database-select, #scheme-select { width: 100%; }
|
||||
#help { position: absolute; border: 1px solid #999; background: #eee; padding: 5px; font-family: monospace; z-index: 1; }
|
||||
#fieldset-select div:last-child > .remove, #fieldset-search div:last-child > .remove, #fieldset-sort div:last-child > .remove { display: none; }
|
||||
|
||||
.rtl h2 { margin: 0 -18px 20px 0; }
|
||||
.rtl p, .rtl table, .rtl .error, .rtl .message { margin: 1em 0 0 20px; }
|
||||
|
@@ -16,17 +16,22 @@ function bodyLoad(version, maria) {
|
||||
if (maria) {
|
||||
for (var i = 1; i < obj.length; i++) {
|
||||
obj[i] = obj[i]
|
||||
.replace(/\.html/, '/')
|
||||
.replace(/-type-syntax/, '-data-types')
|
||||
.replace('.html', '/')
|
||||
.replace('-type-syntax', '-data-types')
|
||||
.replace(/numeric-(data-types)/, '$1-$&')
|
||||
.replace(/#statvar_.*/, '#$$1')
|
||||
.replace(/replication-options-(master|binary-log)\//, 'replication-and-binary-log-system-variables/')
|
||||
.replace('server-options/', 'server-system-variables/')
|
||||
.replace('innodb-parameters/', 'innodb-system-variables/')
|
||||
.replace(/#(statvar|sysvar|option_mysqld)_(.*)/, '#$2')
|
||||
.replace(/#sysvar_(.*)/, '#$1')
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
obj[key] = (maria ? obj[key].replace(/dev\.mysql\.com\/doc\/mysql\/en\//, 'mariadb.com/kb/en/library/') : obj[key]) // MariaDB
|
||||
.replace(/\/doc\/mysql/, '/doc/refman/' + version) // MySQL
|
||||
.replace(/\/docs\/current/, '/docs/' + version) // PostgreSQL
|
||||
|
||||
obj[key] = (maria ? obj[key].replace('dev.mysql.com/doc/mysql/en/', 'mariadb.com/kb/en/') : obj[key]) // MariaDB
|
||||
.replace('/doc/mysql/', '/doc/refman/' + version) // MySQL
|
||||
.replace('/docs/current/', '/docs/' + version) // PostgreSQL
|
||||
;
|
||||
}
|
||||
}
|
||||
@@ -54,7 +59,7 @@ function bodyLoad(version, maria) {
|
||||
function formField(form, name) {
|
||||
// required in IE < 8, form.elements[name] doesn't work
|
||||
for (var i=0; i < form.length; i++) {
|
||||
if (form[i].name == name) {
|
||||
if (form[i].name === name) {
|
||||
return form[i];
|
||||
}
|
||||
}
|
||||
@@ -83,14 +88,18 @@ function messagesPrint(el) {
|
||||
|
||||
|
||||
|
||||
/** 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;
|
||||
/**
|
||||
* Hides or shows some login rows for selected driver.
|
||||
*
|
||||
* @param {HTMLSelectElement} driverSelect
|
||||
*/
|
||||
function loginDriver(driverSelect) {
|
||||
const trs = parentTag(driverSelect, 'table').rows;
|
||||
const disabled = /sqlite/.test(selectValue(driverSelect));
|
||||
|
||||
// 1 - row with server
|
||||
trs[1].classList.toggle('hidden', disabled);
|
||||
trs[1].getElementsByTagName('input')[0].disabled = disabled;
|
||||
}
|
||||
|
||||
|
||||
@@ -103,8 +112,13 @@ var dbPrevious = {};
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function dbMouseDown(event) {
|
||||
// Firefox: mouse-down event does not contain pressed key information for OPTION.
|
||||
// Chrome: mouse-down event has inherited key information from SELECT.
|
||||
// So we ignore the event for OPTION to work Ctrl+click correctly everywhere.
|
||||
if (event.target.tagName === "OPTION") return;
|
||||
|
||||
dbCtrl = isCtrl(event);
|
||||
if (dbPrevious[this.name] == undefined) {
|
||||
if (dbPrevious[this.name] === undefined) {
|
||||
dbPrevious[this.name] = this.value;
|
||||
}
|
||||
}
|
||||
@@ -118,7 +132,7 @@ function dbChange() {
|
||||
}
|
||||
this.form.submit();
|
||||
this.form.target = '';
|
||||
if (dbCtrl && dbPrevious[this.name] != undefined) {
|
||||
if (dbCtrl && dbPrevious[this.name] !== undefined) {
|
||||
this.value = dbPrevious[this.name];
|
||||
dbPrevious[this.name] = undefined;
|
||||
}
|
||||
@@ -145,23 +159,23 @@ function selectFieldChange() {
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
var select = selects[i];
|
||||
var col = selectValue(select);
|
||||
var match = /^(where.+)col\]/.exec(select.name);
|
||||
var match = /^(where.+)col]/.exec(select.name);
|
||||
if (match) {
|
||||
var op = selectValue(form[match[1] + 'op]']);
|
||||
var val = form[match[1] + 'val]'].value;
|
||||
if (col in indexColumns && (!/LIKE|REGEXP/.test(op) || (op == 'LIKE' && val.charAt(0) != '%'))) {
|
||||
if (col in indexColumns && (!/LIKE|REGEXP/.test(op) || (op === 'LIKE' && val.charAt(0) !== '%'))) {
|
||||
return true;
|
||||
} else if (col || val) {
|
||||
ok = false;
|
||||
}
|
||||
}
|
||||
if ((match = /^(columns.+)fun\]/.exec(select.name))) {
|
||||
if ((match = /^(columns.+)fun]/.exec(select.name))) {
|
||||
if (/^(avg|count|count distinct|group_concat|max|min|sum)$/.test(col)) {
|
||||
group = true;
|
||||
}
|
||||
var val = selectValue(form[match[1] + 'col]']);
|
||||
if (val) {
|
||||
columns[col && col != 'count' ? '' : val] = 1;
|
||||
columns[col && col !== 'count' ? '' : val] = 1;
|
||||
}
|
||||
}
|
||||
if (col && /^order/.test(select.name)) {
|
||||
@@ -194,7 +208,7 @@ var added = '.', rowCount;
|
||||
* @return boolean
|
||||
*/
|
||||
function delimiterEqual(val, a, b) {
|
||||
return (val == a + '_' + b || val == a + b || val == a + b.charAt(0).toUpperCase() + b.substr(1));
|
||||
return (val === a + '_' + b || val === a + b || val === a + b.charAt(0).toUpperCase() + b.substr(1));
|
||||
}
|
||||
|
||||
/** Escape string to use as identifier
|
||||
@@ -226,11 +240,13 @@ function editFields() {
|
||||
els = qsa('[name$="[type]"]');
|
||||
for (var i = 0; i < els.length; i++) {
|
||||
mixin(els[i], {
|
||||
onfocus: function () { lastType = selectValue(this); },
|
||||
onfocus: () => {
|
||||
lastType = selectValue(this);
|
||||
},
|
||||
onchange: editingTypeChange,
|
||||
onmouseover: function (event) { helpMouseover.call(this, event, getTarget(event).value, 1) },
|
||||
onmouseout: helpMouseout
|
||||
});
|
||||
|
||||
initHelpFor(els[i], (value) => { return value; }, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -239,7 +255,7 @@ function editFields() {
|
||||
* @return boolean false to cancel action
|
||||
*/
|
||||
function editingClick(event) {
|
||||
var el = getTarget(event);
|
||||
var el = event.target;
|
||||
if (!isTag(el, 'input')) {
|
||||
el = parentTag(el, 'label');
|
||||
el = el && qs('input', el);
|
||||
@@ -248,14 +264,10 @@ function editingClick(event) {
|
||||
var name = el.name;
|
||||
if (/^add\[/.test(name)) {
|
||||
editingAddRow.call(el, 1);
|
||||
} else if (/^up\[/.test(name)) {
|
||||
editingMoveRow.call(el, 1);
|
||||
} else if (/^down\[/.test(name)) {
|
||||
editingMoveRow.call(el);
|
||||
} else if (/^drop_col\[/.test(name)) {
|
||||
editingRemoveRow.call(el, 'fields\$1[field]');
|
||||
} else {
|
||||
if (name == 'auto_increment_col') {
|
||||
if (name === 'auto_increment_col') {
|
||||
var field = el.form['fields[' + el.value + '][field]'];
|
||||
if (!field.value) {
|
||||
field.value = 'id';
|
||||
@@ -272,8 +284,8 @@ function editingClick(event) {
|
||||
* @param InputEvent
|
||||
*/
|
||||
function editingInput(event) {
|
||||
var el = getTarget(event);
|
||||
if (/\[default\]$/.test(el.name)) {
|
||||
var el = event.target;
|
||||
if (/\[default]$/.test(el.name)) {
|
||||
el.previousSibling.checked = true;
|
||||
}
|
||||
}
|
||||
@@ -290,7 +302,7 @@ function editingNameChange() {
|
||||
for (var i = opts.length; i--; ) {
|
||||
var match = /(.+)`(.+)/.exec(opts[i].value);
|
||||
if (!match) { // common type
|
||||
if (candidate && i == opts.length - 2 && val == opts[candidate].value.replace(/.+`/, '') && name == 'fields[1]') { // single target table, link to column, first field - probably `id`
|
||||
if (candidate && i === opts.length - 2 && val === opts[candidate].value.replace(/.+`/, '') && name === 'fields[1]') { // single target table, link to column, first field - probably `id`
|
||||
return;
|
||||
}
|
||||
break;
|
||||
@@ -300,7 +312,7 @@ function editingNameChange() {
|
||||
var tables = [ table, table.replace(/s$/, ''), table.replace(/es$/, '') ];
|
||||
for (var j=0; j < tables.length; j++) {
|
||||
table = tables[j];
|
||||
if (val == column || val == table || delimiterEqual(val, table, column) || delimiterEqual(val, column, table)) {
|
||||
if (val === column || val === table || delimiterEqual(val, table, column) || delimiterEqual(val, column, table)) {
|
||||
if (candidate) {
|
||||
return;
|
||||
}
|
||||
@@ -335,7 +347,7 @@ function editingAddRow(focus) {
|
||||
tags2 = qsa('input', row2);
|
||||
var input = tags2[0]; // IE loose tags2 after insertBefore()
|
||||
for (var i=0; i < tags.length; i++) {
|
||||
if (tags[i].name == 'auto_increment_col') {
|
||||
if (tags[i].name === 'auto_increment_col') {
|
||||
tags2[i].value = x;
|
||||
tags2[i].checked = false;
|
||||
}
|
||||
@@ -348,7 +360,10 @@ function editingAddRow(focus) {
|
||||
}
|
||||
}
|
||||
tags[0].oninput = editingNameChange;
|
||||
|
||||
initSortableRow(row2);
|
||||
row.parentNode.insertBefore(row2, row.nextSibling);
|
||||
|
||||
if (focus) {
|
||||
input.oninput = editingNameChange;
|
||||
input.focus();
|
||||
@@ -370,22 +385,6 @@ function editingRemoveRow(name) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Move table row for field
|
||||
* @param [boolean]
|
||||
* @return boolean false for success
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function editingMoveRow(up){
|
||||
var row = parentTag(this, 'tr');
|
||||
if (!('nextElementSibling' in row)) {
|
||||
return true;
|
||||
}
|
||||
row.parentNode.insertBefore(row, up
|
||||
? row.previousElementSibling
|
||||
: row.nextElementSibling ? row.nextElementSibling.nextElementSibling : row.parentNode.firstChild);
|
||||
return false;
|
||||
}
|
||||
|
||||
var lastType = '';
|
||||
|
||||
/** Clear length and hide collation or unsigned
|
||||
@@ -397,7 +396,7 @@ function editingTypeChange() {
|
||||
var text = selectValue(type);
|
||||
for (var i=0; i < type.form.elements.length; i++) {
|
||||
var el = type.form.elements[i];
|
||||
if (el.name == name + '[length]') {
|
||||
if (el.name === name + '[length]') {
|
||||
if (!(
|
||||
(/(char|binary)$/.test(lastType) && /(char|binary)$/.test(text))
|
||||
|| (/(enum|set)$/.test(lastType) && /(enum|set)$/.test(text))
|
||||
@@ -406,30 +405,30 @@ function editingTypeChange() {
|
||||
}
|
||||
el.oninput.apply(el);
|
||||
}
|
||||
if (lastType == 'timestamp' && el.name == name + '[has_default]' && /timestamp/i.test(formField(type.form, name + '[default]').value)) {
|
||||
if (lastType === 'timestamp' && el.name == name + '[has_default]' && /timestamp/i.test(formField(type.form, name + '[default]').value)) {
|
||||
el.checked = false;
|
||||
}
|
||||
if (el.name == name + '[collation]') {
|
||||
alterClass(el, 'hidden', !/(char|text|enum|set)$/.test(text));
|
||||
if (el.name === name + '[collation]') {
|
||||
el.classList.toggle('hidden', !/(char|text|enum|set)$/.test(text));
|
||||
}
|
||||
if (el.name == name + '[unsigned]') {
|
||||
alterClass(el, 'hidden', !/(^|[^o])int(?!er)|numeric|real|float|double|decimal|money/.test(text));
|
||||
if (el.name === name + '[unsigned]') {
|
||||
el.classList.toggle('hidden', !/(^|[^o])int(?!er)|numeric|real|float|double|decimal|money/.test(text));
|
||||
}
|
||||
if (el.name == name + '[on_update]') {
|
||||
alterClass(el, 'hidden', !/timestamp|datetime/.test(text)); // MySQL supports datetime since 5.6.5
|
||||
if (el.name === name + '[on_update]') {
|
||||
// MySQL supports datetime since 5.6.5.
|
||||
el.classList.toggle('hidden', !/timestamp|datetime/.test(text));
|
||||
}
|
||||
if (el.name == name + '[on_delete]') {
|
||||
alterClass(el, 'hidden', !/`/.test(text));
|
||||
if (el.name === name + '[on_delete]') {
|
||||
el.classList.toggle('hidden', !/`/.test(text));
|
||||
}
|
||||
}
|
||||
helpClose();
|
||||
}
|
||||
|
||||
/** Mark length as required
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function editingLengthChange() {
|
||||
alterClass(this, 'required', !this.value.length && /var(char|binary)$/.test(selectValue(this.parentNode.previousSibling.firstChild)));
|
||||
this.classList.toggle('required', !this.value.length && /var(char|binary)$/.test(selectValue(this.parentNode.previousSibling.firstChild)));
|
||||
}
|
||||
|
||||
/** Edit enum or set
|
||||
@@ -438,7 +437,7 @@ function editingLengthChange() {
|
||||
function editingLengthFocus() {
|
||||
var td = this.parentNode;
|
||||
if (/(enum|set)$/.test(selectValue(td.previousSibling.firstChild))) {
|
||||
var edit = qs('#enum-edit');
|
||||
var edit = gid('enum-edit');
|
||||
edit.value = enumValues(this.value);
|
||||
td.appendChild(edit);
|
||||
this.style.display = 'none';
|
||||
@@ -457,13 +456,13 @@ function enumValues(s) {
|
||||
var offset = 0;
|
||||
var match;
|
||||
while (match = re.exec(s)) {
|
||||
if (offset != match.index) {
|
||||
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);
|
||||
return (offset === s.length ? result.join('\n') : s);
|
||||
}
|
||||
|
||||
/** Finish editing of enum or set
|
||||
@@ -482,9 +481,9 @@ function editingLengthBlur() {
|
||||
* @param number
|
||||
*/
|
||||
function columnShow(checked, column) {
|
||||
var trs = qsa('tr', qs('#edit-fields'));
|
||||
var trs = qsa('tr', gid('edit-fields'));
|
||||
for (var i=0; i < trs.length; i++) {
|
||||
alterClass(qsa('td', trs[i])[column], 'hidden', !checked);
|
||||
qsa('td', trs[i])[column].classList.toggle('hidden', !checked);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -493,9 +492,9 @@ function columnShow(checked, column) {
|
||||
*/
|
||||
function partitionByChange() {
|
||||
var partitionTable = /RANGE|LIST/.test(selectValue(this));
|
||||
alterClass(this.form['partitions'], 'hidden', partitionTable || !this.selectedIndex);
|
||||
alterClass(qs('#partition-table'), 'hidden', !partitionTable);
|
||||
helpClose();
|
||||
|
||||
this.form['partitions'].classList.toggle('hidden', partitionTable || !this.selectedIndex);
|
||||
gid('partition-table').classList.toggle('hidden', !partitionTable);
|
||||
}
|
||||
|
||||
/** Add next partition row
|
||||
@@ -515,7 +514,7 @@ function partitionNameChange() {
|
||||
function editingCommentsClick(el, focus) {
|
||||
var comment = el.form['Comment'];
|
||||
columnShow(el.checked, 6);
|
||||
alterClass(comment, 'hidden', !el.checked);
|
||||
comment.classList.toggle('hidden', !el.checked);
|
||||
if (focus && el.checked) {
|
||||
comment.focus();
|
||||
}
|
||||
@@ -528,10 +527,10 @@ function editingCommentsClick(el, focus) {
|
||||
* @this HTMLTableElement
|
||||
*/
|
||||
function dumpClick(event) {
|
||||
var el = parentTag(getTarget(event), 'label');
|
||||
var el = parentTag(event.target, 'label');
|
||||
if (el) {
|
||||
el = qs('input', el);
|
||||
var match = /(.+)\[\]$/.exec(el.name);
|
||||
var match = /(.+)\[]$/.exec(el.name);
|
||||
if (match) {
|
||||
checkboxClick.call(el, event);
|
||||
formUncheck('check-' + match[1]);
|
||||
@@ -549,7 +548,7 @@ function foreignAddRow() {
|
||||
this.onchange = function () { };
|
||||
var selects = qsa('select', row);
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
selects[i].name = selects[i].name.replace(/\]/, '1$&');
|
||||
selects[i].name = selects[i].name.replace(']', '1]');
|
||||
selects[i].selectedIndex = 0;
|
||||
}
|
||||
parentTag(this, 'table').appendChild(row);
|
||||
@@ -585,7 +584,7 @@ function indexesChangeColumn(prefix) {
|
||||
for (var tag in { 'select': 1, 'input': 1 }) {
|
||||
var columns = qsa(tag, parentTag(this, 'td'));
|
||||
for (var i=0; i < columns.length; i++) {
|
||||
if (/\[columns\]/.test(columns[i].name)) {
|
||||
if (/\[columns]/.test(columns[i].name)) {
|
||||
var value = selectValue(columns[i]);
|
||||
if (value) {
|
||||
names.push(value);
|
||||
@@ -593,7 +592,7 @@ function indexesChangeColumn(prefix) {
|
||||
}
|
||||
}
|
||||
}
|
||||
this.form[this.name.replace(/\].*/, '][name]')].value = prefix + names.join('_');
|
||||
this.form[this.name.replace(/].*/, '][name]')].value = prefix + names.join('_');
|
||||
}
|
||||
|
||||
/** Add column for index
|
||||
@@ -602,9 +601,9 @@ function indexesChangeColumn(prefix) {
|
||||
*/
|
||||
function indexesAddColumn(prefix) {
|
||||
var field = this;
|
||||
var select = field.form[field.name.replace(/\].*/, '][type]')];
|
||||
var select = field.form[field.name.replace(/].*/, '][type]')];
|
||||
if (!select.selectedIndex) {
|
||||
while (selectValue(select) != "INDEX" && select.selectedIndex < select.options.length) {
|
||||
while (selectValue(select) !== "INDEX" && select.selectedIndex < select.options.length) {
|
||||
select.selectedIndex++;
|
||||
}
|
||||
select.onchange();
|
||||
@@ -613,15 +612,15 @@ function indexesAddColumn(prefix) {
|
||||
var selects = qsa('select', column);
|
||||
for (var i = 0; i < selects.length; i++) {
|
||||
select = selects[i];
|
||||
select.name = select.name.replace(/\]\[\d+/, '$&1');
|
||||
select.name = select.name.replace(/]\[\d+/, '$&1');
|
||||
select.selectedIndex = 0;
|
||||
}
|
||||
field.onchange = partial(indexesChangeColumn, prefix);
|
||||
var inputs = qsa('input', column);
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
var input = inputs[i];
|
||||
input.name = input.name.replace(/\]\[\d+/, '$&1');
|
||||
if (input.type != 'checkbox') {
|
||||
input.name = input.name.replace(/]\[\d+/, '$&1');
|
||||
if (input.type !== 'checkbox') {
|
||||
input.value = '';
|
||||
}
|
||||
}
|
||||
@@ -658,7 +657,7 @@ function triggerChange(tableRe, table, form) {
|
||||
if (tableRe.test(form['Trigger'].value)) {
|
||||
form['Trigger'].value = table + '_' + (selectValue(form['Timing']).charAt(0) + formEvent.charAt(0)).toLowerCase();
|
||||
}
|
||||
alterClass(form['Of'], 'hidden', !/ OF/.test(formEvent));
|
||||
form['Of'].classList.toggle('hidden', !/ OF/.test(formEvent));
|
||||
}
|
||||
|
||||
|
||||
@@ -670,7 +669,7 @@ var that, x, y; // em and tablePos defined in schema.inc.php
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function schemaMousedown(event) {
|
||||
if ((event.which ? event.which : event.button) == 1) {
|
||||
if ((event.which ? event.which : event.button) === 1) {
|
||||
that = this;
|
||||
x = event.clientX - this.offsetLeft;
|
||||
y = event.clientY - this.offsetTop;
|
||||
@@ -687,12 +686,12 @@ function schemaMousemove(event) {
|
||||
var divs = qsa('div', that);
|
||||
var lineSet = { };
|
||||
for (var i=0; i < divs.length; i++) {
|
||||
if (divs[i].className == 'references') {
|
||||
if (divs[i].className === 'references') {
|
||||
var div2 = qs('[id="' + (/^refs/.test(divs[i].id) ? 'refd' : 'refs') + divs[i].id.substr(4) + '"]');
|
||||
var ref = (tablePos[divs[i].title] ? tablePos[divs[i].title] : [ div2.parentNode.offsetTop / em, 0 ]);
|
||||
var left1 = -1;
|
||||
var id = divs[i].id.replace(/^ref.(.+)-.+/, '$1');
|
||||
if (divs[i].parentNode != div2.parentNode) {
|
||||
if (divs[i].parentNode !== div2.parentNode) {
|
||||
left1 = Math.min(0, ref[1] - left) - 1;
|
||||
divs[i].style.left = left1 + 'em';
|
||||
divs[i].querySelector('div').style.width = -left1 + 'em';
|
||||
@@ -704,7 +703,7 @@ function schemaMousemove(event) {
|
||||
var line = qs('[id="' + divs[i].id.replace(/^....(.+)-.+$/, 'refl$1') + '"]');
|
||||
var top1 = top + divs[i].offsetTop / em;
|
||||
var top2 = top + div2.offsetTop / em;
|
||||
if (divs[i].parentNode != div2.parentNode) {
|
||||
if (divs[i].parentNode !== div2.parentNode) {
|
||||
top2 += ref[0] - top;
|
||||
line.querySelector('div').style.height = Math.abs(top1 - top2) + 'em';
|
||||
}
|
||||
@@ -732,55 +731,114 @@ function schemaMouseup(event, db) {
|
||||
s += '_' + key + ':' + Math.round(tablePos[key][0] * 10000) / 10000 + 'x' + Math.round(tablePos[key][1] * 10000) / 10000;
|
||||
}
|
||||
s = encodeURIComponent(s.substr(1));
|
||||
var link = qs('#schema-link');
|
||||
var link = gid('schema-link');
|
||||
link.href = link.href.replace(/[^=]+$/, '') + s;
|
||||
cookie('adminer_schema-' + db + '=' + s, 30); //! special chars in db
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Help.
|
||||
(function() {
|
||||
let openTimeout = null;
|
||||
let closeTimeout = null;
|
||||
let helpVisible = false;
|
||||
|
||||
var helpOpen, helpIgnore; // when mouse outs <option> then it mouse overs border of <select> - ignore it
|
||||
window.initHelpPopup = function () {
|
||||
const help = gid("help");
|
||||
|
||||
/** Display help
|
||||
* @param MouseEvent
|
||||
* @param string
|
||||
* @param bool display on left side (otherwise on top)
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function helpMouseover(event, text, side) {
|
||||
var target = getTarget(event);
|
||||
if (!text) {
|
||||
helpClose();
|
||||
} else if (window.jush && (!helpIgnore || this != target)) {
|
||||
helpOpen = 1;
|
||||
var help = qs('#help');
|
||||
help.innerHTML = text;
|
||||
jush.highlight_tag([ help ]);
|
||||
alterClass(help, 'hidden');
|
||||
var rect = target.getBoundingClientRect();
|
||||
var body = document.documentElement;
|
||||
help.style.top = (body.scrollTop + rect.top - (side ? (help.offsetHeight - target.offsetHeight) / 2 : help.offsetHeight)) + 'px';
|
||||
help.style.left = (body.scrollLeft + rect.left - (side ? help.offsetWidth : (help.offsetWidth - target.offsetWidth) / 2)) + 'px';
|
||||
}
|
||||
}
|
||||
help.addEventListener("mouseenter", () => {
|
||||
clearTimeout(closeTimeout);
|
||||
closeTimeout = null;
|
||||
});
|
||||
|
||||
/** Close help after timeout
|
||||
* @param MouseEvent
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function helpMouseout(event) {
|
||||
helpOpen = 0;
|
||||
helpIgnore = (this != getTarget(event));
|
||||
setTimeout(function () {
|
||||
if (!helpOpen) {
|
||||
helpClose();
|
||||
help.addEventListener("mouseleave", hideHelp);
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {HTMLElement} element
|
||||
* @param {string|function} content
|
||||
* @param {boolean} side Displays on left side (otherwise on top).
|
||||
*/
|
||||
window.initHelpFor = function(element, content, side = false) {
|
||||
const withCallback = typeof content === "function";
|
||||
|
||||
element.addEventListener("mouseenter", (event) => {
|
||||
showHelp(event.target, withCallback ? content(event.target.value) : content, side)
|
||||
});
|
||||
|
||||
element.addEventListener("mouseleave", hideHelp);
|
||||
element.addEventListener("blur", hideHelp);
|
||||
|
||||
if (withCallback) {
|
||||
element.addEventListener("change", hideHelp);
|
||||
}
|
||||
}, 200);
|
||||
}
|
||||
};
|
||||
|
||||
/** Close help
|
||||
*/
|
||||
function helpClose() {
|
||||
alterClass(qs('#help'), 'hidden', true);
|
||||
}
|
||||
/**
|
||||
* Displays help popup after a small delay.
|
||||
*
|
||||
* @param {HTMLElement} element
|
||||
* @param {string} text
|
||||
* @param {boolean} side display on left side (otherwise on top)
|
||||
*/
|
||||
function showHelp(element, text, side) {
|
||||
if (!text) {
|
||||
hideHelp();
|
||||
return;
|
||||
}
|
||||
|
||||
if (isSorting() || !window.jush) {
|
||||
return;
|
||||
}
|
||||
|
||||
clearTimeout(openTimeout);
|
||||
openTimeout = null;
|
||||
clearTimeout(closeTimeout);
|
||||
closeTimeout = null;
|
||||
|
||||
const help = gid("help");
|
||||
help.innerHTML = text;
|
||||
jush.highlight_tag([help]);
|
||||
|
||||
// Display help briefly to calculate position properly.
|
||||
help.classList.remove("hidden");
|
||||
|
||||
const rect = element.getBoundingClientRect();
|
||||
const root = document.documentElement;
|
||||
|
||||
help.style.top = (root.scrollTop + rect.top - (side ? (help.offsetHeight - element.offsetHeight) / 2 : help.offsetHeight)) + 'px';
|
||||
help.style.left = (root.scrollLeft + rect.left - (side ? help.offsetWidth : (help.offsetWidth - element.offsetWidth) / 2)) + 'px';
|
||||
|
||||
if (helpVisible) {
|
||||
return;
|
||||
}
|
||||
|
||||
help.classList.add("hidden");
|
||||
|
||||
openTimeout = setTimeout(() => {
|
||||
gid("help").classList.remove("hidden");
|
||||
|
||||
helpVisible = true;
|
||||
openTimeout = null;
|
||||
}, 600);
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the help popup after a small delay.
|
||||
*/
|
||||
function hideHelp() {
|
||||
if (openTimeout) {
|
||||
clearTimeout(openTimeout);
|
||||
openTimeout = null;
|
||||
return;
|
||||
}
|
||||
|
||||
closeTimeout = setTimeout(() => {
|
||||
gid("help").classList.add("hidden");
|
||||
|
||||
helpVisible = false;
|
||||
closeTimeout = null;
|
||||
}, 200);
|
||||
}
|
||||
})();
|
||||
|
@@ -1,10 +1,21 @@
|
||||
|
||||
/**
|
||||
* Returns the element found by given identifier.
|
||||
*
|
||||
* @param {string} id
|
||||
* @param {?HTMLElement} context Defaults to document.
|
||||
* @return {?HTMLElement}
|
||||
*/
|
||||
function gid(id, context = null) {
|
||||
return (context || document).getElementById(id);
|
||||
}
|
||||
|
||||
/** Get first element by selector
|
||||
* @param string
|
||||
* @param [HTMLElement] defaults to document
|
||||
* @return HTMLElement
|
||||
*/
|
||||
function qs(selector, context) {
|
||||
function qs(selector, context = null) {
|
||||
return (context || document).querySelector(selector);
|
||||
}
|
||||
|
||||
@@ -13,7 +24,7 @@ function qs(selector, context) {
|
||||
* @param [HTMLElement] defaults to document
|
||||
* @return HTMLElement
|
||||
*/
|
||||
function qsl(selector, context) {
|
||||
function qsl(selector, context = null) {
|
||||
var els = qsa(selector, context);
|
||||
return els[els.length - 1];
|
||||
}
|
||||
@@ -23,7 +34,7 @@ function qsl(selector, context) {
|
||||
* @param [HTMLElement] defaults to document
|
||||
* @return NodeList
|
||||
*/
|
||||
function qsa(selector, context) {
|
||||
function qsa(selector, context = null) {
|
||||
return (context || document).querySelectorAll(selector);
|
||||
}
|
||||
|
||||
@@ -62,24 +73,15 @@ function mixin(target, source) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Add or remove CSS class
|
||||
* @param HTMLElement
|
||||
* @param string
|
||||
* @param [bool]
|
||||
*/
|
||||
function alterClass(el, className, enable) {
|
||||
if (el) {
|
||||
el.className = el.className.replace(RegExp('(^|\\s)' + className + '(\\s|$)'), '$2') + (enable ? ' ' + className : '');
|
||||
}
|
||||
}
|
||||
|
||||
/** Toggle visibility
|
||||
* @param string
|
||||
* @return boolean false
|
||||
*/
|
||||
/**
|
||||
* Toggles visibility of element with ID.
|
||||
*
|
||||
* @param {string} id
|
||||
* @return {boolean} Always false.
|
||||
*/
|
||||
function toggle(id) {
|
||||
var el = qs('#' + id);
|
||||
el.className = (el.className == 'hidden' ? '' : 'hidden');
|
||||
gid(id).classList.toggle("hidden");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -94,34 +96,31 @@ function cookie(assign, days) {
|
||||
document.cookie = assign + '; expires=' + date;
|
||||
}
|
||||
|
||||
/** Verify current Adminer version
|
||||
* @param string
|
||||
* @param string own URL base
|
||||
* @param string
|
||||
*/
|
||||
function verifyVersion(current, url, token) {
|
||||
/**
|
||||
* Verifies current Adminer version.
|
||||
*
|
||||
* @param currentVersion string
|
||||
* @param baseUrl string
|
||||
* @param token string
|
||||
*/
|
||||
function verifyVersion(currentVersion, baseUrl, token) {
|
||||
cookie('adminer_version=0', 1);
|
||||
var iframe = document.createElement('iframe');
|
||||
iframe.src = 'https://www.adminer.org/version/?current=' + current;
|
||||
iframe.frameBorder = 0;
|
||||
iframe.marginHeight = 0;
|
||||
iframe.scrolling = 'no';
|
||||
iframe.style.width = '7ex';
|
||||
iframe.style.height = '1.25em';
|
||||
if (window.postMessage && window.addEventListener) {
|
||||
iframe.style.display = 'none';
|
||||
addEventListener('message', function (event) {
|
||||
if (event.origin == 'https://www.adminer.org') {
|
||||
var match = /version=(.+)/.exec(event.data);
|
||||
if (match) {
|
||||
cookie('adminer_version=' + match[1], 1);
|
||||
ajax(url + 'script=version', function () {
|
||||
}, event.data + '&token=' + token);
|
||||
}
|
||||
}
|
||||
}, false);
|
||||
}
|
||||
qs('#version').appendChild(iframe);
|
||||
|
||||
ajax('https://api.github.com/repos/pematon/adminer/releases/latest', function (request) {
|
||||
const response = JSON.parse(request.responseText);
|
||||
|
||||
const version = response.tag_name.replace(/^\D*/, '');
|
||||
if (!version) return;
|
||||
|
||||
cookie('adminer_version=' + version, 1);
|
||||
|
||||
const data = 'version=' + version + '&token=' + token;
|
||||
ajax(baseUrl + 'script=version', function () {}, data);
|
||||
|
||||
if (currentVersion !== version) {
|
||||
gid('version').innerText = version;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** Get value of select
|
||||
@@ -139,7 +138,7 @@ function selectValue(select) {
|
||||
/** Verify if element has a specified tag name
|
||||
* @param HTMLElement
|
||||
* @param string regular expression
|
||||
* @return bool
|
||||
* @return boolean
|
||||
*/
|
||||
function isTag(el, tag) {
|
||||
var re = new RegExp('^(' + tag + ')$', 'i');
|
||||
@@ -163,7 +162,7 @@ function parentTag(el, tag) {
|
||||
*/
|
||||
function trCheck(el) {
|
||||
var tr = parentTag(el, 'tr');
|
||||
alterClass(tr, 'checked', el.checked);
|
||||
tr.classList.toggle('checked', el.checked);
|
||||
if (el.form && el.form['all'] && el.form['all'].onclick) { // Opera treats form.all as document.all
|
||||
el.form['all'].onclick();
|
||||
}
|
||||
@@ -176,13 +175,13 @@ function trCheck(el) {
|
||||
*/
|
||||
function selectCount(id, count) {
|
||||
setHtml(id, (count === '' ? '' : '(' + (count + '').replace(/\B(?=(\d{3})+$)/g, thousandsSeparator) + ')'));
|
||||
var el = qs('#' + id);
|
||||
var el = gid(id);
|
||||
if (el) {
|
||||
var inputs = qsa('input', el.parentNode.parentNode);
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
var input = inputs[i];
|
||||
if (input.type == 'submit') {
|
||||
input.disabled = (count == '0');
|
||||
if (input.type === 'submit') {
|
||||
input.disabled = (count === '0');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -211,13 +210,21 @@ function tableCheck() {
|
||||
}
|
||||
}
|
||||
|
||||
/** Uncheck single element
|
||||
* @param string
|
||||
*/
|
||||
/**
|
||||
* Uncheck single element.
|
||||
*/
|
||||
function formUncheck(id) {
|
||||
var el = qs('#' + id);
|
||||
el.checked = false;
|
||||
trCheck(el);
|
||||
formUncheckAll("#" + id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Uncheck elements matched by selector.
|
||||
*/
|
||||
function formUncheckAll(selector) {
|
||||
for (const element of qsa(selector)) {
|
||||
element.checked = false;
|
||||
trCheck(element);
|
||||
}
|
||||
}
|
||||
|
||||
/** Get number of checked elements matching given name
|
||||
@@ -241,7 +248,7 @@ function formChecked(el, name) {
|
||||
* @param [boolean] force click
|
||||
*/
|
||||
function tableClick(event, click) {
|
||||
var td = parentTag(getTarget(event), 'td');
|
||||
var td = parentTag(event.target, 'td');
|
||||
var text;
|
||||
if (td && (text = td.getAttribute('data-text'))) {
|
||||
if (selectClick.call(td, event, +text, td.getAttribute('data-warning'))) {
|
||||
@@ -249,10 +256,10 @@ function tableClick(event, click) {
|
||||
}
|
||||
}
|
||||
click = (click || !window.getSelection || getSelection().isCollapsed);
|
||||
var el = getTarget(event);
|
||||
var el = event.target;
|
||||
while (!isTag(el, 'tr')) {
|
||||
if (isTag(el, 'table|a|input|textarea')) {
|
||||
if (el.type != 'checkbox') {
|
||||
if (el.type !== 'checkbox') {
|
||||
return;
|
||||
}
|
||||
checkboxClick.call(el, event);
|
||||
@@ -268,7 +275,7 @@ function tableClick(event, click) {
|
||||
el.checked = !el.checked;
|
||||
el.onclick && el.onclick();
|
||||
}
|
||||
if (el.name == 'check[]') {
|
||||
if (el.name === 'check[]') {
|
||||
el.form['all'].checked = false;
|
||||
formUncheck('all-page');
|
||||
}
|
||||
@@ -288,7 +295,7 @@ function checkboxClick(event) {
|
||||
if (!this.name) {
|
||||
return;
|
||||
}
|
||||
if (event.shiftKey && (!lastChecked || lastChecked.name == this.name)) {
|
||||
if (event.shiftKey && (!lastChecked || lastChecked.name === this.name)) {
|
||||
var checked = (lastChecked ? lastChecked.checked : true);
|
||||
var inputs = qsa('input', parentTag(this, 'table'));
|
||||
var checking = !lastChecked;
|
||||
@@ -333,7 +340,7 @@ function setHtml(id, html) {
|
||||
*/
|
||||
function nodePosition(el) {
|
||||
var pos = 0;
|
||||
while (el = el.previousSibling) {
|
||||
while ((el = el.previousSibling)) {
|
||||
pos++;
|
||||
}
|
||||
return pos;
|
||||
@@ -345,18 +352,89 @@ function nodePosition(el) {
|
||||
*/
|
||||
function pageClick(href, page) {
|
||||
if (!isNaN(page) && page) {
|
||||
location.href = href + (page != 1 ? '&page=' + (page - 1) : '');
|
||||
location.href = href + (page !== 1 ? '&page=' + (page - 1) : '');
|
||||
}
|
||||
}
|
||||
|
||||
let tablesFilterTimeout = null;
|
||||
let tablesFilterValue = '';
|
||||
|
||||
function initTablesFilter(dbName) {
|
||||
if (sessionStorage) {
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
if (dbName === sessionStorage.getItem('adminer_tables_filter_db') && sessionStorage.getItem('adminer_tables_filter')) {
|
||||
gid('tables-filter').value = sessionStorage.getItem('adminer_tables_filter');
|
||||
filterTables();
|
||||
} else {
|
||||
sessionStorage.removeItem('adminer_tables_filter');
|
||||
}
|
||||
|
||||
sessionStorage.setItem('adminer_tables_filter_db', dbName);
|
||||
});
|
||||
}
|
||||
|
||||
const filterInput = gid('tables-filter');
|
||||
filterInput.addEventListener('input', function () {
|
||||
window.clearTimeout(tablesFilterTimeout);
|
||||
tablesFilterTimeout = window.setTimeout(filterTables, 200);
|
||||
});
|
||||
|
||||
document.body.addEventListener('keydown', function(event) {
|
||||
if (isCtrl(event) && event.shiftKey && event.key.toUpperCase() === 'F') {
|
||||
filterInput.focus();
|
||||
filterInput.select();
|
||||
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function filterTables() {
|
||||
const value = gid('tables-filter').value.toLowerCase();
|
||||
if (value === tablesFilterValue) {
|
||||
return;
|
||||
}
|
||||
tablesFilterValue = value;
|
||||
|
||||
let reg
|
||||
if (value !== '') {
|
||||
const valueExp = (`${value}`).replace(/[\\.+*?\[^\]$(){}=!<>|:]/g, '\\$&');
|
||||
reg = new RegExp(`(${valueExp})`, 'gi');
|
||||
}
|
||||
|
||||
if (sessionStorage) {
|
||||
sessionStorage.setItem('adminer_tables_filter', value);
|
||||
}
|
||||
|
||||
const tables = qsa('#tables li');
|
||||
for (let i = 0; i < tables.length; i++) {
|
||||
let a = qs('a[data-main="true"], span[data-main="true"]', tables[i]);
|
||||
|
||||
let tableName = tables[i].dataset.tableName;
|
||||
if (tableName == null) {
|
||||
tableName = a.innerHTML.trim();
|
||||
|
||||
tables[i].dataset.tableName = tableName;
|
||||
}
|
||||
|
||||
if (value === "") {
|
||||
tables[i].classList.remove('hidden');
|
||||
a.innerHTML = tableName;
|
||||
} else if (tableName.toLowerCase().indexOf(value) >= 0) {
|
||||
tables[i].classList.remove('hidden');
|
||||
a.innerHTML = tableName.replace(reg, '<strong>$1</strong>');
|
||||
} else {
|
||||
tables[i].classList.add('hidden');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Display items in menu
|
||||
* @param MouseEvent
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function menuOver(event) {
|
||||
var a = getTarget(event);
|
||||
var a = event.target;
|
||||
if (isTag(a, 'a|span') && a.offsetLeft + a.offsetWidth > a.parentNode.offsetWidth - 15) { // 15 - ellipsis
|
||||
this.style.overflow = 'visible';
|
||||
}
|
||||
@@ -366,35 +444,71 @@ function menuOver(event) {
|
||||
* @this HTMLElement
|
||||
*/
|
||||
function menuOut() {
|
||||
this.style.overflow = 'auto';
|
||||
this.style.overflow = 'hidden';
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Add row in select fieldset
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function selectAddRow() {
|
||||
var field = this;
|
||||
var row = cloneNode(field.parentNode);
|
||||
/**
|
||||
* Adds row in select fieldset.
|
||||
*
|
||||
* @param {Event} event
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function selectAddRow(event) {
|
||||
const field = this;
|
||||
const row = cloneNode(field.parentNode);
|
||||
|
||||
field.onchange = selectFieldChange;
|
||||
field.onchange();
|
||||
var selects = qsa('select', row);
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
selects[i].name = selects[i].name.replace(/[a-z]\[\d+/, '$&1');
|
||||
selects[i].selectedIndex = 0;
|
||||
field.onchange(event);
|
||||
|
||||
const selects = qsa('select', row);
|
||||
for (const select of selects) {
|
||||
select.name = select.name.replace(/[a-z]\[\d+/, '$&1');
|
||||
select.selectedIndex = 0;
|
||||
}
|
||||
var inputs = qsa('input', row);
|
||||
for (var i=0; i < inputs.length; i++) {
|
||||
inputs[i].name = inputs[i].name.replace(/[a-z]\[\d+/, '$&1');
|
||||
inputs[i].className = '';
|
||||
if (inputs[i].type == 'checkbox') {
|
||||
inputs[i].checked = false;
|
||||
|
||||
const inputs = qsa('input', row);
|
||||
for (const input of inputs) {
|
||||
// Skip buttons.
|
||||
if (input.type === 'image') {
|
||||
continue;
|
||||
}
|
||||
|
||||
input.name = input.name.replace(/[a-z]\[\d+/, '$&1');
|
||||
input.className = '';
|
||||
if (input.type === 'checkbox') {
|
||||
input.checked = false;
|
||||
} else {
|
||||
inputs[i].value = '';
|
||||
input.value = '';
|
||||
}
|
||||
}
|
||||
field.parentNode.parentNode.appendChild(row);
|
||||
|
||||
const buttons = qsa('.icon', row);
|
||||
for (const button of buttons) {
|
||||
button.onclick = selectRemoveRow;
|
||||
}
|
||||
|
||||
const parent = field.parentNode.parentNode;
|
||||
if (parent.classList.contains("sortable")) {
|
||||
initSortableRow(field.parentElement);
|
||||
}
|
||||
|
||||
parent.appendChild(row);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a row in select fieldset.
|
||||
*
|
||||
* @this HTMLInputElement
|
||||
* @return {boolean} Always false.
|
||||
*/
|
||||
function selectRemoveRow() {
|
||||
const row = this.parentNode;
|
||||
|
||||
row.parentNode.removeChild(row);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Prevent onsearch handler on Enter
|
||||
@@ -402,7 +516,7 @@ function selectAddRow() {
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function selectSearchKeydown(event) {
|
||||
if (event.keyCode == 13 || event.keyCode == 10) {
|
||||
if (event.keyCode === 13 || event.keyCode === 10) {
|
||||
this.onsearch = function () {
|
||||
};
|
||||
}
|
||||
@@ -417,6 +531,159 @@ function selectSearchSearch() {
|
||||
}
|
||||
}
|
||||
|
||||
// Sorting.
|
||||
(function() {
|
||||
let placeholderRow = null, nextRow = null, dragHelper = null;
|
||||
let startY, minY, maxY;
|
||||
|
||||
/**
|
||||
* Initializes sortable list of DIV elements.
|
||||
*
|
||||
* @param {string} parentSelector
|
||||
*/
|
||||
window.initSortable = function(parentSelector) {
|
||||
const parent = qs(parentSelector);
|
||||
if (!parent) return;
|
||||
|
||||
for (const row of parent.children) {
|
||||
if (!row.classList.contains("no-sort")) {
|
||||
initSortableRow(row);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Initializes one row of sortable parent.
|
||||
*
|
||||
* @param {HTMLElement} row
|
||||
*/
|
||||
window.initSortableRow = function(row) {
|
||||
row.classList.remove("no-sort");
|
||||
|
||||
const handle = qs(".handle", row);
|
||||
handle.addEventListener("mousedown", (event) => { startSorting(row, event) });
|
||||
handle.addEventListener("touchstart", (event) => { startSorting(row, event) });
|
||||
};
|
||||
|
||||
window.isSorting = function () {
|
||||
return dragHelper !== null;
|
||||
};
|
||||
|
||||
function startSorting(row, event) {
|
||||
event.preventDefault();
|
||||
|
||||
const pointerY = getPointerY(event);
|
||||
|
||||
const parent = row.parentNode;
|
||||
startY = pointerY - getOffsetTop(row);
|
||||
minY = getOffsetTop(parent);
|
||||
maxY = minY + parent.offsetHeight - row.offsetHeight;
|
||||
|
||||
placeholderRow = row.cloneNode(true);
|
||||
placeholderRow.classList.add("placeholder");
|
||||
parent.insertBefore(placeholderRow, row);
|
||||
|
||||
nextRow = row.nextElementSibling;
|
||||
|
||||
let top = pointerY - startY;
|
||||
let left = getOffsetLeft(row);
|
||||
let width = row.getBoundingClientRect().width;
|
||||
|
||||
if (row.tagName === "TR") {
|
||||
const firstChild = row.firstElementChild;
|
||||
const borderWidth = (firstChild.offsetWidth - firstChild.clientWidth) / 2;
|
||||
const borderHeight = (firstChild.offsetHeight - firstChild.clientHeight) / 2;
|
||||
|
||||
minY -= borderHeight;
|
||||
maxY -= borderHeight;
|
||||
top -= borderHeight;
|
||||
left -= borderWidth;
|
||||
width += 2 * borderWidth;
|
||||
|
||||
for (const child of row.children) {
|
||||
child.style.width = child.getBoundingClientRect().width + "px";
|
||||
}
|
||||
|
||||
dragHelper = document.createElement("table");
|
||||
dragHelper.appendChild(row);
|
||||
} else {
|
||||
dragHelper = row;
|
||||
}
|
||||
|
||||
dragHelper.style.top = `${top}px`;
|
||||
dragHelper.style.left = `${left}px`;
|
||||
dragHelper.style.width = `${width}px`;
|
||||
dragHelper.classList.add("dragging");
|
||||
document.body.appendChild(dragHelper);
|
||||
|
||||
window.addEventListener("mousemove", updateSorting);
|
||||
window.addEventListener("touchmove", updateSorting);
|
||||
|
||||
window.addEventListener("mouseup", finishSorting);
|
||||
window.addEventListener("touchend", finishSorting);
|
||||
window.addEventListener("touchcancel", finishSorting);
|
||||
}
|
||||
|
||||
function updateSorting(event) {
|
||||
const pointerY = getPointerY(event);
|
||||
|
||||
let top = Math.min(Math.max(pointerY - startY, minY), maxY);
|
||||
dragHelper.style.top = `${top}px`;
|
||||
|
||||
const parent = placeholderRow.parentNode;
|
||||
top = top - minY + parent.offsetTop;
|
||||
|
||||
let sibling;
|
||||
if (top > placeholderRow.offsetTop + placeholderRow.offsetHeight / 2) {
|
||||
sibling = !nextRow.classList.contains("no-sort") ? nextRow.nextElementSibling : nextRow;
|
||||
} else if (top + placeholderRow.offsetHeight < placeholderRow.offsetTop + placeholderRow.offsetHeight / 2) {
|
||||
sibling = placeholderRow.previousElementSibling;
|
||||
} else {
|
||||
sibling = nextRow;
|
||||
}
|
||||
|
||||
if (sibling !== nextRow) {
|
||||
const parent = placeholderRow.parentNode;
|
||||
|
||||
nextRow = sibling;
|
||||
if (sibling) {
|
||||
parent.insertBefore(placeholderRow, nextRow);
|
||||
} else {
|
||||
parent.appendChild(placeholderRow);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function finishSorting() {
|
||||
dragHelper.classList.remove("dragging");
|
||||
dragHelper.style.top = null;
|
||||
dragHelper.style.left = null;
|
||||
dragHelper.style.width = null;
|
||||
|
||||
placeholderRow.parentNode.insertBefore(dragHelper.tagName === "TABLE" ? dragHelper.firstChild : dragHelper, placeholderRow);
|
||||
placeholderRow.remove();
|
||||
|
||||
placeholderRow = nextRow = dragHelper = null;
|
||||
|
||||
window.removeEventListener("mousemove", updateSorting);
|
||||
window.removeEventListener("touchmove", updateSorting);
|
||||
|
||||
window.removeEventListener("mouseup", finishSorting);
|
||||
window.removeEventListener("touchend", finishSorting);
|
||||
window.removeEventListener("touchcancel", finishSorting);
|
||||
}
|
||||
|
||||
function getPointerY(event) {
|
||||
if (event.type.includes("touch")) {
|
||||
const touch = event.touches[0] || event.changedTouches[0];
|
||||
return touch.clientY;
|
||||
} else {
|
||||
return event.clientY;
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
|
||||
|
||||
|
||||
/** Toggles column context menu
|
||||
@@ -439,17 +706,17 @@ function columnMouse(className) {
|
||||
* @return boolean false
|
||||
*/
|
||||
function selectSearch(name) {
|
||||
var el = qs('#fieldset-search');
|
||||
var el = gid('fieldset-search');
|
||||
el.className = '';
|
||||
var divs = qsa('div', el);
|
||||
for (var i=0; i < divs.length; i++) {
|
||||
var div = divs[i];
|
||||
var el = qs('[name$="[col]"]', div);
|
||||
if (el && selectValue(el) == name) {
|
||||
if (el && selectValue(el) === name) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == divs.length) {
|
||||
if (i === divs.length) {
|
||||
div.firstChild.value = name;
|
||||
div.firstChild.onchange();
|
||||
}
|
||||
@@ -466,16 +733,6 @@ function isCtrl(event) {
|
||||
return (event.ctrlKey || event.metaKey) && !event.altKey; // shiftKey allowed
|
||||
}
|
||||
|
||||
/** Return event target
|
||||
* @param Event
|
||||
* @return HTMLElement
|
||||
*/
|
||||
function getTarget(event) {
|
||||
return event.target || event.srcElement;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Send form by Ctrl+Enter on <select> and <textarea>
|
||||
* @param KeyboardEvent
|
||||
* @param [string]
|
||||
@@ -483,11 +740,11 @@ function getTarget(event) {
|
||||
*/
|
||||
function bodyKeydown(event, button) {
|
||||
eventStop(event);
|
||||
var target = getTarget(event);
|
||||
var target = event.target;
|
||||
if (target.jushTextarea) {
|
||||
target = target.jushTextarea;
|
||||
}
|
||||
if (isCtrl(event) && (event.keyCode == 13 || event.keyCode == 10) && isTag(target, 'select|textarea|input')) { // 13|10 - Enter
|
||||
if (isCtrl(event) && (event.keyCode === 13 || event.keyCode === 10) && isTag(target, 'select|textarea|input')) { // 13|10 - Enter
|
||||
target.blur();
|
||||
if (button) {
|
||||
target.form[button].click();
|
||||
@@ -507,8 +764,8 @@ function bodyKeydown(event, button) {
|
||||
* @param MouseEvent
|
||||
*/
|
||||
function bodyClick(event) {
|
||||
var target = getTarget(event);
|
||||
if ((isCtrl(event) || event.shiftKey) && target.type == 'submit' && isTag(target, 'input')) {
|
||||
var target = event.target;
|
||||
if ((isCtrl(event) || event.shiftKey) && target.type === 'submit' && isTag(target, 'input')) {
|
||||
target.form.target = '_blank';
|
||||
setTimeout(function () {
|
||||
// if (isCtrl(event)) { focus(); } doesn't work
|
||||
@@ -524,9 +781,9 @@ function bodyClick(event) {
|
||||
* @return boolean
|
||||
*/
|
||||
function editingKeydown(event) {
|
||||
if ((event.keyCode == 40 || event.keyCode == 38) && isCtrl(event)) { // 40 - Down, 38 - Up
|
||||
var target = getTarget(event);
|
||||
var sibling = (event.keyCode == 40 ? 'nextSibling' : 'previousSibling');
|
||||
if ((event.keyCode === 40 || event.keyCode === 38) && isCtrl(event)) { // 40 - Down, 38 - Up
|
||||
var target = event.target;
|
||||
var sibling = (event.keyCode === 40 ? 'nextSibling' : 'previousSibling');
|
||||
var el = target.parentNode.parentNode[sibling];
|
||||
if (el && (isTag(el, 'tr') || (el = el[sibling])) && isTag(el, 'tr') && (el = el.childNodes[nodePosition(target.parentNode)]) && (el = el.childNodes[nodePosition(target)])) {
|
||||
el.focus();
|
||||
@@ -539,37 +796,59 @@ function editingKeydown(event) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Disable maxlength for functions
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
/**
|
||||
* Disables maxlength for functions and manages value visibility.
|
||||
*
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
function functionChange() {
|
||||
var input = this.form[this.name.replace(/^function/, 'fields')];
|
||||
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});
|
||||
const input = this.form[this.name.replace(/^function/, 'fields')];
|
||||
const value = selectValue(this);
|
||||
|
||||
// Undefined with the set data type.
|
||||
if (!input) {
|
||||
return;
|
||||
}
|
||||
helpClose();
|
||||
|
||||
if (value) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
// Hide input value if it will be not used by selected function.
|
||||
if (value === "NULL" || value === "now") {
|
||||
if (input.value !== "") {
|
||||
input.dataset.lastValue = input.value;
|
||||
input.value = "";
|
||||
}
|
||||
} else if (input.dataset.lastValue) {
|
||||
input.value = input.dataset.lastValue;
|
||||
}
|
||||
|
||||
oninput({target: input});
|
||||
}
|
||||
|
||||
/** Skip 'original' when typing
|
||||
* @param number
|
||||
* @this HTMLTableCellElement
|
||||
*/
|
||||
/**
|
||||
* Unset 'original', 'NULL' and 'now' functions when typing.
|
||||
*
|
||||
* @param first number
|
||||
* @this HTMLTableCellElement
|
||||
*/
|
||||
function skipOriginal(first) {
|
||||
var fnSelect = this.previousSibling.firstChild;
|
||||
if (fnSelect.selectedIndex < first) {
|
||||
const fnSelect = this.previousSibling.firstChild;
|
||||
const value = selectValue(fnSelect);
|
||||
|
||||
if (fnSelect.selectedIndex < first || value === "NULL" || value === "now") {
|
||||
fnSelect.selectedIndex = first;
|
||||
}
|
||||
}
|
||||
@@ -601,7 +880,7 @@ function fieldChange() {
|
||||
function ajax(url, callback, data, message) {
|
||||
var request = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : false));
|
||||
if (request) {
|
||||
var ajaxStatus = qs('#ajaxstatus');
|
||||
var ajaxStatus = gid('ajaxstatus');
|
||||
if (message) {
|
||||
ajaxStatus.innerHTML = '<div class="message">' + message + '</div>';
|
||||
ajaxStatus.className = ajaxStatus.className.replace(/ hidden/g, '');
|
||||
@@ -614,7 +893,7 @@ function ajax(url, callback, data, message) {
|
||||
}
|
||||
request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
||||
request.onreadystatechange = function () {
|
||||
if (request.readyState == 4) {
|
||||
if (request.readyState === 4) {
|
||||
if (/^2/.test(request.status)) {
|
||||
callback(request);
|
||||
} else {
|
||||
@@ -656,13 +935,13 @@ function ajaxForm(form, message, button) {
|
||||
if (/^file$/i.test(el.type) && el.value) {
|
||||
return false;
|
||||
}
|
||||
if (!/^(checkbox|radio|submit|file)$/i.test(el.type) || el.checked || el == button) {
|
||||
if (!/^(checkbox|radio|submit|file)$/i.test(el.type) || el.checked || el === button) {
|
||||
data.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(isTag(el, 'select') ? selectValue(el) : el.value));
|
||||
}
|
||||
}
|
||||
}
|
||||
data = data.join('&');
|
||||
|
||||
|
||||
var url = form.action;
|
||||
if (!/post/i.test(form.method)) {
|
||||
url = url.replace(/\?.*/, '') + '?' + data;
|
||||
@@ -671,9 +950,9 @@ function ajaxForm(form, message, button) {
|
||||
return ajax(url, function (request) {
|
||||
setHtml('ajaxstatus', request.responseText);
|
||||
if (window.jush) {
|
||||
jush.highlight_tag(qsa('code', qs('#ajaxstatus')), 0);
|
||||
jush.highlight_tag(qsa('code', gid('ajaxstatus')), 0);
|
||||
}
|
||||
messagesPrint(qs('#ajaxstatus'));
|
||||
messagesPrint(gid('ajaxstatus'));
|
||||
}, data, message);
|
||||
}
|
||||
|
||||
@@ -688,7 +967,7 @@ function ajaxForm(form, message, button) {
|
||||
*/
|
||||
function selectClick(event, text, warning) {
|
||||
var td = this;
|
||||
var target = getTarget(event);
|
||||
var target = event.target;
|
||||
if (!isCtrl(event) || isTag(td.firstChild, 'input|textarea') || isTag(target, 'a')) {
|
||||
return;
|
||||
}
|
||||
@@ -703,14 +982,18 @@ function selectClick(event, text, warning) {
|
||||
if (!event) {
|
||||
event = window.event;
|
||||
}
|
||||
if (event.keyCode == 27 && !event.shiftKey && !event.altKey && !isCtrl(event)) { // 27 - Esc
|
||||
if (event.keyCode === 27 && !event.shiftKey && !event.altKey && !isCtrl(event)) { // 27 - Esc
|
||||
inputBlur.apply(input);
|
||||
td.innerHTML = original;
|
||||
}
|
||||
};
|
||||
var pos = event.rangeOffset;
|
||||
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)
|
||||
|
||||
let pos = event.rangeOffset;
|
||||
let value = (td.firstChild && td.firstChild.alt) || td.textContent || td.innerText;
|
||||
const tdStyle = window.getComputedStyle(td, null);
|
||||
|
||||
input.style.width = Math.max(td.clientWidth - parseFloat(tdStyle.paddingLeft) - parseFloat(tdStyle.paddingRight), 20) + 'px';
|
||||
|
||||
if (text) {
|
||||
var rows = 1;
|
||||
value.replace(/\n/g, function () {
|
||||
@@ -733,7 +1016,7 @@ function selectClick(event, text, warning) {
|
||||
td.appendChild(input);
|
||||
setupSubmitHighlight(td);
|
||||
input.focus();
|
||||
if (text == 2) { // long text
|
||||
if (text === 2) { // long text
|
||||
return ajax(location.href + '&' + encodeURIComponent(td.id) + '=', function (request) {
|
||||
if (request.responseText) {
|
||||
input.value = request.responseText;
|
||||
@@ -771,7 +1054,7 @@ function selectLoadMore(limit, loading) {
|
||||
return !ajax(href, function (request) {
|
||||
var tbody = document.createElement('tbody');
|
||||
tbody.innerHTML = request.responseText;
|
||||
qs('#table').appendChild(tbody);
|
||||
gid('table').appendChild(tbody);
|
||||
if (tbody.children.length < limit) {
|
||||
a.parentNode.removeChild(a);
|
||||
} else {
|
||||
@@ -825,9 +1108,9 @@ function setupSubmitHighlightInput(input) {
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function inputFocus() {
|
||||
var submit = findDefaultSubmit(this);
|
||||
const submit = findDefaultSubmit(this);
|
||||
if (submit) {
|
||||
alterClass(submit, 'default', true);
|
||||
submit.classList.toggle('default', true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -835,9 +1118,9 @@ function inputFocus() {
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function inputBlur() {
|
||||
var submit = findDefaultSubmit(this);
|
||||
const submit = findDefaultSubmit(this);
|
||||
if (submit) {
|
||||
alterClass(submit, 'default');
|
||||
submit.classList.toggle('default', false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -855,7 +1138,7 @@ function findDefaultSubmit(el) {
|
||||
var inputs = qsa('input', el.form);
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
var input = inputs[i];
|
||||
if (input.type == 'submit' && !input.style.zIndex) {
|
||||
if (input.type === 'submit' && !input.style.zIndex) {
|
||||
return input;
|
||||
}
|
||||
}
|
||||
@@ -906,8 +1189,22 @@ function cloneNode(el) {
|
||||
return el2;
|
||||
}
|
||||
|
||||
function getOffsetTop(element) {
|
||||
let box = element.getBoundingClientRect();
|
||||
|
||||
return box.top + window.scrollY;
|
||||
}
|
||||
|
||||
function getOffsetLeft(element) {
|
||||
let box = element.getBoundingClientRect();
|
||||
|
||||
return box.left + window.scrollX;
|
||||
}
|
||||
|
||||
oninput = function (event) {
|
||||
var target = event.target;
|
||||
var maxLength = target.getAttribute('data-maxlength');
|
||||
alterClass(target, 'maxlength', target.value && maxLength != null && target.value.length > maxLength); // maxLength could be 0
|
||||
const target = event.target;
|
||||
const maxLength = target.getAttribute('data-maxlength');
|
||||
|
||||
// maxLength could be 0
|
||||
target.classList.toggle('maxlength', target.value && maxLength != null && target.value.length > maxLength);
|
||||
};
|
||||
|
@@ -7,9 +7,19 @@ if (!$fields) {
|
||||
$table_status = table_status1($TABLE, true);
|
||||
$name = $adminer->tableName($table_status);
|
||||
|
||||
$rights = [];
|
||||
foreach ($fields as $key => $field) {
|
||||
$rights += $field["privileges"];
|
||||
}
|
||||
|
||||
page_header(($fields && is_view($table_status) ? $table_status['Engine'] == 'materialized view' ? lang('Materialized view') : lang('View') : lang('Table')) . ": " . ($name != "" ? $name : h($TABLE)), $error);
|
||||
|
||||
$adminer->selectLinks($table_status);
|
||||
$set = null;
|
||||
if (isset($rights["insert"]) || !support("table")) {
|
||||
$set = "";
|
||||
}
|
||||
$adminer->selectLinks($table_status, $set);
|
||||
|
||||
$comment = $table_status["Comment"];
|
||||
if ($comment != "") {
|
||||
echo "<p class='nowrap'>" . lang('Comment') . ": " . h($comment) . "\n";
|
||||
@@ -17,6 +27,22 @@ if ($comment != "") {
|
||||
|
||||
if ($fields) {
|
||||
$adminer->tableStructurePrint($fields);
|
||||
|
||||
if (is_view($table_status)) {
|
||||
$editLink = '<p class="links"><a href="' . h(ME) . 'view=' . urlencode($TABLE) . '">' . lang('Alter view') . "</a>\n";
|
||||
} else {
|
||||
$editLink = '<p class="links"><a href="' . h(ME) . 'create=' . urlencode($TABLE) . '">' . lang('Alter table') . "</a>\n";
|
||||
}
|
||||
echo $editLink;
|
||||
|
||||
if (support("partitioning") && preg_match("~partitioned~", $table_status["Create_options"])) {
|
||||
echo "<h3 id='partition-by'>" . lang('Partition by') . "</h3>\n";
|
||||
|
||||
$partitions_info = get_partitions_info($TABLE);
|
||||
$adminer->tablePartitionsPrint($partitions_info);
|
||||
|
||||
echo $editLink;
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_view($table_status)) {
|
||||
@@ -28,12 +54,12 @@ if (!is_view($table_status)) {
|
||||
}
|
||||
echo '<p class="links"><a href="' . h(ME) . 'indexes=' . urlencode($TABLE) . '">' . lang('Alter indexes') . "</a>\n";
|
||||
}
|
||||
|
||||
|
||||
if (fk_support($table_status)) {
|
||||
echo "<h3 id='foreign-keys'>" . lang('Foreign keys') . "</h3>\n";
|
||||
$foreign_keys = foreign_keys($TABLE);
|
||||
if ($foreign_keys) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<table>\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) . "'>";
|
||||
@@ -57,9 +83,9 @@ if (support(is_view($table_status) ? "view_trigger" : "trigger")) {
|
||||
echo "<h3 id='triggers'>" . lang('Triggers') . "</h3>\n";
|
||||
$triggers = triggers($TABLE);
|
||||
if ($triggers) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<table>\n";
|
||||
foreach ($triggers as $key => $val) {
|
||||
echo "<tr valign='top'><td>" . h($val[0]) . "<td>" . h($val[1]) . "<th>" . h($key) . "<td><a href='" . h(ME . 'trigger=' . urlencode($TABLE) . '&name=' . urlencode($key)) . "'>" . lang('Alter') . "</a>\n";
|
||||
echo "<tr><td>" . h($val[0]) . "<td>" . h($val[1]) . "<th>" . h($key) . "<td><a href='" . h(ME . 'trigger=' . urlencode($TABLE) . '&name=' . urlencode($key)) . "'>" . lang('Alter') . "</a>\n";
|
||||
}
|
||||
echo "</table>\n";
|
||||
}
|
||||
|
@@ -40,7 +40,7 @@ page_header(($name != "" ? lang('Alter trigger') . ": " . h($name) : lang('Creat
|
||||
<tr><th><?php echo lang('Type'); ?><td><?php echo html_select("Type", $trigger_options["Type"], $row["Type"]); ?>
|
||||
</table>
|
||||
<p><?php echo lang('Name'); ?>: <input name="Trigger" value="<?php echo h($row["Trigger"]); ?>" data-maxlength="64" autocapitalize="off">
|
||||
<?php echo script("qs('#form')['Timing'].onchange();"); ?>
|
||||
<?php echo script("gid('form')['Timing'].onchange();"); ?>
|
||||
<p><?php textarea("Statement", $row["Statement"]); ?>
|
||||
<p>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
|
@@ -85,8 +85,8 @@ if ($_POST && !$error) {
|
||||
unset($grants[$object]);
|
||||
}
|
||||
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")
|
||||
!grant(false, $revoke, $match[2], $match[1], $new_user) //! SQL injection
|
||||
|| !grant(true, $grant, $match[2], $match[1], $new_user)
|
||||
)) {
|
||||
$error = true;
|
||||
break;
|
||||
@@ -100,7 +100,7 @@ if ($_POST && !$error) {
|
||||
} elseif (!isset($_GET["grant"])) {
|
||||
foreach ($grants as $object => $revoke) {
|
||||
if (preg_match('~^(.+)(\(.*\))?$~U', $object, $match)) {
|
||||
grant("REVOKE", array_keys($revoke), $match[2], " ON $match[1] FROM $new_user");
|
||||
grant(false, array_keys($revoke), $match[2], $match[1], $new_user);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -126,7 +126,14 @@ if ($_POST) {
|
||||
if ($old_pass != "") {
|
||||
$row["hashed"] = true;
|
||||
}
|
||||
$grants[(DB == "" || $grants ? "" : idf_escape(addcslashes(DB, "%_\\"))) . ".*"] = array();
|
||||
|
||||
if ($grants) {
|
||||
$grants[".*"] = [];
|
||||
} elseif (DB != "") {
|
||||
$grants[idf_escape(addcslashes(DB, "%_\\")) . ".*"] = [];
|
||||
} else {
|
||||
$grants["*.* "] = []; // Space is added to force editing mode.
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -135,48 +142,86 @@ if ($_POST) {
|
||||
<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 if (!$row["hashed"]) { echo script("typePassword(gid('pass'));"); } ?>
|
||||
<?php echo (min_version(8) ? "" : checkbox("hashed", 1, $row["hashed"], lang('Hashed'), "typePassword(this.form['pass'], this.checked);")); ?>
|
||||
</table>
|
||||
|
||||
<?php
|
||||
//! MAX_* limits, REQUIRE
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<thead><tr><th colspan='2'>" . lang('Privileges') . doc_link(array('sql' => "grant.html#priv_level"));
|
||||
echo "<table>\n";
|
||||
|
||||
echo "<thead><tr><th colspan='2'>" . lang('Privileges') . doc_link(array('sql' => "grant.html#priv_level")) . "</th>";
|
||||
$i = 0;
|
||||
foreach ($grants as $object => $grant) {
|
||||
echo '<th>' . ($object != "*.*" ? "<input name='objects[$i]' value='" . h($object) . "' size='10' autocapitalize='off'>" : "<input type='hidden' name='objects[$i]' value='*.*' size='10'>*.*"); //! separate db, table, columns, PROCEDURE|FUNCTION, routine
|
||||
echo "<th>";
|
||||
//! separate db, table, columns, PROCEDURE|FUNCTION, routine
|
||||
if ($object == "*.*") {
|
||||
echo "<input type='hidden' name='objects[$i]' value='*.*' size='10'>*.*";
|
||||
} else {
|
||||
echo "<input name='objects[$i]' value='" . h(trim($object)) . "' size='10' autocapitalize='off'>";
|
||||
}
|
||||
echo "</th>";
|
||||
$i++;
|
||||
}
|
||||
echo "</thead>\n";
|
||||
echo "</tr></thead>\n";
|
||||
|
||||
foreach (array(
|
||||
foreach ([
|
||||
"" => "",
|
||||
"Server Admin" => lang('Server'),
|
||||
"Databases" => lang('Database'),
|
||||
"Tables" => lang('Table'),
|
||||
"Columns" => lang('Column'),
|
||||
"Procedures" => lang('Routine'),
|
||||
) as $context => $desc) {
|
||||
] as $context => $desc) {
|
||||
foreach ((array) $privileges[$context] as $privilege => $comment) {
|
||||
echo "<tr" . odd() . "><td" . ($desc ? ">$desc<td" : " colspan='2'") . ' lang="en" title="' . h($comment) . '">' . h($privilege);
|
||||
echo "<tr" . odd() . ">";
|
||||
if ($desc) {
|
||||
echo "<td>$desc</td>";
|
||||
}
|
||||
echo "<td" . (!$desc ? " colspan='2'" : "") . ' lang="en" title="' . h($comment) . '">' . h($privilege) . "</td>";
|
||||
|
||||
$i = 0;
|
||||
|
||||
foreach ($grants as $object => $grant) {
|
||||
$name = "'grants[$i][" . h(strtoupper($privilege)) . "]'";
|
||||
$value = $grant[strtoupper($privilege)];
|
||||
if ($context == "Server Admin" && $object != (isset($grants["*.*"]) ? "*.*" : ".*")) {
|
||||
echo "<td>";
|
||||
|
||||
$proxiedUser = strpos($object, "@") !== false;
|
||||
$newObject = $object == ".*";
|
||||
$allPrivileges = $privilege == "All privileges";
|
||||
$grantOption = $privilege == "Grant option";
|
||||
|
||||
if ($object == "*.*" && $privilege == "Proxy") {
|
||||
echo "<td></td>";
|
||||
} elseif ($proxiedUser && $privilege != "Proxy" && !$grantOption) {
|
||||
echo "<td></td>";
|
||||
} elseif ($context == "Server Admin" && $object != (isset($grants["*.*"]) ? "*.*" : ".*") && !(($proxiedUser || $newObject) && $privilege == "Proxy")) {
|
||||
echo "<td></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>";
|
||||
echo "<td><select name=$name>" .
|
||||
"<option></option>" .
|
||||
"<option value='1'" . ($value ? " selected" : "") . ">" . lang('Grant') . "</option>" .
|
||||
"<option value='0'" . ($value == "0" ? " selected" : "") . ">" . lang('Revoke') . "</option>" .
|
||||
"</select></td>";
|
||||
} else {
|
||||
echo "<td align='center'><label class='block'>";
|
||||
echo "<input type='checkbox' name=$name value='1'" . ($value ? " checked" : "") . ($privilege == "All privileges"
|
||||
? " id='grants-$i-all'>" //! uncheck all except grant if all is checked
|
||||
: ">" . ($privilege == "Grant option" ? "" : script("qsl('input').onclick = function () { if (this.checked) formUncheck('grants-$i-all'); };")));
|
||||
echo "<td class='center'><label class='block'>";
|
||||
echo "<input type='checkbox' name=$name value='1'" .
|
||||
($value ? " checked" : "") .
|
||||
($allPrivileges ? " id='grants-$i-all'" : (!$grantOption ? " class='grants-$i'" : "")) .
|
||||
">";
|
||||
|
||||
if ($allPrivileges) {
|
||||
echo script("qsl('input').onclick = function () { if (this.checked) formUncheckAll('.grants-$i'); };");
|
||||
} elseif (!$grantOption) {
|
||||
echo script("qsl('input').onclick = function () { if (this.checked) formUncheck('grants-$i-all'); };");
|
||||
}
|
||||
echo "</label>";
|
||||
}
|
||||
|
||||
$i++;
|
||||
}
|
||||
|
||||
echo "</tr>";
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -6,7 +6,7 @@ $variables = ($status ? show_status() : show_variables());
|
||||
if (!$variables) {
|
||||
echo "<p class='message'>" . lang('No rows.') . "\n";
|
||||
} else {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<table>\n";
|
||||
foreach ($variables as $key => $val) {
|
||||
echo "<tr>";
|
||||
echo "<th><code class='jush-" . $jush . ($status ? "status" : "set") . "'>" . h($key) . "</code>";
|
||||
|
24
bin/export.sh
Normal file
24
bin/export.sh
Normal file
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
# Root directory.
|
||||
BASEDIR=$( cd `dirname $0`/.. ; pwd )
|
||||
cd "$BASEDIR"
|
||||
|
||||
php compile.php
|
||||
php compile.php en
|
||||
php compile.php de
|
||||
php compile.php cs
|
||||
php compile.php sk
|
||||
|
||||
php compile.php mysql
|
||||
php compile.php mysql en
|
||||
php compile.php mysql de
|
||||
php compile.php mysql cs
|
||||
php compile.php mysql sk
|
||||
|
||||
php compile.php editor
|
||||
php compile.php editor en
|
||||
php compile.php editor mysql
|
||||
php compile.php editor mysql en
|
952
changes.txt
952
changes.txt
@@ -1,952 +0,0 @@
|
||||
Adminer 4.8.2 (released 2024-03-16):
|
||||
Support multi-line table comments
|
||||
MySQL: Use ST_SRID() instead of SRID() for MySQL 8 (PR #418)
|
||||
PostgreSQL: Don't reset table comments (regression from 4.2.0)
|
||||
PostgreSQL PDO: Allow editing rows identified by boolean column (PR #380)
|
||||
Update several translations: lv, bn, fr, it, nl, ru, cs, sk
|
||||
Allow responsive styles on larger devices
|
||||
|
||||
Adminer 4.8.1 (released 2021-05-14):
|
||||
Internet Explorer or PDO in Adminer 4.7.8-4.8.0: Fix XSS in doc_link (bug #797)
|
||||
Fix more PHP 8 warnings (bug #781)
|
||||
Avoid PHP warnings with PDO drivers (bug #786, regression from 4.7.8)
|
||||
MySQL: Allow moving views to other DB and renaming DB with views (bug #783)
|
||||
MariaDB: Do not treat sequences as views (PR #416)
|
||||
PostgreSQL: Support UPDATE OF triggers (bug #789)
|
||||
PostgreSQL: Support triggers with more events (OR)
|
||||
PostgreSQL: Fix parsing of foreign keys with non-ASCII column names
|
||||
PostgreSQL < 10 PDO: Avoid displaying GENERATED ALWAYS BY IDENTITY everywhere (bug #785, regression from 4.7.9)
|
||||
SQLite: Fix displayed types (bug #784, regression from 4.8.0)
|
||||
|
||||
Adminer 4.8.0 (released 2021-02-10):
|
||||
Support function default values in insert (bug #713)
|
||||
Allow SQL pseudo-function in insert
|
||||
Skip date columns for non-date values in search anywhere
|
||||
Add DB version to comment in export
|
||||
Support PHP 8 in create table (regression from 4.7.9)
|
||||
MySQL 8: Fix EXPLAIN in SQL command
|
||||
PostgreSQL: Create PRIMARY KEY for auto increment columns
|
||||
PostgreSQL: Avoid exporting empty sequence last value (bug #768)
|
||||
PostgreSQL: Do not show triggers from other schemas (PR #412)
|
||||
PostgreSQL: Fix multi-parameter functions in default values (bug #736)
|
||||
PostgreSQL: Fix displaying NULL bytea fields
|
||||
PostgreSQL PDO: Do not select NULL function for false values in edit
|
||||
Oracle: Alter indexes
|
||||
Oracle: Count tables
|
||||
Oracle: Import from CSV
|
||||
Oracle: Fix column size with string type
|
||||
MongoDB: Handle errors
|
||||
SimpleDB, Firebird, ClickHouse: Move to plugin
|
||||
|
||||
Adminer 4.7.9 (released 2021-02-07):
|
||||
Fix XSS in browsers which don't encode URL parameters (bug #775, regression from 4.7.0)
|
||||
Elasticsearch, ClickHouse: Do not print response if HTTP code is not 200
|
||||
Don't syntax highlight during IME composition (bug #747)
|
||||
Quote values with leading and trailing zeroes in CSV export (bug #777)
|
||||
Link URLs in SQL command (PR #411)
|
||||
Fix displayed foreign key columns from other DB (bug #766)
|
||||
Re-enable PHP warnings (regression from 4.7.8)
|
||||
MySQL: Do not export names in quotes with sql_mode='ANSI_QUOTES' (bug #749)
|
||||
MySQL: Avoid error in PHP 8 when connecting to socket (PR #409)
|
||||
MySQL: Don't quote default value of text fields (bug #779)
|
||||
PostgreSQL: Export all FKs after all CREATE TABLE (PR #351)
|
||||
PostgreSQL: Fix dollar-quoted syntax highlighting (bug #738)
|
||||
PostgreSQL: Do not show view definition from other schema (PR #392)
|
||||
PostgreSQL: Use bigserial for bigint auto increment (bug #765, regression from 3.0.0)
|
||||
PostgreSQL PDO: Support PgBouncer, unsupport PostgreSQL < 9.1 (bug #771)
|
||||
PostgreSQL 10: Support GENERATED ALWAYS BY IDENTITY (PR #386)
|
||||
PostgreSQL 10: Support partitioned tables (PR #396)
|
||||
PostgreSQL 11: Create PRIMARY KEY for auto increment columns
|
||||
SQLite: Set busy_timeout to 500
|
||||
MS SQL: Don't truncate comments to 30 chars (PR #376)
|
||||
Elasticsearch 6: Fix displaying type mapping (PR #402)
|
||||
MongoDB: Fix password-less check in the mongo extension (PR #405)
|
||||
Editor: Cast to string when searching (bug #325)
|
||||
Editor: Avoid trailing dot in export filename
|
||||
|
||||
Adminer 4.7.8 (released 2020-12-06):
|
||||
Support PHP 8
|
||||
Disallow connecting to privileged ports (bug #769)
|
||||
|
||||
Adminer 4.7.7 (released 2020-05-11):
|
||||
Fix open redirect if Adminer is accessible at //adminer.php%2F@
|
||||
|
||||
Adminer 4.7.6 (released 2020-01-31):
|
||||
Speed up alter table form (regression from 4.4.0)
|
||||
Fix clicking on non-input fields in alter table (regression from 4.6.2)
|
||||
Display time of procedure execution
|
||||
Disallow connecting to ports > 65535 (bug #730)
|
||||
MySQL: Always set foreign_key_checks in export
|
||||
PostgreSQL: Support exporting views
|
||||
Editor: Fix focusing foreign key search in select
|
||||
|
||||
Adminer 4.7.5 (released 2019-11-13):
|
||||
Add id="" to cells with failed inline edit (bug #708)
|
||||
PostgreSQL: Fix getting default value in PostgreSQL 12 (bug #719)
|
||||
PostgreSQL, Oracle: Set schema for EXPLAIN queries in SQL command (bug #706)
|
||||
ClickHouse: SQL command
|
||||
Swedish translation
|
||||
|
||||
Adminer 4.7.4 (released 2019-10-22):
|
||||
Fix XSS if Adminer is accessible at URL /data:
|
||||
|
||||
Adminer 4.7.3 (released 2019-08-27):
|
||||
Allow editing foreign keys pointing to tables in other database/schema (bug #694)
|
||||
Fix blocking of concurrent instances in PHP >7.2 (bug #703)
|
||||
MySQL: Speed up displaying tables in large databases (bug #700, regression from 4.7.2)
|
||||
MySQL: Allow editing rows identified by negative floats (bug #695)
|
||||
MySQL: Skip editing generated columns
|
||||
SQLite: Quote strings stored in integer columns in export (bug #696)
|
||||
SQLite: Handle error in altering table (bug #697)
|
||||
SQLite: Allow setting auto increment for empty tables
|
||||
SQLite: Preserve auto increment when recreating table
|
||||
MS SQL: Support foreign keys to other DB
|
||||
MongoDB: Allow setting authSource from environment variable
|
||||
|
||||
Adminer 4.7.2 (released 2019-07-18):
|
||||
Do not attempt logging in without password (bug #676)
|
||||
Stretch footer over the whole table width (bug #624)
|
||||
Allow overwriting tables when copying them
|
||||
Fix displaying SQL command after Save and continue edit
|
||||
Cache busting for adminer.css
|
||||
MySQL: Fix displaying multi-columns foreign keys (bug #675, regression from 4.7.0)
|
||||
MySQL: Fix creating users and changing password in MySQL 8 (bug #663)
|
||||
MySQL: Pass SRID to GeomFromText
|
||||
PostgreSQL: Fix setting column comments on new table
|
||||
PostgreSQL: Display definitions of materialized views (bug #682)
|
||||
PostgreSQL: Fix table status in PostgreSQL 12 (bug #683)
|
||||
MS SQL: Support comments
|
||||
Elasticsearch: Fix setting number of rows
|
||||
|
||||
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 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
|
||||
PostgreSQL: Add IF EXISTS to DROP SEQUENCE in export (bug #595)
|
||||
Editor: Fix displaying of true boolean values (regression from 4.5.0)
|
||||
|
||||
Adminer 4.6.1 (released 2018-02-09):
|
||||
Sticky position of table actions
|
||||
Speed up rendering of long tables (regression from 4.4.0)
|
||||
Display notification about performing action after relogin
|
||||
Add system tables help links
|
||||
MySQL: Support non-utf8 charset in search in column
|
||||
MySQL: Support geometry in MySQL 8 (bug #574)
|
||||
MariaDB: Links to documentation
|
||||
SQLite: Allow deleting PRIMARY KEY from tables with auto increment
|
||||
PostgreSQL: Support binary files in bytea fields
|
||||
PostgreSQL: Don't treat interval type as number (bug #474)
|
||||
PostgreSQL: Cast to string when searching using LIKE (bug #325)
|
||||
PostgreSQL: Fix condition for selecting no rows
|
||||
PostgreSQL: Support TRUNCATE+INSERT export
|
||||
Customization: Support connecting to MySQL via SSL
|
||||
Customization: Allow specifying server name displayed in breadcrumbs
|
||||
|
||||
Adminer 4.6.0 (released 2018-02-05):
|
||||
Fix counting selected rows after going back to select page
|
||||
PHP <5.3 compatibility even with Elasticsearch enabled
|
||||
Fully support functions in default values
|
||||
Stop redirecting links via adminer.org
|
||||
Support X-Forwarded-Prefix
|
||||
Display options for timestamp columns when creating a new table
|
||||
Disable autocompleting password on create user page
|
||||
Use primary key to edit rows even if not selected
|
||||
MySQL, PostgreSQL: Display warnings
|
||||
MySQL: Add floor and ceil select functions
|
||||
MySQL: Add FIND_IN_SET search operator
|
||||
MariaDB: Support JSON since MariaDB 10.2
|
||||
SQLite, PostgreSQL: Limit rows in data manipulation without unique key
|
||||
PostgreSQL: Support routines
|
||||
PostgreSQL: Allow editing views with uppercase letters (bug #467)
|
||||
PostgreSQL: Allow now() as default value (bug #525)
|
||||
SimpleDB: Document that allow_url_fopen is required
|
||||
Malay translation
|
||||
|
||||
Adminer 4.5.0 (released 2018-01-24):
|
||||
Display name of the object in confirmation when dropping it
|
||||
Display newlines in column comments (bug #573)
|
||||
Support current_timestamp() as default of time fields (bug #572)
|
||||
Hide window.opener from pages opened in a new window (bug #561)
|
||||
Display error when getting row to edit
|
||||
Store current Adminer version server-side to avoid excessive requests
|
||||
Adminer: Fix Search data in tables (regression from 4.4.0)
|
||||
CSP: Allow any styles, images, media and fonts, disallow base-uri
|
||||
MySQL: Support geometry in MySQL 8 (bug #574)
|
||||
MySQL: Support routines with comments in parameters (bug #460)
|
||||
MariaDB: Support fulltext and spatial indexes in InnoDB (bug #583)
|
||||
SQLite: Enable foreign key checks
|
||||
PostgreSQL: Respect NULL default value
|
||||
PostgreSQL: Display foreign tables (bug #576)
|
||||
PostgreSQL: Do not export triggers if not requested
|
||||
PostgreSQL: Export DROP SEQUENCE if dropping table
|
||||
PostgreSQL: Display boolean values as code (bug #562)
|
||||
MS SQL: Support freetds
|
||||
non-MySQL: Avoid CONVERT() (bug #509)
|
||||
Elasticsearch: Insert, update, delete
|
||||
MongoDB: Support mongodb PHP extension
|
||||
Editor: Fix displaying of false values in PostgreSQL (bug #568)
|
||||
|
||||
Adminer 4.4.0 (released 2018-01-17):
|
||||
Add Content Security Policy
|
||||
Disallow scripts without nonce
|
||||
Rate limit password-less login attempts from the same IP address
|
||||
Disallow connecting to privileged ports
|
||||
Add nosniff header
|
||||
PHP 7.1: Prevent warning when using empty limit
|
||||
PHP 7.2: Prevent warning when searching in select
|
||||
MySQL: Remove dedicated view for replication status (added in 4.3.0)
|
||||
PostgreSQL: Sort table names (regression from 4.3.1)
|
||||
Editor: Don't set time zone from PHP, fixes DST
|
||||
Editor: Display field comment's text inside [] only in edit form
|
||||
Editor: Fix doubleclick on database page
|
||||
Editor: Fix Search data in tables
|
||||
Customization: Always send security headers
|
||||
Hebrew translation
|
||||
|
||||
Adminer 4.3.1 (released 2017-04-14):
|
||||
Fix permanent login after logout (bug #539)
|
||||
Fix SQL command autofocus (regression from 4.0.0)
|
||||
PostgreSQL: Support JSON and JSONB data types
|
||||
PostgreSQL: Fix index size computation in PostgreSQL < 9.0 (regression from 4.3.0)
|
||||
PostgreSQL: Fix nullable fields in export
|
||||
|
||||
Adminer 4.3.0 (released 2017-03-15):
|
||||
Make maxlength in edit fields a soft limit
|
||||
Add accessibility labels
|
||||
Add Cache-Control: immutable to static files
|
||||
MySQL: Support MySQL 8
|
||||
MySQL: Support JSON data type
|
||||
MySQL: Add dedicated view for replication status
|
||||
MySQL: Support spatial indexes
|
||||
PostgreSQL: Export
|
||||
PostgreSQL: Don't treat partial indexes as unique
|
||||
MS SQL: Support pdo_dblib
|
||||
Elasticsearch: Support HTTPS by inputting https://server
|
||||
|
||||
Adminer 4.2.5 (released 2016-06-01):
|
||||
Fix remote execution in SQLite query
|
||||
SQLite: Require credentials to use
|
||||
PostgreSQL: Support KILL
|
||||
|
||||
Adminer 4.2.4 (released 2016-02-06):
|
||||
Fix remote execution in SQLite query
|
||||
MySQL: Support PHP 7
|
||||
Bosnian translation
|
||||
Finnish translation
|
||||
|
||||
Adminer 4.2.3 (released 2015-11-15):
|
||||
Fix XSS in indexes (non-MySQL only)
|
||||
Support PHP 7
|
||||
Greek translation
|
||||
Galician translation
|
||||
Bulgarian translation
|
||||
|
||||
Adminer 4.2.2 (released 2015-08-05):
|
||||
Fix XSS in alter table (found by HP Fortify)
|
||||
|
||||
Adminer 4.2.1 (released 2015-03-10):
|
||||
Send referrer header to the same domain
|
||||
MySQL: Fix usage of utf8mb4 if the client library doesn't support it
|
||||
MySQL: Use utf8mb4 in export only if required
|
||||
SQLite: Use EXPLAIN QUERY PLAN in SQL query
|
||||
|
||||
Adminer 4.2.0 (released 2015-02-07):
|
||||
Fix XSS in login form (bug #436)
|
||||
Allow limiting number of displayed rows in SQL command
|
||||
Fix reading routine column collations
|
||||
Unlock session in alter database
|
||||
Make master key unreadable to others (bug #410)
|
||||
Fix edit by long non-utf8 string
|
||||
Specify encoding for PHP 5.6 with invalid default_charset
|
||||
Fix saving NULL value, bug since Adminer 4.0.3
|
||||
Send 403 for auth error
|
||||
Report offline and other AJAX errors (bug #419)
|
||||
Don't alter table comment if not changed
|
||||
Add links to documentation on table status page
|
||||
Fix handling of 64 bit numbers in auto_increment
|
||||
Add referrer: never meta tag
|
||||
MySQL: Use utf8mb4 if available
|
||||
MySQL: Support foreign keys in NDB storage
|
||||
PostgreSQL: Materialized views
|
||||
SQLite: Support CURRENT_* default values (bug #417)
|
||||
Elasticsearch: Use where in select
|
||||
Firebird: Alpha version
|
||||
Danish translation
|
||||
|
||||
Adminer 4.1.0 (released 2014-04-18):
|
||||
Provide size of all databases in the overview
|
||||
Prevent against brute force login attempts from the same IP address
|
||||
Compute number of tables in the overview explicitly
|
||||
Display edit form after error in clone or multi-edit
|
||||
Trim trailing non-breaking spaces in SQL textarea
|
||||
Display time of the select command
|
||||
Print elapsed time in HTML instead of SQL command comment
|
||||
Improve gzip export ratio (bug #387)
|
||||
Use rel="noreferrer" for external links, skip adminer.org redirect in WebKit
|
||||
MySQL: Fix enum types in routines (bug #391)
|
||||
MySQL: Fix editing rows by binary values, bug since Adminer 3.7.1
|
||||
MySQL: Respect daylight saving time in dump, bug since Adminer 3.6.4
|
||||
MySQL 5.6.5+: Support ON UPDATE on datatime column
|
||||
SQLite: Support UPDATE OF triggers
|
||||
SQLite: Display auto-created unique indexes, bug since Adminer 3.5.0
|
||||
Editor: Fix login() method, bug since Adminer 4.0.0
|
||||
Translate numbers in ar, bn, fa
|
||||
Vietnamese translation
|
||||
|
||||
Adminer 4.0.3 (released 2014-02-01)
|
||||
MongoDB: insert, truncate, indexes
|
||||
SimpleDB, MongoDB: insert more fields at once
|
||||
SQLite: Fix creating table and altering primary key, bug since Adminer 4.0.0
|
||||
Don't store invalid credentials to session, bug since Adminer 4.0.0
|
||||
Norweigan translation
|
||||
|
||||
Adminer 4.0.2 (released 2014-01-11):
|
||||
Fix handling of long text in SQL textarea
|
||||
Support paste to SQL textarea in Opera
|
||||
|
||||
Adminer 4.0.1 (released 2014-01-11):
|
||||
Don't use type=number if a SQL function is used
|
||||
Disable highlighting in textareas with long texts
|
||||
Don't autofocus SQL textarea in Firefox
|
||||
Don't link NULL foreign key values
|
||||
Fix displaying images in Editor, bug since Adminer 3.6.0
|
||||
Fix uploading files, bug since Adminer 4.0.0
|
||||
MongoDB: Count tables, display ObjectIds, sort, limit, offset, count rows
|
||||
Elasticsearch: Fix compiled version, create and drop DB, drop table
|
||||
|
||||
Adminer 4.0.0 (released 2014-01-08):
|
||||
Driver for SimpleDB, MongoDB and Elasticsearch
|
||||
Highlight SQL in textareas
|
||||
Save and continue edit by AJAX
|
||||
Split SQL command and import
|
||||
Add a new column in alter table on key press
|
||||
Mark length as required for strings
|
||||
Add label to database selection, move logout button
|
||||
Add button for dropping an index
|
||||
Display number of selected rows
|
||||
Add links to documentation
|
||||
Disable underlining links
|
||||
Differentiate views in navigation
|
||||
Improve speed of CSV import
|
||||
Keep form values after refresh in Firefox
|
||||
Mark auto_increment fields in edit
|
||||
Don't append newlines to uploaded files, bug since Adminer 3.7.0
|
||||
Don't display SQL edit form on Ctrl+click on the select query, introduced in Adminer 3.6.4
|
||||
Use MD5 for editing long keys only in supported drivers, bug since Adminer 3.6.4
|
||||
Don't reset column when searching for an empty value with Enter, bug since Adminer 3.6.4
|
||||
Encrypt passwords stored in session by a key stored in cookie
|
||||
Don't execute external JavaScript when verifying version
|
||||
Include JUSH in the compiled version
|
||||
Protect CSRF token against BREACH
|
||||
Non-MySQL: View triggers
|
||||
SQLite: Allow editing primary key
|
||||
SQLite: Allow editing foreign keys
|
||||
PostgreSQL: Fix handling of nextval() default values
|
||||
PostgreSQL: Support creating array columns
|
||||
Customization: Provide schemas()
|
||||
Portugal Portuguese translation
|
||||
Thai translation
|
||||
|
||||
Adminer 3.7.1 (released 2013-06-29):
|
||||
Increase click target for checkboxes
|
||||
Use shadow for highlighting default button
|
||||
Don't use LIMIT 1 if inline updating unique row
|
||||
Don't check previous checkbox on added column in create table (bug #326)
|
||||
Order table list by name
|
||||
Verify UTF-8 encoding of CSV import
|
||||
Notify user about expired master password for permanent login
|
||||
Highlight table being altered in navigation
|
||||
Send 404 for invalid database and schema
|
||||
Fix title and links on invalid table pages
|
||||
Display error on invalid alter table and view pages
|
||||
MySQL: Speed up updating rows without numeric or UTF-8 primary key
|
||||
Non-MySQL: Descending indexes
|
||||
PostgreSQL: Fix detecting oid column in PDO
|
||||
PostgreSQL: Handle timestamp types (bug #324)
|
||||
Add Korean translation
|
||||
|
||||
Adminer 3.7.0 (released 2013-05-19):
|
||||
Allow more SQL files to be uploaded at the same time
|
||||
Print run time next to executed queries
|
||||
Don't drop original view and routine before creating the new one
|
||||
Highlight default submit button
|
||||
Add server placeholder to login form
|
||||
Disable SQL export when applying functions in select
|
||||
Allow using lang() in plugins (customization)
|
||||
Remove bzip2 compression support
|
||||
Constraint memory used in TAR export
|
||||
Allow exporting views dependent on each other (bug #214)
|
||||
Fix resetting search (bug #318)
|
||||
Don't use LIMIT 1 if updating unique row (bug #320)
|
||||
Restrict editing rows without unique identifier to search results
|
||||
Display navigation bellow main content on mobile browsers
|
||||
Get number of rows on export page asynchronously
|
||||
Respect 'whole result' even if some rows are checked (bug #339 since Adminer 3.7.0)
|
||||
MySQL: Optimize create table page and Editor navigation
|
||||
MySQL: Display bit type as binary number
|
||||
MySQL: Improve export of binary data types
|
||||
MySQL: Fix handling of POINT data type (bug #282)
|
||||
MySQL: Don't export binary and geometry columns twice in select
|
||||
MySQL: Fix EXPLAIN in MySQL < 5.1, bug since Adminer 3.6.4
|
||||
SQLite: Export views
|
||||
PostgreSQL: Fix swapped NULL and NOT NULL columns in PDO
|
||||
|
||||
Adminer 3.6.4 (released 2013-04-26):
|
||||
Display pagination on a fixed position
|
||||
Increase default select limit to 50
|
||||
Display SQL edit form on Ctrl+click on the select query
|
||||
Display SQL history from newest
|
||||
Recover original view, trigger, routine if creating fails
|
||||
Do not store plain text password to history in creating user
|
||||
Selectable ON UPDATE CURRENT_TIMESTAMP field in create table
|
||||
Open database to a new window after selecting it with Ctrl
|
||||
Clear column name after resetting search (bug #296)
|
||||
Explain partitions in SQL query (bug #294)
|
||||
Allow loading more data with inline edit (bug #299)
|
||||
Stay on the same page after deleting rows (bug #301)
|
||||
Respect checked tables in export filename (bug #133)
|
||||
Respect PHP configuration max_input_vars
|
||||
Fix unsetting permanent login after logout
|
||||
Disable autocapitalize in identifiers on mobile browsers
|
||||
MySQL: Compatibility with MySQL 5.6
|
||||
MySQL: Move ALTER export to plugin
|
||||
MySQL: Use numeric time zone in export
|
||||
MySQL: Link processlist documentation
|
||||
SQLite: Export indexes
|
||||
|
||||
Adminer 3.6.3 (released 2013-01-23):
|
||||
Display error code in SQL query
|
||||
Allow specifying external links
|
||||
Treat Meta key same as Ctrl
|
||||
Fix XSS in displaying non-UTF-8 strings
|
||||
Don't use type="number" for decimal numbers
|
||||
|
||||
Adminer 3.6.2 (released 2012-12-21):
|
||||
Edit values by Ctrl+click instead of double click
|
||||
Don't select row on double click
|
||||
Support NULL in routine calls
|
||||
Shorten printed values in varchar fields
|
||||
Display table default values on wide screens
|
||||
Display date in SQL history
|
||||
HTML5 input fields
|
||||
Display warning for missing UPDATE privilege
|
||||
Fix switching language on first load
|
||||
Support enabled mbstring.func_overload
|
||||
MySQL: Prolong comment length since MySQL 5.5
|
||||
PostgreSQL: Fix process list in version 9.2
|
||||
MS SQL: Support databases starting with number
|
||||
|
||||
Adminer 3.6.1 (released 2012-09-17):
|
||||
Fix compiled version on PHP with multibyte support
|
||||
|
||||
Adminer 3.6.0 (released 2012-09-16):
|
||||
Load more data in select
|
||||
Edit strings with \n in textarea
|
||||
Time out long running database list and select count
|
||||
Use VALUES() in INSERT+UPDATE export
|
||||
Style logout button as link
|
||||
Store selected database to permanent login
|
||||
Ctrl+click and Shift+click on button opens form to a blank window
|
||||
Switch language by POST
|
||||
Compress translations
|
||||
MySQL: Support geometry data types
|
||||
selectQueryBuild() method (customization)
|
||||
Serbian translation
|
||||
|
||||
Adminer 3.5.1 (released 2012-08-10):
|
||||
Support same name fields in CSV export
|
||||
Support Shift+click in export
|
||||
|
||||
Adminer 3.5.0 (released 2012-08-05):
|
||||
Links for column search in select
|
||||
Autohide column context menu in select
|
||||
Autodisplay long table names in tables list
|
||||
Display assigned auto_increment after clone
|
||||
SQLite: Full alter table
|
||||
SQLite: Better editing in tables without primary key
|
||||
SQLite: Display number of rows in database overview
|
||||
|
||||
Adminer 3.4.0 (released 2012-06-30):
|
||||
Link to descending order
|
||||
Shift+click on checkbox to select consecutive rows
|
||||
Print current time next to executed SQL queries
|
||||
Warn about selecting data without index
|
||||
Allow specifying database in login form
|
||||
Link to original table in EXPLAIN of SELECT * FROM table t
|
||||
Format numbers in translations
|
||||
MySQL: inform about disabled event_scheduler
|
||||
SQLite: support binary data
|
||||
PostgreSQL: approximate row count in table overview
|
||||
PostgreSQL: improve PDO support in SQL command
|
||||
Oracle: schema, processlist, table overview numbers
|
||||
Simplify work with NULL values (customization)
|
||||
Use namespace in login form (customization)
|
||||
Customizable export filename (customization)
|
||||
Replace JSMin by better JavaScript minifier
|
||||
Don't use AJAX links and forms
|
||||
Indonesian translation
|
||||
Ukrainian translation
|
||||
Bengali translation
|
||||
|
||||
Adminer 3.3.4 (released 2012-03-07):
|
||||
Foreign keys default actions (bug #188)
|
||||
SET DEFAULT foreign key action
|
||||
Fix minor parser bug in SQL command with webserver file
|
||||
Ctrl+click on button opens form to a blank window
|
||||
Trim table and column names (bug #195)
|
||||
Error message with no response from server in AJAX
|
||||
Esc to cancel AJAX request
|
||||
Move AJAX loading indicator to the right
|
||||
Don't quote bit type in export
|
||||
Don't check row while selecting text
|
||||
Fix invalid references line position on Database schema
|
||||
Disable selecting text on Database schema
|
||||
Ability to disable export (customization)
|
||||
Extensible list of databases (customization)
|
||||
MySQL: set autocommit after connect
|
||||
SQLite, PostgreSQL: vacuum
|
||||
SQLite, PostgreSQL: don't use LIKE for numbers (bug #202)
|
||||
PostgreSQL: fix alter foreign key
|
||||
PostgreSQL over PDO: connect if the eponymous database does not exist (bug #185)
|
||||
Boolean search (Editor)
|
||||
Persian translation
|
||||
|
||||
Adminer 3.3.3 (released 2011-08-12):
|
||||
Highlight checked rows
|
||||
Titles of links in database overview and navigation
|
||||
Fix trigger export (SQLite)
|
||||
Default trigger statement (SQLite, PostgreSQL)
|
||||
Remove search by expression (PostgreSQL, MS SQL)
|
||||
|
||||
Adminer 3.3.2 (released 2011-08-08):
|
||||
Display error with non-existent row in edit
|
||||
Fix minor parser bug in SQL command with webserver file
|
||||
Fix SQL command Stop on error
|
||||
Don't scroll with AJAX select order and alter move column
|
||||
Fast number of rows with big tables (PostgreSQL)
|
||||
Sort databases and schemas (PostgreSQL)
|
||||
|
||||
Adminer 3.3.1 (released 2011-07-27):
|
||||
Fix XSS introduced in Adminer 3.2.0
|
||||
Fix altering default values (PostgreSQL)
|
||||
Process list (PostgreSQL)
|
||||
|
||||
Adminer 3.3.0 (released 2011-07-19):
|
||||
Use Esc to disable in-place edit
|
||||
Shortcut for database privileges
|
||||
Editable index names
|
||||
Append new index with auto index selection (bug #138)
|
||||
Preserve original timestamp value in multiple update (bug #158)
|
||||
Bit type default value
|
||||
Display foreign key name in tooltip
|
||||
Display default column value in table overview
|
||||
Display column collation in tooltip
|
||||
Keyboard shortcuts: Alt+Shift+1 for homepage, Ctrl+Shift+Enter for Save and continue edit
|
||||
Show only errors with Webserver file SQL command
|
||||
Remember select export and import options
|
||||
Link tables and indexes from SQL command EXPLAIN (MySQL)
|
||||
Display error with all wrong SQL commands (MySQL)
|
||||
Display foreign keys from other schemas (PostgreSQL)
|
||||
Pagination support (Oracle)
|
||||
Autocomplete for big foreign keys (Editor)
|
||||
Display name of the referenced record in PostgreSQL (Editor)
|
||||
Prefer NULL to empty string (Editor, bug #162)
|
||||
Display searched columns (Editor)
|
||||
Customizable favicon (customization)
|
||||
Method name can return a link (customization)
|
||||
Easier sending of default headers (customization)
|
||||
Lithuanian and Romanian translation
|
||||
|
||||
Adminer 3.2.2 (released 2011-03-28):
|
||||
Fix AJAX history after reload
|
||||
|
||||
Adminer 3.2.1 (released 2011-03-23):
|
||||
Ability to save expression in edit
|
||||
Respect default database collation (bug #119)
|
||||
Don't export triggers without table (bug #123)
|
||||
Esc to focus next field in Tab textarea
|
||||
Send forms by Ctrl+Enter on <select>
|
||||
Enum editor and textarea Ctrl+Enter working in IE
|
||||
AJAX forms in Google Chrome
|
||||
Parse UTF-16 and UTF-8 BOM in all text uploads
|
||||
Display ; in history
|
||||
Use DELIMITER in history
|
||||
Show databases even with skip_show_database in MySQL 5
|
||||
Disable maxlength with functions in edit
|
||||
Better placement of AJAX icon
|
||||
Table header in CSV export (Editor)
|
||||
Time format hint (Editor)
|
||||
Respect order after search (Editor)
|
||||
Set MySQL time zone by PHP setting (Editor)
|
||||
Allow own code in <head> (customization)
|
||||
Polish translation
|
||||
|
||||
Adminer 3.2.0 (released 2011-02-24):
|
||||
Get long texts and slow information by AJAX
|
||||
Most links and forms by AJAX in browsers with support for history.pushState
|
||||
Copy tables
|
||||
Ability to search by expression in select
|
||||
Export SQL command result (bug #99)
|
||||
Focus first field with insert (bug #106)
|
||||
Permanent link in schema
|
||||
Display total time in show only errors mode in SQL command
|
||||
History: edit all
|
||||
MS SQL: auto primary and foreign key
|
||||
SQLite: display 0
|
||||
Create table default data type: int
|
||||
Focus upper/lower fields by Ctrl+Up/Ctrl+Down
|
||||
Hide credentials for SQLite
|
||||
Utilize oids in PostgreSQL
|
||||
Homepage customization
|
||||
Use IN for search in numeric fields (Editor)
|
||||
Use password input for _md5 and _sha1 fields (Editor)
|
||||
Work without session.use_cookies (bug #107)
|
||||
Fix saving schema to cookie in Opera
|
||||
Portuguese, Slovenian and Turkish translation
|
||||
|
||||
Adminer 3.1.0 (released 2010-11-16):
|
||||
TSV export and import
|
||||
Customizable export
|
||||
Option to show only errors in SQL command
|
||||
Link to bookmark SQL command
|
||||
Recognize $$ strings in SQL command (PostgreSQL)
|
||||
Highlight and edit SQL command in processlist
|
||||
Always display all drivers
|
||||
Timestamp at the end of export
|
||||
Link to refresh database cache (bug #96)
|
||||
Support for virtual foreign keys
|
||||
Disable XSS "protection" of IE8
|
||||
Immunity against zend.ze1_compatibility_mode (bug #86)
|
||||
Fix last page with empty result set
|
||||
Arabic translation and RTL support
|
||||
Dual licensing: Apache or GPL
|
||||
|
||||
Adminer 3.0.1 (released 2010-10-18):
|
||||
Send the form by Ctrl+Enter in all textareas
|
||||
Disable creating SQLite databases with extension other than db, sdb, sqlite
|
||||
Ability to use Adminer in a frame through customization
|
||||
Catalan translation
|
||||
MS SQL 2005 compatibility
|
||||
PostgreSQL: connect if the eponymous database does not exist
|
||||
|
||||
Adminer 3.0.0 (released 2010-10-15):
|
||||
Drivers for MS SQL, SQLite, PostgreSQL, Oracle
|
||||
Allow concurrent logins on the same server
|
||||
Allow permanent login without customization
|
||||
In-place editation in select
|
||||
Foreign key options in Table creation
|
||||
Treat binary type as hex
|
||||
Show number of tables in server overview
|
||||
Operator LIKE %%
|
||||
Remember export parameters in cookie
|
||||
Allow semicolon as CSV separator
|
||||
Schemas, sequences and types support (PostgreSQL)
|
||||
Autofocus username in login form
|
||||
Allow to insert Tab in SQL textareas and send the form by Ctrl+Enter
|
||||
Disable spellchecking in SQL textareas
|
||||
Display auto_increment value of inserted item
|
||||
Allow disabling auto_increment value export
|
||||
Prefill auto_increment column name
|
||||
Ability to jump to any page in select by JavaScript
|
||||
Display comment in table overview
|
||||
Link last page above data in select
|
||||
Link table names in SQL queries
|
||||
Hungarian, Japanese and Tamil translation
|
||||
Defer table information in database overview to JavaScript (performance)
|
||||
Big tables optimizations (performance)
|
||||
|
||||
Adminer 2.3.2 (released 2010-04-21):
|
||||
Fix COUNT(*) link
|
||||
Fix Save and continue edit
|
||||
|
||||
Adminer 2.3.1 (released 2010-04-06):
|
||||
Add Drop button to Alter pages (regression from 2.0.0)
|
||||
Link COUNT(*) result to listing
|
||||
Newlines in select query edit
|
||||
Return to referrer after edit
|
||||
Respect session.auto_start (bug #42)
|
||||
|
||||
Adminer 2.3.0 (released 2010-02-26):
|
||||
Support for permanent login (customization required)
|
||||
Search in all tables
|
||||
Show status variables
|
||||
Print sums in tables overview
|
||||
Add Delete button to Edit page (regression from 2.0.0)
|
||||
Print error summary in SQL command
|
||||
Simplify SQL syntax error message
|
||||
Show SQL query info if available
|
||||
Delete length when changing type in alter table
|
||||
Ability to check table prefix in export
|
||||
|
||||
Adminer 2.2.1 (released 2009-11-26):
|
||||
Highlight current links
|
||||
Improve concurrency
|
||||
Move number of tables to DB info (performance)
|
||||
Search by foreign keys (Editor)
|
||||
Link new item in backward keys (Editor)
|
||||
|
||||
Adminer 2.2.0 (released 2009-10-20):
|
||||
Database list - bulk drop, number of tables
|
||||
Enlarge field for enum and set definition
|
||||
Display table links above table structure
|
||||
Link URLs in select
|
||||
Display number of manipulated rows in JS confirm
|
||||
Set required memory in SQL command
|
||||
Fix removed default in ALTER
|
||||
Display whitespace in texts (bug #11)
|
||||
ClickJacking protection in modern browsers
|
||||
E-mail attachments (Editor)
|
||||
Optional year in date (Editor)
|
||||
Search operators (Editor)
|
||||
Align numbers to right in select (Editor)
|
||||
Move <h1> to $adminer->navigation (customization)
|
||||
Rename get_dbh to connection (customization)
|
||||
|
||||
Adminer 2.1.0 (released 2009-09-12):
|
||||
Edit default values directly in table creation
|
||||
Execute SQL file stored on server disk
|
||||
Display EXPLAIN in SQL query
|
||||
Compress export and import
|
||||
Display column comments in table overview
|
||||
Use ON DUPLICATE KEY UPDATE for CSV import
|
||||
Print ALTER export instead of executing it
|
||||
Click on row selects it
|
||||
Fix Editor date format
|
||||
Fix long SQL query crash (bug #3)
|
||||
Speed up simple alter table
|
||||
Traditional Chinese translation
|
||||
|
||||
Adminer 2.0.0 (released 2009-08-06):
|
||||
Editor: User friendly data editor
|
||||
Customization: Adminer class
|
||||
Create single column foreign key in table structure
|
||||
Table relations (Editor)
|
||||
Send e-mails (Editor)
|
||||
Display images in blob (Editor)
|
||||
Localize date (Editor)
|
||||
Treat tinyint(1) as bool (Editor)
|
||||
Divide types to groups in table creation
|
||||
Link e-mails in select
|
||||
Show type in field name title
|
||||
Preselect now() for timestamp columns
|
||||
Clear history
|
||||
Prefill insert by foreign key searches
|
||||
Print number of rows in SQL command
|
||||
Remove Delete button from Edit page - use mass operation for it
|
||||
Faster multiple update, clone and delete
|
||||
Faster table list in navigation
|
||||
Download version checker and syntax highlighting from HTTPS
|
||||
Use HTML Strict instead of XHTML
|
||||
Remove function minification in favor of performance and customization
|
||||
Fix grant ALL PRIVILEGES with GRANT OPTION
|
||||
Fix CSV import
|
||||
Fix work with default values
|
||||
|
||||
Adminer 1.11.1 (released 2009-07-03):
|
||||
Fix problem with enabled Filter extension
|
||||
|
||||
Adminer 1.11.0 (released 2009-07-02):
|
||||
Connection through socket by server :/path/to/socket
|
||||
Simplify export
|
||||
Display execution time in SQL query
|
||||
Relative date and time functions
|
||||
Version checker
|
||||
Save queries to history and display it on SQL page
|
||||
Display MySQL variables
|
||||
Ability to select all rows on current page of select
|
||||
Separate JavaScript functions
|
||||
Always use the default style before the external one
|
||||
Always try to use the syntax highlighter
|
||||
All privileges in user rights
|
||||
Fix FOUND_ROWS() in SQL command
|
||||
Export only selected columns in select
|
||||
Bulk database creation
|
||||
Include views in drop and move on database overview
|
||||
Hide fieldsets in select
|
||||
Automatically add new fields in table creation
|
||||
Use \n in SQL commands
|
||||
|
||||
phpMinAdmin 1.10.1 (released 2009-05-07):
|
||||
Highlight odd and hover rows
|
||||
Partition editing comfort (bug #12)
|
||||
Allow full length in limited int
|
||||
|
||||
phpMinAdmin 1.10.0 (released 2009-04-28):
|
||||
Partitioning (MySQL 5.1)
|
||||
CSV import
|
||||
Plus and minus functions
|
||||
Option to stop on error in SQL command
|
||||
Cross links to select and table (bug #2236232), link new item
|
||||
Suhosin compatibility
|
||||
Remove max_allowed_packet from export
|
||||
Read style from phpMinAdmin.css if exists
|
||||
Size reduction by minification of variables and functions
|
||||
Russian translation
|
||||
|
||||
phpMinAdmin 1.9.1 (released 2008-10-27):
|
||||
Update translations
|
||||
|
||||
phpMinAdmin 1.9.0 (released 2008-10-16):
|
||||
List of tables and views with maintenance commands
|
||||
Clone rows
|
||||
Bulk edit and clone
|
||||
Function results in edit
|
||||
NOT operators in select
|
||||
Search without column restriction
|
||||
Use type=password for unhashed password
|
||||
Only one button for each action in select
|
||||
Choose language through option-list
|
||||
XHTML syntax errors
|
||||
Don't set global variable in export
|
||||
SHOW DATABASES can be revoked
|
||||
Order by function result working also in older MySQL versions
|
||||
Tested on IIS
|
||||
|
||||
phpMinAdmin 1.8.0 (released 2008-09-12):
|
||||
Events (MySQL 5.1)
|
||||
Access without login - accept ?username=
|
||||
Print SQL query in select, messages and warnings
|
||||
Display number of found rows
|
||||
Don't wrap lines in select table
|
||||
Italian and Estonian translation
|
||||
Order by COUNT(*)
|
||||
|
||||
phpMinAdmin 1.7.0 (released 2008-08-26):
|
||||
Customizable export (select objects to export, SQL or CSV)
|
||||
Ability to alter existing tables and drop old tables in export
|
||||
Choose columns in select, aggregation
|
||||
Order rows by clicking on table heading
|
||||
Truncate only search results
|
||||
Automatically select name for trigger
|
||||
Chinese and French translation
|
||||
Preserve default values when altering table
|
||||
Maintain auto_increment when moving columns
|
||||
Smaller multilingual file
|
||||
Cache static files
|
||||
Faster checking of number of results
|
||||
|
||||
phpMinAdmin 1.6.1 (released 2008-05-22):
|
||||
Set session parameters only if not session.auto_start
|
||||
|
||||
phpMinAdmin 1.6.0 (released 2008-05-16):
|
||||
Order of columns in table
|
||||
Set max_allowed_packet in dump and use extended insert
|
||||
Spanish and German translations
|
||||
Use images for editing buttons
|
||||
Protection against big POST data
|
||||
Logout by POST
|
||||
Information about logged user
|
||||
Separate stylesheet
|
||||
Last-Modified header for files
|
||||
Several bug fixes
|
||||
|
||||
phpMinAdmin 1.5.0 (released 2008-01-09):
|
||||
Mass delete
|
||||
Vertical privileges
|
||||
Specify connection port by colon in server
|
||||
Ignore length in date and time types
|
||||
Boolean fulltext search for all columns in MyISAM
|
||||
Shrink compiled output
|
||||
Remove maxlength from server and username
|
||||
Uncheck NULL by change
|
||||
Mark shortened fields in select
|
||||
|
||||
phpMinAdmin 1.4.0 (released 2007-08-15):
|
||||
Privileges
|
||||
New design
|
||||
Dutch translation
|
||||
Use NULL for auto_increment (bug #1)
|
||||
Fix dropping procedure parameters
|
||||
|
||||
phpMinAdmin 1.3.2 (released 2007-08-06):
|
||||
Next field by JavaScript in foreign keys
|
||||
Set time zone in dump
|
||||
Refresh lang cookie
|
||||
Remember drop result in case of faulty create
|
||||
Move vertical lines in schema properly
|
||||
Fix maximum page in select
|
||||
|
||||
phpMinAdmin 1.3.1 (released 2007-07-31):
|
||||
Move references lines in schema
|
||||
Fix dump
|
||||
Fix update links
|
||||
|
||||
phpMinAdmin 1.3.0 (released 2007-07-27):
|
||||
Breadcrumb navigation
|
||||
Operator IN
|
||||
Timestamp default values
|
||||
Draggable tables in schema
|
||||
Number of rows in navigation
|
||||
Display MySQL version and used PHP extension
|
||||
More friendly user interface
|
||||
Slovak translation
|
||||
|
||||
phpMinAdmin 1.2.0 (released 2007-07-25):
|
||||
Manipulate triggers
|
||||
PDO Abstraction
|
||||
Auto_increment value
|
||||
JavaScript for adding rows
|
||||
|
||||
phpMinAdmin 1.1.0 (released 2007-07-19):
|
||||
Routines manipulation
|
||||
Views manipulation
|
||||
Foreign keys manipulation
|
||||
Database schema with references
|
||||
Processlist
|
||||
Index length
|
||||
Dump individual tables
|
||||
JavaScript for next rows in table edit
|
||||
Cache databases list
|
||||
|
||||
phpMinAdmin 1.0.0 (released 2007-07-11):
|
||||
First official release
|
34
compile.php
34
compile.php
@@ -7,7 +7,7 @@ function adminer_errors($errno, $errstr) {
|
||||
error_reporting(6135); // errors and warnings
|
||||
set_error_handler('adminer_errors', E_WARNING);
|
||||
include dirname(__FILE__) . "/adminer/include/version.inc.php";
|
||||
include dirname(__FILE__) . "/externals/JsShrink/jsShrink.php";
|
||||
include dirname(__FILE__) . "/vendor/vrana/jsshrink/jsShrink.php";
|
||||
|
||||
function add_apo_slashes($s) {
|
||||
return addcslashes($s, "\\'");
|
||||
@@ -196,7 +196,7 @@ function php_shrink($input) {
|
||||
$short_variables = array();
|
||||
$shortening = true;
|
||||
$tokens = token_get_all($input);
|
||||
|
||||
|
||||
// remove unnecessary { }
|
||||
//! change also `while () { if () {;} }` to `while () if () ;` but be careful about `if () { if () { } } else { }
|
||||
$shorten = 0;
|
||||
@@ -223,13 +223,13 @@ function php_shrink($input) {
|
||||
}
|
||||
}
|
||||
$tokens = array_values($tokens);
|
||||
|
||||
|
||||
foreach ($tokens as $i => $token) {
|
||||
if ($token[0] === T_VARIABLE && !isset($special_variables[$token[1]])) {
|
||||
$short_variables[$token[1]]++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
arsort($short_variables);
|
||||
$chars = implode(range('a', 'z')) . '_' . implode(range('A', 'Z'));
|
||||
// preserve variable names between versions if possible
|
||||
@@ -240,7 +240,7 @@ function php_shrink($input) {
|
||||
foreach (array_keys($short_variables) as $number => $key) {
|
||||
$short_variables[$key] = short_identifier($number, $chars); // could use also numbers and \x7f-\xff
|
||||
}
|
||||
|
||||
|
||||
$set = array_flip(preg_split('//', '!"#$%&\'()*+,-./:;<=>?@[]^`{|}'));
|
||||
$space = '';
|
||||
$output = '';
|
||||
@@ -418,7 +418,7 @@ if ($driver) {
|
||||
if (count($drivers) == 1) {
|
||||
$file = str_replace('<?php echo html_select("auth[driver]", $drivers, DRIVER) . "\n"; ?>', "<input type='hidden' name='auth[driver]' value='" . ($driver == "mysql" ? "server" : $driver) . "'>" . reset($drivers), $file);
|
||||
}
|
||||
$file = preg_replace('(;../externals/jush/modules/jush-(?!textarea\.|txt\.|js\.|' . preg_quote($driver == "mysql" ? "sql" : $driver) . '\.)[^.]+.js)', '', $file);
|
||||
$file = preg_replace('(;\.\./vendor/vrana/jush/modules/jush-(?!textarea\.|txt\.|js\.|' . preg_quote($driver == "mysql" ? "sql" : $driver) . '\.)[^.]+.js)', '', $file);
|
||||
$file = preg_replace_callback('~doc_link\(array\((.*)\)\)~sU', function ($match) use ($driver) {
|
||||
list(, $links) = $match;
|
||||
$links = preg_replace("~'(?!(" . ($driver == "mysql" ? "sql|mariadb" : $driver) . ")')[^']*' => [^,]*,?~", '', $links);
|
||||
@@ -427,8 +427,8 @@ if ($driver) {
|
||||
//! strip doc_link() definition
|
||||
}
|
||||
if ($project == "editor") {
|
||||
$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('~;\.\./vendor/vrana/jush/jush\.css~', '', $file);
|
||||
$file = preg_replace('~compile_file\(\'\.\./(vendor/vrana/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);
|
||||
@@ -439,18 +439,20 @@ if ($_SESSION["lang"]) {
|
||||
$file = str_replace("<?php switch_lang(); ?>\n", "", $file);
|
||||
$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 = str_replace('<link rel="stylesheet" type="text/css" href="../externals/jush/jush.css">' . "\n", "", $file);
|
||||
$file = str_replace('<?php echo script_src("static/editing.js?" . filemtime("../adminer/static/editing.js")); ?>' . "\n", "", $file);
|
||||
$file = preg_replace('~\s+echo script_src\("\.\./vendor/vrana/jush/modules/jush-(textarea|txt|js|\$jush)\.js"\);~', '', $file);
|
||||
$file = str_replace('<link rel="stylesheet" type="text/css" href="../vendor/vrana/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 . '"';
|
||||
$file = preg_replace('~\.\./adminer/static/(default\.css|favicon\.ico)~', '<?php echo h(' . $replace . '); ?>', $file);
|
||||
$file = preg_replace('~"\.\./adminer/static/(functions\.js)"~', $replace, $file);
|
||||
$replace = 'preg_replace("~\\\\\\\\?.*~", "", ME) . "?file=\1&version=' . substr(md5(microtime()), 0, 8) . '"';
|
||||
$file = preg_replace('~\.\./adminer/static/(favicon\.ico)~', '<?php echo h(' . $replace . '); ?>', $file);
|
||||
$file = preg_replace('~\.\./adminer/static/(default\.css)\?.*default.css"\);\s+\?>~', '<?php echo h(' . $replace . '); ?>', $file);
|
||||
$file = preg_replace('~"\.\./adminer/static/(functions\.js)\?".*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('~"\.\./vendor/vrana/jush/modules/(jush\.js)"~', $replace, $file);
|
||||
$file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file);
|
||||
$file = php_shrink($file);
|
||||
|
||||
$filename = $project . (preg_match('~-dev$~', $VERSION) ? "" : "-$VERSION") . ($driver ? "-$driver" : "") . ($_SESSION["lang"] ? "-$_SESSION[lang]" : "") . ".php";
|
||||
@mkdir("temp/export", 0777, true);
|
||||
$filename = "temp/export/$project" . (preg_match('~-dev$~', $VERSION) ? "" : "-$VERSION") . ($driver ? "-$driver" : "") . ($_SESSION["lang"] ? "-$_SESSION[lang]" : "") . ".php";
|
||||
file_put_contents($filename, $file);
|
||||
echo "$filename created (" . strlen($file) . " B).\n";
|
||||
|
@@ -26,11 +26,42 @@
|
||||
"GPL-2.0-only"
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.6",
|
||||
"php": "5.6 - 8.3",
|
||||
"ext-pdo": "*",
|
||||
"ext-json": "*"
|
||||
"ext-json": "*",
|
||||
"vrana/jush": "2.0.*",
|
||||
"vrana/jsshrink": "@dev"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-zlib": "*",
|
||||
"ext-suhosin": "*",
|
||||
"ext-mysqli": "*",
|
||||
"ext-mysql": "*",
|
||||
"ext-pgsql": "*",
|
||||
"ext-mongo": "*",
|
||||
"ext-sqlsrv": "*",
|
||||
"ext-mssql": "*",
|
||||
"ext-oci8": "*",
|
||||
"ext-interbase": "*",
|
||||
"ext-pdo_pgsql": "*",
|
||||
"ext-pdo_dblib": "*",
|
||||
"ext-pdo_sqlite": "*",
|
||||
"ext-pdo_oci": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-xdebug": "*"
|
||||
},
|
||||
"scripts": {
|
||||
"compile": "php compile.php"
|
||||
}
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"type": "vcs",
|
||||
"url": "https://github.com/pematon/jush.git"
|
||||
},
|
||||
{
|
||||
"type": "vcs",
|
||||
"url": "https://github.com/vrana/jsshrink.git"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@@ -62,7 +62,7 @@ if (!extension_loaded("xdebug")) {
|
||||
if (file_exists($coverage_filename)) {
|
||||
// display list of files
|
||||
$coverage = unserialize(file_get_contents($coverage_filename));
|
||||
echo "<table border='1' cellspacing='0'>\n";
|
||||
echo "<table>\n";
|
||||
foreach (array_merge(glob("adminer/*.php"), glob("adminer/include/*.php"), glob("editor/*.php"), glob("editor/include/*.php")) as $filename) {
|
||||
$cov = $coverage[realpath($filename)];
|
||||
$ratio = 0;
|
||||
|
Submodule designs/hydra updated: afcef61f66...f8aa49777e
@@ -374,7 +374,7 @@ thead td, thead th {
|
||||
padding: 7px 2px;
|
||||
}
|
||||
|
||||
thead td acronym, thead td sup, thead th acronym, thead th sup {
|
||||
thead td abbr, thead td sup, thead th acronym, thead th sup {
|
||||
color: #cdf
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
FLAT UI Flavored Adminer Theme by M. Mahbubur Rahman (mahbub@mahbubblog.com)
|
||||
FLAT UI Flavored Adminer Theme by M. Mahbubur Rahman (mahbub@mahbubblog.com)
|
||||
Screenshot : http://d.pr/i/cznH
|
||||
Based on work by : Lukáš Brandejs
|
||||
Based on work by : Lukáš Brandejs
|
||||
https://raw.github.com/vrana/adminer/master/designs/ng9/adminer.css
|
||||
*/
|
||||
|
||||
@@ -119,7 +119,7 @@ code a:hover{background:transparent}
|
||||
table{
|
||||
margin:10px 0px;
|
||||
border:1px solid #E6E6E6;
|
||||
background-color:#FFFFFF;
|
||||
background-color:#FFFFFF;
|
||||
}
|
||||
|
||||
tbody tr:hover td,tbody tr:hover th{
|
||||
@@ -133,17 +133,17 @@ thead th, thead td {
|
||||
white-space:nowrap;
|
||||
border-right:1px solid #34495e;
|
||||
background:#34495e;
|
||||
color:#FFFFFF;
|
||||
color:#FFFFFF;
|
||||
padding-right:10px;
|
||||
}
|
||||
thead th acronym, thead td acronym, thead th sup, thead td sup{
|
||||
thead th abbr, thead td acronym, thead th sup, thead td sup{
|
||||
color:#CCDDFF;
|
||||
}
|
||||
|
||||
th,td{
|
||||
border:1px solid rgba(233,233,233,.3);
|
||||
padding:3px 6px;
|
||||
vertical-align:top;
|
||||
vertical-align:top;
|
||||
}
|
||||
|
||||
th a {
|
||||
@@ -269,12 +269,12 @@ input[name=logout]:hover {
|
||||
background:#ea0202;
|
||||
}
|
||||
|
||||
#logins a, #tables a {
|
||||
#logins a, #tables a {
|
||||
background:none;
|
||||
}
|
||||
|
||||
#logins a:hover, #tables a:hover {
|
||||
|
||||
#logins a:hover, #tables a:hover {
|
||||
|
||||
}
|
||||
|
||||
#logout {
|
||||
@@ -283,7 +283,7 @@ input[name=logout]:hover {
|
||||
}
|
||||
|
||||
#logout:hover {
|
||||
color:red;
|
||||
color:red;
|
||||
}
|
||||
|
||||
.logout {
|
||||
@@ -308,14 +308,14 @@ input[name=logout]:hover {
|
||||
|
||||
|
||||
input[type=submit] {
|
||||
font-size:13px;
|
||||
font-size:13px;
|
||||
font-weight:normal;
|
||||
-moz-border-radius:1px;
|
||||
-webkit-border-radius:1px;
|
||||
border-radius:1px;
|
||||
border:0px solid #469df5;
|
||||
padding:4px 12px;
|
||||
text-decoration:none;
|
||||
text-decoration:none;
|
||||
background-color:#65ADC3;
|
||||
color:#ffffff;
|
||||
display:inline-block;
|
||||
@@ -324,7 +324,7 @@ input[type=submit] {
|
||||
-moz-box-shadow:inset 0px 0px 0px 0px #cae3fc;
|
||||
box-shadow:inset 0px 0px 0px 0px #cae3fc;
|
||||
}
|
||||
input[type=submit]:hover {
|
||||
input[type=submit]:hover {
|
||||
background-color:#34495e;
|
||||
text-shadow:0px 1px 0px #000;
|
||||
}
|
||||
|
Submodule designs/pepa-linha-dark updated: 81eb3c4870...0f4f3789af
@@ -11,11 +11,11 @@ if ($adminer->homepage()) {
|
||||
echo "<table cellspacing='0' class='nowrap checkable'>\n";
|
||||
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
|
||||
echo '<thead><tr class="wrap">';
|
||||
echo '<td><input id="check-all" type="checkbox" class="jsonly">' . script("qs('#check-all').onclick = partial(formCheck, /^tables\[/);", "");
|
||||
echo '<td><input id="check-all" type="checkbox" class="jsonly">' . script("gid('check-all').onclick = partial(formCheck, /^tables\[/);", "");
|
||||
echo '<th>' . lang('Table');
|
||||
echo '<td>' . lang('Rows');
|
||||
echo "</thead>\n";
|
||||
|
||||
|
||||
foreach (table_status() as $table => $row) {
|
||||
$name = $adminer->tableName($row);
|
||||
if (isset($row["Engine"]) && $name != "") {
|
||||
@@ -25,7 +25,7 @@ if ($adminer->homepage()) {
|
||||
echo "<td align='right'><a href='" . h(ME . "edit=") . urlencode($table) . "'>" . ($row["Engine"] == "InnoDB" && $val ? "~ $val" : $val) . "</a>";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
echo "</table>\n";
|
||||
echo "</div>\n";
|
||||
echo "</form>\n";
|
||||
|
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
class Adminer {
|
||||
var $operators = array("<=", ">=");
|
||||
var $operator_like = null;
|
||||
var $operator_regexp = null;
|
||||
var $_values = array();
|
||||
|
||||
function name() {
|
||||
@@ -16,14 +18,17 @@ class Adminer {
|
||||
function connectSsl() {
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \Random\RandomException
|
||||
*/
|
||||
function permanentLogin($create = false) {
|
||||
return password_file($create);
|
||||
return get_private_key($create);
|
||||
}
|
||||
|
||||
function bruteForceKey() {
|
||||
return $_SERVER["REMOTE_ADDR"];
|
||||
}
|
||||
|
||||
|
||||
function serverName($server) {
|
||||
}
|
||||
|
||||
@@ -72,7 +77,7 @@ class Adminer {
|
||||
|
||||
function loginForm() {
|
||||
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('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(gid('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";
|
||||
@@ -202,7 +207,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
$return = (preg_match('~^(1|t|true|y|yes|on)$~i', $val) ? lang('yes') : lang('no'));
|
||||
}
|
||||
if ($link) {
|
||||
$return = "<a href='$link'" . (is_url($link) ? target_blank() : "") . ">$return</a>";
|
||||
$return = "<a href='$link'" . (is_web_url($link) ? target_blank() : "") . ">$return</a>";
|
||||
}
|
||||
if (!$link && !like_bool($field) && preg_match(number_type(), $field["type"])) {
|
||||
$return = "<div class='number'>$return</div>"; // Firefox doesn't support <colgroup>
|
||||
@@ -259,15 +264,20 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
if (($val["col"] == "" || $columns[$val["col"]]) && "$val[col]$val[val]" != "") {
|
||||
echo "<div><select name='where[$i][col]'><option value=''>(" . lang('anywhere') . ")" . optionlist($columns, $val["col"], true) . "</select>";
|
||||
echo html_select("where[$i][op]", array(-1 => "") + $this->operators, $val["op"]);
|
||||
echo "<input type='search' name='where[$i][val]' value='" . h($val["val"]) . "'>" . script("mixin(qsl('input'), {onkeydown: selectSearchKeydown, onsearch: selectSearchSearch});", "") . "</div>\n";
|
||||
echo "<input type='search' name='where[$i][val]' value='" . h($val["val"]) . "'>" . script("mixin(qsl('input'), {onkeydown: selectSearchKeydown, onsearch: selectSearchSearch});", "");
|
||||
echo " <input type='image' src='../adminer/static/cross.gif' class='jsonly icon remove' title='" . h(lang('Remove')) . "' alt='x'>" . script('qsl("#fieldset-search .remove").onclick = selectRemoveRow;', "");
|
||||
echo "</div>\n";
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
echo "<div><select name='where[$i][col]'><option value=''>(" . lang('anywhere') . ")" . optionlist($columns, null, true) . "</select>";
|
||||
echo script("qsl('select').onchange = selectAddRow;", "");
|
||||
echo html_select("where[$i][op]", array(-1 => "") + $this->operators);
|
||||
echo "<input type='search' name='where[$i][val]'></div>";
|
||||
echo "<input type='search' name='where[$i][val]'>";
|
||||
echo script("mixin(qsl('input'), {onchange: function () { this.parentNode.firstChild.onchange(); }, onsearch: selectSearchSearch});");
|
||||
echo " <input type='image' src='../adminer/static/cross.gif' class='jsonly icon remove' title='" . h(lang('Remove')) . "' alt='x'>";
|
||||
echo script('qsl("#fieldset-search .remove").onclick = selectRemoveRow;', "");
|
||||
echo "</div>";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
|
||||
@@ -342,35 +352,44 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
|
||||
function selectSearchProcess($fields, $indexes) {
|
||||
global $driver;
|
||||
$return = array();
|
||||
|
||||
$return = [];
|
||||
|
||||
foreach ((array) $_GET["where"] as $key => $where) {
|
||||
$col = $where["col"];
|
||||
$op = $where["op"];
|
||||
$val = $where["val"];
|
||||
if (($key < 0 ? "" : $col) . $val != "") {
|
||||
$conds = array();
|
||||
foreach (($col != "" ? array($col => $fields[$col]) : $fields) as $name => $field) {
|
||||
|
||||
if (($key >= 0 && $col != "") || $val != "") {
|
||||
$conds = [];
|
||||
|
||||
foreach (($col != "" ? [$col => $fields[$col]] : $fields) as $name => $field) {
|
||||
if ($col != "" || is_numeric($val) || !preg_match(number_type(), $field["type"])) {
|
||||
$name = idf_escape($name);
|
||||
|
||||
if ($col != "" && $field["type"] == "enum") {
|
||||
$conds[] = (in_array(0, $val) ? "$name IS NULL OR " : "") . "$name IN (" . implode(", ", array_map('intval', $val)) . ")";
|
||||
} else {
|
||||
$text_type = preg_match('~char|text|enum|set~', $field["type"]);
|
||||
$value = $this->processInput($field, (!$op && $text_type && preg_match('~^[^%]+$~', $val) ? "%$val%" : $val));
|
||||
$conds[] = $driver->convertSearch($name, $val, $field) . ($value == "NULL" ? " IS" . ($op == ">=" ? " NOT" : "") . " $value"
|
||||
|
||||
$conds[] = $driver->convertSearch($name, $where, $field) . ($value == "NULL" ? " IS" . ($op == ">=" ? " NOT" : "") . " $value"
|
||||
: (in_array($op, $this->operators) || $op == "=" ? " $op $value"
|
||||
: ($text_type ? " LIKE $value"
|
||||
: " IN (" . str_replace(",", "', '", $value) . ")"
|
||||
)));
|
||||
|
||||
if ($key < 0 && $val == "0") {
|
||||
$conds[] = "$name IS NULL";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$return[] = ($conds ? "(" . implode(" OR ", $conds) . ")" : "1 = 0");
|
||||
}
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
@@ -471,7 +490,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
return $return;
|
||||
}
|
||||
|
||||
function editInput($table, $field, $attrs, $value) {
|
||||
function editInput($table, $field, $attrs, $value, $function) {
|
||||
if ($field["type"] == "enum") {
|
||||
return (isset($_GET["select"]) ? "<label><input type='radio'$attrs value='-1' checked><i>" . lang('original') . "</i></label> " : "")
|
||||
. enum_input("radio", $attrs, $field, ($value || isset($_GET["select"]) ? $value : 0), ($field["null"] ? "" : null))
|
||||
@@ -499,7 +518,9 @@ qsl('div').onclick = whisperClick;", "")
|
||||
$hint = lang('[yyyy]-mm-dd') . ($hint ? " [$hint]" : "");
|
||||
}
|
||||
if ($hint) {
|
||||
return "<input value='" . h($value) . "'$attrs> ($hint)"; //! maxlength
|
||||
return "<input"
|
||||
. ($function != "now" ? " value='" . h($value) . "'" : " data-last-value='" . h($value) . "'")
|
||||
. "$attrs> ($hint)"; //! maxlength
|
||||
}
|
||||
if (preg_match('~_(md5|sha1)$~i', $field["field"])) {
|
||||
return "<input type='password' value='" . h($value) . "'$attrs>";
|
||||
@@ -570,6 +591,7 @@ qsl('div').onclick = whisperClick;", "")
|
||||
}
|
||||
|
||||
function importServerPath() {
|
||||
return null;
|
||||
}
|
||||
|
||||
function homepage() {
|
||||
@@ -580,8 +602,15 @@ qsl('div').onclick = whisperClick;", "")
|
||||
global $VERSION;
|
||||
?>
|
||||
<h1>
|
||||
<?php echo $this->name(); ?> <span class="version"><?php echo $VERSION; ?></span>
|
||||
<a href="https://www.adminer.org/editor/#download"<?php echo target_blank(); ?> id="version"><?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?></a>
|
||||
<?php echo $this->name(); ?>
|
||||
<?php if ($missing != "auth"): ?>
|
||||
<span class="version">
|
||||
<?php echo $VERSION; ?>
|
||||
<a href="https://github.com/pematon/adminer/releases"<?php echo target_blank(); ?> id="version">
|
||||
<?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?>
|
||||
</a>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</h1>
|
||||
<?php
|
||||
if ($missing == "auth") {
|
||||
@@ -591,7 +620,7 @@ qsl('div').onclick = whisperClick;", "")
|
||||
if ($password !== null) {
|
||||
if ($first) {
|
||||
echo "<ul id='logins'>";
|
||||
echo script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
echo script("mixin(gid('logins'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
$first = false;
|
||||
}
|
||||
echo "<li><a href='" . h(auth_url($vendor, "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a>\n";
|
||||
@@ -605,6 +634,7 @@ qsl('div').onclick = whisperClick;", "")
|
||||
if (!$table_status) {
|
||||
echo "<p class='message'>" . lang('No tables.') . "\n";
|
||||
} else {
|
||||
$this->printTablesFilter();
|
||||
$this->tablesPrint($table_status);
|
||||
}
|
||||
}
|
||||
@@ -614,19 +644,32 @@ qsl('div').onclick = whisperClick;", "")
|
||||
function databasesPrint($missing) {
|
||||
}
|
||||
|
||||
function printTablesFilter()
|
||||
{
|
||||
global $adminer;
|
||||
|
||||
echo "<div class='tables-filter jsonly'>"
|
||||
. "<input id='tables-filter' autocomplete='off' placeholder='" . lang('Table') . "'>"
|
||||
. script("initTablesFilter(" . json_encode($adminer->database()) . ");")
|
||||
. "</div>\n";
|
||||
}
|
||||
|
||||
function tablesPrint($tables) {
|
||||
echo "<ul id='tables'>";
|
||||
echo script("mixin(qs('#tables'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
echo "<ul id='tables'>" . script("mixin(gid('tables'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
|
||||
foreach ($tables as $row) {
|
||||
echo '<li>';
|
||||
$name = $this->tableName($row);
|
||||
if (isset($row["Engine"]) && $name != "") { // ignore views and tables without name
|
||||
echo "<a href='" . h(ME) . 'select=' . urlencode($row["Name"]) . "'"
|
||||
. bold($_GET["select"] == $row["Name"] || $_GET["edit"] == $row["Name"], "select")
|
||||
. " title='" . lang('Select data') . "'>$name</a>\n"
|
||||
;
|
||||
// Skip views and tables without a name.
|
||||
if (!isset($row["Engine"]) || ($name = $this->tableName($row)) == "") {
|
||||
continue;
|
||||
}
|
||||
|
||||
$active = $_GET["select"] == $row["Name"] || $_GET["edit"] == $row["Name"];
|
||||
|
||||
echo '<li><a href="' . h(ME) . 'select=' . urlencode($row["Name"]) . '"'
|
||||
. bold($active, "select")
|
||||
. " title='" . lang('Select data') . "' data-main='true'>$name</a></li>\n";
|
||||
}
|
||||
|
||||
echo "</ul>\n";
|
||||
}
|
||||
|
||||
@@ -640,6 +683,8 @@ qsl('div').onclick = whisperClick;", "")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function _foreignKeyOptions($table, $column, $value = null) {
|
||||
|
@@ -17,7 +17,7 @@ function email_header($header) {
|
||||
* @return bool
|
||||
*/
|
||||
function send_mail($email, $subject, $message, $from = "", $files = array()) {
|
||||
$eol = (DIRECTORY_SEPARATOR == "/" ? "\n" : "\r\n"); // PHP_EOL available since PHP 5.0.2
|
||||
$eol = "\r\n";
|
||||
$message = str_replace("\n", $eol, wordwrap(str_replace("\r", "", "$message\n")));
|
||||
$boundary = uniqid("boundary");
|
||||
$attachments = "";
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user