mirror of
https://github.com/vrana/adminer.git
synced 2025-09-02 10:53:09 +02:00
Compare commits
74 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
5dab5ae23e | ||
|
41c71f8854 | ||
|
b0e5c1d6e4 | ||
|
7d3d46e509 | ||
|
9bd23b1395 | ||
|
93f8a0e7ed | ||
|
e6810258bd | ||
|
aac223e279 | ||
|
75f9aa9e7d | ||
|
05170899dc | ||
|
69890ffc48 | ||
|
025d77c7c6 | ||
|
de95807eaf | ||
|
833fa22e3f | ||
|
9e0aa1b91a | ||
|
f2e1243fb7 | ||
|
0d683fd57c | ||
|
9683342792 | ||
|
cdd8448908 | ||
|
3578517e15 | ||
|
2d853b633a | ||
|
089093d4b1 | ||
|
39b977bd80 | ||
|
0aff6e06a6 | ||
|
b36bd12291 | ||
|
fb32c10f94 | ||
|
7ff1d82903 | ||
|
cca943015f | ||
|
48f82b3454 | ||
|
91d43b574b | ||
|
6258c975c1 | ||
|
e12d12524f | ||
|
a43a9fbd52 | ||
|
79ae6d8541 | ||
|
60ea595cdc | ||
|
ebd2e4f5b4 | ||
|
806efe5e2d | ||
|
54d3239cfb | ||
|
7198ad5229 | ||
|
01d8fe112c | ||
|
510cd2e068 | ||
|
7dbd929600 | ||
|
6c9ac63508 | ||
|
ab0dc19c9f | ||
|
4aa7647a55 | ||
|
db2709d15a | ||
|
5f5d114dac | ||
|
dadaa02b52 | ||
|
e277d05162 | ||
|
ef3946ee52 | ||
|
57f6d296fb | ||
|
bd35de5a6b | ||
|
64816a3d7a | ||
|
6e8c89ee71 | ||
|
3f6136205d | ||
|
1500a3f2c8 | ||
|
63236ea5d1 | ||
|
c6398736ac | ||
|
dc25ccec0d | ||
|
364d18f166 | ||
|
e7c2d09fa8 | ||
|
646af54e7b | ||
|
96191587cc | ||
|
dea16493ff | ||
|
d7c14b16b1 | ||
|
986433dd3a | ||
|
a70089f8ce | ||
|
49eefa2585 | ||
|
3693992650 | ||
|
30847c97eb | ||
|
9b179bca21 | ||
|
ce03585210 | ||
|
22dc4ff444 | ||
|
2b6a262d56 |
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@@ -1,3 +1,3 @@
|
||||
github: vrana
|
||||
patreon: jakubvrana
|
||||
custom: ["https://www.paypal.com/donate/?item_name=Donation+to+Adminer&business=jakub%40vrana.cz"]
|
||||
custom: ["https://www.paypal.com/donate/?hosted_button_id=6PK5VNUCFT3FG"]
|
||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,9 +1,6 @@
|
||||
[submodule "jush"]
|
||||
path = externals/jush
|
||||
url = https://github.com/vrana/jush
|
||||
[submodule "JsShrink"]
|
||||
path = externals/JsShrink
|
||||
url = https://github.com/vrana/JsShrink
|
||||
[submodule "PhpShrink"]
|
||||
path = externals/PhpShrink
|
||||
url = https://github.com/vrana/PhpShrink
|
||||
|
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,3 +1,17 @@
|
||||
## Adminer dev
|
||||
- Autocomplete SQL commands
|
||||
- Do not edit NULL values by Modify (bug #967)
|
||||
- PostgreSQL: Support COPY FROM stdin in SQL query (bug #942)
|
||||
- MySQL: Display number of found rows in group queries (regression from 5.1.1)
|
||||
- non-MySQL: Parse '--' without trailing space as comment in SQL command (bug SF-842)
|
||||
- MS SQL: Limit one INSERT in export to 1000 rows (bug #983)
|
||||
- CSS: Add logo
|
||||
- Editor: Move mass sending e-mails to a plugin
|
||||
- Plugins: Support translations by extending Adminer\Plugin
|
||||
- New plugin: Configure options by end-users and store them to a cookie
|
||||
- New plugin: Configure menu table links
|
||||
- New plugin: Set up driver, server and database in Adminer Editor
|
||||
|
||||
## Adminer 5.1.1 (released 2025-04-02)
|
||||
- Export: Fix tar (regression from 5.0.3)
|
||||
- Select: Allow ordering by COUNT(*) (bug #966, regression from 5.0.2)
|
||||
|
@@ -18,9 +18,6 @@ If downloaded from Git then run: `git submodule update --init`
|
||||
- `adminer/index.php` - Run development version of Adminer
|
||||
- `editor/index.php` - Run development version of Adminer Editor
|
||||
- `editor/example.php` - Example customization
|
||||
- `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/*.html` - Katalon Recorder test suites
|
||||
|
@@ -41,7 +41,7 @@ if (!$error && $_POST) {
|
||||
if (!$result) {
|
||||
echo "<p class='error'>" . error() . "\n";
|
||||
} else {
|
||||
$connection2 = connect(adminer()->credentials());
|
||||
$connection2 = connect();
|
||||
if ($connection2) {
|
||||
$connection2->select_db(DB);
|
||||
}
|
||||
|
@@ -189,7 +189,7 @@ if (support("columns") || $TABLE == "") {
|
||||
echo ($engines ? html_select("Engine", array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . on_help("event.target.value", 1) . script("qsl('select').onchange = helpClose;") . "\n" : "");
|
||||
if ($collations) {
|
||||
echo "<datalist id='collations'>" . optionlist($collations) . "</datalist>\n";
|
||||
echo (preg_match("~sqlite|mssql~", JUSH) ? "" : "<input list='collations' name='Collation' value='" . h($row["Collation"]) . "' placeholder='(" . lang('collation') . ")'>");
|
||||
echo (preg_match("~sqlite|mssql~", JUSH) ? "" : "<input list='collations' name='Collation' value='" . h($row["Collation"]) . "' placeholder='(" . lang('collation') . ")'>\n");
|
||||
}
|
||||
echo "<input type='submit' value='" . lang('Save') . "'>\n";
|
||||
}
|
||||
|
@@ -149,9 +149,9 @@ if (adminer()->homepage()) {
|
||||
$databases = (support("scheme") ? adminer()->schemas() : adminer()->databases());
|
||||
if (count($databases) != 1 && JUSH != "sqlite") {
|
||||
$db = (isset($_POST["target"]) ? $_POST["target"] : (support("scheme") ? $_GET["ns"] : DB));
|
||||
echo "<p>" . lang('Move to other database') . ": ";
|
||||
echo "<p><label>" . lang('Move to other database') . ": ";
|
||||
echo ($databases ? html_select("target", $databases, $db) : '<input name="target" value="' . h($db) . '" autocapitalize="off">');
|
||||
echo " <input type='submit' name='move' value='" . lang('Move') . "'>";
|
||||
echo "</label> <input type='submit' name='move' value='" . lang('Move') . "'>";
|
||||
echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'> " . checkbox("overwrite", 1, $_POST["overwrite"], lang('overwrite')) : "");
|
||||
echo "\n";
|
||||
}
|
||||
|
@@ -13,7 +13,7 @@ if (isset($_GET["mssql"])) {
|
||||
define('Adminer\DRIVER', "mssql");
|
||||
if (extension_loaded("sqlsrv") && $_GET["ext"] != "pdo") {
|
||||
class Db extends SqlDb {
|
||||
public string $extension = "sqlsrv";
|
||||
public $extension = "sqlsrv";
|
||||
private $link, $result;
|
||||
|
||||
private function get_error() {
|
||||
@@ -178,7 +178,7 @@ if (isset($_GET["mssql"])) {
|
||||
|
||||
if (extension_loaded("pdo_sqlsrv")) {
|
||||
class Db extends MssqlDb {
|
||||
public string $extension = "PDO_SQLSRV";
|
||||
public $extension = "PDO_SQLSRV";
|
||||
|
||||
function attach(?string $server, string $username, string $password): string {
|
||||
return $this->dsn("sqlsrv:Server=" . str_replace(":", ",", $server), $username, $password);
|
||||
@@ -187,7 +187,7 @@ if (isset($_GET["mssql"])) {
|
||||
|
||||
} elseif (extension_loaded("pdo_dblib")) {
|
||||
class Db extends MssqlDb {
|
||||
public string $extension = "PDO_DBLIB";
|
||||
public $extension = "PDO_DBLIB";
|
||||
|
||||
function attach(?string $server, string $username, string $password): string {
|
||||
return $this->dsn("dblib:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\d)~', ';port=\1', $server)), $username, $password);
|
||||
@@ -198,20 +198,20 @@ if (isset($_GET["mssql"])) {
|
||||
|
||||
|
||||
class Driver extends SqlDriver {
|
||||
static array $extensions = array("SQLSRV", "PDO_SQLSRV", "PDO_DBLIB");
|
||||
static string $jush = "mssql";
|
||||
static $extensions = array("SQLSRV", "PDO_SQLSRV", "PDO_DBLIB");
|
||||
static $jush = "mssql";
|
||||
|
||||
public array $insertFunctions = array("date|time" => "getdate");
|
||||
public array $editFunctions = array(
|
||||
public $insertFunctions = array("date|time" => "getdate");
|
||||
public $editFunctions = array(
|
||||
"int|decimal|real|float|money|datetime" => "+/-",
|
||||
"char|text" => "+",
|
||||
);
|
||||
|
||||
public array $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL");
|
||||
public array $functions = array("len", "lower", "round", "upper");
|
||||
public array $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||
public array $generated = array("PERSISTED", "VIRTUAL");
|
||||
public string $onActions = "NO ACTION|CASCADE|SET NULL|SET DEFAULT";
|
||||
public $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL");
|
||||
public $functions = array("len", "lower", "round", "upper");
|
||||
public $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||
public $generated = array("PERSISTED", "VIRTUAL");
|
||||
public $onActions = "NO ACTION|CASCADE|SET NULL|SET DEFAULT";
|
||||
|
||||
static function connect(?string $server, string $username, string $password) {
|
||||
if ($server == "") {
|
||||
|
@@ -9,7 +9,7 @@ if (!defined('Adminer\DRIVER')) {
|
||||
if (extension_loaded("mysqli") && $_GET["ext"] != "pdo") {
|
||||
class Db extends \MySQLi {
|
||||
/** @var Db */ static $instance;
|
||||
public string $extension = "MySQLi", $flavor = '';
|
||||
public $extension = "MySQLi", $flavor = '';
|
||||
|
||||
function __construct() {
|
||||
parent::init();
|
||||
@@ -113,7 +113,7 @@ if (!defined('Adminer\DRIVER')) {
|
||||
}
|
||||
|
||||
class Result {
|
||||
public int $num_rows; // number of rows in the result
|
||||
public $num_rows; // number of rows in the result
|
||||
/** @var resource */ private $result;
|
||||
private int $offset = 0;
|
||||
|
||||
@@ -155,7 +155,7 @@ if (!defined('Adminer\DRIVER')) {
|
||||
|
||||
} elseif (extension_loaded("pdo_mysql")) {
|
||||
class Db extends PdoDb {
|
||||
public string $extension = "PDO_MySQL";
|
||||
public $extension = "PDO_MySQL";
|
||||
|
||||
function attach(?string $server, string $username, string $password): string {
|
||||
$options = array(\PDO::MYSQL_ATTR_LOCAL_INFILE => false);
|
||||
@@ -202,13 +202,13 @@ if (!defined('Adminer\DRIVER')) {
|
||||
|
||||
|
||||
class Driver extends SqlDriver {
|
||||
/** @var list<string> */ static array $extensions = array("MySQLi", "MySQL", "PDO_MySQL");
|
||||
static string $jush = "sql"; // JUSH identifier
|
||||
static $extensions = array("MySQLi", "MySQL", "PDO_MySQL");
|
||||
static $jush = "sql"; // JUSH identifier
|
||||
|
||||
/** @var list<string> */ public array $unsigned = array("unsigned", "zerofill", "unsigned zerofill");
|
||||
/** @var list<string> */ public array $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "FIND_IN_SET", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL");
|
||||
/** @var list<string> */ public array $functions = array("char_length", "date", "from_unixtime", "lower", "round", "floor", "ceil", "sec_to_time", "time_to_sec", "upper");
|
||||
/** @var list<string> */ public array $grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum");
|
||||
public $unsigned = array("unsigned", "zerofill", "unsigned zerofill");
|
||||
public $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "FIND_IN_SET", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL");
|
||||
public $functions = array("char_length", "date", "from_unixtime", "lower", "round", "floor", "ceil", "sec_to_time", "time_to_sec", "upper");
|
||||
public $grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum");
|
||||
|
||||
static function connect(?string $server, string $username, string $password) {
|
||||
$connection = parent::connect($server, $username, $password);
|
||||
|
@@ -7,7 +7,7 @@ if (isset($_GET["oracle"])) {
|
||||
define('Adminer\DRIVER', "oracle");
|
||||
if (extension_loaded("oci8") && $_GET["ext"] != "pdo") {
|
||||
class Db extends SqlDb {
|
||||
public string $extension = "oci8";
|
||||
public $extension = "oci8";
|
||||
public $_current_db;
|
||||
private $link;
|
||||
|
||||
@@ -102,7 +102,7 @@ if (isset($_GET["oracle"])) {
|
||||
|
||||
} elseif (extension_loaded("pdo_oci")) {
|
||||
class Db extends PdoDb {
|
||||
public string $extension = "PDO_OCI";
|
||||
public $extension = "PDO_OCI";
|
||||
public $_current_db;
|
||||
|
||||
function attach(?string $server, string $username, string $password): string {
|
||||
@@ -120,22 +120,22 @@ if (isset($_GET["oracle"])) {
|
||||
|
||||
|
||||
class Driver extends SqlDriver {
|
||||
static array $extensions = array("OCI8", "PDO_OCI");
|
||||
static string $jush = "oracle";
|
||||
static $extensions = array("OCI8", "PDO_OCI");
|
||||
static $jush = "oracle";
|
||||
|
||||
public array $insertFunctions = array( //! no parentheses
|
||||
public $insertFunctions = array( //! no parentheses
|
||||
"date" => "current_date",
|
||||
"timestamp" => "current_timestamp",
|
||||
);
|
||||
public array $editFunctions = array(
|
||||
public $editFunctions = array(
|
||||
"number|float|double" => "+/-",
|
||||
"date|timestamp" => "+ interval/- interval",
|
||||
"char|clob" => "||",
|
||||
);
|
||||
|
||||
public array $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL");
|
||||
public array $functions = array("length", "lower", "round", "upper");
|
||||
public array $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||
public $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL");
|
||||
public $functions = array("length", "lower", "round", "upper");
|
||||
public $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||
|
||||
function __construct(Db $connection) {
|
||||
parent::__construct($connection);
|
||||
|
@@ -6,9 +6,9 @@ add_driver("pgsql", "PostgreSQL");
|
||||
if (isset($_GET["pgsql"])) {
|
||||
define('Adminer\DRIVER', "pgsql");
|
||||
if (extension_loaded("pgsql") && $_GET["ext"] != "pdo") {
|
||||
class Db extends SqlDb {
|
||||
public string $extension = "PgSQL";
|
||||
public int $timeout = 0;
|
||||
class PgsqlDb extends SqlDb {
|
||||
public $extension = "PgSQL";
|
||||
public $timeout = 0;
|
||||
private $link, $string, $database = true;
|
||||
|
||||
function _error($errno, $error) {
|
||||
@@ -88,6 +88,19 @@ if (isset($_GET["pgsql"])) {
|
||||
function warnings() {
|
||||
return h(pg_last_notice($this->link)); // second parameter is available since PHP 7.1.0
|
||||
}
|
||||
|
||||
/** Copy from array into a table
|
||||
* @param list<string> $rows
|
||||
*/
|
||||
function copyFrom(string $table, array $rows): bool {
|
||||
$this->error = '';
|
||||
set_error_handler(function ($errno, $error) {
|
||||
$this->error = (ini_bool('html_errors') ? html_entity_decode($error) : $error);
|
||||
});
|
||||
$return = pg_copy_from($this->link, $table, $rows);
|
||||
restore_error_handler();
|
||||
return $return;
|
||||
}
|
||||
}
|
||||
|
||||
class Result {
|
||||
@@ -123,9 +136,9 @@ if (isset($_GET["pgsql"])) {
|
||||
}
|
||||
|
||||
} elseif (extension_loaded("pdo_pgsql")) {
|
||||
class Db extends PdoDb {
|
||||
public string $extension = "PDO_PgSQL";
|
||||
public int $timeout = 0;
|
||||
class PgsqlDb extends PdoDb {
|
||||
public $extension = "PDO_PgSQL";
|
||||
public $timeout = 0;
|
||||
|
||||
function attach(?string $server, string $username, string $password): string {
|
||||
$db = adminer()->database();
|
||||
@@ -155,6 +168,12 @@ if (isset($_GET["pgsql"])) {
|
||||
// not implemented in PDO_PgSQL as of PHP 7.2.1
|
||||
}
|
||||
|
||||
function copyFrom(string $table, array $rows): bool {
|
||||
$return = $this->pdo->pgsqlCopyFromArray($table, $rows);
|
||||
$this->error = idx($this->pdo->errorInfo(), 2) ?: '';
|
||||
return $return;
|
||||
}
|
||||
|
||||
function close() {
|
||||
}
|
||||
}
|
||||
@@ -163,13 +182,28 @@ if (isset($_GET["pgsql"])) {
|
||||
|
||||
|
||||
|
||||
class Driver extends SqlDriver {
|
||||
static array $extensions = array("PgSQL", "PDO_PgSQL");
|
||||
static string $jush = "pgsql";
|
||||
if (class_exists('Adminer\PgsqlDb')) {
|
||||
class Db extends PgsqlDb {
|
||||
function multi_query(string $query) {
|
||||
if (preg_match('~\bCOPY\s+(.+?)\s+FROM\s+stdin;\n?(.*)\n\\\\\.$~is', str_replace("\r\n", "\n", $query), $match)) { // no ^ to allow leading comments
|
||||
$rows = explode("\n", $match[2]);
|
||||
$this->affected_rows = count($rows);
|
||||
return $this->copyFrom($match[1], $rows);
|
||||
}
|
||||
return parent::multi_query($query);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public array $operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "SQL" to avoid CSRF
|
||||
public array $functions = array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper");
|
||||
public array $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||
|
||||
|
||||
class Driver extends SqlDriver {
|
||||
static $extensions = array("PgSQL", "PDO_PgSQL");
|
||||
static $jush = "pgsql";
|
||||
|
||||
public $operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "SQL" to avoid CSRF
|
||||
public $functions = array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper");
|
||||
public $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||
|
||||
static function connect(?string $server, string $username, string $password) {
|
||||
$connection = parent::connect($server, $username, $password);
|
||||
|
@@ -8,7 +8,7 @@ if (isset($_GET["sqlite"])) {
|
||||
if (class_exists("SQLite3") && $_GET["ext"] != "pdo") {
|
||||
|
||||
abstract class SqliteDb extends SqlDb {
|
||||
public string $extension = "SQLite3";
|
||||
public $extension = "SQLite3";
|
||||
private $link;
|
||||
|
||||
function attach(?string $filename, string $username, string $password): string {
|
||||
@@ -73,7 +73,7 @@ if (isset($_GET["sqlite"])) {
|
||||
|
||||
} elseif (extension_loaded("pdo_sqlite")) {
|
||||
abstract class SqliteDb extends PdoDb {
|
||||
public string $extension = "PDO_SQLite";
|
||||
public $extension = "PDO_SQLite";
|
||||
|
||||
function attach(?string $filename, string $username, string $password): string {
|
||||
$this->dsn(DRIVER . ":$filename", "", "");
|
||||
@@ -106,21 +106,21 @@ if (isset($_GET["sqlite"])) {
|
||||
|
||||
|
||||
class Driver extends SqlDriver {
|
||||
static array $extensions = array("SQLite3", "PDO_SQLite");
|
||||
static string $jush = "sqlite";
|
||||
static $extensions = array("SQLite3", "PDO_SQLite");
|
||||
static $jush = "sqlite";
|
||||
|
||||
protected array $types = array(array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0));
|
||||
protected $types = array(array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0));
|
||||
|
||||
public array $insertFunctions = array(); // "text" => "date('now')/time('now')/datetime('now')",
|
||||
public array $editFunctions = array(
|
||||
public $insertFunctions = array(); // "text" => "date('now')/time('now')/datetime('now')",
|
||||
public $editFunctions = array(
|
||||
"integer|real|numeric" => "+/-",
|
||||
// "text" => "date/time/datetime",
|
||||
"text" => "||",
|
||||
);
|
||||
|
||||
public array $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"); // REGEXP can be user defined function
|
||||
public array $functions = array("hex", "length", "lower", "round", "unixepoch", "upper");
|
||||
public array $grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum");
|
||||
public $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"); // REGEXP can be user defined function
|
||||
public $functions = array("hex", "length", "lower", "round", "unixepoch", "upper");
|
||||
public $grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum");
|
||||
|
||||
static function connect(?string $server, string $username, string $password) {
|
||||
if ($password != "") {
|
||||
@@ -704,7 +704,7 @@ if (isset($_GET["sqlite"])) {
|
||||
function show_status() {
|
||||
$return = array();
|
||||
foreach (get_vals("PRAGMA compile_options") as $option) {
|
||||
$return[] = explode("=", $option, 2);
|
||||
$return[] = explode("=", $option, 2) + array('', '');
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
@@ -11,10 +11,9 @@ if (substr(VERSION, -4) != '-dev') {
|
||||
header("Cache-Control: immutable");
|
||||
}
|
||||
|
||||
if ($_GET["file"] == "favicon.ico") {
|
||||
header("Content-Type: image/x-icon");
|
||||
echo lzw_decompress(compile_file('../adminer/static/favicon.ico', 'lzw_compress'));
|
||||
} elseif ($_GET["file"] == "default.css") {
|
||||
@ini_set("zlib.output_compression", 1); // @ - may be disabled
|
||||
|
||||
if ($_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'));
|
||||
} elseif ($_GET["file"] == "dark.css") {
|
||||
@@ -26,6 +25,7 @@ if ($_GET["file"] == "favicon.ico") {
|
||||
} 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-autocomplete-sql.js;
|
||||
../externals/jush/modules/jush-textarea.js;
|
||||
../externals/jush/modules/jush-txt.js;
|
||||
../externals/jush/modules/jush-js.js;
|
||||
@@ -35,5 +35,8 @@ if ($_GET["file"] == "favicon.ico") {
|
||||
../externals/jush/modules/jush-mssql.js;
|
||||
../externals/jush/modules/jush-oracle.js;
|
||||
../externals/jush/modules/jush-simpledb.js', 'minify_js'));
|
||||
} elseif ($_GET["file"] == "logo.png") {
|
||||
header("Content-Type: image/png");
|
||||
echo compile_file('../adminer/static/logo.png');
|
||||
}
|
||||
exit;
|
||||
|
@@ -67,12 +67,12 @@ if ($row["ns"] != "") {
|
||||
$referencable = array_keys(array_filter(table_status('', true), 'Adminer\fk_support'));
|
||||
$target = array_keys(fields(in_array($row["table"], $referencable) ? $row["table"] : reset($referencable)));
|
||||
$onchange = "this.form['change-js'].value = '1'; this.form.submit();";
|
||||
echo "<p>" . lang('Target table') . ": " . html_select("table", $referencable, $row["table"], $onchange) . "\n";
|
||||
echo "<p><label>" . lang('Target table') . ": " . html_select("table", $referencable, $row["table"], $onchange) . "</label>\n";
|
||||
if (support("scheme")) {
|
||||
$schemas = array_filter(adminer()->schemas(), function ($schema) {
|
||||
return !preg_match('~^information_schema$~i', $schema);
|
||||
});
|
||||
echo lang('Schema') . ": " . html_select("ns", $schemas, $row["ns"] != "" ? $row["ns"] : $_GET["ns"], $onchange);
|
||||
echo "<label>" . lang('Schema') . ": " . html_select("ns", $schemas, $row["ns"] != "" ? $row["ns"] : $_GET["ns"], $onchange) . "</label>";
|
||||
if ($row["ns"] != "") {
|
||||
set_schema($orig_schema);
|
||||
}
|
||||
@@ -83,7 +83,7 @@ if (support("scheme")) {
|
||||
$dbs[] = $db;
|
||||
}
|
||||
}
|
||||
echo lang('DB') . ": " . html_select("db", $dbs, $row["db"] != "" ? $row["db"] : $_GET["db"], $onchange);
|
||||
echo "<label>" . lang('DB') . ": " . html_select("db", $dbs, $row["db"] != "" ? $row["db"] : $_GET["db"], $onchange) . "</label>";
|
||||
}
|
||||
echo input_hidden("change-js");
|
||||
?>
|
||||
@@ -101,8 +101,8 @@ foreach ($row["source"] as $key => $val) {
|
||||
?>
|
||||
</table>
|
||||
<p>
|
||||
<?php echo lang('ON DELETE'); ?>: <?php echo html_select("on_delete", array(-1 => "") + explode("|", driver()->onActions), $row["on_delete"]); ?>
|
||||
<?php echo lang('ON UPDATE'); ?>: <?php echo html_select("on_update", array(-1 => "") + explode("|", driver()->onActions), $row["on_update"]); ?>
|
||||
<label><?php echo lang('ON DELETE'); ?>: <?php echo html_select("on_delete", array(-1 => "") + explode("|", driver()->onActions), $row["on_delete"]); ?></label>
|
||||
<label><?php echo lang('ON UPDATE'); ?>: <?php echo html_select("on_update", array(-1 => "") + explode("|", driver()->onActions), $row["on_update"]); ?></label>
|
||||
<?php echo doc_link(array(
|
||||
'sql' => "innodb-foreign-key-constraints.html",
|
||||
'mariadb' => "foreign-keys/",
|
||||
|
@@ -12,7 +12,7 @@ class Adminer {
|
||||
* @return string HTML code
|
||||
*/
|
||||
function name(): string {
|
||||
return "<a href='https://www.adminer.org/'" . target_blank() . " id='h1'>Adminer</a>";
|
||||
return "<a href='https://www.adminer.org/'" . target_blank() . " id='h1'><img src='../adminer/static/logo.png' width='24' height='24' alt='' id='logo'>Adminer</a>";
|
||||
}
|
||||
|
||||
/** Connection parameters
|
||||
@@ -300,6 +300,13 @@ class Adminer {
|
||||
return $val;
|
||||
}
|
||||
|
||||
/** Get configuration options for AdminerConfig
|
||||
* @return string[] key is config description, value is HTML
|
||||
*/
|
||||
function config(): array {
|
||||
return array();
|
||||
}
|
||||
|
||||
/** Print table structure in tabular format
|
||||
* @param Field[] $fields
|
||||
* @param TableStatus $tableStatus
|
||||
@@ -536,7 +543,7 @@ class Adminer {
|
||||
} elseif ($val["op"] == "SQL") {
|
||||
$cond = " $val[val]"; // SQL injection
|
||||
} elseif ($val["op"] == "LIKE %%") {
|
||||
$cond = " LIKE " . adminer()->processInput($fields[$val["col"]], "%$val[val]%");
|
||||
$cond = " LIKE " . adminer()->processInput(idx($fields, $val["col"], array()), "%$val[val]%"); // this is used by search anywhere which doesn't set $val["col"]
|
||||
} elseif ($val["op"] == "ILIKE %%") {
|
||||
$cond = " ILIKE " . adminer()->processInput($fields[$val["col"]], "%$val[val]%");
|
||||
} elseif ($val["op"] == "FIND_IN_SET") {
|
||||
@@ -816,6 +823,7 @@ class Adminer {
|
||||
$generated = array();
|
||||
$suffix = "";
|
||||
$fetch_function = ($table != '' ? 'fetch_assoc' : 'fetch_row');
|
||||
$count = 0;
|
||||
while ($row = $result->$fetch_function()) {
|
||||
if (!$keys) {
|
||||
$values = array();
|
||||
@@ -855,13 +863,17 @@ class Adminer {
|
||||
$s = ($max_packet ? "\n" : " ") . "(" . implode(",\t", $row) . ")";
|
||||
if (!$buffer) {
|
||||
$buffer = $insert . $s;
|
||||
} elseif (strlen($buffer) + 4 + strlen($s) + strlen($suffix) < $max_packet) { // 4 - length specification
|
||||
} elseif (JUSH == 'mssql'
|
||||
? $count % 1000 != 0 // https://learn.microsoft.com/en-us/sql/t-sql/queries/table-value-constructor-transact-sql#limitations-and-restrictions
|
||||
: strlen($buffer) + 4 + strlen($s) + strlen($suffix) < $max_packet // 4 - length specification
|
||||
) {
|
||||
$buffer .= ",$s";
|
||||
} else {
|
||||
echo $buffer . $suffix;
|
||||
$buffer = $insert . $s;
|
||||
}
|
||||
}
|
||||
$count++;
|
||||
}
|
||||
if ($buffer) {
|
||||
echo $buffer . $suffix;
|
||||
@@ -993,12 +1005,13 @@ class Adminer {
|
||||
*/
|
||||
function syntaxHighlighting(array $tables): void {
|
||||
// this is matched by compile.php
|
||||
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("../externals/jush/modules/jush.js", true);
|
||||
echo script_src("../externals/jush/modules/jush-autocomplete-sql.js", true);
|
||||
echo script_src("../externals/jush/modules/jush-textarea.js", true);
|
||||
echo script_src("../externals/jush/modules/jush-txt.js", true);
|
||||
echo script_src("../externals/jush/modules/jush-js.js", true);
|
||||
if (support("sql")) {
|
||||
echo script_src("../externals/jush/modules/jush-" . JUSH . ".js");
|
||||
echo script_src("../externals/jush/modules/jush-" . JUSH . ".js", true);
|
||||
echo "<script" . nonce() . ">\n";
|
||||
if ($tables) {
|
||||
$links = array();
|
||||
@@ -1009,12 +1022,17 @@ class Adminer {
|
||||
foreach (array("bac", "bra", "sqlite_quo", "mssql_bra") as $val) {
|
||||
echo "jushLinks.$val = jushLinks." . JUSH . ";\n";
|
||||
}
|
||||
$tablesColumns = array_fill_keys(array_keys($tables), array());
|
||||
foreach (driver()->allFields() as $table => $fields) {
|
||||
foreach ($fields as $field) {
|
||||
$tablesColumns[$table][] = $field["field"];
|
||||
}
|
||||
}
|
||||
echo "addEventListener('DOMContentLoaded', () => { autocompleter = jush.autocompleteSql('" . idf_escape("") . "', " . json_encode($tablesColumns) . "); });\n";
|
||||
}
|
||||
echo "</script>\n";
|
||||
}
|
||||
echo script("syntaxHighlighting('" . preg_replace('~^(\d\.?\d).*~s', '\1', connection()->server_info) . "'"
|
||||
. (connection()->flavor == 'maria' ? ", 'maria'" : (connection()->flavor == 'cockroach' ? ", 'cockroach'" : "")) . ");"
|
||||
);
|
||||
echo script("syntaxHighlighting('" . preg_replace('~^(\d\.?\d).*~s', '\1', connection()->server_info) . "', '" . connection()->flavor . "');");
|
||||
}
|
||||
|
||||
/** Print databases list in menu */
|
||||
@@ -1026,14 +1044,14 @@ class Adminer {
|
||||
echo "<form action=''>\n<p id='dbs'>\n";
|
||||
hidden_fields_get();
|
||||
$db_events = script("mixin(qsl('select'), {onmousedown: dbMouseDown, onchange: dbChange});");
|
||||
echo "<span title='" . lang('Database') . "'>" . lang('DB') . ":</span> " . ($databases
|
||||
echo "<label title='" . lang('Database') . "'>" . lang('DB') . ": " . ($databases
|
||||
? html_select("db", array("" => "") + $databases, DB) . $db_events
|
||||
: "<input name='db' value='" . h(DB) . "' autocapitalize='off' size='19'>\n"
|
||||
);
|
||||
) . "</label>";
|
||||
echo "<input type='submit' value='" . lang('Use') . "'" . ($databases ? " class='hidden'" : "") . ">\n";
|
||||
if (support("scheme")) {
|
||||
if ($missing != "db" && DB != "" && connection()->select_db(DB)) {
|
||||
echo "<br><span>" . lang('Schema') . ":</span> " . html_select("ns", array("" => "") + adminer()->schemas(), $_GET["ns"]) . $db_events;
|
||||
echo "<br><label>" . lang('Schema') . ": " . html_select("ns", array("" => "") + adminer()->schemas(), $_GET["ns"]) . "$db_events</label>";
|
||||
if ($_GET["ns"] != "") {
|
||||
set_schema($_GET["ns"]);
|
||||
}
|
||||
@@ -1062,7 +1080,7 @@ class Adminer {
|
||||
;
|
||||
echo (support("table") || support("indexes")
|
||||
? '<a href="' . h(ME) . 'table=' . urlencode($table) . '"'
|
||||
. bold(in_array($table, array($_GET["table"], $_GET["create"], $_GET["indexes"], $_GET["foreign"], $_GET["trigger"])), (is_view($status) ? "view" : "structure"))
|
||||
. bold(in_array($table, array($_GET["table"], $_GET["create"], $_GET["indexes"], $_GET["foreign"], $_GET["trigger"], $_GET["check"], $_GET["view"])), (is_view($status) ? "view" : "structure"))
|
||||
. " title='" . lang('Show structure') . "'>$name</a>"
|
||||
: "<span>$name</span>"
|
||||
) . "\n";
|
||||
|
@@ -79,14 +79,13 @@ include "../adminer/drivers/oracle.inc.php";
|
||||
include "../adminer/drivers/mssql.inc.php";
|
||||
include "./include/adminer.inc.php";
|
||||
include "../adminer/include/plugins.inc.php";
|
||||
include "../adminer/include/plugin.inc.php";
|
||||
|
||||
if (function_exists('adminer_object')) {
|
||||
Adminer::$instance = adminer_object();
|
||||
} elseif (is_dir("adminer-plugins") || file_exists("adminer-plugins.php")) {
|
||||
Adminer::$instance = new Plugins(null);
|
||||
} else {
|
||||
Adminer::$instance = new Adminer;
|
||||
}
|
||||
Adminer::$instance =
|
||||
(function_exists('adminer_object') ? adminer_object() :
|
||||
(is_dir("adminer-plugins") || file_exists("adminer-plugins.php") ? new Plugins(null) :
|
||||
new Adminer
|
||||
));
|
||||
|
||||
// this is matched by compile.php
|
||||
include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
|
||||
|
@@ -44,14 +44,7 @@ if (
|
||||
}
|
||||
echo "<p>" . lang('%s version: %s through PHP extension %s', get_driver(DRIVER), "<b>" . h(connection()->server_info) . "</b>", "<b>" . connection()->extension . "</b>") . "\n";
|
||||
echo "<p>" . lang('Logged as: %s', "<b>" . h(logged_user()) . "</b>") . "\n";
|
||||
if (isset(adminer()->plugins) && is_array(adminer()->plugins)) {
|
||||
echo "<p>" . lang('Loaded plugins') . ":\n<ul>\n";
|
||||
foreach (adminer()->plugins as $plugin) {
|
||||
$reflection = new \ReflectionObject($plugin);
|
||||
echo "<li><b>" . get_class($plugin) . "</b>" . h(preg_match('~^/[\s*]+(.+)~', $reflection->getDocComment(), $match) ? ": $match[1]" : "") . "\n";
|
||||
}
|
||||
echo "</ul>\n";
|
||||
}
|
||||
|
||||
$databases = adminer()->databases();
|
||||
if ($databases) {
|
||||
$scheme = support("scheme");
|
||||
@@ -69,7 +62,6 @@ if (
|
||||
;
|
||||
|
||||
$databases = ($_GET["dbsize"] ? count_tables($databases) : array_flip($databases));
|
||||
|
||||
foreach ($databases as $db => $tables) {
|
||||
$root = h(ME) . "db=" . urlencode($db);
|
||||
$id = h("Db-" . $db);
|
||||
@@ -96,6 +88,17 @@ if (
|
||||
echo "</form>\n";
|
||||
echo script("tableCheck();");
|
||||
}
|
||||
|
||||
if (isset(adminer()->plugins) && is_array(adminer()->plugins)) {
|
||||
echo "<div class='plugins'>\n";
|
||||
echo "<h3>" . lang('Loaded plugins') . "</h3>\n<ul>\n";
|
||||
foreach (adminer()->plugins as $plugin) {
|
||||
$reflection = new \ReflectionObject($plugin);
|
||||
echo "<li><b>" . get_class($plugin) . "</b>" . h(preg_match('~^/[\s*]+(.+)~', $reflection->getDocComment(), $match) ? ": $match[1]" : "") . "\n";
|
||||
}
|
||||
echo "</ul>\n";
|
||||
echo "</div>\n";
|
||||
}
|
||||
}
|
||||
|
||||
page_footer("db");
|
||||
|
@@ -6,13 +6,13 @@ namespace Adminer;
|
||||
abstract class SqlDb {
|
||||
/** @var Db */ static $instance;
|
||||
|
||||
public string $extension; // extension name
|
||||
public string $flavor = ''; // different vendor with the same API, e.g. MariaDB; usually stays empty
|
||||
public string $server_info; // server version
|
||||
public int $affected_rows = 0; // number of affected rows
|
||||
public string $info = ''; // see https://php.net/mysql_info
|
||||
public int $errno = 0; // last error code
|
||||
public string $error = ''; // last error message
|
||||
/** @var string */ public $extension; // extension name
|
||||
/** @var string */ public $flavor = ''; // different vendor with the same API, e.g. MariaDB; usually stays empty
|
||||
/** @var string */ public $server_info; // server version
|
||||
/** @var int */ public $affected_rows = 0; // number of affected rows
|
||||
/** @var string */ public $info = ''; // see https://php.net/mysql_info
|
||||
/** @var int */ public $errno = 0; // last error code
|
||||
/** @var string */ public $error = ''; // last error message
|
||||
/** @var Result|bool */ protected $multi; // used for multiquery
|
||||
|
||||
/** Connect to server
|
||||
|
@@ -13,7 +13,7 @@ function page_header(string $title, string $error = "", $breadcrumb = array(), s
|
||||
exit;
|
||||
}
|
||||
if (!ob_get_level()) {
|
||||
ob_start(null, 4096);
|
||||
ob_start('ob_gzhandler', 4096);
|
||||
}
|
||||
$title_all = $title . ($title2 != "" ? ": $title2" : "");
|
||||
$title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . adminer()->name());
|
||||
@@ -51,11 +51,11 @@ function page_header(string $title, string $error = "", $breadcrumb = array(), s
|
||||
echo script_src("../adminer/static/functions.js");
|
||||
echo script_src("static/editing.js");
|
||||
if (adminer()->head($dark)) {
|
||||
echo "<link rel='shortcut icon' type='image/x-icon' href='../adminer/static/favicon.ico'>\n";
|
||||
echo "<link rel='apple-touch-icon' href='../adminer/static/favicon.ico'>\n";
|
||||
echo "<link rel='icon' href='data:image/gif;base64,R0lGODlhEAAQAJEAAAQCBPz+/PwCBAROZCH5BAEAAAAALAAAAAAQABAAAAI2hI+pGO1rmghihiUdvUBnZ3XBQA7f05mOak1RWXrNq5nQWHMKvuoJ37BhVEEfYxQzHjWQ5qIAADs='>\n";
|
||||
echo "<link rel='apple-touch-icon' href='../adminer/static/logo.png'>\n";
|
||||
}
|
||||
foreach ($css as $val) {
|
||||
echo "<link rel='stylesheet'" . (preg_match('~-dark~', $val) && !$dark ? $media : "") . " href='" . h($val) . "'>\n";
|
||||
echo "<link rel='stylesheet'" . (preg_match('~-dark\.~', $val) && !$dark ? $media : "") . " href='" . h($val) . "'>\n";
|
||||
}
|
||||
echo "\n<body class='" . lang('ltr') . " nojs'>\n";
|
||||
$filename = get_temp_dir() . "/adminer.version";
|
||||
|
@@ -12,23 +12,23 @@ function get_driver(string $id): string {
|
||||
}
|
||||
|
||||
abstract class SqlDriver {
|
||||
static Driver $instance;
|
||||
/** @var string[] */ static array $drivers = array(); // all available drivers
|
||||
/** @var list<string> */ static array $extensions = array(); // possible extensions in the current driver
|
||||
static string $jush; // JUSH identifier
|
||||
/** @var Driver */ static $instance;
|
||||
/** @var string[] */ static $drivers = array(); // all available drivers
|
||||
/** @var list<string> */ static $extensions = array(); // possible extensions in the current driver
|
||||
/** @var string */ static $jush; // JUSH identifier
|
||||
|
||||
protected Db $conn;
|
||||
/** @var int[][] */ protected array $types = array(); // [$group => [$type => $maximum_unsigned_length, ...], ...]
|
||||
/** @var string[] */ public array $insertFunctions = array(); // ["$type|$type2" => "$function/$function2"] functions used in edit and insert
|
||||
/** @var string[] */ public array $editFunctions = array(); // ["$type|$type2" => "$function/$function2"] functions used in edit only
|
||||
/** @var list<string> */ public array $unsigned = array(); // number variants
|
||||
/** @var list<string> */ public array $operators = array(); // operators used in select
|
||||
/** @var list<string> */ public array $functions = array(); // functions used in select
|
||||
/** @var list<string> */ public array $grouping = array(); // grouping functions used in select
|
||||
public string $onActions = "RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT"; // used in foreign_keys()
|
||||
public string $inout = "IN|OUT|INOUT"; // used in routines
|
||||
public string $enumLength = "'(?:''|[^'\\\\]|\\\\.)*'"; // regular expression for parsing enum lengths
|
||||
/** @var list<string> */ public array $generated = array(); // allowed types of generated columns
|
||||
/** @var Db */ protected $conn;
|
||||
/** @var int[][] */ protected $types = array(); // [$group => [$type => $maximum_unsigned_length, ...], ...]
|
||||
/** @var string[] */ public $insertFunctions = array(); // ["$type|$type2" => "$function/$function2"] functions used in edit and insert
|
||||
/** @var string[] */ public $editFunctions = array(); // ["$type|$type2" => "$function/$function2"] functions used in edit only
|
||||
/** @var list<string> */ public $unsigned = array(); // number variants
|
||||
/** @var list<string> */ public $operators = array(); // operators used in select
|
||||
/** @var list<string> */ public $functions = array(); // functions used in select
|
||||
/** @var list<string> */ public $grouping = array(); // grouping functions used in select
|
||||
/** @var string */ public $onActions = "RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT"; // used in foreign_keys()
|
||||
/** @var string */ public $inout = "IN|OUT|INOUT"; // used in routines
|
||||
/** @var string */ public $enumLength = "'(?:''|[^'\\\\]|\\\\.)*'"; // regular expression for parsing enum lengths
|
||||
/** @var list<string> */ public $generated = array(); // allowed types of generated columns
|
||||
|
||||
/** Connect to the database
|
||||
* @return Db|string string for error
|
||||
|
@@ -24,10 +24,9 @@ function driver(): Driver {
|
||||
return Driver::$instance;
|
||||
}
|
||||
|
||||
/** Connect to the database
|
||||
* @param array{?string, string, string} $credentials [$server, $username, $password]
|
||||
*/
|
||||
function connect(array $credentials): ?Db {
|
||||
/** Connect to the database */
|
||||
function connect(): ?Db {
|
||||
$credentials = adminer()->credentials();
|
||||
$return = Driver::connect($credentials[0], $credentials[1], $credentials[2]);
|
||||
return (is_object($return) ? $return : null);
|
||||
}
|
||||
@@ -349,7 +348,9 @@ function get_setting(string $key, string $cookie = "adminer_settings") {
|
||||
* @param mixed[] $settings
|
||||
*/
|
||||
function save_settings(array $settings, string $cookie = "adminer_settings"): void {
|
||||
cookie($cookie, http_build_query($settings + get_settings($cookie)));
|
||||
$value = http_build_query($settings + get_settings($cookie));
|
||||
cookie($cookie, $value);
|
||||
$_COOKIE[$cookie] = $value;
|
||||
}
|
||||
|
||||
/** Restart stopped session */
|
||||
@@ -831,7 +832,7 @@ function slow_query(string $query): array {
|
||||
$slow_query = driver()->slowQuery($query, $timeout);
|
||||
$connection2 = null;
|
||||
if (!$slow_query && support("kill")) {
|
||||
$connection2 = connect(adminer()->credentials());
|
||||
$connection2 = connect();
|
||||
if ($connection2 && ($db == "" || $connection2->select_db($db))) {
|
||||
$kill = get_val(connection_id(), 0, $connection2); // MySQL and MySQLi can use thread_id but it's not in PDO_MySQL
|
||||
echo script("const timeout = setTimeout(() => { ajax('" . js_escape(ME) . "script=kill', function () {}, 'kill=$kill&token=" . get_token() . "'); }, 1000 * $timeout);");
|
||||
|
@@ -7,8 +7,8 @@ function script(string $source, string $trailing = "\n"): string {
|
||||
}
|
||||
|
||||
/** Return <script src> element */
|
||||
function script_src(string $url): string {
|
||||
return "<script src='" . h($url) . "'" . nonce() . "></script>\n";
|
||||
function script_src(string $url, bool $defer = false): string {
|
||||
return "<script src='" . h($url) . "'" . nonce() . ($defer ? " defer" : "") . "></script>\n";
|
||||
}
|
||||
|
||||
/** Get a nonce="" attribute with CSP nonce */
|
||||
@@ -90,9 +90,17 @@ function optionlist($options, $selected = null, bool $use_keys = false): string
|
||||
* @param string[] $options
|
||||
*/
|
||||
function html_select(string $name, array $options, ?string $value = "", string $onchange = "", string $labelled_by = ""): string {
|
||||
static $label = 0;
|
||||
$label_option = "";
|
||||
if (!$labelled_by && substr($options[""], 0, 1) == "(") {
|
||||
$label++;
|
||||
$labelled_by = "label-$label";
|
||||
$label_option = "<option value='' id='$labelled_by'>" . h($options[""]);
|
||||
unset($options[""]);
|
||||
}
|
||||
return "<select name='" . h($name) . "'"
|
||||
. ($labelled_by ? " aria-labelledby='$labelled_by'" : "")
|
||||
. ">" . optionlist($options, $value) . "</select>"
|
||||
. ">" . $label_option . optionlist($options, $value) . "</select>"
|
||||
. ($onchange ? script("qsl('select').onchange = function () { $onchange };", "") : "")
|
||||
;
|
||||
}
|
||||
@@ -100,10 +108,10 @@ function html_select(string $name, array $options, ?string $value = "", string $
|
||||
/** Generate HTML radio list
|
||||
* @param string[] $options
|
||||
*/
|
||||
function html_radios(string $name, array $options, string $value = ""): string {
|
||||
function html_radios(string $name, array $options, ?string $value = "", string $separator = ""): string {
|
||||
$return = "";
|
||||
foreach ($options as $key => $val) {
|
||||
$return .= "<label><input type='radio' name='" . h($name) . "' value='" . h($key) . "'" . ($key == $value ? " checked" : "") . ">" . h($val) . "</label>";
|
||||
$return .= "<label><input type='radio' name='" . h($name) . "' value='" . h($key) . "'" . ($key == $value ? " checked" : "") . ">" . h($val) . "</label>$separator";
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
@@ -1,7 +1,48 @@
|
||||
<?php
|
||||
namespace Adminer;
|
||||
|
||||
// not used in a single language version
|
||||
/** Translate string
|
||||
* @param literal-string $idf
|
||||
* @param float|string $number
|
||||
*/
|
||||
function lang(string $idf, $number = null): string {
|
||||
$args = func_get_args();
|
||||
// this is matched by compile.php
|
||||
$args[0] = Lang::$translations[$idf] ?: $idf;
|
||||
return call_user_func_array('Adminer\lang_format', $args);
|
||||
}
|
||||
|
||||
/** Format translation, usable also by plugins
|
||||
* @param string|list<string> $translation
|
||||
* @param float|string $number
|
||||
*/
|
||||
function lang_format($translation, $number = null): string {
|
||||
if (is_array($translation)) {
|
||||
// this is matched by compile.php
|
||||
$pos = ($number == 1 ? 0
|
||||
: (LANG == 'cs' || LANG == 'sk' ? ($number && $number < 5 ? 1 : 2) // different forms for 1, 2-4, other
|
||||
: (LANG == 'fr' ? (!$number ? 0 : 1) // different forms for 0-1, other
|
||||
: (LANG == 'pl' ? ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2) // different forms for 1, 2-4 except 12-14, other
|
||||
: (LANG == 'sl' ? ($number % 100 == 1 ? 0 : ($number % 100 == 2 ? 1 : ($number % 100 == 3 || $number % 100 == 4 ? 2 : 3))) // different forms for 1, 2, 3-4, other
|
||||
: (LANG == 'lt' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 12-19, other
|
||||
: (LANG == 'lv' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number ? 1 : 2)) // different forms for 1 except 11, other, 0
|
||||
: (in_array(LANG, array('bs', 'ru', 'sr', 'uk')) ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1 except 11, 2-4 except 12-14, other
|
||||
: 1)))))))) // different forms for 1, other
|
||||
; // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
|
||||
$translation = $translation[$pos];
|
||||
}
|
||||
$translation = str_replace("'", '’', $translation); // translations can contain HTML or be used in optionlist (we couldn't escape them here) but they can also be used e.g. in title='' //! escape plaintext translations
|
||||
$args = func_get_args();
|
||||
array_shift($args);
|
||||
$format = str_replace("%d", "%s", $translation);
|
||||
if ($format != $translation) {
|
||||
$args[0] = format_number($number);
|
||||
}
|
||||
return vsprintf($format, $args);
|
||||
}
|
||||
|
||||
// this is matched by compile.php
|
||||
// not used in a single language version from here
|
||||
|
||||
/** Get available languages
|
||||
* @return string[]
|
||||
@@ -56,40 +97,9 @@ function langs(): array {
|
||||
);
|
||||
}
|
||||
|
||||
/** Translate string
|
||||
* @param literal-string $idf
|
||||
* @param float|string $number
|
||||
*/
|
||||
function lang(string $idf, $number = null): string {
|
||||
// this is matched by compile.php
|
||||
$translation = (Lang::$translations[$idf] ?: $idf);
|
||||
if (is_array($translation)) {
|
||||
// this is matched by compile.php
|
||||
$pos = ($number == 1 ? 0
|
||||
: (LANG == 'cs' || LANG == 'sk' ? ($number && $number < 5 ? 1 : 2) // different forms for 1, 2-4, other
|
||||
: (LANG == 'fr' ? (!$number ? 0 : 1) // different forms for 0-1, other
|
||||
: (LANG == 'pl' ? ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2) // different forms for 1, 2-4 except 12-14, other
|
||||
: (LANG == 'sl' ? ($number % 100 == 1 ? 0 : ($number % 100 == 2 ? 1 : ($number % 100 == 3 || $number % 100 == 4 ? 2 : 3))) // different forms for 1, 2, 3-4, other
|
||||
: (LANG == 'lt' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 12-19, other
|
||||
: (LANG == 'lv' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number ? 1 : 2)) // different forms for 1 except 11, other, 0
|
||||
: (in_array(LANG, array('bs', 'ru', 'sr', 'uk')) ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1 except 11, 2-4 except 12-14, other
|
||||
: 1)))))))) // different forms for 1, other
|
||||
; // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
|
||||
$translation = $translation[$pos];
|
||||
}
|
||||
$translation = str_replace("'", '’', $translation); // translations can contain HTML or be used in optionlist (we couldn't escape them here) but they can also be used e.g. in title='' //! escape plaintext translations
|
||||
$args = func_get_args();
|
||||
array_shift($args);
|
||||
$format = str_replace("%d", "%s", $translation);
|
||||
if ($format != $translation) {
|
||||
$args[0] = format_number($number);
|
||||
}
|
||||
return vsprintf($format, $args);
|
||||
}
|
||||
|
||||
function switch_lang(): void {
|
||||
echo "<form action='' method='post'>\n<div id='lang'>";
|
||||
echo lang('Language') . ": " . html_select("lang", langs(), LANG, "this.form.submit();");
|
||||
echo "<label>" . lang('Language') . ": " . html_select("lang", langs(), LANG, "this.form.submit();") . "</label>";
|
||||
echo " <input type='submit' value='" . lang('Use') . "' class='hidden'>\n";
|
||||
echo input_token();
|
||||
echo "</div>\n</form>\n";
|
||||
|
16
adminer/include/plugin.inc.php
Normal file
16
adminer/include/plugin.inc.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
namespace Adminer;
|
||||
|
||||
abstract class Plugin {
|
||||
/** @var array<literal-string, string|list<string>>[] */ protected static $translations = array(); // key is language code
|
||||
|
||||
/** Translate a string from static::$translations; use Adminer\lang() for strings used by Adminer
|
||||
* @param literal-string $idf
|
||||
* @param float|string $number
|
||||
*/
|
||||
protected function lang(string $idf, $number = null) {
|
||||
$args = func_get_args();
|
||||
$args[0] = idx(static::$translations[LANG], $idf) ?: $idf;
|
||||
return call_user_func_array('Adminer\lang_format', $args);
|
||||
}
|
||||
}
|
@@ -2,7 +2,7 @@
|
||||
namespace Adminer;
|
||||
|
||||
class Plugins {
|
||||
/** @var true[] */ private static array $append = array('dumpFormat' => true, 'dumpOutput' => true, 'editRowPrint' => true, 'editFunctions' => true); // these hooks expect the value to be appended to the result
|
||||
/** @var true[] */ private static array $append = array('dumpFormat' => true, 'dumpOutput' => true, 'editRowPrint' => true, 'editFunctions' => true, 'config' => true); // these hooks expect the value to be appended to the result
|
||||
|
||||
/** @var list<object> @visibility protected(set) */ public array $plugins;
|
||||
/** @visibility protected(set) */ public string $error = ''; // HTML
|
||||
|
@@ -1,4 +1,4 @@
|
||||
<?php
|
||||
namespace Adminer;
|
||||
|
||||
const VERSION = "5.1.1";
|
||||
const VERSION = "5.2.0-dev";
|
||||
|
@@ -106,7 +106,7 @@ $show_options = ($_POST ? $_POST["options"] : get_setting("index_options"));
|
||||
<thead><tr>
|
||||
<th id="label-type"><?php echo lang('Index Type'); ?>
|
||||
<th><input type="submit" class="wayoff"><?php
|
||||
echo lang('Column') . ($lengths ? "<span class='idxopts" . ($show_options ? "" : " hidden") . "'> (" . lang('length') . ")</span>" : "");
|
||||
echo lang('Columns') . ($lengths ? "<span class='idxopts" . ($show_options ? "" : " hidden") . "'> (" . lang('length') . ")</span>" : "");
|
||||
if ($lengths || support("descidx")) {
|
||||
echo checkbox("options", 1, $show_options, lang('Options'), "indexOptionsShow(this.checked)", "jsonly") . "\n";
|
||||
}
|
||||
|
@@ -212,11 +212,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'ثنائية',
|
||||
'Lists' => 'قوائم',
|
||||
'Editor' => 'المحرر',
|
||||
'E-mail' => 'البريد الإلكتروني',
|
||||
'From' => 'من',
|
||||
'Subject' => 'الموضوع',
|
||||
'Send' => 'إرسال',
|
||||
'%d e-mail(s) have been sent.' => 'تم إرسال %d رسالة.',
|
||||
'Webserver file %s' => 'ملف %s من خادم الويب',
|
||||
'File does not exist.' => 'الملف غير موجود.',
|
||||
'%d in total' => '%d في المجموع',
|
||||
@@ -251,7 +246,6 @@ Lang::$translations = array(
|
||||
'Network' => 'شبكة',
|
||||
'Geometry' => 'هندسة',
|
||||
'File exists.' => 'الملف موجود.',
|
||||
'Attachments' => 'ملفات مرفقة',
|
||||
'Item%s has been inserted.' => '%sتم إدراج العنصر.',
|
||||
'now' => 'الآن',
|
||||
'%d query(s) executed OK.' => array('تم تنفيذ الاستعلام %d بنجاح.', 'تم تنفيذ الاستعلامات %d بنجاح.'),
|
||||
|
@@ -279,13 +279,6 @@ Lang::$translations = array(
|
||||
'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' => 'Дата и час',
|
||||
|
@@ -214,11 +214,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'বাইনারি',
|
||||
'Lists' => 'তালিকা',
|
||||
'Editor' => 'সম্পাদক',
|
||||
'E-mail' => 'ই-মেইল',
|
||||
'From' => 'থেকে',
|
||||
'Subject' => 'বিষয়',
|
||||
'Send' => 'পাঠান',
|
||||
'%d e-mail(s) have been sent.' => array('%d ইমেইল(গুলি) পাঠানো হয়েছে।', '%d ইমেইল(গুলি) পাঠানো হয়েছে।'),
|
||||
'Webserver file %s' => 'ওয়েবসার্ভার ফাইল %s',
|
||||
'File does not exist.' => 'ফাইলটির কোন অস্তিত্ব নেই।',
|
||||
'%d in total' => 'সর্বমোটঃ %d টি',
|
||||
@@ -252,7 +247,6 @@ Lang::$translations = array(
|
||||
'Network' => 'নেটওয়ার্ক',
|
||||
'Geometry' => 'জ্যামিতি',
|
||||
'File exists.' => 'ফাইল রয়েছে।',
|
||||
'Attachments' => 'সংযুক্তিগুলো',
|
||||
'%d query(s) executed OK.' => array('SQL-অনুসন্ধান সফলভাবে সম্পন্ন হয়েছে।', '%d SQL-অনুসন্ধানসমূহ সফলভাবে সম্পন্ন হয়েছে।'),
|
||||
'Show only errors' => 'শুধুমাত্র ত্রুটিগুলো দেখান',
|
||||
'Refresh' => 'রিফ্রেশ',
|
||||
|
@@ -264,13 +264,6 @@ Lang::$translations = array(
|
||||
'Delete' => 'Izbriši',
|
||||
'Modify' => 'Izmjene',
|
||||
|
||||
'E-mail' => 'El. pošta',
|
||||
'From' => 'Od',
|
||||
'Subject' => 'Naslov',
|
||||
'Attachments' => 'Prilozi',
|
||||
'Send' => 'Pošalji',
|
||||
'%d e-mail(s) have been sent.' => array('%d poruka el. pošte je poslata.', '%d poruke el. pošte su poslate.', '%d poruka el. pošte je poslato.'),
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Broj',
|
||||
'Date and time' => 'Datum i vrijeme',
|
||||
|
@@ -206,11 +206,6 @@ Lang::$translations = array(
|
||||
'History' => 'Història',
|
||||
'Variables' => 'Variables',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Les columnes d\'origen i de destinació han de ser del mateix tipus, la columna de destinació ha d\'estar indexada i les dades referenciades han d\'existir.',
|
||||
'E-mail' => 'Correu electrònic',
|
||||
'From' => 'De',
|
||||
'Subject' => 'Assumpte',
|
||||
'Send' => 'Envia',
|
||||
'%d e-mail(s) have been sent.' => array('S\'ha enviat %d correu electrònic.', 'S\'han enviat %d correus electrònics.'),
|
||||
'Run file' => 'Executa el fitxer',
|
||||
'Numbers' => 'Nombres',
|
||||
'Date and time' => 'Data i hora',
|
||||
@@ -225,7 +220,6 @@ Lang::$translations = array(
|
||||
'File does not exist.' => 'El fitxer no existeix.',
|
||||
'Permanent login' => 'Sessió permanent',
|
||||
'%d in total' => '%d en total',
|
||||
'Attachments' => 'Adjuncions',
|
||||
'System' => 'Sistema',
|
||||
'last' => 'darrera',
|
||||
'Network' => 'Xarxa',
|
||||
|
@@ -45,6 +45,7 @@ Lang::$translations = array(
|
||||
'User has been created.' => 'Uživatel byl vytvořen.',
|
||||
'Hashed' => 'Zahašované',
|
||||
'Column' => 'Sloupec',
|
||||
'Columns' => 'Sloupce',
|
||||
'Routine' => 'Procedura',
|
||||
'Grant' => 'Povolit',
|
||||
'Revoke' => 'Zakázat',
|
||||
@@ -295,13 +296,6 @@ Lang::$translations = array(
|
||||
'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',
|
||||
|
@@ -238,12 +238,6 @@ Lang::$translations = array(
|
||||
'Clone' => 'Klon',
|
||||
'Delete' => 'Slet',
|
||||
'You have no privileges to update this table.' => 'Du mangler rettigheder til at ændre denne tabellen.',
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Fra',
|
||||
'Subject' => 'Titel',
|
||||
'Attachments' => 'Vedhæft',
|
||||
'Send' => 'Send',
|
||||
'%d e-mail(s) have been sent.' => array('%d email sendt.', '%d emails sendt.'),
|
||||
'Numbers' => 'Nummer',
|
||||
'Date and time' => 'Dato og tid',
|
||||
'Strings' => 'Strenge',
|
||||
|
@@ -215,11 +215,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Binär',
|
||||
'Lists' => 'Listen',
|
||||
'Editor' => 'Editor',
|
||||
'E-mail' => 'E-Mail',
|
||||
'From' => 'Von',
|
||||
'Subject' => 'Betreff',
|
||||
'Send' => 'Abschicken',
|
||||
'%d e-mail(s) have been sent.' => array('%d E-Mail abgeschickt.', '%d E-Mails abgeschickt.'),
|
||||
'Webserver file %s' => 'Webserver Datei %s',
|
||||
'File does not exist.' => 'Datei existiert nicht.',
|
||||
'%d in total' => '%d insgesamt',
|
||||
@@ -254,7 +249,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Netzwerk',
|
||||
'Geometry' => 'Geometrie',
|
||||
'File exists.' => 'Datei existiert schon.',
|
||||
'Attachments' => 'Anhänge',
|
||||
'%d query(s) executed OK.' => array('SQL-Abfrage erfolgreich ausgeführt.', '%d SQL-Abfragen erfolgreich ausgeführt.'),
|
||||
'Show only errors' => 'Nur Fehler anzeigen',
|
||||
'Refresh' => 'Aktualisieren',
|
||||
@@ -308,6 +302,9 @@ Lang::$translations = array(
|
||||
'Alter check' => 'Check ändern',
|
||||
'Create check' => 'Check erstellen',
|
||||
'Checks' => 'Checks',
|
||||
'Loaded plugins' => 'Geladene Plugins',
|
||||
'%s must <a%s>return an array</a>.' => '%s muss <a%s>ein Array zurückgeben</a>.',
|
||||
'<a%s>Configure</a> %s in %s.' => '<a%s>Konfigure</a> %s mit %s.',
|
||||
);
|
||||
|
||||
// run `php ../../lang.php de` to update this file
|
||||
|
@@ -279,13 +279,6 @@ Lang::$translations = array(
|
||||
'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' => 'Ημερομηνία και ώρα',
|
||||
|
@@ -11,7 +11,6 @@ Lang::$translations = array(
|
||||
'%d row(s)' => array('%d row', '%d rows'),
|
||||
'%d item(s) have been affected.' => array('%d item has been affected.', '%d items have been affected.'),
|
||||
'%d row(s) have been imported.' => array('%d row has been imported.', '%d rows have been imported.'),
|
||||
'%d e-mail(s) have been sent.' => array('%d e-mail has been sent.', '%d e-mails have been sent.'),
|
||||
'%d in total' => '%d in total',
|
||||
'%d query(s) executed OK.' => array('%d query executed OK.', '%d queries executed OK.'),
|
||||
);
|
||||
|
@@ -222,11 +222,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Binario',
|
||||
'Lists' => 'Listas',
|
||||
'Editor' => 'Editor',
|
||||
'E-mail' => 'Email',
|
||||
'From' => 'De',
|
||||
'Subject' => 'Asunto',
|
||||
'Send' => 'Enviar',
|
||||
'%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
|
||||
'Webserver file %s' => 'Archivo de servidor web %s',
|
||||
'File does not exist.' => 'Ese archivo no existe.',
|
||||
'%d in total' => '%d en total',
|
||||
@@ -261,7 +256,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Red',
|
||||
'Geometry' => 'Geometría',
|
||||
'File exists.' => 'Ese archivo ya existe.',
|
||||
'Attachments' => 'Adjuntos',
|
||||
'%d query(s) executed OK.' => array('%d sentencia SQL ejecutada correctamente.', '%d sentencias SQL ejecutadas correctamente.'),
|
||||
'Show only errors' => 'Mostrar solamente errores',
|
||||
'Refresh' => 'Actualizar',
|
||||
@@ -276,8 +270,8 @@ Lang::$translations = array(
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
|
||||
'Loaded plugins' => 'Plugins cargados',
|
||||
// '<b>%s</b> must return an array.' => '<b>%s</b> tiene que retornar un arreglo.',
|
||||
// 'Configure <b>%s</b> in <b>%s</b>.' => 'Configurar <b>%s</b> en <b>%s</b>.',
|
||||
'%s must <a%s>return an array</a>.' => '%s tiene que <a%s>retornar un arreglo</a>.',
|
||||
'<a%s>Configure</a> %s in %s.' => '<a%s>Configurar</a> %s en %s.',
|
||||
'There is a space in the input password which might be the cause.' => 'Hay un espacio en el password, lo cual puede ser la causa.',
|
||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer no soporta accesar una base de datos sin clave, <a href="https://www.adminer.org/en/password/"%s>Ver detalles</a>.',
|
||||
'Database does not support password.' => 'La base de datos no soporta password.',
|
||||
|
@@ -214,11 +214,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Binaar',
|
||||
'Lists' => 'Listid',
|
||||
'Editor' => 'Redaktor',
|
||||
'E-mail' => 'E-post',
|
||||
'From' => 'Kellelt',
|
||||
'Subject' => 'Pealkiri',
|
||||
'Send' => 'Saada',
|
||||
'%d e-mail(s) have been sent.' => 'Saadetud kirju: %d.',
|
||||
'Webserver file %s' => 'Fail serveris: %s',
|
||||
'File does not exist.' => 'Faili ei leitud.',
|
||||
'%d in total' => 'Kokku: %d',
|
||||
@@ -253,7 +248,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Võrk (network)',
|
||||
'Geometry' => 'Geomeetria',
|
||||
'File exists.' => 'Fail juba eksisteerib.',
|
||||
'Attachments' => 'Manused',
|
||||
'%d query(s) executed OK.' => array('%d päring edukalt käivitatud.', '%d päringut edukalt käivitatud.'),
|
||||
'Show only errors' => 'Kuva vaid veateateid',
|
||||
'Refresh' => 'Uuenda',
|
||||
|
@@ -277,13 +277,6 @@ Lang::$translations = array(
|
||||
'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' => 'تاریخ و زمان',
|
||||
|
@@ -279,13 +279,6 @@ Lang::$translations = array(
|
||||
'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',
|
||||
|
@@ -212,11 +212,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Binaires',
|
||||
'Lists' => 'Listes',
|
||||
'Editor' => 'Éditeur',
|
||||
'E-mail' => 'Courriel',
|
||||
'From' => 'De',
|
||||
'Subject' => 'Sujet',
|
||||
'Send' => 'Envoyer',
|
||||
'%d e-mail(s) have been sent.' => array('%d message a été envoyé.', '%d messages ont été envoyés.'),
|
||||
'Webserver file %s' => 'Fichier %s du serveur Web',
|
||||
'File does not exist.' => 'Le fichier est introuvable.',
|
||||
'%d in total' => '%d au total',
|
||||
@@ -252,7 +247,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Réseau',
|
||||
'Geometry' => 'Géométrie',
|
||||
'File exists.' => 'Le fichier existe.',
|
||||
'Attachments' => 'Pièces jointes',
|
||||
'Item%s has been inserted.' => 'L\'élément%s a été inséré.',
|
||||
'now' => 'maintenant',
|
||||
'%d query(s) executed OK.' => array('%d requête exécutée avec succès.', '%d requêtes exécutées avec succès.'),
|
||||
|
@@ -214,11 +214,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Binario',
|
||||
'Lists' => 'Listas',
|
||||
'Editor' => 'Editor',
|
||||
'E-mail' => 'Email',
|
||||
'From' => 'De',
|
||||
'Subject' => 'Asunto',
|
||||
'Send' => 'Enviar',
|
||||
'%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
|
||||
'Webserver file %s' => 'Ficheiro de servidor web %s',
|
||||
'File does not exist.' => 'O ficheiro non existe.',
|
||||
'%d in total' => '%d en total',
|
||||
@@ -253,7 +248,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Rede',
|
||||
'Geometry' => 'Xeometría',
|
||||
'File exists.' => 'O ficheiro xa existe.',
|
||||
'Attachments' => 'Adxuntos',
|
||||
'%d query(s) executed OK.' => array('%d consulta executada correctamente.', '%d consultas executadas correctamente.'),
|
||||
'Show only errors' => 'Amosar só erros',
|
||||
'Refresh' => 'Refrescar',
|
||||
|
@@ -212,11 +212,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'בינארי',
|
||||
'Lists' => 'רשימות',
|
||||
'Editor' => 'עורך',
|
||||
'E-mail' => 'דוא"ל',
|
||||
'From' => 'מ:',
|
||||
'Subject' => 'נושא',
|
||||
'Send' => 'שלח',
|
||||
'%d e-mail(s) have been sent.' => '%d הודעות דוא"ל נשלחו',
|
||||
'Webserver file %s' => 'קובץ השרת %s',
|
||||
'File does not exist.' => 'הקובץ אינו קיים',
|
||||
'%d in total' => '%d בסך הכל',
|
||||
@@ -251,7 +246,6 @@ Lang::$translations = array(
|
||||
'Network' => 'רשת',
|
||||
'Geometry' => 'גיאומטריה',
|
||||
'File exists.' => 'קובץ קיים',
|
||||
'Attachments' => 'קבצים מצורפים',
|
||||
'Item%s has been inserted.' => 'הפריט %s הוזן בהצלחה',
|
||||
'now' => 'כעת',
|
||||
'%d query(s) executed OK.' => '%d שאילתות בוצעו בהצלחה',
|
||||
|
@@ -206,11 +206,6 @@ Lang::$translations = array(
|
||||
'History' => 'Történet',
|
||||
'Variables' => 'Változók',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'A forrás és cél oszlopoknak azonos típusúak legyenek, a cél oszlopok indexeltek legyenek, és a hivatkozott adatnak léteznie kell.',
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Feladó',
|
||||
'Subject' => 'Tárgy',
|
||||
'Send' => 'Küldés',
|
||||
'%d e-mail(s) have been sent.' => array('%d e-mail elküldve.', '%d e-mail elküldve.', '%d e-mail elküldve.'),
|
||||
'Run file' => 'Fájl futtatása',
|
||||
'Numbers' => 'Szám',
|
||||
'Date and time' => 'Dátum és idő',
|
||||
@@ -225,7 +220,6 @@ Lang::$translations = array(
|
||||
'File does not exist.' => 'A fájl nem létezik.',
|
||||
'Permanent login' => 'Emlékezz rám',
|
||||
'%d in total' => 'összesen %d',
|
||||
'Attachments' => 'Csatolmány',
|
||||
'System' => 'Adatbázis',
|
||||
'last' => 'utolsó',
|
||||
'Network' => 'Hálózat',
|
||||
|
@@ -259,13 +259,6 @@ Lang::$translations = array(
|
||||
'Clone' => 'Gandakan',
|
||||
'Delete' => 'Hapus',
|
||||
|
||||
'E-mail' => 'Surel',
|
||||
'From' => 'Dari',
|
||||
'Subject' => 'Judul',
|
||||
'Attachments' => 'Lampiran',
|
||||
'Send' => 'Kirim',
|
||||
'%d e-mail(s) have been sent.' => '%d surel berhasil dikirim.',
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Angka',
|
||||
'Date and time' => 'Tanggal dan waktu',
|
||||
|
@@ -214,11 +214,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Binari',
|
||||
'Lists' => 'Liste',
|
||||
'Editor' => 'Editor',
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Da',
|
||||
'Subject' => 'Oggetto',
|
||||
'Send' => 'Invia',
|
||||
'%d e-mail(s) have been sent.' => array('%d e-mail inviata.', '%d e-mail inviate.'),
|
||||
'Webserver file %s' => 'Webserver file %s',
|
||||
'File does not exist.' => 'Il file non esiste.',
|
||||
'%d in total' => '%d in totale',
|
||||
@@ -253,7 +248,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Rete',
|
||||
'Geometry' => 'Geometria',
|
||||
'File exists.' => 'Il file esiste già.',
|
||||
'Attachments' => 'Allegati',
|
||||
'%d query(s) executed OK.' => array('%d query eseguita con successo.', '%d query eseguite con successo.'),
|
||||
'Show only errors' => 'Mostra solo gli errori',
|
||||
'Refresh' => 'Aggiorna',
|
||||
|
@@ -243,11 +243,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'バイナリ',
|
||||
'Lists' => 'リスト',
|
||||
'Editor' => 'エディタ',
|
||||
'E-mail' => 'メール',
|
||||
'From' => '差出人',
|
||||
'Subject' => '題名',
|
||||
'Send' => '送信',
|
||||
'%d e-mail(s) have been sent.' => '%d メールを送信しました。',
|
||||
'Webserver file %s' => 'Webサーバファイル %s',
|
||||
'File does not exist.' => 'ファイルは存在しません。',
|
||||
'%d in total' => '合計 %d',
|
||||
@@ -280,7 +275,6 @@ Lang::$translations = array(
|
||||
'Network' => 'ネットワーク型',
|
||||
'Geometry' => 'ジオメトリ型',
|
||||
'File exists.' => 'ファイルが既に存在します。',
|
||||
'Attachments' => '添付ファイル',
|
||||
'Item%s has been inserted.' => '%s項目を挿入しました。',
|
||||
'now' => '現在の日時',
|
||||
'%d query(s) executed OK.' => '%d クエリーを実行しました。',
|
||||
|
@@ -210,11 +210,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'ორობითი',
|
||||
'Lists' => 'სია',
|
||||
'Editor' => 'რედაქტორი',
|
||||
'E-mail' => 'ელ. ფოსტა',
|
||||
'From' => 'ავტორი:',
|
||||
'Subject' => 'თემა',
|
||||
'Send' => 'გაგზავნა',
|
||||
'%d e-mail(s) have been sent.' => 'გაიგზავნა %d წერილი.',
|
||||
'Webserver file %s' => 'ფაილი %s ვებსერვერზე',
|
||||
'File does not exist.' => 'ასეთი ფაილი არ არსებობს.',
|
||||
'%d in total' => 'სულ %d',
|
||||
@@ -249,7 +244,6 @@ Lang::$translations = array(
|
||||
'Network' => 'ქსელი',
|
||||
'Geometry' => 'გეომეტრია',
|
||||
'File exists.' => 'ფაილი უკვე არსებობს.',
|
||||
'Attachments' => 'მიმაგრებული ფაილები',
|
||||
'%d query(s) executed OK.' => '%d მოთხოვნა შესრულდა.',
|
||||
'Show only errors' => 'მხოლოდ შეცდომები',
|
||||
'Refresh' => 'განახლება',
|
||||
|
@@ -5,7 +5,6 @@ Lang::$translations = array(
|
||||
'$1-$3-$5' => '$1-$3-$5',
|
||||
'%.3f s' => '%.3f 초',
|
||||
'%d byte(s)' => '%d 바이트',
|
||||
'%d e-mail(s) have been sent.' => '%d개 메일을 보냈습니다.',
|
||||
'%d in total' => '총 %d개',
|
||||
'%d item(s) have been affected.' => '%d개 항목을 갱신했습니다.',
|
||||
'%d process(es) have been killed.' => '%d개 프로세스를 강제 종료하였습니다.',
|
||||
@@ -38,7 +37,6 @@ Lang::$translations = array(
|
||||
'anywhere' => '모든',
|
||||
'Are you sure?' => '실행 하시겠습니까?',
|
||||
'At given time' => '지정 시간',
|
||||
'Attachments' => '첨부 파일',
|
||||
'Auto Increment' => '자동 증가',
|
||||
'Binary' => '이진',
|
||||
'Call' => '호출',
|
||||
@@ -80,7 +78,6 @@ Lang::$translations = array(
|
||||
'Delete' => '삭제',
|
||||
'descending' => '역순',
|
||||
'Drop' => '삭제',
|
||||
'E-mail' => '메일',
|
||||
'Edit all' => '모두 편집',
|
||||
'Edit' => '편집',
|
||||
'edit' => '편집',
|
||||
@@ -109,7 +106,6 @@ Lang::$translations = array(
|
||||
'Foreign keys' => '외부 키',
|
||||
'Format' => '형식',
|
||||
'From server' => '서버에서 실행',
|
||||
'From' => '보낸 사람',
|
||||
'Functions' => '함수',
|
||||
'Geometry' => '기하 형',
|
||||
'Grant' => '권한 부여',
|
||||
@@ -211,7 +207,6 @@ Lang::$translations = array(
|
||||
'Select' => '선택',
|
||||
'select' => '선택',
|
||||
'Selected' => '선택됨',
|
||||
'Send' => '보내기',
|
||||
'Sequence has been altered.' => '시퀀스를 변경했습니다.',
|
||||
'Sequence has been created.' => '시퀀스를 추가했습니다.',
|
||||
'Sequence has been dropped.' => '시퀀스를 제거했습니다.',
|
||||
@@ -230,7 +225,6 @@ Lang::$translations = array(
|
||||
'Status' => '상태',
|
||||
'Stop on error' => '오류의 경우 중지',
|
||||
'Strings' => '문자열',
|
||||
'Subject' => '제목',
|
||||
'System' => '데이터베이스 형식',
|
||||
'Table has been altered.' => '테이블을 변경했습니다.',
|
||||
'Table has been created.' => '테이블을 만들었습니다.',
|
||||
|
@@ -257,13 +257,6 @@ Lang::$translations = array(
|
||||
'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',
|
||||
|
@@ -214,11 +214,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Binārie',
|
||||
'Lists' => 'Saraksti',
|
||||
'Editor' => 'Redaktors',
|
||||
'E-mail' => 'Epasts',
|
||||
'From' => 'No',
|
||||
'Subject' => 'Tēma',
|
||||
'Send' => 'Sūtīt',
|
||||
'%d e-mail(s) have been sent.' => array('Nosūtīts %d epasts.', 'Nosūtīti %d epasti.', 'Nosūtīti %d epasti.'),
|
||||
'Webserver file %s' => 'Fails %s uz servera',
|
||||
'File does not exist.' => 'Fails neeksistē.',
|
||||
'%d in total' => 'Kopā %d',
|
||||
@@ -253,7 +248,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Tīkls',
|
||||
'Geometry' => 'Ģeometrija',
|
||||
'File exists.' => 'Fails eksistē.',
|
||||
'Attachments' => 'Pielikumi',
|
||||
'%d query(s) executed OK.' => array('%d pieprasījums veiksmīgs.', '%d pieprasījumi veiksmīgi.', '%d pieprasījumi veiksmīgi.'),
|
||||
'Show only errors' => 'Rādīt tikai kļūdas',
|
||||
'Refresh' => 'Atjaunot',
|
||||
|
@@ -283,13 +283,6 @@ Lang::$translations = array(
|
||||
'Delete' => 'Padam',
|
||||
'You have no privileges to update this table.' => 'Anda tidak mempunyai keistimewaan untuk mengemaskini jadual ini.',
|
||||
|
||||
'E-mail' => 'Emel',
|
||||
'From' => 'Dari',
|
||||
'Subject' => 'Subjek',
|
||||
'Attachments' => 'Lampiran',
|
||||
'Send' => 'Hantar',
|
||||
'%d e-mail(s) have been sent.' => '%d emel telah dihantar.',
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Nombor',
|
||||
'Date and time' => 'Tarikh dan masa',
|
||||
|
@@ -215,11 +215,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Binaire gegevens',
|
||||
'Lists' => 'Lijsten',
|
||||
'Editor' => 'Editor',
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Van',
|
||||
'Subject' => 'Onderwerp',
|
||||
'Send' => 'Verzenden',
|
||||
'%d e-mail(s) have been sent.' => array('%d e-mail verzonden.', '%d e-mails verzonden.'),
|
||||
'Webserver file %s' => 'Webserver bestand %s',
|
||||
'File does not exist.' => 'Bestand niet gevonden.',
|
||||
'%d in total' => '%d in totaal',
|
||||
@@ -253,7 +248,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Netwerk',
|
||||
'Geometry' => 'Geometrie',
|
||||
'File exists.' => 'Bestand bestaat reeds.',
|
||||
'Attachments' => 'Bijlagen',
|
||||
'%d query(s) executed OK.' => array('%d query succesvol uitgevoerd.', '%d querys succesvol uitgevoerd.'),
|
||||
'Show only errors' => 'Enkel fouten tonen',
|
||||
'Refresh' => 'Vernieuwen',
|
||||
|
@@ -238,12 +238,6 @@ Lang::$translations = array(
|
||||
'Clone' => 'Klon',
|
||||
'Delete' => 'Slett',
|
||||
'You have no privileges to update this table.' => 'Du mangler rettighetene som trengs for å endre denne tabellen.',
|
||||
'E-mail' => 'E-post',
|
||||
'From' => 'Fra',
|
||||
'Subject' => 'Tittel',
|
||||
'Attachments' => 'Vedlegg',
|
||||
'Send' => 'Send',
|
||||
'%d e-mail(s) have been sent.' => array('%d epost sendt.', '%d eposter sendt.'),
|
||||
'Numbers' => 'Nummer',
|
||||
'Date and time' => 'Dato og tid',
|
||||
'Strings' => 'Strenger',
|
||||
|
@@ -45,6 +45,7 @@ Lang::$translations = array(
|
||||
'User has been created.' => 'Użytkownik został dodany.',
|
||||
'Hashed' => 'Zahashowane',
|
||||
'Column' => 'Kolumna',
|
||||
'Columns' => 'Kolumny',
|
||||
'Routine' => 'Procedura',
|
||||
'Grant' => 'Uprawnienia',
|
||||
'Revoke' => 'Usuń uprawnienia',
|
||||
@@ -295,13 +296,6 @@ Lang::$translations = array(
|
||||
'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',
|
||||
|
@@ -214,11 +214,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Binário',
|
||||
'Lists' => 'Listas',
|
||||
'Editor' => 'Editor',
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'De',
|
||||
'Subject' => 'Assunto',
|
||||
'Send' => 'Enviar',
|
||||
'%d e-mail(s) have been sent.' => array('%d email foi enviado.', '%d emails foram enviados.'),
|
||||
'Webserver file %s' => 'Arquivo do servidor web %s',
|
||||
'File does not exist.' => 'Arquivo não existe.',
|
||||
'%d in total' => '%d no total',
|
||||
@@ -253,7 +248,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Rede',
|
||||
'Geometry' => 'Geometria',
|
||||
'File exists.' => 'Arquivo já existe.',
|
||||
'Attachments' => 'Anexos',
|
||||
'%d query(s) executed OK.' => array('%d consulta sql executada corretamente.', '%d consultas sql executadas corretamente.'),
|
||||
'Show only errors' => 'Mostrar somente erros',
|
||||
'Refresh' => 'Atualizar',
|
||||
|
@@ -214,11 +214,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Binário',
|
||||
'Lists' => 'Listas',
|
||||
'Editor' => 'Editor',
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'De',
|
||||
'Subject' => 'Assunto',
|
||||
'Send' => 'Enviar',
|
||||
'%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
|
||||
'Webserver file %s' => 'Ficheiro do servidor web %s',
|
||||
'File does not exist.' => 'Ficheiro não existe.',
|
||||
'%d in total' => '%d no total',
|
||||
@@ -253,7 +248,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Rede',
|
||||
'Geometry' => 'Geometria',
|
||||
'File exists.' => 'Ficheiro já existe.',
|
||||
'Attachments' => 'Anexos',
|
||||
'%d query(s) executed OK.' => array('%d consulta sql executada corretamente.', '%d consultas sql executadas corretamente.'),
|
||||
'Show only errors' => 'Mostrar somente erros',
|
||||
'Refresh' => 'Atualizar',
|
||||
|
@@ -214,11 +214,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Tip binar',
|
||||
'Lists' => 'Liste',
|
||||
'Editor' => 'Editor',
|
||||
'E-mail' => 'Poșta electronică',
|
||||
'From' => 'De la',
|
||||
'Subject' => 'Pentru',
|
||||
'Send' => 'Trimite',
|
||||
'%d e-mail(s) have been sent.' => array('A fost trimis %d mail.', 'Au fost trimise %d mail-uri.'),
|
||||
'Webserver file %s' => 'Fișierul %s pe server',
|
||||
'File does not exist.' => 'Acest fișier nu există.',
|
||||
'%d in total' => 'În total %d',
|
||||
@@ -253,7 +248,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Rețea',
|
||||
'Geometry' => 'Geometrie',
|
||||
'File exists.' => 'Fișierul există deja.',
|
||||
'Attachments' => 'Fișiere atașate',
|
||||
'%d query(s) executed OK.' => array('%d query executat.', '%d query-uri executate cu succes.'),
|
||||
'Show only errors' => 'Arată doar greșeli',
|
||||
'Refresh' => 'Împrospătează',
|
||||
|
@@ -214,11 +214,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'Двоичный тип',
|
||||
'Lists' => 'Списки',
|
||||
'Editor' => 'Редактор',
|
||||
'E-mail' => 'Эл. почта',
|
||||
'From' => 'От',
|
||||
'Subject' => 'Тема',
|
||||
'Send' => 'Послать',
|
||||
'%d e-mail(s) have been sent.' => array('Было отправлено %d письмо.', 'Было отправлено %d письма.', 'Было отправлено %d писем.'),
|
||||
'Webserver file %s' => 'Файл %s на вебсервере',
|
||||
'File does not exist.' => 'Такого файла не существует.',
|
||||
'%d in total' => 'Всего %d',
|
||||
@@ -253,7 +248,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Сеть',
|
||||
'Geometry' => 'Геометрия',
|
||||
'File exists.' => 'Файл уже существует.',
|
||||
'Attachments' => 'Прикреплённые файлы',
|
||||
'%d query(s) executed OK.' => array('%d запрос выполнен успешно.', '%d запроса выполнено успешно.', '%d запросов выполнено успешно.'),
|
||||
'Show only errors' => 'Только ошибки',
|
||||
'Refresh' => 'Обновить',
|
||||
|
@@ -205,11 +205,6 @@ Lang::$translations = array(
|
||||
'History' => 'História',
|
||||
'Variables' => 'Premenné',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Zdrojové a cieľové stĺpce musia mať rovnaký datový typ, nad cieľovými stĺpcami musí byť definovaný index a odkazované dáta musia existovať.',
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Odosielateľ',
|
||||
'Subject' => 'Predmet',
|
||||
'Send' => 'Odoslať',
|
||||
'%d e-mail(s) have been sent.' => array('Bol odoslaný %d e-mail.', 'Boli odoslané %d e-maily.', 'Bolo odoslaných %d e-mailov.'),
|
||||
'Run file' => 'Spustiť súbor',
|
||||
'Numbers' => 'Čísla',
|
||||
'Date and time' => 'Dátum a čas',
|
||||
@@ -253,7 +248,6 @@ Lang::$translations = array(
|
||||
'Network' => 'Sieť',
|
||||
'Geometry' => 'Geometria',
|
||||
'File exists.' => 'Súbor existuje.',
|
||||
'Attachments' => 'Prílohy',
|
||||
'%d query(s) executed OK.' => array('Bol vykonaný %d dotaz.', 'Boli vykonané %d dotazy.', 'Bolo vykonaných %d dotazov.'),
|
||||
'Show only errors' => 'Zobraziť iba chyby',
|
||||
'Refresh' => 'Obnoviť',
|
||||
|
@@ -254,13 +254,6 @@ Lang::$translations = array(
|
||||
'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',
|
||||
|
@@ -262,13 +262,6 @@ Lang::$translations = array(
|
||||
'Clone' => 'Дуплирај',
|
||||
'Delete' => 'Избриши',
|
||||
|
||||
'E-mail' => 'Ел. пошта',
|
||||
'From' => 'Од',
|
||||
'Subject' => 'Наслов',
|
||||
'Attachments' => 'Прилози',
|
||||
'Send' => 'Пошаљи',
|
||||
'%d e-mail(s) have been sent.' => array('%d порука ел. поште је послата.', '%d поруке ел. поште су послате.', '%d порука ел. поште је послато.'),
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Број',
|
||||
'Date and time' => 'Датум и време',
|
||||
|
@@ -292,13 +292,6 @@ Lang::$translations = array(
|
||||
'Delete' => 'Ta bort',
|
||||
'You have no privileges to update this table.' => 'Du har inga privilegier för att uppdatera den här tabellen.',
|
||||
|
||||
'E-mail' => 'Email',
|
||||
'From' => 'Från',
|
||||
'Subject' => 'Ämne',
|
||||
'Attachments' => 'Bilagor',
|
||||
'Send' => 'Skicka',
|
||||
'%d e-mail(s) have been sent.' => array('%d email har blivit skickat.', '%d email har blivit skickade.'),
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Nummer',
|
||||
'Date and time' => 'Datum och tid',
|
||||
|
@@ -212,11 +212,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'பைனரி',
|
||||
'Lists' => 'பட்டியல்',
|
||||
'Editor' => 'தொகுப்பாளர்',
|
||||
'E-mail' => 'மின்னஞ்சல்',
|
||||
'From' => 'அனுப்புனர்',
|
||||
'Subject' => 'பொருள்',
|
||||
'Send' => 'அனுப்பு',
|
||||
'%d e-mail(s) have been sent.' => array('%d மின்னஞ்சல் அனுப்பபட்டது.', '%d மின்னஞ்சல்கள் அனுப்பப்பட்டன.'),
|
||||
'Webserver file %s' => 'வெப் சர்வர் கோப்பு %s',
|
||||
'File does not exist.' => 'கோப்பு இல்லை.',
|
||||
'%d in total' => 'மொத்தம் %d ',
|
||||
@@ -252,7 +247,6 @@ Lang::$translations = array(
|
||||
'Network' => 'நெட்வொர்க்',
|
||||
'Geometry' => 'வடிவவியல் (Geometry)',
|
||||
'File exists.' => 'கோப்பு உள்ளது.',
|
||||
'Attachments' => 'இணைப்புகள்',
|
||||
'now' => 'இப்பொழுது',
|
||||
'%d query(s) executed OK.' => array('%d வினவல் செயல்படுத்தப்பட்டது.', '%d வினவல்கள் செயல்படுத்தப்பட்டன.'),
|
||||
'Show only errors' => 'பிழைகளை மட்டும் காண்பிக்கவும்',
|
||||
|
@@ -214,11 +214,6 @@ Lang::$translations = array(
|
||||
'Binary' => 'เลขฐานสอง',
|
||||
'Lists' => 'รายการ',
|
||||
'Editor' => 'ผู้แก้ไข',
|
||||
'E-mail' => 'อีเมล์',
|
||||
'From' => 'จาก',
|
||||
'Subject' => 'หัวข้อ',
|
||||
'Send' => 'ส่ง',
|
||||
'%d e-mail(s) have been sent.' => 'มี %d อีเมล์ ถูกส่งออกแล้ว.',
|
||||
'Webserver file %s' => 'Webserver file %s',
|
||||
'File does not exist.' => 'ไม่มีไฟล์.',
|
||||
'%d in total' => '%d ของทั้งหมด',
|
||||
@@ -253,7 +248,6 @@ Lang::$translations = array(
|
||||
'Network' => 'เครื่องข่าย',
|
||||
'Geometry' => 'เรขาคณิต',
|
||||
'File exists.' => 'มีไฟล์นี้อยู่แล้ว.',
|
||||
'Attachments' => 'ไฟล์แนบ',
|
||||
'%d query(s) executed OK.' => '%d คำสั่งถูกดำเนินการแล้ว.',
|
||||
'Show only errors' => 'แสดงเฉพาะเออเรอ',
|
||||
'Refresh' => 'โหลดใหม่',
|
||||
|
@@ -286,13 +286,6 @@ Lang::$translations = array(
|
||||
'Delete' => 'Sil',
|
||||
'You have no privileges to update this table.' => 'Bu tabloyu güncellemek için yetkiniz yok.',
|
||||
|
||||
'E-mail' => 'E-posta',
|
||||
'From' => 'Gönderen',
|
||||
'Subject' => 'Konu',
|
||||
'Attachments' => 'Ekler',
|
||||
'Send' => 'Gönder',
|
||||
'%d e-mail(s) have been sent.' => array('%d e-posta gönderildi.', '%d adet e-posta gönderildi.'),
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Sayılar',
|
||||
'Date and time' => 'Tarih ve zaman',
|
||||
|
@@ -259,13 +259,6 @@ Lang::$translations = array(
|
||||
'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' => 'Дата і час',
|
||||
|
@@ -297,13 +297,6 @@ Lang::$translations = array(
|
||||
'Delete' => 'O\'chirish',
|
||||
'You have no privileges to update this table.' => 'Bu jadvalni yangilash uchun sizda huquqlar yo\'q.',
|
||||
|
||||
'E-mail' => 'E-pochta',
|
||||
'From' => 'Kimdan',
|
||||
'Subject' => 'Mavzu',
|
||||
'Attachments' => 'Ilovalar',
|
||||
'Send' => 'Yuborish',
|
||||
'%d e-mail(s) have been sent.' => array('%d e-pochta yuborildi.', '%d e-pochtalar yuborildi.'),
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Raqamlar',
|
||||
'Date and time' => 'Sana va vaqt',
|
||||
|
@@ -271,13 +271,6 @@ Lang::$translations = array(
|
||||
'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ờ',
|
||||
|
@@ -46,6 +46,7 @@ Lang::$translations = array(
|
||||
'User has been created.' => 'Xx.',
|
||||
'Hashed' => 'Xx',
|
||||
'Column' => 'Xx',
|
||||
'Columns' => 'Xx',
|
||||
'Routine' => 'Xx',
|
||||
'Grant' => 'Xx',
|
||||
'Revoke' => 'Xx',
|
||||
@@ -297,13 +298,6 @@ Lang::$translations = array(
|
||||
'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',
|
||||
|
@@ -292,13 +292,6 @@ Lang::$translations = array(
|
||||
'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' => '日期時間',
|
||||
|
@@ -208,7 +208,6 @@ Lang::$translations = array(
|
||||
'Alter indexes' => '修改索引',
|
||||
'Add next' => '下一行插入',
|
||||
'Index Type' => '索引类型',
|
||||
// 'Column (length)' => '列(长度)',
|
||||
|
||||
'Foreign keys' => '外键',
|
||||
'Foreign key' => '外键',
|
||||
@@ -292,13 +291,6 @@ Lang::$translations = array(
|
||||
'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' => '日期时间',
|
||||
|
@@ -48,7 +48,7 @@ echo ($collations ? "<datalist id='collations'>" . optionlist($collations) . "</
|
||||
|
||||
<form action="" method="post" id="form">
|
||||
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" data-maxlength="64" autocapitalize="off">
|
||||
<?php echo ($routine_languages ? lang('Language') . ": " . html_select("language", $routine_languages, $row["language"]) . "\n" : ""); ?>
|
||||
<?php echo ($routine_languages ? "<label>" . lang('Language') . ": " . html_select("language", $routine_languages, $row["language"]) . "</label>\n" : ""); ?>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<div class="scrollable">
|
||||
<table class="nowrap">
|
||||
|
@@ -271,6 +271,7 @@ if (!$columns && support("table")) {
|
||||
echo "</form>\n";
|
||||
|
||||
$page = $_GET["page"];
|
||||
$found_rows = null;
|
||||
if ($page == "last") {
|
||||
$found_rows = get_val(count_rows($TABLE, $where, $is_group, $group));
|
||||
$page = floor(max(0, intval($found_rows) - 1) / $limit);
|
||||
@@ -451,20 +452,20 @@ if (!$columns && support("table")) {
|
||||
}
|
||||
}
|
||||
|
||||
$val = select_value($val, $link, $field, $text_length);
|
||||
$html = select_value($val, $link, $field, $text_length);
|
||||
$id = h("val[$unique_idf][" . bracket_escape($key) . "]");
|
||||
$value = idx(idx($_POST["val"], $unique_idf), bracket_escape($key));
|
||||
$editable = !is_array($row[$key]) && is_utf8($val) && $rows[$n][$key] == $row[$key] && !$functions[$key] && !$field["generated"];
|
||||
$posted = idx(idx($_POST["val"], $unique_idf), bracket_escape($key));
|
||||
$editable = !is_array($row[$key]) && is_utf8($html) && $rows[$n][$key] == $row[$key] && !$functions[$key] && !$field["generated"];
|
||||
$text = preg_match('~text|json|lob~', $field["type"]);
|
||||
echo "<td id='$id'" . (preg_match(number_type(), $field["type"]) && ($val == '<i>NULL</i>' || is_numeric(strip_tags($val))) ? " class='number'" : "");
|
||||
if (($_GET["modify"] && $editable) || $value !== null) {
|
||||
$h_value = h($value !== null ? $value : $row[$key]);
|
||||
echo "<td id='$id'" . (preg_match(number_type(), $field["type"]) && ($val === null || is_numeric(strip_tags($html))) ? " class='number'" : "");
|
||||
if (($_GET["modify"] && $editable && $val !== null) || $posted !== null) {
|
||||
$h_value = h($posted !== null ? $posted : $row[$key]);
|
||||
echo ">" . ($text ? "<textarea name='$id' cols='30' rows='" . (substr_count($row[$key], "\n") + 1) . "'>$h_value</textarea>" : "<input name='$id' value='$h_value' size='$lengths[$key]'>");
|
||||
} else {
|
||||
$long = strpos($val, "<i>…</i>");
|
||||
$long = strpos($html, "<i>…</i>");
|
||||
echo " data-text='" . ($long ? 2 : ($text ? 1 : 0)) . "'"
|
||||
. ($editable ? "" : " data-warning='" . h(lang('Use edit link to modify this value.')) . "'")
|
||||
. ">$val"
|
||||
. ">$html"
|
||||
;
|
||||
}
|
||||
}
|
||||
@@ -487,7 +488,6 @@ if (!$columns && support("table")) {
|
||||
if (!is_ajax()) {
|
||||
if ($rows || $page) {
|
||||
$exact_count = true;
|
||||
$found_rows = null;
|
||||
if ($_GET["page"] != "last") {
|
||||
if (!$limit || (count($rows) < $limit && ($rows || !$page))) {
|
||||
$found_rows = ($page ? $page * $limit : 0) + count($rows);
|
||||
|
@@ -55,7 +55,7 @@ if (!$error && $_POST) {
|
||||
$delimiter = ";";
|
||||
$offset = 0;
|
||||
$empty = true;
|
||||
$connection2 = connect(adminer()->credentials()); // connection for exploring indexes and EXPLAIN (to not replace FOUND_ROWS()) //! PDO - silent error
|
||||
$connection2 = connect(); // connection for exploring indexes and EXPLAIN (to not replace FOUND_ROWS()) //! PDO - silent error
|
||||
if ($connection2 && DB != "") {
|
||||
$connection2->select_db(DB);
|
||||
if ($_GET["ns"] != "") {
|
||||
@@ -64,7 +64,7 @@ if (!$error && $_POST) {
|
||||
}
|
||||
$commands = 0;
|
||||
$errors = array();
|
||||
$parse = '[\'"' . (JUSH == "sql" ? '`#' : (JUSH == "sqlite" ? '`[' : (JUSH == "mssql" ? '[' : ''))) . ']|/\*|-- |$' . (JUSH == "pgsql" ? '|\$[^$]*\$' : '');
|
||||
$parse = '[\'"' . (JUSH == "sql" ? '`#' : (JUSH == "sqlite" ? '`[' : (JUSH == "mssql" ? '[' : ''))) . ']|/\*|--' . (JUSH == 'sql' ? ' ' : '') . '|$' . (JUSH == "pgsql" ? '|\$[^$]*\$' : '');
|
||||
$total_start = microtime(true);
|
||||
$adminer_export = get_settings("adminer_import"); // this doesn't offer SQL export so we match the import/export style at select
|
||||
$dump_format = adminer()->dumpFormat();
|
||||
@@ -72,10 +72,13 @@ if (!$error && $_POST) {
|
||||
|
||||
while ($query != "") {
|
||||
if (!$offset && preg_match("~^$space*+DELIMITER\\s+(\\S+)~i", $query, $match)) {
|
||||
$delimiter = $match[1];
|
||||
$delimiter = preg_quote($match[1]);
|
||||
$query = substr($query, strlen($match[0]));
|
||||
} elseif (!$offset && JUSH == 'pgsql' && preg_match("~^($space*+COPY\\s+)[^;]+\\s+FROM\\s+stdin;~i", $query, $match)) {
|
||||
$delimiter = "\n\\\\\\.\r?\n";
|
||||
$offset = strlen($match[0]);
|
||||
} else {
|
||||
preg_match('(' . preg_quote($delimiter) . "\\s*|$parse)", $query, $match, PREG_OFFSET_CAPTURE, $offset); // should always match
|
||||
preg_match("($delimiter\\s*|$parse)", $query, $match, PREG_OFFSET_CAPTURE, $offset); // always matches
|
||||
list($found, $pos) = $match[0];
|
||||
if (!$found && $fp && !feof($fp)) {
|
||||
$query .= fread($fp, 1e5);
|
||||
@@ -85,14 +88,15 @@ if (!$error && $_POST) {
|
||||
}
|
||||
$offset = $pos + strlen($found);
|
||||
|
||||
if ($found && rtrim($found) != $delimiter) { // find matching quote or comment end
|
||||
if ($found && !preg_match("(^$delimiter)", $found)) { // find matching quote or comment end
|
||||
$c_style_escapes = driver()->hasCStyleEscapes() || (JUSH == "pgsql" && ($pos > 0 && strtolower($query[$pos - 1]) == "e"));
|
||||
|
||||
$pattern = ($found == '/*' ? '\*/'
|
||||
: ($found == '[' ? ']'
|
||||
: (preg_match('~^-- |^#~', $found) ? "\n"
|
||||
: preg_quote($found) . ($c_style_escapes ? "|\\\\." : "")))
|
||||
);
|
||||
$pattern =
|
||||
($found == '/*' ? '\*/' :
|
||||
($found == '[' ? ']' :
|
||||
(preg_match('~^-- |^#~', $found) ? "\n" :
|
||||
preg_quote($found) . ($c_style_escapes ? '|\\\\.' : ''))))
|
||||
;
|
||||
|
||||
while (preg_match("($pattern|\$)s", $query, $match, PREG_OFFSET_CAPTURE, $offset)) {
|
||||
$s = $match[0][0];
|
||||
@@ -108,7 +112,7 @@ if (!$error && $_POST) {
|
||||
|
||||
} else { // end of a query
|
||||
$empty = false;
|
||||
$q = substr($query, 0, $pos);
|
||||
$q = substr($query, 0, $pos + ($delimiter[0] == "\n" ? 3 : 0)); // 3 - pass "\n\\." to PostgreSQL COPY
|
||||
$commands++;
|
||||
$print = "<pre id='sql-$commands'><code class='jush-" . JUSH . "'>" . adminer()->sqlCommandQuery($q) . "</code></pre>\n";
|
||||
if (JUSH == "sqlite" && preg_match("~^$space*+ATTACH\\b~i", $q, $match)) {
|
||||
|
@@ -3,12 +3,13 @@
|
||||
html {
|
||||
--bg: #002240;
|
||||
--fg: #829bb0;
|
||||
--dim: #154269;
|
||||
}
|
||||
|
||||
a { color: #517fa8; }
|
||||
a:visited { color: #517fa8; }
|
||||
a { color: #618CB3; }
|
||||
a:visited { color: #618CB3; }
|
||||
a:link:hover, a:visited:hover { color: #9bc0e1; }
|
||||
h1 { border-color: #5e94c1; color: #ffddbf; background: #154269; }
|
||||
h1 { border-color: #5e94c1; color: #ffddbf; }
|
||||
h2 { border-color: #a3bdd3; color: #000; background: #3c678d; }
|
||||
table, td, th { border-color: #0e416d; }
|
||||
th { background: #11385a; }
|
||||
@@ -37,7 +38,6 @@ input.required, input.maxlength { box-shadow: 1px 1px 1px red; }
|
||||
.icon:hover { background-color: #d1394e; }
|
||||
#menu { border-color: #a3bdd3; }
|
||||
#menu p, #logins, #tables { border-color: #326b9c; }
|
||||
#breadcrumb { background: #154269; }
|
||||
#h1 { color: #ffddbf; }
|
||||
#version { color: #d2b397; }
|
||||
#schema .table { border-color: #093459; }
|
||||
|
@@ -3,6 +3,7 @@
|
||||
html {
|
||||
--bg: #fff;
|
||||
--fg: #000;
|
||||
--dim: #eee;
|
||||
}
|
||||
|
||||
body { color: var(--fg); background: var(--bg); font: 90%/1.25 Verdana, Arial, Helvetica, sans-serif; margin: 0; min-width: fit-content; }
|
||||
@@ -11,7 +12,7 @@ a:visited { color: navy; }
|
||||
a:link:hover, a:visited: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; }
|
||||
h1 { font-size: 150%; margin: 0; padding: .8em .667em; border-bottom: 1px solid #999; font-weight: normal; color: #777; background: var(--dim); }
|
||||
h2 { font-size: 150%; margin: 0 0 20px -18px; padding: .8em 1em; border-bottom: 1px solid var(--fg); font-weight: normal; background: #ddf; }
|
||||
h3 { font-weight: normal; font-size: 130%; margin: 1em 0 0; }
|
||||
form { margin: 0; }
|
||||
@@ -19,16 +20,16 @@ td table { width: 100%; margin: 0; }
|
||||
table { margin: 1em 20px 0 0; font-size: 90%; border-spacing: 0; border-width: 1px 0 0 1px; }
|
||||
table, td, th { border-color: #999; border-style: solid; }
|
||||
td, th { border-width: 0 1px 1px 0; padding: .2em .3em; margin: 0; }
|
||||
th { background: #eee; text-align: left; }
|
||||
th { background: var(--dim); text-align: left; }
|
||||
thead { position: sticky; top: 0; }
|
||||
thead th { text-align: center; padding: .2em .5em; }
|
||||
thead td, thead th { background: #ddf; }
|
||||
fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: .8em .5em 0 0; border: 1px solid #999; }
|
||||
fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: .8em .5em 0 0; border: 1px solid #999; border-radius: 5px; }
|
||||
p { margin: .8em 20px 0 0; }
|
||||
img { vertical-align: middle; border: 0; }
|
||||
td img { max-width: 200px; max-height: 200px; }
|
||||
tbody tr:hover td, tbody tr:hover th { background: #eee; }
|
||||
code { font-size: 110%; padding: 1px 2px; background: #eee; }
|
||||
tbody tr:hover td, tbody tr:hover th { background: var(--dim); }
|
||||
code { font-size: 110%; padding: 1px 2px; background: var(--dim); }
|
||||
pre { margin: 1em 0 0; }
|
||||
td pre { margin: 0; }
|
||||
pre, textarea { font: 110%/1.25 monospace; }
|
||||
@@ -66,16 +67,16 @@ input.wayoff { left: -1000px; position: absolute; }
|
||||
.sqlarea { width: 98%; }
|
||||
.sql-footer { margin-bottom: 2.5em; }
|
||||
.explain table { white-space: pre; }
|
||||
.icon { width: 18px; height: 18px; background-color: navy; border: 0; vertical-align: middle; }
|
||||
.icon { width: 18px; height: 18px; background: navy center no-repeat; border: 0; vertical-align: middle; }
|
||||
.icon span { display: none; }
|
||||
.icon:hover { background-color: red; }
|
||||
.size { width: 7ex; }
|
||||
.help { cursor: help; }
|
||||
.footer { position: sticky; bottom: 0; margin-right: -20px; border-top: 20px solid rgb(from var(--bg) r g b / .7); border-image: linear-gradient(rgb(from var(--bg) r g b / .2), var(--bg)) 100% 0; }
|
||||
.footer { position: sticky; bottom: 0; margin: 1em -20px .5em 0; box-shadow: 0 -5px 10px 10px var(--bg); }
|
||||
.footer > div { background: var(--bg); 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-top: .5em; position: absolute; top: 0; right: 0; background-color: var(--bg); box-shadow: 0 0 5px 5px var(--bg); }
|
||||
.loadmore { margin-left: 1ex; }
|
||||
/* .edit used in designs */
|
||||
#menu { position: absolute; margin: 10px 0 0; top: 2em; left: 0; width: 19em; }
|
||||
@@ -87,13 +88,14 @@ input.wayoff { left: -1000px; position: absolute; }
|
||||
#content { margin: 2em 0 0 21em; padding: 10px 20px 20px 0; }
|
||||
#lang { position: absolute; top: -2.6em; left: 0; padding: .3em 1em; }
|
||||
#menuopen { display: none; }
|
||||
#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; }
|
||||
#breadcrumb { white-space: nowrap; position: absolute; top: 0; left: 21em; background: var(--dim); height: 2em; line-height: 1.8em; padding: 0 1em; margin: 0 0 0 -18px; }
|
||||
#logo { vertical-align: baseline; margin-bottom: -3px; }
|
||||
#h1 { color: #777; text-decoration: none; font-style: italic; }
|
||||
#version { color: red; }
|
||||
#schema { margin-left: 60px; position: relative; user-select: none; -webkit-user-select: none; }
|
||||
#schema .table { border: 1px solid silver; padding: 0 2px; cursor: move; position: absolute; }
|
||||
#schema .references { position: absolute; }
|
||||
#help { position: absolute; border: 1px solid #999; background: #eee; padding: 5px; font-family: monospace; z-index: 1; }
|
||||
#help { position: absolute; border: 1px solid #999; background: var(--dim); padding: 5px; font-family: monospace; z-index: 1; }
|
||||
|
||||
/* inlined here and not in compile.php because otherwise the development version flickers a little bit when loading the images */
|
||||
.icon-up { background-image: url(data:image/gif;base64,R0lGODlhEgASAIEAMe7u7gAAgJmZmQAAACH5BAEAAAEALAAAAAASABIAAQIghI+py+0PTQhRTgrvfRP0nmEVOIoReZphxbauAMfyHBcAOw==); }
|
||||
@@ -113,16 +115,17 @@ input.wayoff { left: -1000px; position: absolute; }
|
||||
.rtl #lang, .rtl #menu { left: auto; right: 0; }
|
||||
.rtl pre, .rtl code { direction: ltr; }
|
||||
|
||||
@media all and (max-width: 880px) {
|
||||
@media all and (max-width: 800px) {
|
||||
.pages { left: auto; }
|
||||
.logout { padding: 1em; top: 3em; }
|
||||
#menu { width: auto; background: var(--bg); border: 1px solid var(--fg); }
|
||||
#content { margin-left: 10px; }
|
||||
.js .logout { top: 1.667em; background-color: var(--dim); box-shadow: 0 0 5px 5px var(--dim); }
|
||||
#menu { position: static; width: auto; min-width: 23em; background: var(--bg); border: 1px solid var(--fg); margin-top: 9px; box-shadow: 0 0 20px -3px var(--fg); }
|
||||
#content { margin-left: 10px !important; }
|
||||
#lang { position: static; }
|
||||
#breadcrumb { left: 48px; }
|
||||
#breadcrumb { left: 48px !important; }
|
||||
.js #foot { position: absolute; top: 2em; left: 0; }
|
||||
.js .foot { display: none; }
|
||||
.js #menuopen { display: block; position: absolute; top: 3px; left: 6px; }
|
||||
.nojs .logout, .nojs #menu { position: static; }
|
||||
.nojs #menu { position: static; }
|
||||
.rtl .pages { right: auto; }
|
||||
.rtl #content { margin-right: 10px; }
|
||||
.rtl #breadcrumb { right: auto; }
|
||||
|
@@ -1,60 +1,64 @@
|
||||
'use strict'; // Adminer specific functions
|
||||
|
||||
let autocompleter; // set in adminer.inc.php
|
||||
|
||||
/** Load syntax highlighting
|
||||
* @param string first three characters of database system version
|
||||
* @param [string]
|
||||
*/
|
||||
function syntaxHighlighting(version, vendor) {
|
||||
if (window.jush) {
|
||||
jush.create_links = 'target="_blank" rel="noreferrer noopener"';
|
||||
if (version) {
|
||||
for (let key in jush.urls) {
|
||||
let obj = jush.urls;
|
||||
if (typeof obj[key] != 'string') {
|
||||
obj = obj[key];
|
||||
key = 0;
|
||||
if (vendor == 'maria') {
|
||||
for (let i = 1; i < obj.length; i++) {
|
||||
obj[i] = obj[i]
|
||||
.replace('.html', '/')
|
||||
.replace('-type-syntax', '-data-types')
|
||||
.replace(/numeric-(data-types)/, '$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')
|
||||
;
|
||||
addEventListener('DOMContentLoaded', () => {
|
||||
if (window.jush) {
|
||||
jush.create_links = 'target="_blank" rel="noreferrer noopener"';
|
||||
if (version) {
|
||||
for (let key in jush.urls) {
|
||||
let obj = jush.urls;
|
||||
if (typeof obj[key] != 'string') {
|
||||
obj = obj[key];
|
||||
key = 0;
|
||||
if (vendor == 'maria') {
|
||||
for (let i = 1; i < obj.length; i++) {
|
||||
obj[i] = obj[i]
|
||||
.replace('.html', '/')
|
||||
.replace('-type-syntax', '-data-types')
|
||||
.replace(/numeric-(data-types)/, '$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] = (vendor == 'maria' ? obj[key].replace('dev.mysql.com/doc/mysql', 'mariadb.com/kb') : obj[key]) // MariaDB
|
||||
.replace('/doc/mysql', '/doc/refman/' + version) // MySQL
|
||||
;
|
||||
if (vendor != 'cockroach') {
|
||||
obj[key] = obj[key].replace('/docs/current', '/docs/' + version); // PostgreSQL
|
||||
obj[key] = (vendor == 'maria' ? obj[key].replace('dev.mysql.com/doc/mysql', 'mariadb.com/kb') : obj[key]) // MariaDB
|
||||
.replace('/doc/mysql', '/doc/refman/' + version) // MySQL
|
||||
;
|
||||
if (vendor != 'cockroach') {
|
||||
obj[key] = obj[key].replace('/docs/current', '/docs/' + version); // PostgreSQL
|
||||
}
|
||||
}
|
||||
}
|
||||
if (window.jushLinks) {
|
||||
jush.custom_links = jushLinks;
|
||||
}
|
||||
jush.highlight_tag('code', 0);
|
||||
adminerHighlighter = els => jush.highlight_tag(els, 0);
|
||||
for (const tag of qsa('textarea')) {
|
||||
if (/(^|\s)jush-/.test(tag.className)) {
|
||||
const pre = jush.textarea(tag, autocompleter);
|
||||
if (pre) {
|
||||
setupSubmitHighlightInput(pre);
|
||||
tag.onchange = () => {
|
||||
pre.textContent = tag.value;
|
||||
pre.oninput();
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (window.jushLinks) {
|
||||
jush.custom_links = jushLinks;
|
||||
}
|
||||
jush.highlight_tag('code', 0);
|
||||
adminerHighlighter = els => jush.highlight_tag(els, 0);
|
||||
for (const tag of qsa('textarea')) {
|
||||
if (/(^|\s)jush-/.test(tag.className)) {
|
||||
const pre = jush.textarea(tag);
|
||||
if (pre) {
|
||||
setupSubmitHighlightInput(pre);
|
||||
tag.onchange = () => {
|
||||
pre.textContent = tag.value;
|
||||
pre.oninput();
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** Get value of dynamically created form field
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 318 B |
BIN
adminer/static/logo.png
Normal file
BIN
adminer/static/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 587 B |
58
compile.php
58
compile.php
@@ -2,7 +2,6 @@
|
||||
<?php
|
||||
include __DIR__ . "/adminer/include/version.inc.php";
|
||||
include __DIR__ . "/adminer/include/errors.inc.php";
|
||||
include __DIR__ . "/externals/JsShrink/jsShrink.php";
|
||||
include __DIR__ . "/externals/PhpShrink/phpShrink.php";
|
||||
|
||||
function add_apo_slashes($s) {
|
||||
@@ -21,7 +20,7 @@ function remove_lang($match) {
|
||||
$idf = strtr($match[2], array("\\'" => "'", "\\\\" => "\\"));
|
||||
$s = (Adminer\Lang::$translations[$idf] ?: $idf);
|
||||
if ($match[3] == ",") { // lang() has parameters
|
||||
return $match[1] . (is_array($s) ? "lang(array('" . implode("', '", array_map('add_apo_slashes', $s)) . "')," : "sprintf('" . add_apo_slashes($s) . "',");
|
||||
return $match[1] . (is_array($s) ? "lang_format(array('" . implode("', '", array_map('add_apo_slashes', $s)) . "')," : "sprintf('" . add_apo_slashes($s) . "',");
|
||||
}
|
||||
return ($match[1] && $match[4] ? $s : "$match[1]'" . add_apo_slashes($s) . "'$match[4]");
|
||||
}
|
||||
@@ -84,8 +83,8 @@ function put_file($match) {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (basename($match[2]) != "lang.inc.php" || !$_SESSION["lang"]) {
|
||||
if (basename($match[2]) == "lang.inc.php") {
|
||||
if (basename($match[2]) == "lang.inc.php") {
|
||||
if (!$_SESSION["lang"]) {
|
||||
$return = str_replace('function lang(string $idf, $number = null): string {', 'function lang($idf, $number = null) {
|
||||
if (is_string($idf)) { // compiled version uses numbers, string comes from a plugin
|
||||
// English translation is closest to the original identifiers //! pluralized translations are not found
|
||||
@@ -97,29 +96,17 @@ function put_file($match) {
|
||||
if (!$count) {
|
||||
echo "lang() not found\n";
|
||||
}
|
||||
} else {
|
||||
$return = preg_replace('~// not used in a single language version from here\n.*~s', '', $return);
|
||||
$return = preg_replace_callback('~(\$pos = (.+\n).+;)~sU', function ($match) {
|
||||
return "\$pos = $match[2]\t\t\t: " . (preg_match("~'$_SESSION[lang]'.* \\? (.+)\n~U", $match[1], $match2) ? $match2[1] : "1") . "\n\t\t);";
|
||||
}, $return);
|
||||
$return = str_replace('Lang::$translations[$idf] ?: $idf', '$idf', $return); // lang() is used only by old plugins
|
||||
$return .= "define('Adminer\\LANG', '$_SESSION[lang]');\n";
|
||||
}
|
||||
$tokens = token_get_all($return); // to find out the last token
|
||||
return "?>\n$return" . (in_array($tokens[count($tokens) - 1][0], array(T_CLOSE_TAG, T_INLINE_HTML), true) ? "<?php" : "");
|
||||
} elseif (preg_match('~\s*(\$pos = (.+\n).+;)~sU', $return, $match2)) {
|
||||
// single language lang() is used for plural
|
||||
return "function get_lang() {
|
||||
return '$_SESSION[lang]';
|
||||
}
|
||||
|
||||
function lang(\$translation, \$number = null) {
|
||||
if (is_array(\$translation)) {
|
||||
\$pos = $match2[2]\t\t\t: " . (preg_match("~'$_SESSION[lang]'.* \\? (.+)\n~U", $match2[1], $match3) ? $match3[1] : "1") . '
|
||||
);
|
||||
$translation = $translation[$pos];
|
||||
}
|
||||
$translation = str_replace("%d", "%s", $translation);
|
||||
$number = format_number($number);
|
||||
return sprintf($translation, $number);
|
||||
}
|
||||
';
|
||||
} else {
|
||||
echo "lang() \$pos not found\n";
|
||||
}
|
||||
$tokens = token_get_all($return); // to find out the last token
|
||||
return "?>\n$return" . (in_array($tokens[count($tokens) - 1][0], array(T_CLOSE_TAG, T_INLINE_HTML), true) ? "<?php" : "");
|
||||
}
|
||||
|
||||
function lzw_compress($string) {
|
||||
@@ -202,20 +189,21 @@ function get_translations($lang) {
|
||||
function minify_css($file) {
|
||||
global $project;
|
||||
if ($project == "editor") {
|
||||
$file = preg_replace('~.*\.url\(.*~', '', $file);
|
||||
$file = preg_replace('~\.icon-(up|down|plus|cross).*~', '', $file);
|
||||
}
|
||||
$file = preg_replace_callback('~url\((\w+\.(gif|png|jpg))\)~', function ($match) {
|
||||
return "url(data:image/$match[2];base64," . base64_encode(file_get_contents(__DIR__ . "/adminer/static/$match[1]")) . ")"; // we don't have ME in *.css so we can only inline images
|
||||
}, $file);
|
||||
return lzw_compress(preg_replace('~\s*([:;{},])\s*~', '\1', preg_replace('~/\*.*?\*/\s*~s', '', $file)));
|
||||
}
|
||||
|
||||
function minify_js($file) {
|
||||
$file = preg_replace_callback("~'use strict';~", function ($match) { // keep only the first one
|
||||
static $count = 0;
|
||||
$count++;
|
||||
return ($count == 1 ? $match[0] : '');
|
||||
}, $file);
|
||||
if (function_exists('jsShrink')) {
|
||||
$file = jsShrink($file);
|
||||
file_put_contents("compile.js", $file);
|
||||
$terser = shell_exec("terser -c --comments false compile.js"); // prints warning to stderr if terser is not available
|
||||
if ($terser) {
|
||||
$file = $terser;
|
||||
}
|
||||
unlink("compile.js");
|
||||
return lzw_compress($file);
|
||||
}
|
||||
|
||||
@@ -321,7 +309,7 @@ if ($vendor) {
|
||||
$file = str_replace(");\n\t\techo \$this->loginFormField('server', '<tr><th>' . lang('Server') . '<td>', '<input name=\"auth[server]", ' . \'<input type="hidden" name="auth[server]"', $file);
|
||||
}
|
||||
}
|
||||
$file = preg_replace('(;\s*../externals/jush/modules/jush-(?!textarea\.|txt\.|js\.|' . preg_quote($vendor == "mysql" ? "sql" : $vendor) . '\.)[^.]+.js)', '', $file);
|
||||
$file = preg_replace('(;\s*../externals/jush/modules/jush-(?!autocomplete-sql\.|textarea\.|txt\.|js\.|' . preg_quote($vendor == "mysql" ? "sql" : $vendor) . '\.)[^.]+.js)', '', $file);
|
||||
$file = preg_replace_callback('~doc_link\(array\((.*)\)\)~sU', function ($match) use ($vendor) {
|
||||
list(, $links) = $match;
|
||||
$links = preg_replace("~'(?!(" . ($vendor == "mysql" ? "sql|mariadb" : $vendor) . ")')[^']*' => [^,]*,?~", '', $links);
|
||||
@@ -343,7 +331,7 @@ if ($_SESSION["lang"]) {
|
||||
$file = str_replace('<?php echo LANG; ?>', $_SESSION["lang"], $file);
|
||||
}
|
||||
$file = str_replace('echo script_src("static/editing.js");' . "\n", "", $file); // merged into functions.js
|
||||
$file = preg_replace('~\s+echo script_src\("\.\./externals/jush/modules/jush-(textarea|txt|js|" \. JUSH \. ")\.js"\);~', '', $file); // merged into jush.js
|
||||
$file = preg_replace('~\s+echo script_src\("\.\./externals/jush/modules/jush-(autocomplete-sql|textarea|txt|js|" \. JUSH \. ")\.js", true\);~', '', $file); // merged into jush.js
|
||||
$file = preg_replace('~echo .*/jush(-dark)?.css\'>.*~', '', $file); // merged into default.css or dark.css
|
||||
if (function_exists('stripTypes')) {
|
||||
$file = stripTypes($file);
|
||||
|
2
designs/adminer-dark/README.md
Normal file
2
designs/adminer-dark/README.md
Normal file
@@ -0,0 +1,2 @@
|
||||
## Screenshot
|
||||

|
1
designs/adminer-dark/adminer-dark.css
Normal file
1
designs/adminer-dark/adminer-dark.css
Normal file
@@ -0,0 +1 @@
|
||||
/* Empty file named adminer-dark.css causes Adminer to switch to default dark mode. */
|
@@ -317,6 +317,7 @@ font-size:10px;
|
||||
height: 23px;
|
||||
width: 255px;
|
||||
display: block;
|
||||
margin-top: -28px;
|
||||
padding: 1px 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
|
@@ -692,6 +692,7 @@ legend{
|
||||
padding: 0;
|
||||
top: 0;
|
||||
overflow-y: overlay;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
#menu p {
|
||||
|
@@ -42,7 +42,7 @@ html>/**/body .message, html>/**/body #menu p.message {
|
||||
|
||||
/* Adminer logo */
|
||||
html>/**/body h1 {
|
||||
background: #eee url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEXAwMD/////AAAATmEAAAAA%0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5w%2BL8AAAAAXRSTlMAQObYZgAAAAlwSFlz%0AAAALEgAACxIB0t1%2B/AAAAEVJREFUCJljYEAGjIKCAmCGoKKSIFhASFBQEcgFkoJCggyMwsaGQiA1%0AjIaCwoKKQkCGsbGxIEwErJcoBtAcqEWCgiguAADa1AZzThzIfQAAAABJRU5ErkJggg%3D%3D%0A") no-repeat 14px 7px;
|
||||
background: #eee;
|
||||
box-shadow: 0px 0px 3px rgba(0,0,0,0.30) !important;
|
||||
font-size: 1em;
|
||||
padding: 7px 6px 5px 35px;
|
||||
|
@@ -6,8 +6,6 @@ Used Silk icon set 1.3 by Mark James - http://www.famfamfam.com/lab/icons/silk
|
||||
.error {background:#FFEEEE url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIsSURBVDjLpVNLSJQBEP7+h6uu62vLVAJDW1KQTMrINQ1vPQzq1GOpa9EppGOHLh0kCEKL7JBEhVCHihAsESyJiE4FWShGRmauu7KYiv6Pma+DGoFrBQ7MzGFmPr5vmDFIYj1mr1WYfrHPovA9VVOqbC7e/1rS9ZlrAVDYHig5WB0oPtBI0TNrUiC5yhP9jeF4X8NPcWfopoY48XT39PjjXeF0vWkZqOjd7LJYrmGasHPCCJbHwhS9/F8M4s8baid764Xi0Ilfp5voorpJfn2wwx/r3l77TwZUvR+qajXVn8PnvocYfXYH6k2ioOaCpaIdf11ivDcayyiMVudsOYqFb60gARJYHG9DbqQFmSVNjaO3K2NpAeK90ZCqtgcrjkP9aUCXp0moetDFEeRXnYCKXhm+uTW0CkBFu4JlxzZkFlbASz4CQGQVBFeEwZm8geyiMuRVntzsL3oXV+YMkvjRsydC1U+lhwZsWXgHb+oWVAEzIwvzyVlk5igsi7DymmHlHsFQR50rjl+981Jy1Fw6Gu0ObTtnU+cgs28AKgDiy+Awpj5OACBAhZ/qh2HOo6i+NeA73jUAML4/qWux8mt6NjW1w599CS9xb0mSEqQBEDAtwqALUmBaG5FV3oYPnTHMjAwetlWksyByaukxQg2wQ9FlccaK/OXA3/uAEUDp3rNIDQ1ctSk6kHh1/jRFoaL4M4snEMeD73gQx4M4PsT1IZ5AfYH68tZY7zv/ApRMY9mnuVMvAAAAAElFTkSuQmCC") no-repeat scroll 0.8em center; padding-left:38px;}
|
||||
.message, #menu p.message {background:#EEFFEE url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKfSURBVDjLpZPrS1NhHMf9O3bOdmwDCWREIYKEUHsVJBI7mg3FvCxL09290jZj2EyLMnJexkgpLbPUanNOberU5taUMnHZUULMvelCtWF0sW/n7MVMEiN64AsPD8/n83uucQDi/id/DBT4Dolypw/qsz0pTMbj/WHpiDgsdSUyUmeiPt2+V7SrIM+bSss8ySGdR4abQQv6lrui6VxsRonrGCS9VEjSQ9E7CtiqdOZ4UuTqnBHO1X7YXl6Daa4yGq7vWO1D40wVDtj4kWQbn94myPGkCDPdSesczE2sCZShwl8CzcwZ6NiUs6n2nYX99T1cnKqA2EKui6+TwphA5k4yqMayopU5mANV3lNQTBdCMVUA9VQh3GuDMHiVcLCS3J4jSLhCGmKCjBEx0xlshjXYhApfMZRP5CyYD+UkG08+xt+4wLVQZA1tzxthm2tEfD3JxARH7QkbD1ZuozaggdZbxK5kAIsf5qGaKMTY2lAU/rH5HW3PLsEwUYy+YCcERmIjJpDcpzb6l7th9KtQ69fi09ePUej9l7cx2DJbD7UrG3r3afQHOyCo+V3QQzE35pvQvnAZukk5zL5qRL59jsKbPzdheXoBZc4saFhBS6AO7V4zqCpiawuptwQG+UAa7Ct3UT0hh9p9EnXT5Vh6t4C22QaUDh6HwnECOmcO7K+6kW49DKqS2DrEZCtfuI+9GrNHg4fMHVSO5kE7nAPVkAxKBxcOzsajpS4Yh4ohUPPWKTUh3PaQEptIOr6BiJjcZXCwktaAGfrRIpwblqOV3YKdhfXOIvBLeREWpnd8ynsaSJoyESFphwTtfjN6X1jRO2+FxWtCWksqBApeiFIR9K6fiTpPiigDoadqCEag5YUFKl6Yrciw0VOlhOivv/Ff8wtn0KzlebrUYwAAAABJRU5ErkJggg==") no-repeat scroll 0.8em center; padding-left:38px;}
|
||||
|
||||
h1 {background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIECCYmDoJEqQAAA3lJREFUSMfVlm9olVUcxz/nPH/uvftzd29XWI21Su4spDk3gmU0vGC9sBdLhFlkpdELadibiMQ206CEoUYECWuLXgT9E00FC7FyYVGIxMgMg2c2rrfRNtu93P2793nOc04vTCGR6Op60Q8Ohx98OV++3+/h/I7gEyz+w5KLfeDxIaJnt0bqrvRisRVMPsk6I3jNkmJ0BvniTSsY6E86U5vFYwP9SQfg05bksdItzhoCLlT7+s2bIjjf4ybXn8u/J3zWrZrKxwC2bMsHXtQtGkFW2qb6hgl+3Ww1Jwr+x0aI0YOtiadX7KUIsHPXcqs1N3fCWOZhJXnJBqgfqrcmRlc2E0ktR6lGtIxj4WLwMWIaJ8gS2D/x+kdjVwhi0iyTkiVIMbLngZSCPACv7vo53LqJsfkaXrjzbSaFdVd3exhxe1GBh+2MIEUOFRRx8QlVFGklxIK+3dhOB8g41aU+th/MAeSetVrcUjigpThy5N7EG1u25YNvdlC17ILYPl1lBu8ZJGuHdvR5zMIh2n47RPd3fmZ/Rlxrx3DPsInt7j5cmnN7zKzbBewHaHw3PDvyHOsbZ+hd5edjQLDkj0gEUW6Nl6wUhFnB3Rvfx8hLhGEDjimi5TiWKSCERmkbQwLLakKbKIbfMWaM3R+89W+zstHCxpFDmYaLvwyfjyVJ1TYQ6Dh+KIk4CjssMBsZTz96esb7smM1vl5ZyWWwL2+z5Fpy0ONNA9PXRZ5KC8qBxnZlZU+FMArfymS/bkv8E9A7ed9tCJHBaFWZAiElUsb9ebGP3sddhCyCKWBCH9woopwgtGvQuogkizSyMgJtJCZyNL322z2e12xxsZwgTMapUZIFoQhVgcyBYjqSNt7xjtWosNIMQhB5DcAznyvg0l/r7xbhwWftN5CBlEqIxCbvi9aW2lfWRK4Hiu58pJYdXfcjrCeQlWaglTS2OEcY3TBDqom+DRItFJgSllWFRpZM6ONEPVTpNMJNVGiRIwkWfkivPfOh1+mZ9Km0mDhxh6vLs3KuTYR0f+9fRfdtzOCrCjMwWiNK+qrXnZ6h0ysv1gCyMaWjUPey91X7YY61/sjS1CRLmeehd3T9YL01MdoSQ9Y1Iu12lOqSVXqfroDg8sjc+1QTU8GDSLUCy74VjIsxGmFLLHyUGUcGZyK+OFnuP5CnYoL/06/i2voTrxlsuqTozDgAAAAASUVORK5CYII="); background-repeat:no-repeat; background-position:1em .82em; padding-left:2.3em;}
|
||||
|
||||
#dbs span, th a[href*="&db="]:not([href*="&select="]):not([href*="&table="]) {background:transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;}
|
||||
|
||||
.links a {margin-right:8px;}
|
||||
|
@@ -364,7 +364,7 @@ tbody tr:nth-child(n):hover th {
|
||||
}
|
||||
.icon {
|
||||
width: 1.2em;
|
||||
background: #4c3957 center no-repeat;
|
||||
background-color: #4c3957;
|
||||
background-size: 66%;
|
||||
}
|
||||
.icon-plus {
|
||||
@@ -413,6 +413,7 @@ tbody tr:nth-child(n):hover th {
|
||||
position: fixed;
|
||||
}
|
||||
#lang {
|
||||
top: 0;
|
||||
left: 18em;
|
||||
}
|
||||
.rtl #lang {
|
||||
@@ -497,7 +498,7 @@ button,
|
||||
display: inline-block;
|
||||
font-size: 85%;
|
||||
text-align: center;
|
||||
background: #4c3957;
|
||||
background-color: #4c3957;
|
||||
color: #fff;
|
||||
padding: 0.5em 0.8em 0.6em;
|
||||
margin: 0;
|
||||
@@ -517,7 +518,7 @@ button:focus,
|
||||
.links a:link:focus,
|
||||
.links a:visited:focus {
|
||||
color: #fff;
|
||||
background: #ec5f12;
|
||||
background-color: #ec5f12;
|
||||
text-decoration: none;
|
||||
}
|
||||
input[type="submit"]:disabled,
|
||||
@@ -691,10 +692,13 @@ input[type="file"]:disabled::file-selector-button {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
@media all and (max-width: 880px) {
|
||||
@media all and (max-width: 800px) {
|
||||
body {
|
||||
padding-bottom: 2em;
|
||||
}
|
||||
.js #menuopen {
|
||||
left: 14px;
|
||||
}
|
||||
body,
|
||||
#content,
|
||||
#content > form:last-of-type,
|
||||
@@ -710,7 +714,7 @@ input[type="file"]:disabled::file-selector-button {
|
||||
width: auto;
|
||||
}
|
||||
#breadcrumb {
|
||||
padding: 0 0 0 10px;
|
||||
padding: 0 28px;
|
||||
height: 2em;
|
||||
line-height: 2em;
|
||||
margin: 0 -10px;
|
||||
|
@@ -726,6 +726,10 @@ legend{
|
||||
/* menu
|
||||
----------------------------------------------------------------------- */
|
||||
|
||||
#foot{
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#menu{
|
||||
height: 100%;
|
||||
width: 300px;
|
||||
@@ -739,6 +743,7 @@ legend{
|
||||
top: 0;
|
||||
overflow-y: overlay;
|
||||
overflow-y: auto; /* needed for firefox 2017-03-05 */
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
#menu p {
|
||||
|
@@ -28,7 +28,7 @@ h1 {
|
||||
font-size: 150%;
|
||||
font-weight: normal;
|
||||
margin: 0;
|
||||
padding: .8em .7em;
|
||||
padding: 1.6em .7em 0;
|
||||
color: #f44;
|
||||
border-bottom: 0 solid #999;
|
||||
background: transparent;
|
||||
@@ -368,7 +368,7 @@ td.nowrap {
|
||||
right: 0;
|
||||
left: auto;
|
||||
}
|
||||
@media all and (max-width: 880px) {
|
||||
@media all and (max-width: 800px) {
|
||||
.pages {
|
||||
left: auto;
|
||||
}
|
||||
|
@@ -237,10 +237,7 @@ p code + a:visited:hover {
|
||||
}
|
||||
|
||||
#menu h1 {
|
||||
background: none left top no-repeat;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAAyCAIAAABgVkRrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTA0RDI5NkM5QkRGMTFFMzg4ODNEQjEzNjY5NzJEMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTA0RDI5NkQ5QkRGMTFFMzg4ODNEQjEzNjY5NzJEMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDREMjk2QTlCREYxMUUzODg4M0RCMTM2Njk3MkQwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDREMjk2QjlCREYxMUUzODg4M0RCMTM2Njk3MkQwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnG4emkAAASXSURBVHja7Fk9aNtAFL6EDKKUoqGDySRKB1FC8dDBdCgeOmQoIUMG0yGE0EFT8dDBUwidPJQQQgcNpYROGjKI0sFDB9GhaMhgSgcPpWgqHjqYYsINJfQ7PfV0tmX9JI4Sgx+HI8f26bt3733fe6elIf/LbqwdHbJWS1wYBrMstrXJVg36ZJnNhQWBWMB9k+215gq3tDeHBH3pRseJtC8ee2ezEzd62+ncDH/DhS+ttC88qbMPDntaj952uyvXD3q7ETvyyE77pq5HFz9614r7V8C2GnBezBgp9tGNl3ffzIjvwZ9B//dA7Mz3YPLTyl29UhE+MI0KW9YKh2yjwQZichEAjsNu6WlUqNqkvwHUO+0BJeD2gn4hJFXTwAIw6jUzYxlwHkCTvWqy1+0Ct7FtsPh/3Ofc9brOJ5+8ezHr9gKMcGpWf2SK8bhKk48sA1kIOiODmzc2c8U0DLrzwhI5ypjA3fsZtNrOgPP4y5pmGJXamqHd1kQMTIkENYpwEfQHEW7GsGkYZse393ewb+Y9IwE0PJcOejQ2pFgK3Li3BI14hZM269XKaiXPVPodHUOs6l48o/+t5wO038OcQGztHzd31uPfUEgQdCQi3JkfumLLHa9LoK2tunPQtJ6v5wQ9zWoPzebupms34QKxmZNJAugIDzJE+V4rbTrDSMYtr3AD+H5WFIfZ0lIFPu50otiF7zfW2dlgquKccTFWRxYQ8wlFJOVTdc2gAChq/V99vxdgD7O5CIBO/Yi/P3vsUY2dOOxBdSrzIBm2dxJwq+hlaiId9dua5OlEv/IhH0vKvAYXfvUjvUTFB2STeinJu91Oxo3Eh58onwRXcB7zWkGj/Maa9203+9soPIyWEKBEkQdc8veo+sS4wQkYzV1Bi+A1Ee5DnhO33BxsSw1/wszGPHkXmqI7yIQzPvnvhPqEFjAWtSq7j7n2YplwSctVV8F/FXazbN76nQXu68btfe3Odmqwahl5Ca6tel0UVdnVc6pRBX/JkrgYn0RCY0cdAMhYvGYxHbEklbJ++FoqD8LTUiwTlZLEha55WKOmSybWTCXD1eJG8dnc4XAYqmdgmoRFyp/ZqqHbgMiD8qGXZeAOs1RD9YyhBgBVTgL3cMTHwKd2xyUL50qmTI5p/oK/F7jnEjeycLZTFz02SrKlaSPGbe0fOx+9mbTGcMHhe/fwuFMGn4Dy7BMPA3oBGkZrbIDgcp9JgK37YYtZjmSuqApH9yPRcTp+TM939THOpkaYroMguRuSE14tbuegif11vS58poYm7i1vn6fdxF6hMoNk4leIvTJ0B1FhPQ/PxM45eZ2HGjkY8jHXqptghGJJqqmKVHn1oCr4k93xgr8XuOcZ9zmf7dQym68Et6QFcFaBk7EsQ5fdfuteHW7xPM3asyVh05EkxFJITMHuGDUCukxwvOz3YI31mtWoX7TRXkrDjQhBLeFOHBtQQ6n/f8TDlAd/6mNBP7xO7Ecbz2qNjfrl6qoU3Mr5Qa4j9yyLHqZd7jwjL241QQFdPiJTdT7RsBuapslzi5mqVSHcKXYetcZlSelU3P8EGADW25uhkIE0mQAAAABJRU5ErkJggg==);
|
||||
line-height: 50px;
|
||||
padding-left: 50px;
|
||||
padding-top: 9px;
|
||||
text-transform: lowercase;
|
||||
margin: 25px 0 10px 16px;
|
||||
|
@@ -36,10 +36,9 @@ html>/**/body #dump {
|
||||
}
|
||||
/* Modified adminer logo */
|
||||
html>/**/body h1 {
|
||||
background: #eee url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFMEMzMjFEREIzNENFMTExOTE4QkYwQjc5MjcxNEMzNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOUM1RjA3QTRENkIxMUUxODFCNkVBNEZGMDk2NUJEMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOUM1RjA3OTRENkIxMUUxODFCNkVBNEZGMDk2NUJEMSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFM0MzMjFEREIzNENFMTExOTE4QkYwQjc5MjcxNEMzNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFMEMzMjFEREIzNENFMTExOTE4QkYwQjc5MjcxNEMzNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ph6vyIoAAAJsSURBVHjalFNNaxNRFD3z0Uxm2iRtGhVdBOxOcFkESQ2GNoXgwk1X/Q9uxB+QRf6CP6HQbQs1UFqisREhG4MYJVlEiyR2IM4kZjL5mJnnfZOMpAsFH5y5dz7OefeeuU8AECIs5XK5p6Io3nFdV2aMiRyHh4fPMF+CIPDA+GV/f/95sVg8onTK78OEWDabfaHrOmu1WqxerzPbHrHBYMjY5iZF248c06nHDMP4wTkEVaQLh+R5nuQ4Dnq9HpLJJBxniuXHaRin5+DPB6Uy7HIF8sMHoOqEVCrFNxY4mdcm8ZIXSsVKJgPz7NzPi6cXflTTKUzfvffzSqXiLQoIXNVvkvlt0o4lrO5s+23ndrf8aJdnQnt7ey8DnhiYRKV/yufzpWq1ioODA4zHY+gnJ1jb3cFkYtO9TRVsod83h9TS54AnB0ksFrtfKBQylmXBtm202x1sbGzgV+k1VGqL/hBGFxVEJUmTZfkeUd5cE+ArMLHb7VLu4sPHL7DpmaIqiK+tIrG+jhuJxCIFIv61BAbXc6h7F55AYLP8PwTIOsGbgYvMsbikYBLj8bjSaDRuUX6Xt9But/H921eYug7LMGH9NDGg+Oro+G2z2TzudDqXfBL/eBCJRK6ZyD3QidSzLciKiOUVFdFoBOkn249qtdoZUS4WTWTD4dC7bqKDK8NAb2JB0UJYZVGIMoOmKXwDNzgX4jxhRPyLH2zBhxlM0xQCnjw/THESCNH/5fOAUCjktyApKrRRH6Ii+C1omgpJFrnAEucQulzpNiEZDoczNMY36ThL8zENxtw/HzRIjKJHcOm7q9FoVKJXl78FGAAi7FBT6eTVegAAAABJRU5ErkJggg==") no-repeat 14px center;
|
||||
box-shadow: 0px 0px 3px rgba(0,0,0,0.30) !important;
|
||||
font-size: 1em;
|
||||
padding: 6px 6px 5px 35px;
|
||||
padding: 6px 6px 5px 1em;
|
||||
}
|
||||
/* Logout */
|
||||
html>/**/body input[name="logout"], #logout {
|
||||
|
@@ -1,10 +1,7 @@
|
||||
/*!
|
||||
* @package Adminer.css - Theme CSS for Adminer --- [theme light] gray - orange B (with icons)
|
||||
*
|
||||
*/
|
||||
/*!
|
||||
* @version 5.1.0.1
|
||||
* @date Sat, 29 Mar 2025 13:55:32 +0100
|
||||
* @version 5.1.1.1
|
||||
* @date Thu, 03 Apr 2025 13:24:32 +0100
|
||||
* @author Robert Mesaros
|
||||
* @copyright Copyright 2025 Robert Mesaros, rmSOFT, Slovakia
|
||||
* @web https://www.rmsoft.sk
|
||||
@@ -36,27 +33,20 @@
|
||||
* Modified icons by Robert Mesaros
|
||||
*
|
||||
*/
|
||||
html {
|
||||
--bg: #f0f0f0;
|
||||
}
|
||||
|
||||
#menu{padding:0 0 30px 0}
|
||||
.ltr .logout{right:0;left:auto;margin-top:.5em}
|
||||
.rtl .logout{left:0;right:auto;margin-top:.5em}
|
||||
html{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}
|
||||
*,*:before,*:after{box-sizing:inherit}
|
||||
html{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;--bg:#f0f0f0;--fg:#000}
|
||||
*:before,*:after{box-sizing:inherit}
|
||||
body{color:#000;background:#f0f0f0;font-family:Verdana,Arial,Helvetica,sans-serif;font-weight:normal;cursor:default;margin:0}
|
||||
a{color:#c60;text-decoration:none}
|
||||
a:visited{color:#844200}
|
||||
a:link:hover,a:visited:hover{color:#d00808;text-decoration:underline}
|
||||
img{width:100%;max-width:100%}
|
||||
#menu #h1{margin-left:10px}
|
||||
#menu h1{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAdCAYAAAC9pNwMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozNDA3NDEwQ0Y0MkQxMUVGODA4RUNENTRFQzJENUU4RCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozNDA3NDEwQkY0MkQxMUVGODA4RUNENTRFQzJENUU4RCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFRTREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ph59M4AAAAPFSURBVHja7JZrSFNRHMDvvVvq1mNlucBK0g/lh+Us6oPrU0ERRFgRUqYUVEb2qTJ0vko0ZbMHiBT0sizSXEUfJGzN1CjBQLPCR/RwSYKp23RO3e527/r/57mxxpblhCD8w59z7t2553f+zx36Ulk5FYxkZpyiijVahUgkqnc62cu5arUGXrMl2tIkhmGuu91uGp4HXre0qB490A3C3IXfMVSQojl/QQYAHUzlNtvYPBhl2Xn5672gqBFxSmXF0WPpCTCfg+/EwUDBwkixeM4TmqZjzSbTFU1J8W00RiaTtUxMTJSfzctFd4Yq49eGJ6ekNETHxGyG50jQkWDAcoA+BqjSbDaXA/QqvBtFBWg6QGuJtSaapr7jB7AWrV0C6pguWAZurIeNFCaTqUxbUnwd3lkRAjoO0JswStApEGs1jJs4jusw9vTcEcI7LTBA3wA02mI2X/WFgvIIxCQC6EmIdQ7P898qb1Xs7O7qGiVrWWaa4C5PZopEy6RSKQfTYS8oRUYO1i3Hh4e6mlSA2sjhLHgwMdkoA04lI1noV8BVn/Nzsu/iFHTP2cIiHSTR9tNZaqYgP28/iecv4nA4ajmXi7NYLKPkcFbiDYomdcxNVVoul6s9JytzC/mYWxEVtfDQkbQKiUSyw26368/k5iTBexvZSxA0bD4Zx0An0E4B3Nfz5cu+zs4OJ+tgQwOBlfHxcSujo7MHBwfTLpZq69Cdq2NjFyWnpFaGhYVtA3hdU2PD4ecGQ78AhxjnQi6o29va1lVX3TNibAUwniSyq7PT+qKxcQjmduEHX0lQqSIgUZaOj4+FwyM2ipEP3d1msHRvQdG5GoQnqDYWAviEYDmErw/G1t7e3hAYQwiY+tm5Pn36aCdusATS+QsWDOBa8ArWInqGga6FltnQzcPDlrKvRmMTKSMRroXQ3AXd3fzq5ZCvQZ7kOnb8ONQXbYd+6/pNmBd70pXnfHPBAy8pKsojUNYruzmSEwzp0e5fwNCBFIFc7CXMZHbzIn9JT9wrJA/nVVasv8084PvVVVvftLbavIPvK6kHDqoUa9Zc+03J8V6WTike8FzpXJ4UtzUQOEIux98oCAdHzYCIJzsQw5M6s0LC+D01NIPxmQQz1D+SWfAs+D8FO1mn6w9uHUJ90zPSQOAvcdWOxERD4q5dSwjA/0KxuNmg1294/+7tGLlFuIOy+NbNG0b4s3YSSwIqyzr4Z/qnlv7+/iE/N42/FjokJBQ3lmI7JteUQK5E0Ajp6fZgLUaw0LNDp7juuomL2WCtRfkhwACjULOQ0RiwkAAAAABJRU5ErkJggg==");background-repeat:no-repeat}
|
||||
#menu h1:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAdCAYAAAC9pNwMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowQUNCOTdFQkY0MkQxMUVGOUM0OUMyQTRDNjAyNzhENiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowQUNCOTdFQUY0MkQxMUVGOUM0OUMyQTRDNjAyNzhENiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFRTREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pq1mg9cAAAQtSURBVHja7JZdTFxFFIDP3J9dCgqUQimQIlBSWNoCNfVBYmo0jX9Jg014aYrWFzWGRl9MTHzpiy8k2kbrm9qUWtMaY9S2RqV9ADQm9o/+pHsvhW5Lw8/iLu6PC9yfvTOeWWbbC9ktlPWRk5ydvWfmzjfnzJkzlxz+7HNYSpIeD1QEAtB2+kew8vKgwdXn9Wsw1uR7tQTg+zhjfRs0fTeazWCT71ARwLt8jANgn0nMNO+9d+82nw6VSZCj3PE1VhcDnJIBpDnG8tC0TmvYvC8N5YJ9yq6C/L4/6je9jo8eVJITOMjY9lJCdBUdn6D0Sq0+9B6alTpZ7okwNrjGrzWjPnkwHO4oJKR8h8fzJfaXcLiUA3TLWkJ+x+WvQeglhL6N5jhqZIqxbyo1vQP/z6GOW5QN8nfI/KtrOVhZLogwllIuE4xVo6eXEJo3TumFOn2oS0D/Rv23WtPfxPYxVCvU5DuL41pMAOOWbf+ENu4sWR4YgUlVBUdRQHIcKJPlEQyvGqT02mLofC6BhRrFBPuhEOAZG20HJoOvHItEJtEeQ7WXFWrFtmGq+gm4+NLL6DUF23Ei3O4hpLRKVXkY/nFBRSKDjUlVxR8+Coc7BTSEGuZZr8w7xN6nlBZhS7LBqWHc3n/kyAkxaV2osWG4RJKqrtRvOluu6S0PtvCBxCg9iZtsBSwrJBYXEdFgKTAhpFuW5aW8v4p6RoTV7Bwb23F848aLxYRUhn2NN0o13Sf6kukX6vWhT7E5zoMm+mwOTTGxgIzfCQT2+v03bcu0vNmoLa2tzTW1tR+GpsNvHeru/pVP0FlcXHG4YsMFflSweEwdjUaf/2AyeEtEhWFincMM2/XzzOxzHaOjf6HNSIP5Sio1vz8+0NcXdncslqfb2sokSSqfTSRKRMbGTkSjE6hb0GM/h+8rKvoOwTtFAiUtxkYNQqI3TYNHkztlusEwMjJsiDMXzQZ+vLCQZy1gVFQxiWQ+u9P29g/EMMxNdxsbfhm2rH4+FHWWg6s0/QC2B0W1WjBvCvxOV9fXGHUD9zn5kD1el0oy6tzPhdM1tQD9A/ydWI0+9KKA8uShYogtkkpKJ9UCsKKoW7N56pIU0HGonDaMtG4H6OkBkVBxETUmgOljNZfxiPKfb0+dfGHw8uXE4lW55bX9b7Rt3bbtC/eR4wXFJY7rHC9dG/hPQX4BD820WHVGcNn69fHUTSPL9ydXDWPFF0wKLMkSB89wcPfHn9BMA03TnF0MxgKwYnDO9/EqeBW8Cl4Ati07ufTXD0ufb/J/gBW8Ejfvbm8/375nT6kAZB6oKH+e7+196sb1azPuC33FHh87+tVd/AKxhSdZ1bJMeq73t0gwGOT3duJR6nLGr1aPx8snzuflWFxr2ULpiAt++mEfDI8CTtdsb7p2Z9tmEWIrV2+5/CfAAOVxxSK4gGWJAAAAAElFTkSuQmCC")}
|
||||
.rtl table.layout tbody td{display:flex}
|
||||
.rtl table.layout~table thead th:first-child,.rtl table.layout~table tbody td:first-child{text-align:right !important}
|
||||
.rtl table.layout~table thead th:last-child,.rtl table.layout~table tbody td:last-child{text-align:left !important}
|
||||
h1{padding:.6em .4em;background:#c60;border:1px solid #894501;text-align:left}
|
||||
h1{padding:.6em;background:#c60;border:1px solid #894501;text-align:left}
|
||||
#h1{color:#fff}
|
||||
.version{color:#ddd;margin-left:8px}
|
||||
h2{padding:13px 16px 14px;color:#000;background:#b8b8b8;border-bottom:1px solid #000}
|
||||
@@ -91,7 +81,6 @@ tbody a:visited{color:#840000}
|
||||
#menu p,#menu ul{padding:.8em 1em;margin:0;border-bottom:1px solid #b3b3b3}
|
||||
#menu .links a{display:block;width:fit-content;margin:0;font-size:93%}
|
||||
#menu h1{border:1px solid #894501}
|
||||
#menu h1{padding-left:52px;background-position:top 10px left 20px}
|
||||
.rtl #menu h1{direction:ltr}
|
||||
#menu p.error{margin:10px 0;padding:.5em .8em;border-bottom:1px solid #e76f6f}
|
||||
#menu p.message{margin:10px 0;padding:.5em .8em;border-bottom:1px solid #7fbd7f}
|
||||
|
@@ -1,9 +1,7 @@
|
||||
/*!
|
||||
* @package Adminer.css - Theme CSS for Adminer --- [theme dark] blue B (with icons)
|
||||
*
|
||||
*//*!
|
||||
* @version 5.1.0.1
|
||||
* @date Sat, 29 Mar 2025 13:55:32 +0100
|
||||
* @version 5.1.1.1
|
||||
* @date Thu, 03 Apr 2025 13:24:32 +0100
|
||||
* @author Robert Mesaros
|
||||
* @copyright Copyright 2025 Robert Mesaros, rmSOFT, Slovakia
|
||||
* @web https://www.rmsoft.sk
|
||||
@@ -35,29 +33,21 @@
|
||||
* Modified icons by Robert Mesaros
|
||||
*
|
||||
*/
|
||||
html {
|
||||
--bg: #002240;
|
||||
--fg: #829bb0;
|
||||
}
|
||||
|
||||
#menu{padding:0 0 30px 0}
|
||||
.ltr .logout{right:0;left:auto;margin-top:.5em}
|
||||
.rtl .logout{left:0;right:auto;margin-top:.5em}
|
||||
html{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}
|
||||
*,*:before,*:after{box-sizing:inherit}
|
||||
html{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;--bg:#002240;--fg:#829bb0}
|
||||
*:before,*:after{box-sizing:inherit}
|
||||
body{color:#829bb0;background:#002240;font-family:Verdana,Arial,Helvetica,sans-serif;font-weight:normal;cursor:default;margin:0}
|
||||
a{color:#829bb0;text-decoration:none}
|
||||
a:visited{color:#517fa8}
|
||||
a:link:hover,a:visited:hover{color:#9bc0e1;text-decoration:underline}
|
||||
img{width:100%;max-width:100%}
|
||||
#menu #h1{margin-left:10px}
|
||||
#menu h1{background-color:#1d4e78}
|
||||
#menu h1{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAdCAYAAAC9pNwMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozNDA3NDEwQ0Y0MkQxMUVGODA4RUNENTRFQzJENUU4RCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozNDA3NDEwQkY0MkQxMUVGODA4RUNENTRFQzJENUU4RCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFRTREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ph59M4AAAAPFSURBVHja7JZrSFNRHMDvvVvq1mNlucBK0g/lh+Us6oPrU0ERRFgRUqYUVEb2qTJ0vko0ZbMHiBT0sizSXEUfJGzN1CjBQLPCR/RwSYKp23RO3e527/r/57mxxpblhCD8w59z7t2553f+zx36Ulk5FYxkZpyiijVahUgkqnc62cu5arUGXrMl2tIkhmGuu91uGp4HXre0qB490A3C3IXfMVSQojl/QQYAHUzlNtvYPBhl2Xn5672gqBFxSmXF0WPpCTCfg+/EwUDBwkixeM4TmqZjzSbTFU1J8W00RiaTtUxMTJSfzctFd4Yq49eGJ6ekNETHxGyG50jQkWDAcoA+BqjSbDaXA/QqvBtFBWg6QGuJtSaapr7jB7AWrV0C6pguWAZurIeNFCaTqUxbUnwd3lkRAjoO0JswStApEGs1jJs4jusw9vTcEcI7LTBA3wA02mI2X/WFgvIIxCQC6EmIdQ7P898qb1Xs7O7qGiVrWWaa4C5PZopEy6RSKQfTYS8oRUYO1i3Hh4e6mlSA2sjhLHgwMdkoA04lI1noV8BVn/Nzsu/iFHTP2cIiHSTR9tNZaqYgP28/iecv4nA4ajmXi7NYLKPkcFbiDYomdcxNVVoul6s9JytzC/mYWxEVtfDQkbQKiUSyw26368/k5iTBexvZSxA0bD4Zx0An0E4B3Nfz5cu+zs4OJ+tgQwOBlfHxcSujo7MHBwfTLpZq69Cdq2NjFyWnpFaGhYVtA3hdU2PD4ecGQ78AhxjnQi6o29va1lVX3TNibAUwniSyq7PT+qKxcQjmduEHX0lQqSIgUZaOj4+FwyM2ipEP3d1msHRvQdG5GoQnqDYWAviEYDmErw/G1t7e3hAYQwiY+tm5Pn36aCdusATS+QsWDOBa8ArWInqGga6FltnQzcPDlrKvRmMTKSMRroXQ3AXd3fzq5ZCvQZ7kOnb8ONQXbYd+6/pNmBd70pXnfHPBAy8pKsojUNYruzmSEwzp0e5fwNCBFIFc7CXMZHbzIn9JT9wrJA/nVVasv8084PvVVVvftLbavIPvK6kHDqoUa9Zc+03J8V6WTike8FzpXJ4UtzUQOEIux98oCAdHzYCIJzsQw5M6s0LC+D01NIPxmQQz1D+SWfAs+D8FO1mn6w9uHUJ90zPSQOAvcdWOxERD4q5dSwjA/0KxuNmg1294/+7tGLlFuIOy+NbNG0b4s3YSSwIqyzr4Z/qnlv7+/iE/N42/FjokJBQ3lmI7JteUQK5E0Ajp6fZgLUaw0LNDp7juuomL2WCtRfkhwACjULOQ0RiwkAAAAABJRU5ErkJggg==");background-repeat:no-repeat;mix-blend-mode:difference}
|
||||
#menu h1:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAdCAYAAAC9pNwMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowQUNCOTdFQkY0MkQxMUVGOUM0OUMyQTRDNjAyNzhENiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowQUNCOTdFQUY0MkQxMUVGOUM0OUMyQTRDNjAyNzhENiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFRTREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pq1mg9cAAAQtSURBVHja7JZdTFxFFIDP3J9dCgqUQimQIlBSWNoCNfVBYmo0jX9Jg014aYrWFzWGRl9MTHzpiy8k2kbrm9qUWtMaY9S2RqV9ADQm9o/+pHsvhW5Lw8/iLu6PC9yfvTOeWWbbC9ktlPWRk5ydvWfmzjfnzJkzlxz+7HNYSpIeD1QEAtB2+kew8vKgwdXn9Wsw1uR7tQTg+zhjfRs0fTeazWCT71ARwLt8jANgn0nMNO+9d+82nw6VSZCj3PE1VhcDnJIBpDnG8tC0TmvYvC8N5YJ9yq6C/L4/6je9jo8eVJITOMjY9lJCdBUdn6D0Sq0+9B6alTpZ7okwNrjGrzWjPnkwHO4oJKR8h8fzJfaXcLiUA3TLWkJ+x+WvQeglhL6N5jhqZIqxbyo1vQP/z6GOW5QN8nfI/KtrOVhZLogwllIuE4xVo6eXEJo3TumFOn2oS0D/Rv23WtPfxPYxVCvU5DuL41pMAOOWbf+ENu4sWR4YgUlVBUdRQHIcKJPlEQyvGqT02mLofC6BhRrFBPuhEOAZG20HJoOvHItEJtEeQ7WXFWrFtmGq+gm4+NLL6DUF23Ei3O4hpLRKVXkY/nFBRSKDjUlVxR8+Coc7BTSEGuZZr8w7xN6nlBZhS7LBqWHc3n/kyAkxaV2osWG4RJKqrtRvOluu6S0PtvCBxCg9iZtsBSwrJBYXEdFgKTAhpFuW5aW8v4p6RoTV7Bwb23F848aLxYRUhn2NN0o13Sf6kukX6vWhT7E5zoMm+mwOTTGxgIzfCQT2+v03bcu0vNmoLa2tzTW1tR+GpsNvHeru/pVP0FlcXHG4YsMFflSweEwdjUaf/2AyeEtEhWFincMM2/XzzOxzHaOjf6HNSIP5Sio1vz8+0NcXdncslqfb2sokSSqfTSRKRMbGTkSjE6hb0GM/h+8rKvoOwTtFAiUtxkYNQqI3TYNHkztlusEwMjJsiDMXzQZ+vLCQZy1gVFQxiWQ+u9P29g/EMMxNdxsbfhm2rH4+FHWWg6s0/QC2B0W1WjBvCvxOV9fXGHUD9zn5kD1el0oy6tzPhdM1tQD9A/ydWI0+9KKA8uShYogtkkpKJ9UCsKKoW7N56pIU0HGonDaMtG4H6OkBkVBxETUmgOljNZfxiPKfb0+dfGHw8uXE4lW55bX9b7Rt3bbtC/eR4wXFJY7rHC9dG/hPQX4BD820WHVGcNn69fHUTSPL9ydXDWPFF0wKLMkSB89wcPfHn9BMA03TnF0MxgKwYnDO9/EqeBW8Cl4Ati07ufTXD0ufb/J/gBW8Ejfvbm8/375nT6kAZB6oKH+e7+196sb1azPuC33FHh87+tVd/AKxhSdZ1bJMeq73t0gwGOT3duJR6nLGr1aPx8snzuflWFxr2ULpiAt++mEfDI8CTtdsb7p2Z9tmEWIrV2+5/CfAAOVxxSK4gGWJAAAAAElFTkSuQmCC");mask-image:linear-gradient(black, transparent);-webkit-mask-image:linear-gradient(black, transparent);mix-blend-mode:unset;background-color:unset}
|
||||
.rtl table.layout tbody td{display:flex}
|
||||
.rtl table.layout~table thead th:first-child,.rtl table.layout~table tbody td:first-child{text-align:right !important}
|
||||
.rtl table.layout~table thead th:last-child,.rtl table.layout~table tbody td:last-child{text-align:left !important}
|
||||
h1{padding:.6em .4em;background:#1d4e78;border:1px solid #f2ddaf;text-align:left}
|
||||
h1{padding:.6em;background:#1d4e78;border:1px solid #f2ddaf;text-align:left}
|
||||
#h1{color:#fff}
|
||||
.version{color:#ddd;margin-left:8px}
|
||||
h2{padding:13px 16px 14px;color:#000;background:#3c678d;border-bottom:1px solid #b9cbda}
|
||||
@@ -92,7 +82,6 @@ tbody a:visited{color:#396d9b}
|
||||
#menu p,#menu ul{padding:.8em 1em;margin:0;border-bottom:1px solid #326b9c}
|
||||
#menu .links a{display:block;width:fit-content;margin:0;font-size:93%}
|
||||
#menu h1{border:1px solid #f2ddaf}
|
||||
#menu h1{padding-left:52px;background-position:top 10px left 20px}
|
||||
.rtl #menu h1{direction:ltr}
|
||||
#menu p.error{margin:10px 0;padding:.5em .8em;border-bottom:1px solid #e76f6f}
|
||||
#menu p.message{margin:10px 0;padding:.5em .8em;border-bottom:1px solid #7fbd7f}
|
@@ -1,10 +1,7 @@
|
||||
/*!
|
||||
* @package Adminer.css - Theme CSS for Adminer --- [theme light] blue B (with icons)
|
||||
*
|
||||
*/
|
||||
/*!
|
||||
* @version 5.1.0.1
|
||||
* @date Sat, 29 Mar 2025 13:55:32 +0100
|
||||
* @version 5.1.1.1
|
||||
* @date Thu, 03 Apr 2025 13:24:32 +0100
|
||||
* @author Robert Mesaros
|
||||
* @copyright Copyright 2025 Robert Mesaros, rmSOFT, Slovakia
|
||||
* @web https://www.rmsoft.sk
|
||||
@@ -36,27 +33,20 @@
|
||||
* Modified icons by Robert Mesaros
|
||||
*
|
||||
*/
|
||||
html {
|
||||
--bg: #82a7c0;
|
||||
}
|
||||
|
||||
#menu{padding:0 0 30px 0}
|
||||
.ltr .logout{right:0;left:auto;margin-top:.5em}
|
||||
.rtl .logout{left:0;right:auto;margin-top:.5em}
|
||||
html{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}
|
||||
*,*:before,*:after{box-sizing:inherit}
|
||||
html{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;--bg:#82a7c0;--fg:#000}
|
||||
*:before,*:after{box-sizing:inherit}
|
||||
body{color:#000;background:#82a7c0;font-family:Verdana,Arial,Helvetica,sans-serif;font-weight:normal;cursor:default;margin:0}
|
||||
a{color:#f0f9ff;text-decoration:none}
|
||||
a:visited{color:#fff1d0}
|
||||
a:link:hover,a:visited:hover{color:#0b3a5a;text-decoration:underline}
|
||||
img{width:100%;max-width:100%}
|
||||
#menu #h1{margin-left:10px}
|
||||
#menu h1{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAdCAYAAAC9pNwMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozNDA3NDEwQ0Y0MkQxMUVGODA4RUNENTRFQzJENUU4RCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozNDA3NDEwQkY0MkQxMUVGODA4RUNENTRFQzJENUU4RCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFRTREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ph59M4AAAAPFSURBVHja7JZrSFNRHMDvvVvq1mNlucBK0g/lh+Us6oPrU0ERRFgRUqYUVEb2qTJ0vko0ZbMHiBT0sizSXEUfJGzN1CjBQLPCR/RwSYKp23RO3e527/r/57mxxpblhCD8w59z7t2553f+zx36Ulk5FYxkZpyiijVahUgkqnc62cu5arUGXrMl2tIkhmGuu91uGp4HXre0qB490A3C3IXfMVSQojl/QQYAHUzlNtvYPBhl2Xn5672gqBFxSmXF0WPpCTCfg+/EwUDBwkixeM4TmqZjzSbTFU1J8W00RiaTtUxMTJSfzctFd4Yq49eGJ6ekNETHxGyG50jQkWDAcoA+BqjSbDaXA/QqvBtFBWg6QGuJtSaapr7jB7AWrV0C6pguWAZurIeNFCaTqUxbUnwd3lkRAjoO0JswStApEGs1jJs4jusw9vTcEcI7LTBA3wA02mI2X/WFgvIIxCQC6EmIdQ7P898qb1Xs7O7qGiVrWWaa4C5PZopEy6RSKQfTYS8oRUYO1i3Hh4e6mlSA2sjhLHgwMdkoA04lI1noV8BVn/Nzsu/iFHTP2cIiHSTR9tNZaqYgP28/iecv4nA4ajmXi7NYLKPkcFbiDYomdcxNVVoul6s9JytzC/mYWxEVtfDQkbQKiUSyw26368/k5iTBexvZSxA0bD4Zx0An0E4B3Nfz5cu+zs4OJ+tgQwOBlfHxcSujo7MHBwfTLpZq69Cdq2NjFyWnpFaGhYVtA3hdU2PD4ecGQ78AhxjnQi6o29va1lVX3TNibAUwniSyq7PT+qKxcQjmduEHX0lQqSIgUZaOj4+FwyM2ipEP3d1msHRvQdG5GoQnqDYWAviEYDmErw/G1t7e3hAYQwiY+tm5Pn36aCdusATS+QsWDOBa8ArWInqGga6FltnQzcPDlrKvRmMTKSMRroXQ3AXd3fzq5ZCvQZ7kOnb8ONQXbYd+6/pNmBd70pXnfHPBAy8pKsojUNYruzmSEwzp0e5fwNCBFIFc7CXMZHbzIn9JT9wrJA/nVVasv8084PvVVVvftLbavIPvK6kHDqoUa9Zc+03J8V6WTike8FzpXJ4UtzUQOEIux98oCAdHzYCIJzsQw5M6s0LC+D01NIPxmQQz1D+SWfAs+D8FO1mn6w9uHUJ90zPSQOAvcdWOxERD4q5dSwjA/0KxuNmg1294/+7tGLlFuIOy+NbNG0b4s3YSSwIqyzr4Z/qnlv7+/iE/N42/FjokJBQ3lmI7JteUQK5E0Ajp6fZgLUaw0LNDp7juuomL2WCtRfkhwACjULOQ0RiwkAAAAABJRU5ErkJggg==");background-repeat:no-repeat}
|
||||
#menu h1:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAdCAYAAAC9pNwMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowQUNCOTdFQkY0MkQxMUVGOUM0OUMyQTRDNjAyNzhENiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowQUNCOTdFQUY0MkQxMUVGOUM0OUMyQTRDNjAyNzhENiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFRTREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFODREQjFFMzE2RjRFRjExOTIyNkVEQzE2RkYzQkNDRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pq1mg9cAAAQtSURBVHja7JZdTFxFFIDP3J9dCgqUQimQIlBSWNoCNfVBYmo0jX9Jg014aYrWFzWGRl9MTHzpiy8k2kbrm9qUWtMaY9S2RqV9ADQm9o/+pHsvhW5Lw8/iLu6PC9yfvTOeWWbbC9ktlPWRk5ydvWfmzjfnzJkzlxz+7HNYSpIeD1QEAtB2+kew8vKgwdXn9Wsw1uR7tQTg+zhjfRs0fTeazWCT71ARwLt8jANgn0nMNO+9d+82nw6VSZCj3PE1VhcDnJIBpDnG8tC0TmvYvC8N5YJ9yq6C/L4/6je9jo8eVJITOMjY9lJCdBUdn6D0Sq0+9B6alTpZ7okwNrjGrzWjPnkwHO4oJKR8h8fzJfaXcLiUA3TLWkJ+x+WvQeglhL6N5jhqZIqxbyo1vQP/z6GOW5QN8nfI/KtrOVhZLogwllIuE4xVo6eXEJo3TumFOn2oS0D/Rv23WtPfxPYxVCvU5DuL41pMAOOWbf+ENu4sWR4YgUlVBUdRQHIcKJPlEQyvGqT02mLofC6BhRrFBPuhEOAZG20HJoOvHItEJtEeQ7WXFWrFtmGq+gm4+NLL6DUF23Ei3O4hpLRKVXkY/nFBRSKDjUlVxR8+Coc7BTSEGuZZr8w7xN6nlBZhS7LBqWHc3n/kyAkxaV2osWG4RJKqrtRvOluu6S0PtvCBxCg9iZtsBSwrJBYXEdFgKTAhpFuW5aW8v4p6RoTV7Bwb23F848aLxYRUhn2NN0o13Sf6kukX6vWhT7E5zoMm+mwOTTGxgIzfCQT2+v03bcu0vNmoLa2tzTW1tR+GpsNvHeru/pVP0FlcXHG4YsMFflSweEwdjUaf/2AyeEtEhWFincMM2/XzzOxzHaOjf6HNSIP5Sio1vz8+0NcXdncslqfb2sokSSqfTSRKRMbGTkSjE6hb0GM/h+8rKvoOwTtFAiUtxkYNQqI3TYNHkztlusEwMjJsiDMXzQZ+vLCQZy1gVFQxiWQ+u9P29g/EMMxNdxsbfhm2rH4+FHWWg6s0/QC2B0W1WjBvCvxOV9fXGHUD9zn5kD1el0oy6tzPhdM1tQD9A/ydWI0+9KKA8uShYogtkkpKJ9UCsKKoW7N56pIU0HGonDaMtG4H6OkBkVBxETUmgOljNZfxiPKfb0+dfGHw8uXE4lW55bX9b7Rt3bbtC/eR4wXFJY7rHC9dG/hPQX4BD820WHVGcNn69fHUTSPL9ydXDWPFF0wKLMkSB89wcPfHn9BMA03TnF0MxgKwYnDO9/EqeBW8Cl4Ati07ufTXD0ufb/J/gBW8Ejfvbm8/375nT6kAZB6oKH+e7+196sb1azPuC33FHh87+tVd/AKxhSdZ1bJMeq73t0gwGOT3duJR6nLGr1aPx8snzuflWFxr2ULpiAt++mEfDI8CTtdsb7p2Z9tmEWIrV2+5/CfAAOVxxSK4gGWJAAAAAElFTkSuQmCC")}
|
||||
.rtl table.layout tbody td{display:flex}
|
||||
.rtl table.layout~table thead th:first-child,.rtl table.layout~table tbody td:first-child{text-align:right !important}
|
||||
.rtl table.layout~table thead th:last-child,.rtl table.layout~table tbody td:last-child{text-align:left !important}
|
||||
h1{padding:.6em .4em;background:#1d5377;border:1px solid #f2ddaf;text-align:left}
|
||||
h1{padding:.6em;background:#1d5377;border:1px solid #f2ddaf;text-align:left}
|
||||
#h1{color:#fff}
|
||||
.version{color:#ddd;margin-left:8px}
|
||||
h2{padding:13px 16px 14px;color:#000;background:#527d9a;border-bottom:1px solid #000}
|
||||
@@ -91,7 +81,6 @@ tbody a:visited{color:#39749b}
|
||||
#menu p,#menu ul{padding:.8em 1em;margin:0;border-bottom:1px solid #32729c}
|
||||
#menu .links a{display:block;width:fit-content;margin:0;font-size:93%}
|
||||
#menu h1{border:1px solid #f2ddaf}
|
||||
#menu h1{padding-left:52px;background-position:top 10px left 20px}
|
||||
.rtl #menu h1{direction:ltr}
|
||||
#menu p.error{margin:10px 0;padding:.5em .8em;border-bottom:1px solid #e76f6f}
|
||||
#menu p.message{margin:10px 0;padding:.5em .8em;border-bottom:1px solid #7fbd7f}
|
||||
|
@@ -7,7 +7,7 @@ class Adminer {
|
||||
private $values = array();
|
||||
|
||||
function name() {
|
||||
return "<a href='https://www.adminer.org/editor/'" . target_blank() . " id='h1'>" . lang('Editor') . "</a>";
|
||||
return "<a href='https://www.adminer.org/editor/'" . target_blank() . " id='h1'><img src='../adminer/static/logo.png' width='24' height='24' alt='' id='logo'>" . lang('Editor') . "</a>";
|
||||
}
|
||||
|
||||
//! driver, ns
|
||||
@@ -231,6 +231,10 @@ ORDER BY ORDINAL_POSITION", null, "") as $row
|
||||
return $val;
|
||||
}
|
||||
|
||||
function config() {
|
||||
return array();
|
||||
}
|
||||
|
||||
function selectColumnsPrint($select, $columns) {
|
||||
// can allow grouping functions by indexes
|
||||
}
|
||||
@@ -332,20 +336,6 @@ ORDER BY ORDINAL_POSITION", null, "") as $row
|
||||
}
|
||||
|
||||
function selectEmailPrint($emailFields, $columns) {
|
||||
if ($emailFields) {
|
||||
print_fieldset("email", lang('E-mail'), $_POST["email_append"]);
|
||||
echo "<div>";
|
||||
echo script("qsl('div').onkeydown = partialArg(bodyKeydown, 'email');");
|
||||
echo "<p>" . lang('From') . ": <input name='email_from' value='" . h($_POST ? $_POST["email_from"] : $_COOKIE["adminer_email"]) . "'>\n";
|
||||
echo lang('Subject') . ": <input name='email_subject' value='" . h($_POST["email_subject"]) . "'>\n";
|
||||
echo "<p><textarea name='email_message' rows='15' cols='75'>" . h($_POST["email_message"] . ($_POST["email_append"] ? '{$' . "$_POST[email_addition]}" : "")) . "</textarea>\n";
|
||||
echo "<p>" . script("qsl('p').onkeydown = partialArg(bodyKeydown, 'email_append');", "") . html_select("email_addition", $columns, $_POST["email_addition"]) . "<input type='submit' name='email_append' value='" . lang('Insert') . "'>\n"; //! JavaScript
|
||||
echo "<p>" . lang('Attachments') . ": <input type='file' name='email_files[]'>" . script("qsl('input').onchange = emailFileChange;");
|
||||
echo "<p>" . (count($emailFields) == 1 ? input_hidden("email_field", key($emailFields)) : html_select("email_field", $emailFields));
|
||||
echo "<input type='submit' name='email' value='" . lang('Send') . "'>" . confirm();
|
||||
echo "</div>\n";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
}
|
||||
|
||||
function selectColumnsProcess($columns, $indexes) {
|
||||
@@ -422,37 +412,6 @@ ORDER BY ORDINAL_POSITION", null, "") as $row
|
||||
}
|
||||
|
||||
function selectEmailProcess($where, $foreignKeys) {
|
||||
if ($_POST["email_append"]) {
|
||||
return true;
|
||||
}
|
||||
if ($_POST["email"]) {
|
||||
$sent = 0;
|
||||
if ($_POST["all"] || $_POST["check"]) {
|
||||
$field = idf_escape($_POST["email_field"]);
|
||||
$subject = $_POST["email_subject"];
|
||||
$message = $_POST["email_message"];
|
||||
preg_match_all('~\{\$([a-z0-9_]+)\}~i', "$subject.$message", $matches); // allows {$name} in subject or message
|
||||
$rows = get_rows(
|
||||
"SELECT DISTINCT $field" . ($matches[1] ? ", " . implode(", ", array_map('Adminer\idf_escape', array_unique($matches[1]))) : "") . " FROM " . table($_GET["select"])
|
||||
. " WHERE $field IS NOT NULL AND $field != ''"
|
||||
. ($where ? " AND " . implode(" AND ", $where) : "")
|
||||
. ($_POST["all"] ? "" : " AND ((" . implode(") OR (", array_map('Adminer\where_check', (array) $_POST["check"])) . "))")
|
||||
);
|
||||
$fields = fields($_GET["select"]);
|
||||
foreach (adminer()->rowDescriptions($rows, $foreignKeys) as $row) {
|
||||
$replace = array('{\\' => '{'); // allow literal {$name}
|
||||
foreach ($matches[1] as $val) {
|
||||
$replace['{$' . "$val}"] = adminer()->editVal($row[$val], $fields[$val]);
|
||||
}
|
||||
$email = $row[$_POST["email_field"]];
|
||||
if (is_mail($email) && send_mail($email, strtr($subject, $replace), strtr($message, $replace), $_POST["email_from"], $_FILES["email_files"])) {
|
||||
$sent++;
|
||||
}
|
||||
}
|
||||
}
|
||||
cookie("adminer_email", $_POST["email_from"]);
|
||||
redirect(remove_from_uri(), lang('%d e-mail(s) have been sent.', $sent));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@@ -1,10 +1,12 @@
|
||||
<?php
|
||||
// see ../plugins/editor-setup.php for an easier solution
|
||||
|
||||
function adminer_object() {
|
||||
include_once "../plugins/login-password-less.php";
|
||||
|
||||
class AdminerCustomization extends Adminer\Plugins {
|
||||
function loginFormField($name, $heading, $value) {
|
||||
return parent::loginFormField($name, $heading, str_replace('value="server"', 'value="sqlite"', $value));
|
||||
return parent::loginFormField($name, $heading, str_replace("value='server'", "value='sqlite'", $value));
|
||||
}
|
||||
function database() {
|
||||
return "PATH_TO_YOUR_SQLITE_HERE";
|
||||
|
2
externals/jush
vendored
2
externals/jush
vendored
Submodule externals/jush updated: d599d55910...c2c986e0d7
89
lang.php
89
lang.php
@@ -28,48 +28,63 @@ foreach (
|
||||
}
|
||||
|
||||
foreach (glob(__DIR__ . "/adminer/lang/" . ($_SESSION["lang"] ?: "*") . ".inc.php") as $filename) {
|
||||
$messages = $messages_all;
|
||||
$lang = basename($filename, ".inc.php");
|
||||
update_translations($lang, $messages_all, $filename, '~(\$translations = array\(\n)(.*\n)(?=\);)~sU');
|
||||
if ($lang != "xx") {
|
||||
foreach (glob(__DIR__ . "/plugins/*.php") as $filename) {
|
||||
$file = file_get_contents($filename);
|
||||
if (preg_match_all("~\\\$this->lang\\(('(?:[^\\\\']+|\\\\.)*')([),])~", $file, $matches)) {
|
||||
$messages = array_combine($matches[1], $matches[2]);
|
||||
$file = preg_replace("~(static \\\$translations = array\\((?!.*'$lang').*?)\t\\);~s", "\\1\t\t'$lang' => array(\n\t\t),\n\t);", $file);
|
||||
file_put_contents($filename, $file);
|
||||
update_translations($lang, $messages, $filename, "~(static \\\$translations = array\\(.*'$lang' => array\\(\n)(.*)(?=^\t\t\\),)~msU", "\t\t\t");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function update_translations($lang, $messages, $filename, $pattern, $tabs = "\t") {
|
||||
$file = file_get_contents($filename);
|
||||
$file = str_replace("\r", "", $file);
|
||||
preg_match_all("~^(\\s*(?:// [^'].*\\s+)?)(?:// )?(('(?:[^\\\\']+|\\\\.)*') => (.*[^,\n])),?~m", $file, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
|
||||
$s = "";
|
||||
$lang = basename($filename, ".inc.php");
|
||||
$fullstop = ($lang == "bn" ? '।' : (preg_match('~^(ja|zh)~', $lang) ? '。' : ($lang == 'he' ? '[^.]' : '\.')));
|
||||
foreach ($matches as $match) {
|
||||
list(, list($indent), list($line, $offset), list($en), list($translation)) = $match;
|
||||
if (isset($messages[$en])) {
|
||||
// keep current messages
|
||||
$s .= "$indent$line,\n";
|
||||
unset($messages[$en]);
|
||||
$en_fullstop = (substr($en, -2, 1) == ".");
|
||||
//! check in array
|
||||
if ($en != "','" && ($en_fullstop xor preg_match("~$fullstop'\)?\$~", $line))) {
|
||||
if ($lang != ($en_fullstop ? "ja" : "he")) { // fullstop is optional in 'ja', forbidden in 'he'
|
||||
echo "$filename:" . (substr_count($file, "\n", 0, $offset) + 1) . ":Not matching fullstop: $line\n";
|
||||
$s = preg_replace_callback($pattern, function ($match) use ($lang, $messages, $filename, $file, $tabs) {
|
||||
$prefix = $match[1][0];
|
||||
$start = $match[2][1];
|
||||
preg_match_all("~^(\\s*(?:// [^'].*\\s+)?)(?:// )?(('(?:[^\\\\']+|\\\\.)*') => (.*[^,\n])),?~m", $match[2][0], $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
|
||||
$s = "";
|
||||
$fullstop = ($lang == "bn" ? '।' : (preg_match('~^(ja|zh)~', $lang) ? '。' : ($lang == 'he' ? '[^.]' : '\.')));
|
||||
foreach ($matches as $match) {
|
||||
list(, list($indent), list($line, $offset), list($en), list($translation)) = $match;
|
||||
if (isset($messages[$en])) {
|
||||
// keep current messages
|
||||
$s .= "$indent$line,\n";
|
||||
unset($messages[$en]);
|
||||
$en_fullstop = (substr($en, -2, 1) == ".");
|
||||
//! check in array
|
||||
if ($en != "','" && ($en_fullstop xor preg_match("~$fullstop'\)?\$~", $line))) {
|
||||
if ($lang != ($en_fullstop ? "ja" : "he")) { // fullstop is optional in 'ja', forbidden in 'he'
|
||||
echo "$filename:" . (substr_count($file, "\n", 0, $start + $offset) + 1) . ":Not matching fullstop: $line\n";
|
||||
}
|
||||
}
|
||||
if (preg_match('~%~', $en) xor preg_match('~%~', $translation)) {
|
||||
echo "$filename:" . (substr_count($file, "\n", 0, $start + $offset) + 1) . ":Not matching placeholder.\n";
|
||||
}
|
||||
} else {
|
||||
// comment deprecated messages
|
||||
$s .= "$indent// $line,\n";
|
||||
}
|
||||
}
|
||||
if ($messages) {
|
||||
foreach ($messages as $idf => $val) {
|
||||
// add new messages
|
||||
if ($val == "," && strpos($idf, "%d")) {
|
||||
$s .= "$tabs$idf => array(),\n";
|
||||
} elseif ($lang != "en") {
|
||||
$s .= "$tabs$idf => null,\n";
|
||||
}
|
||||
}
|
||||
if (preg_match('~%~', $en) xor preg_match('~%~', $translation)) {
|
||||
echo "$filename:" . (substr_count($file, "\n", 0, $offset) + 1) . ":Not matching placeholder.\n";
|
||||
}
|
||||
} else {
|
||||
// comment deprecated messages
|
||||
$s .= "$indent// $line,\n";
|
||||
}
|
||||
}
|
||||
if ($messages) {
|
||||
if ($lang != "en") {
|
||||
$s .= "\n";
|
||||
}
|
||||
foreach ($messages as $idf => $val) {
|
||||
// add new messages
|
||||
if ($val == "," && strpos($idf, "%d")) {
|
||||
$s .= "\t$idf => array(),\n";
|
||||
} elseif ($lang != "en") {
|
||||
$s .= "\t$idf => null,\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
$s = "<?php\nnamespace Adminer;\n\nLang::\$translations = array(\n$s);\n\n// run `php ../../lang.php $lang` to update this file\n";
|
||||
return $prefix . $s;
|
||||
}, $file, -1, $count, PREG_OFFSET_CAPTURE);
|
||||
if ($s != $file) {
|
||||
file_put_contents($filename, $s);
|
||||
echo "$filename updated.\n";
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user