1
0
mirror of https://github.com/vrana/adminer.git synced 2025-09-01 18:32:39 +02:00

Compare commits

...

145 Commits

Author SHA1 Message Date
Jakub Vrana
8706bc7c0f Release 4.7.5 2019-11-13 08:17:14 +01:00
Jakub Vrana
c2b7d38f2c Re-apply https://github.com/vrana/adminer/pull/363/commits/89b6e9bb 2019-11-11 14:41:11 +01:00
popcorner
fcd90a74f6 Update zh-tw.inc.php 2019-11-11 14:41:03 +01:00
popcorner
05cddd38e5 Update zh.inc.php 2019-11-11 14:41:03 +01:00
Mike Baranski
c7550bf68f Stop using adsrc column
Was removed in V12, invalid since V8.

See https://www.postgresql.org/docs/8.3/catalog-pg-attrdef.html
2019-11-11 14:19:39 +01:00
Vladimir Goncharov
6ae81cd0ea fixed: SQL command for insert, create table, etc. new: create/rename table, add/drop/change type for column 2019-11-11 14:11:49 +01:00
Raphael de Almeida
677774405c Fix brazilian portuguese translation 2019-11-11 14:04:47 +01:00
Rasmus
39375b82d8 Swedish translation 2019-11-11 14:01:45 +01:00
Jakub Vrana
5944ca09a3 Update hever design 2019-11-11 13:45:30 +01:00
Jakub Vrana
5a507ec586 Don't overwrite variable 2019-11-11 13:40:47 +01:00
Jakub Vrana
c24dd79c22 Add id="" to cells with failed inline edit (bug #708) 2019-11-11 12:27:53 +01:00
Jakub Vrana
08c132cbea Unify dumpTable declarations (bug #707) 2019-11-11 12:27:53 +01:00
Jakub Vrana
a4e997fe60 PostgreSQL, Oracle: Set schema for EXPLAIN queries in SQL command (bug #706) 2019-11-11 12:27:53 +01:00
Jakub Vrana
0678ce1222 Initialize version-noverify sooner (bug #705) 2019-11-11 12:27:53 +01:00
Jakub Vrana
5acdc55a4a Make context in qsa() optional 2019-11-11 12:27:53 +01:00
Jakub Vrana
fd5f5b8805 Delete extra newlines 2019-11-11 12:27:53 +01:00
Lucas Sandery
d90d06e832 correct complement of responsive media query 2019-11-11 12:27:34 +01:00
Lucas Sandery
feb59fa8cf update lucas-sandery theme 2019-11-11 12:27:34 +01:00
Jakub Vrána
1bcb440698 Add funding 2019-11-08 11:51:41 +01:00
Jakub Vrana
b9594d13d6 Release 4.7.4 2019-10-22 08:33:20 +02:00
Jakub Vrana
789ebc07bd Fix XSS if Adminer is accessible at URL /data: 2019-10-22 08:30:32 +02:00
Jakub Vrana
3310e18efa Do not put unused doc links to single driver compiled version 2019-08-28 10:57:47 +02:00
Jakub Vrana
965fe2e8ae Fix PostgreSQL doc root 2019-08-28 10:31:12 +02:00
Jakub Vrana
acb3f9b9d1 Save bytes 2019-08-28 10:30:54 +02:00
Ivan Masár
8ae059d2ac add links to oracle docs 2019-08-28 10:14:31 +02:00
Ivan Masár
2a3de78a8e add links to postgres docs 2019-08-28 10:14:31 +02:00
Jakub Vrana
cb37a141f4 Bump version 2019-08-28 10:14:31 +02:00
Jakub Vrana
32955f7802 Release 4.7.3 2019-08-27 17:58:21 +02:00
Jakub Vrana
5ffec58a8f Fix blocking of concurrent instances in PHP >7.2 (bug #703) 2019-08-27 13:03:03 +02:00
František Hána
34a0bfd939 setup Mongo authSource by ENV 2019-08-22 09:43:46 +02:00
Jakub Vrana
b07908282b Reset table after changing DB 2019-08-21 15:09:47 +02:00
Jakub Vrana
bce0e8d54a Move <p> after a possible error 2019-08-21 15:05:02 +02:00
Jakub Vrana
c6fc6b63e8 Allow editing foreign keys pointing to tables in other database/schema (bug #694) 2019-08-21 15:00:11 +02:00
Jakub Vrana
03961bbe1b MS SQL: Support foreign keys to other DB 2019-08-21 14:33:17 +02:00
Jakub Vrana
f37a878b62 Do not display error for foreign keys to other databases 2019-08-21 14:19:48 +02:00
Jakub Vrana
021e3f900d Save bytes 2019-08-21 14:13:08 +02:00
Jakub Vokoun
3d32470b87 MSSQL: use textarea in edit form for Memo type (#357)
Signed-off-by: Jakub Vokoun <jakub.vokoun@gmail.com>
2019-08-21 13:13:16 +02:00
Jakub Vrana
f692b6498f MySQL: Support STORED GENERATED 2019-08-21 12:23:08 +02:00
Jakub Vrana
3b056fe308 SQLite: Skip renaming when recreating table if not necessary 2019-08-21 12:06:32 +02:00
Jakub Vrana
d6ec4ca0b3 SQLite: Preserve auto increment when recreating table 2019-08-21 11:54:07 +02:00
Jakub Vrana
903de0e889 SQLite: Allow setting auto increment for empty tables 2019-08-21 11:46:38 +02:00
Jakub Vrana
48f33f6255 Remove extra space in alter table command 2019-08-21 11:28:33 +02:00
Jakub Vrana
1b33729110 SQLite: Handle error in altering table (bug #697) 2019-08-21 11:21:17 +02:00
Troy Olson
788d383609 init mancave-hever design 2019-08-20 18:01:41 +02:00
Jakub Vrana
364e032b69 MySQL: Allow editing rows identified by negative floats (bug #695) 2019-08-20 17:58:54 +02:00
Troy Olson
b7641a2d13 added floating footer css for adminer-theme-mancave2-2.1.alpha 2019-08-20 17:42:23 +02:00
Jakub Vrana
5f4af56f68 Add a comment (bug #691) 2019-08-20 16:24:33 +02:00
Jakub Vrana
95a92ceb95 Use is_numeric() 2019-08-20 09:47:01 +02:00
Jakub Vrana
306e8733e7 Support MariaDB virtual columns 2019-08-19 18:38:57 +02:00
Jakub Vrana
67b84d1167 MySQL: Speed up displaying tables in large databases (bug #700) 2019-08-19 18:29:05 +02:00
Jakub Vrana
ab76024da7 Support unquoted floats in export 2019-08-19 17:18:56 +02:00
Jakub Vrana
4a27882a97 SQLite: Quote strings stored in integer columns in export (bug #696) 2019-08-19 17:14:27 +02:00
Malte Riesch
00d36efcf1 MySQL: Skip editing generated columns 2019-08-19 16:51:28 +02:00
Jakub Vrana
92d443dac0 Add AdminerLoginIp 2019-07-19 14:36:42 +02:00
Jakub Vrana
d71cb127cf Close </ul> of logins 2019-07-19 13:52:24 +02:00
Jakub Vrana
fd1691cb1d Release 4.7.2 2019-07-18 08:56:37 +02:00
Jakub Vrana
d5bf51b2a7 MySQL: Fix getting foreign keys 2019-07-18 08:50:52 +02:00
Jakub Vrana
b7b4157bcb Fix table status in PostgreSQL 12 (bug #683) 2019-07-15 13:37:10 +02:00
Jakub Vrana
10b00e13b1 Fix displaying SQL command after Save and continue edit 2019-07-15 13:16:24 +02:00
Jakub Vrana
45caae1660 PostgreSQL: Display definitions of materialized views (bug #682) 2019-07-15 13:03:57 +02:00
Michal Adamec
36e9a4d6e1 Support for viewing and editing of column comments in mssql driver 2019-07-15 12:45:39 +02:00
Jakub Vrana
9b58ecf925 PostgreSQL: Fix setting column comments on new table 2019-07-15 12:21:17 +02:00
Jakub Vrana
36ade4e197 MySQL: Fix displaying multi-columns foreign keys (bug #675) 2019-07-14 19:53:41 +02:00
grass@dionera.com
6a5b0abbb4 Check if PDO SSL Attributes are set within config, and only set them in PDO Options. otherwise Mysql PDO throws errors if attribute is set and empty 2019-07-14 19:20:13 +02:00
Bohuslav Simek
33234fef19 Elasticsearch: Show executed query as a json 2019-07-14 19:11:17 +02:00
Bohuslav Simek
4b6833ba65 MongoDB: number of records should be count on provide rows 2019-07-14 19:10:16 +02:00
Inge Brattaas
d846eac97e Keep font size in all tables.
Prevent CSS rule "table { font-size: 90% }" from making nested tables
unreadable.
2019-07-14 18:58:07 +02:00
Adam Žurek
0eab60c338 travis: test on php 5.6-7.3 (#330) 2019-07-14 17:22:32 +02:00
Jonathon Sim
7f32e26759 Cache busting for adminer.css 2019-05-18 17:29:33 +02:00
Dennis Stolmeijer
327041874e Always pass the SRID part of a geometry property with the GeomFromText function 2019-05-18 17:24:35 +02:00
Jakub Vrana
37a3dd6c6b Update rmsoft designs 2019-05-18 17:24:35 +02:00
Mario Wenzel
02f5cbdc4d Allow bruteForceKey to be overwritten (#342)
As per Documentation (https://www.adminer.org/en/extension/#api) bruteForceKey can be overwritten by plugins. This change actually allows for that to happen.
2019-05-14 10:49:52 +02:00
Jakub Vrana
deea21dd2d Allow overwriting tables when copying them 2019-05-14 09:56:29 +02:00
Jakub Vrana
f00f7a0e19 Update rmsoft design 2019-05-14 09:43:58 +02:00
Jakub Vrana
48292b70e8 Stretch footer over the whole table width (bug #624) 2019-05-14 09:31:51 +02:00
Jakub Vrana
15900301ee Do not attempt logging in without password (bug #676) 2019-05-14 09:07:51 +02:00
Jakub Vrana
0e6f1972e9 Fix typo in translation (bug #673) 2019-03-21 08:38:57 +01:00
Christoph Thelen
4e91550b14 missing translation DE
added missing translation for donation link
2019-01-29 10:02:39 +01:00
0x1793d1
333da64cdb Fix too small #lang margin on pepa-linha design 2019-01-28 13:55:21 +01:00
Jakub Vrana
a2ec51e948 Fix creating users and changing password in MySQL 8 (bug #663) 2019-01-28 13:47:53 +01:00
0x1793d1
d114535911 Fix #tables margin (#326) 2019-01-25 10:00:26 +01:00
Jakub Vrana
7247f801bd Release 4.7.1 2019-01-24 15:57:17 +01:00
Jakub Vrana
21f0481a1d Remember visible columns in Create Table form (bug #493) 2019-01-22 13:24:15 +01:00
Jakub Vrana
7defb7787d Editor: Allow disabling boolean fields in PostgreSQL (bug #640) 2019-01-22 12:04:08 +01:00
Jan
659003e07f fix: haeckel adminer.css (#323)
- fix: broken menu layout on Firefox 64+
 - add: option to hide "new version" link (commented out)
 - add: author credits for changes made in 2018
2019-01-22 10:39:52 +01:00
Jakub Vrana
2cb426b464 SQLite: Hide server field in login form 2019-01-16 14:57:21 +01:00
Jakub Vrana
2117f224b6 Improve MariaDB status variables link (bug #658) 2019-01-16 12:49:24 +01:00
popcorner
7ea6266482 Update zh-tw.inc.php 2019-01-16 12:26:58 +01:00
popcorner
edb79998a9 Update zh.inc.php 2019-01-16 12:26:58 +01:00
Jakub Vrana
41043f8dad Display the tables scrollbar (bug #647) 2019-01-16 12:16:51 +01:00
Jakub Vrana
31bbadb479 Document change 2018-12-18 16:20:34 +01:00
Tim Düsterhus
a2fbcbe28e Fix PHP 7.3 compatibility (#318) 2018-12-18 16:17:21 +01:00
Edgar Barrantes
a623cd69de Position of the background database image changed. (#316) 2018-12-18 16:07:53 +01:00
alekseymvt
ed346be313 Fix mvt theme (#315) 2018-12-18 15:52:43 +01:00
Peter Knut
7eaa57fc0b Use <ul> list for logins (#314) 2018-12-18 15:45:04 +01:00
Jakub Vrana
c275362c30 Add missing Japanese translations (thanks to Shirai Takashi) 2018-12-18 14:45:46 +01:00
Peter Knut
b2606cda0e Change '...' to horizontal ellipsis character 2018-12-18 14:45:37 +01:00
helix84
da76e6b9b8 php <5.4 compat: array syntax (#313) 2018-12-18 14:21:23 +01:00
Jakub Vrana
83fe083f2f Add autocomplete attributes to login form 2018-12-12 16:13:14 +01:00
Jakub Vrana
85e6f2ac9e Release 4.7.0 2018-11-24 14:13:01 +01:00
Jakub Vrana
e148db4b0f Fix whitespace 2018-11-24 12:16:12 +01:00
Jakub Vrana
660703e422 Clarify change description 2018-11-24 12:08:02 +01:00
Lucas Sandery
55f11df052 Updated theme for v4.7 (#310)
Signed-off-by: Lucas Sandery <lucas-sandery@users.noreply.github.com>
2018-11-24 11:09:47 +01:00
Winnie Lin
ea6370ef77 Update zh-tw.inc.php (#299)
Fix some typo and add white spaces for readability
2018-11-01 07:03:53 +01:00
Jakub Vrana
0ad6a1e578 Fix a typo 2018-10-29 11:46:04 +01:00
Jakub Vrana
e546b483a1 Delete copy/pasted code 2018-10-29 11:43:45 +01:00
Jakub Vrana
5b443a4e7d Change inline style to class name 2018-10-27 21:21:20 +02:00
kPherox
e4837a0564 Wrap table.nowrap with div[style="overflow-x: auto"] 2018-10-27 21:16:57 +02:00
Jakub Vrana
83a0776e8d Fix MariaDB link to numeric types 2018-10-27 20:13:55 +02:00
Jakub Vrana
5bebb439a1 MySQL: Descending indexes in MySQL 8 (bug #643) 2018-10-27 20:05:04 +02:00
sartor
9f0ee9cf41 PostgreSQL: Support for GENERATED BY DEFAULT AS IDENTITY 2018-10-27 19:42:01 +02:00
Jakub Vrana
c002009bfe Fix style 2018-10-27 19:38:43 +02:00
sartor
a592ad52f1 ClickHouse: support for decimal types, SQL operator 2018-10-27 19:32:52 +02:00
sartor
3127c0d95e ClickHouse: Fix for drop multiple tables and views 2018-10-27 19:32:10 +02:00
sartor
9447d97a6a ClickHouse ALTER DELETE and ALTER UPDATE support 2018-10-27 19:31:35 +02:00
sartor
c8e41ee649 ClickHouse fix select-like queries format postfix 2018-10-27 19:30:33 +02:00
Jakub Vrana
b327a76fc0 Avoid overwriting existing tables when copying tables (bug #642) 2018-10-27 18:50:50 +02:00
Jakub Vrana
7f2dd73670 PostgreSQL: Export DESC indexes (bug #639) 2018-10-27 18:14:00 +02:00
Jakub Vrana
c8975a151c Recognize current_timestamp() in edit (bug #638) 2018-10-27 18:06:20 +02:00
ilessiivi
150841e5d7 Hide import from server if no path 2018-10-01 18:07:51 +02:00
Jakub Vrana
ae03bdd4c4 Simplify storing executed SQL queries to bookmarks 2018-10-01 17:08:58 +02:00
alekseymvt
01e08cc053 fix editor theme (#302) 2018-09-19 16:42:22 +02:00
Jakub Vrana
a426fefd40 Remove unused code 2018-09-19 11:16:21 +02:00
Jakub Vrana
90df1b14f0 MySQL: Recognize ON UPDATE current_timestamp() (bug #632) 2018-09-19 10:08:41 +02:00
Jakub Vrana
cd3231b4af PostgreSQL: Quote array values in export (bug #621) 2018-09-19 09:49:56 +02:00
Christopher CHEN
65c52735fb Add plugin pretty-json-column
(cherry picked from commit 9b8612a49c43ff170837dbf84f8c08a0e85386a8)
2018-09-18 18:59:24 +02:00
Jakub Vrana
93ccc7502b Update translation 2018-09-18 15:47:22 +02:00
Christopher CHEN
84e86cf572 DOM not ready when restoring adminer_tables_filter (#289)
Uncaught TypeError: Cannot set property 'value' of null
2018-09-18 15:38:13 +02:00
Jakub Vrana
1ce5b5ad31 Add Georgian translation 2018-09-18 15:34:09 +02:00
Aleksey M
941bf22e52 Update mvt design 2018-09-18 13:40:58 +02:00
Jakub Vrana
a5c54563c6 Fix design (thanks to apmuthu) 2018-09-18 13:32:26 +02:00
Jakub Vrana
0234fe4a66 ClickHouse: Fix escaping 2018-09-18 13:13:34 +02:00
Sartor
1883e250ff ClickHouse support alpha version 2018-09-18 13:09:46 +02:00
Huy Cat, Hoang
56d8b89bee Fix typo in Vietnamese translation 2018-09-18 12:20:21 +02:00
Peter Knut
4d66e42817 Add class 'layout' to all non-data tables 2018-09-18 12:08:19 +02:00
harryxu
94f6a45a2a Set default db to sqlsrv connection 2018-09-18 11:44:02 +02:00
Jakub Vrana
0f08592bc0 Warn when using password with leading or trailing spaces 2018-09-13 16:08:57 +02:00
Jakub Vrana
a5cbad504c Update donation link 2018-09-06 17:22:56 +02:00
Jakub Vrana
d581f3dedb Make maxlength in all fields a soft limit 2018-07-15 21:05:26 +02:00
Jakub Vrana
e8e4934e97 Increase username maxlength to 80 (bug #623) 2018-07-15 21:01:38 +02:00
Jared Brandt
e959e46fa5 Fixes foreign key pattern in MySQL
Foreign keys are not displaying in MySQL when ANSI_QUOTES is enabled because the preg_match_all() is looking specifically for backticks. This fix allows for double quotes as well, so foreign keys are recognized even when ANSI_QUOTES is enabled.
2018-07-15 20:51:09 +02:00
Jakub Vrana
bb3d2957e1 Fix function change with set data type (thanks to osoba hrdelnata) 2018-07-15 20:37:47 +02:00
Aleksey M
ea408aa530 Adminer theme 2018-07-15 20:12:07 +02:00
Jakub Vrana
df90d9f68c Reset event handlers after cloning (thanks to Salko) 2018-07-15 20:10:13 +02:00
Jakub Vrana
cf76ad529b Fix inline editing of empty cells 2018-07-09 16:52:10 +02:00
93 changed files with 3501 additions and 1146 deletions

2
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
patreon: jakubvrana
custom: ["https://sourceforge.net/p/adminer/donate/"]

View File

@@ -1,5 +1,7 @@
language: php
php:
- '5.6'
- '7.1'
- 5.6
- 7.1
- 7.2
- 7.3
script: git diff --name-only $TRAVIS_COMMIT_RANGE | grep '\.php$' | xargs -n1 -P8 php -l | grep -v 'No syntax errors'; test $? -eq 1

View File

@@ -62,7 +62,7 @@ if (!$error && $_POST) {
<form action="" method="post">
<?php
if ($in) {
echo "<table cellspacing='0'>\n";
echo "<table cellspacing='0' class='layout'>\n";
foreach ($in as $key) {
$field = $routine["fields"][$key];
$name = $field["field"];

View File

@@ -27,6 +27,10 @@ if ($row["auto_increment_col"]) {
$row["fields"][$row["auto_increment_col"]]["auto_increment"] = true;
}
if ($_POST) {
set_adminer_settings(array("comments" => $_POST["comments"], "defaults" => $_POST["defaults"]));
}
if ($_POST && !process_fields($row["fields"]) && !$error) {
if ($_POST["drop"]) {
queries_redirect(substr(ME, 0, -1), lang('Table has been dropped.'), drop_tables(array($TABLE)));
@@ -162,7 +166,7 @@ foreach ($engines as $engine) {
<form action="" method="post" id="form">
<p>
<?php if (support("columns") || $TABLE == "") { ?>
<?php echo lang('Table name'); ?>: <input name="name" maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
<?php echo lang('Table name'); ?>: <input name="name" data-maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
<?php if ($TABLE == "" && !$_POST) { echo script("focus(qs('#form')['name']);"); } ?>
<?php echo ($engines ? "<select name='Engine'>" . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "</select>" . on_help("getTarget(event).value", 1) . script("qsl('select').onchange = helpClose;") : ""); ?>
<?php echo ($collations && !preg_match("~sqlite|mssql~", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
@@ -170,28 +174,19 @@ foreach ($engines as $engine) {
<?php } ?>
<?php if (support("columns")) { ?>
<div class="scrollable">
<table cellspacing="0" id="edit-fields" class="nowrap">
<?php
$comments = ($_POST ? $_POST["comments"] : $row["Comment"] != "");
if (!$_POST && !$comments) {
foreach ($row["fields"] as $field) {
if ($field["comment"] != "") {
$comments = true;
break;
}
}
}
edit_fields($row["fields"], $collations, "TABLE", $foreign_keys, $comments);
edit_fields($row["fields"], $collations, "TABLE", $foreign_keys);
?>
</table>
</div>
<p>
<?php echo lang('Auto Increment'); ?>: <input type="number" name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
<?php echo checkbox("defaults", 1, !$_POST || $_POST["defaults"], lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
<?php echo ($_POST ? "" : script("editingHideDefaults();")); ?>
<?php echo checkbox("defaults", 1, ($_POST ? $_POST["defaults"] : adminer_setting("defaults")), lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
<?php echo (support("comment")
? "<label><input type='checkbox' name='comments' value='1' class='jsonly'" . ($comments ? " checked" : "") . ">" . lang('Comment') . "</label>"
. script("qsl('input').onclick = partial(editingCommentsClick, true);")
. ' <input name="Comment" value="' . h($row["Comment"]) . '" maxlength="' . (min_version(5.5) ? 2048 : 60) . '"' . ($comments ? '' : ' class="hidden"') . '>'
? checkbox("comments", 1, ($_POST ? $_POST["comments"] : adminer_setting("comments")), lang('Comment'), "editingCommentsClick(this, true);", "jsonly")
. ' <input name="Comment" value="' . h($row["Comment"]) . '" data-maxlength="' . (min_version(5.5) ? 2048 : 60) . '">'
: '')
; ?>
<p>
@@ -225,4 +220,4 @@ foreach ($row["partition_names"] as $key => $val) {
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>
<?php echo script("qs('#form')['defaults'].onclick();" . (support("comment") ? " editingCommentsClick.call(qs('#form')['comments']);" : "")); ?>
<?php echo script("qs('#form')['defaults'].onclick();" . (support("comment") ? " editingCommentsClick(qs('#form')['comments']);" : "")); ?>

View File

@@ -60,7 +60,7 @@ if ($_POST) {
<?php
echo ($_POST["add_x"] || strpos($name, "\n")
? '<textarea id="name" name="name" rows="10" cols="40">' . h($name) . '</textarea><br>'
: '<input name="name" id="name" value="' . h($name) . '" maxlength="64" autocapitalize="off">'
: '<input name="name" id="name" value="' . h($name) . '" data-maxlength="64" autocapitalize="off">'
) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $row["collation"]) . doc_link(array(
'sql' => "charset-charsets.html",
'mariadb' => "supported-character-sets-and-collations/",

View File

@@ -65,7 +65,7 @@ if ($adminer->homepage()) {
search_tables();
}
}
$doc_link = doc_link(array('sql' => 'show-table-status.html'));
echo "<div class='scrollable'>\n";
echo "<table cellspacing='0' class='nowrap checkable'>\n";
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
echo '<thead><tr class="wrap">';
@@ -73,12 +73,12 @@ if ($adminer->homepage()) {
echo '<th>' . lang('Table');
echo '<td>' . lang('Engine') . doc_link(array('sql' => 'storage-engines.html'));
echo '<td>' . lang('Collation') . doc_link(array('sql' => 'charset-charsets.html', 'mariadb' => 'supported-character-sets-and-collations/'));
echo '<td>' . lang('Data Length') . $doc_link;
echo '<td>' . lang('Index Length') . $doc_link;
echo '<td>' . lang('Data Free') . $doc_link;
echo '<td>' . lang('Data Length') . doc_link(array('sql' => 'show-table-status.html', 'pgsql' => 'functions-admin.html#FUNCTIONS-ADMIN-DBOBJECT', 'oracle' => 'REFRN20286'));
echo '<td>' . lang('Index Length') . doc_link(array('sql' => 'show-table-status.html', 'pgsql' => 'functions-admin.html#FUNCTIONS-ADMIN-DBOBJECT'));
echo '<td>' . lang('Data Free') . doc_link(array('sql' => 'show-table-status.html'));
echo '<td>' . lang('Auto Increment') . doc_link(array('sql' => 'example-auto-increment.html', 'mariadb' => 'auto_increment/'));
echo '<td>' . lang('Rows') . $doc_link;
echo (support("comment") ? '<td>' . lang('Comment') . $doc_link : '');
echo '<td>' . lang('Rows') . doc_link(array('sql' => 'show-table-status.html', 'pgsql' => 'catalog-pg-class.html#CATALOG-PG-CLASS', 'oracle' => 'REFRN20286'));
echo (support("comment") ? '<td>' . lang('Comment') . doc_link(array('sql' => 'show-table-status.html', 'pgsql' => 'functions-info.html#FUNCTIONS-INFO-COMMENT-TABLE')) : '');
echo "</thead>\n";
$tables = 0;
@@ -119,6 +119,7 @@ if ($adminer->homepage()) {
}
echo "</table>\n";
echo "</div>\n";
if (!information_schema(DB)) {
echo "<div class='footer'><div>\n";
$vacuum = "<input type='submit' value='" . lang('Vacuum') . "'> " . on_help("'VACUUM'");
@@ -138,7 +139,7 @@ if ($adminer->homepage()) {
echo "<p>" . 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 (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'>" : "");
echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'> " . checkbox("overwrite", 1, $_POST["overwrite"], lang('overwrite')) : "");
echo "\n";
}
echo "<input type='hidden' name='all' value=''>"; // used by trCheck()

View File

@@ -0,0 +1,392 @@
<?php
$drivers["clickhouse"] = "ClickHouse (alpha)";
if (isset($_GET["clickhouse"])) {
define("DRIVER", "clickhouse");
class Min_DB {
var $extension = "JSON", $server_info, $errno, $_result, $error, $_url;
var $_db = 'default';
function rootQuery($db, $query) {
@ini_set('track_errors', 1); // @ - may be disabled
$file = @file_get_contents("$this->_url/?database=$db", false, stream_context_create(array('http' => array(
'method' => 'POST',
'content' => $this->isQuerySelectLike($query) ? "$query FORMAT JSONCompact" : $query,
'header' => 'Content-type: application/x-www-form-urlencoded',
'ignore_errors' => 1, // available since PHP 5.2.10
))));
if ($file === false) {
$this->error = $php_errormsg;
return $file;
}
if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
$this->error = $file;
return false;
}
$return = json_decode($file, true);
if ($return === null) {
if (!$this->isQuerySelectLike($query) && $file === '') {
return true;
}
$this->errno = json_last_error();
if (function_exists('json_last_error_msg')) {
$this->error = json_last_error_msg();
} else {
$constants = get_defined_constants(true);
foreach ($constants['json'] as $name => $value) {
if ($value == $this->errno && preg_match('~^JSON_ERROR_~', $name)) {
$this->error = $name;
break;
}
}
}
}
return new Min_Result($return);
}
function isQuerySelectLike($query) {
return (bool) preg_match('~^(select|show)~i', $query);
}
function query($query) {
return $this->rootQuery($this->_db, $query);
}
function connect($server, $username, $password) {
preg_match('~^(https?://)?(.*)~', $server, $match);
$this->_url = ($match[1] ? $match[1] : "http://") . "$username:$password@$match[2]";
$return = $this->query('SELECT 1');
return (bool) $return;
}
function select_db($database) {
$this->_db = $database;
return true;
}
function quote($string) {
return "'" . addcslashes($string, "\\'") . "'";
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function store_result() {
return $this->_result;
}
function next_result() {
return false;
}
function result($query, $field = 0) {
$result = $this->query($query);
return $result['data'];
}
}
class Min_Result {
var $num_rows, $_rows, $columns, $meta, $_offset = 0;
function __construct($result) {
$this->num_rows = $result['rows'];
$this->_rows = $result['data'];
$this->meta = $result['meta'];
$this->columns = array_column($this->meta, 'name');
reset($this->_rows);
}
function fetch_assoc() {
$row = current($this->_rows);
next($this->_rows);
return $row === false ? false : array_combine($this->columns, $row);
}
function fetch_row() {
$row = current($this->_rows);
next($this->_rows);
return $row;
}
function fetch_field() {
$column = $this->_offset++;
$return = new stdClass;
if ($column < count($this->columns)) {
$return->name = $this->meta[$column]['name'];
$return->orgname = $return->name;
$return->type = $this->meta[$column]['type'];
}
return $return;
}
}
class Min_Driver extends Min_SQL {
function delete($table, $queryWhere, $limit = 0) {
if ($queryWhere === '') {
$queryWhere = 'WHERE 1=1';
}
return queries("ALTER TABLE " . table($table) . " DELETE $queryWhere");
}
function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
$values = array();
foreach ($set as $key => $val) {
$values[] = "$key = $val";
}
$query = $separator . implode(",$separator", $values);
return queries("ALTER TABLE " . table($table) . " UPDATE $query$queryWhere");
}
}
function idf_escape($idf) {
return "`" . str_replace("`", "``", $idf) . "`";
}
function table($idf) {
return idf_escape($idf);
}
function explain($connection, $query) {
return '';
}
function found_rows($table_status, $where) {
$rows = get_vals("SELECT COUNT(*) FROM " . idf_escape($table_status["Name"]) . ($where ? " WHERE " . implode(" AND ", $where) : ""));
return empty($rows) ? false : $rows[0];
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
$alter = $order = array();
foreach ($fields as $field) {
if ($field[1][2] === " NULL") {
$field[1][1] = " Nullable({$field[1][1]})";
} elseif ($field[1][2] === ' NOT NULL') {
$field[1][2] = '';
}
if ($field[1][3]) {
$field[1][3] = '';
}
$alter[] = ($field[1]
? ($table != "" ? ($field[0] != "" ? "MODIFY COLUMN " : "ADD COLUMN ") : " ") . implode($field[1])
: "DROP COLUMN " . idf_escape($field[0])
);
$order[] = $field[1][0];
}
$alter = array_merge($alter, $foreign);
$status = ($engine ? " ENGINE " . $engine : "");
if ($table == "") {
return queries("CREATE TABLE " . table($name) . " (\n" . implode(",\n", $alter) . "\n)$status$partitioning" . ' ORDER BY (' . implode(',', $order) . ')');
}
if ($table != $name) {
$result = queries("RENAME TABLE " . table($table) . " TO " . table($name));
if ($alter) {
$table = $name;
} else {
return $result;
}
}
if ($status) {
$alter[] = ltrim($status);
}
return ($alter || $partitioning ? queries("ALTER TABLE " . table($table) . "\n" . implode(",\n", $alter) . $partitioning) : true);
}
function truncate_tables($tables) {
return apply_queries("TRUNCATE TABLE", $tables);
}
function drop_views($views) {
return drop_tables($views);
}
function drop_tables($tables) {
return apply_queries("DROP TABLE", $tables);
}
function connect() {
global $adminer;
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
return $connection;
}
return $connection->error;
}
function get_databases($flush) {
global $connection;
$result = get_rows('SHOW DATABASES');
$return = array();
foreach ($result as $row) {
$return[] = $row['name'];
}
sort($return);
return $return;
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? ", $offset" : "") : "");
}
function limit1($table, $query, $where, $separator = "\n") {
return limit($query, $where, 1, 0, $separator);
}
function db_collation($db, $collations) {
}
function engines() {
return array('MergeTree');
}
function logged_user() {
global $adminer;
$credentials = $adminer->credentials();
return $credentials[1];
}
function tables_list() {
$result = get_rows('SHOW TABLES');
$return = array();
foreach ($result as $row) {
$return[$row['name']] = 'table';
}
ksort($return);
return $return;
}
function count_tables($databases) {
return array();
}
function table_status($name = "", $fast = false) {
global $connection;
$return = array();
$tables = get_rows("SELECT name, engine FROM system.tables WHERE database = " . q($connection->_db));
foreach ($tables as $table) {
$return[$table['name']] = array(
'Name' => $table['name'],
'Engine' => $table['engine'],
);
if ($name === $table['name']) {
return $return[$table['name']];
}
}
return $return;
}
function is_view($table_status) {
return false;
}
function fk_support($table_status) {
return false;
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
if (in_array($field['type'], array("Int8", "Int16", "Int32", "Int64", "UInt8", "UInt16", "UInt32", "UInt64", "Float32", "Float64"))) {
return "to$field[type]($return)";
}
return $return;
}
function fields($table) {
$return = array();
$result = get_rows("SELECT name, type, default_expression FROM system.columns WHERE " . idf_escape('table') . " = " . q($table));
foreach($result as $row) {
$type = trim($row['type']);
$nullable = strpos($type, 'Nullable(') === 0;
$return[trim($row['name'])] = array(
"field" => trim($row['name']),
"full_type" => $type,
"type" => $type,
"default" => trim($row['default_expression']),
"null" => $nullable,
"auto_increment" => '0',
"privileges" => array("insert" => 1, "select" => 1, "update" => 0),
);
}
return $return;
}
function indexes($table, $connection2 = null) {
return array();
}
function foreign_keys($table) {
return array();
}
function collations() {
return array();
}
function information_schema($db) {
return false;
}
function error() {
global $connection;
return h($connection->error);
}
function types() {
return array();
}
function schemas() {
return array();
}
function get_schema() {
return "";
}
function set_schema($schema) {
return true;
}
function auto_increment() {
return '';
}
function last_id() {
return 0; // ClickHouse doesn't have it
}
function support($feature) {
return preg_match("~^(columns|sql|status|table|drop_col)$~", $feature);
}
$jush = "clickhouse";
$types = array();
$structured_types = array();
foreach (array( //! arrays
lang('Numbers') => array("Int8" => 3, "Int16" => 5, "Int32" => 10, "Int64" => 19, "UInt8" => 3, "UInt16" => 5, "UInt32" => 10, "UInt64" => 20, "Float32" => 7, "Float64" => 16, 'Decimal' => 38, 'Decimal32' => 9, 'Decimal64' => 18, 'Decimal128' => 38),
lang('Date and time') => array("Date" => 13, "DateTime" => 20),
lang('Strings') => array("String" => 0),
lang('Binary') => array("FixedString" => 0),
) as $key => $val) {
$types += $val;
$structured_types[$key] = array_keys($val);
}
$unsigned = array();
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL");
$functions = array();
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
$edit_functions = array();
}

View File

@@ -84,7 +84,7 @@ if (isset($_GET["elastic"])) {
var $num_rows, $_rows;
function __construct($rows) {
$this->num_rows = count($this->_rows);
$this->num_rows = count($rows);
$this->_rows = $rows;
reset($this->_rows);
}
@@ -148,7 +148,7 @@ if (isset($_GET["elastic"])) {
$start = microtime(true);
$search = $this->_conn->query($query, $data);
if ($print) {
echo $adminer->selectQuery("$query: " . print_r($data, true), $start, !$search);
echo $adminer->selectQuery("$query: " . json_encode($data), $start, !$search);
}
if (!$search) {
return false;

View File

@@ -526,7 +526,7 @@ if (isset($_GET["mongo"])) {
$op = '$regex';
break;
default:
continue;
continue 2;
}
if ($type == 'and') {
$data['$and'][] = array($col => array($op => $val));
@@ -618,6 +618,9 @@ if (isset($_GET["mongo"])) {
if ($db != "") {
$options["db"] = $db;
}
if (($auth_source = getenv("MONGO_AUTH_SOURCE"))) {
$options["authSource"] = $auth_source;
}
try {
$connection->_link = $connection->connect("mongodb://$server", $options);
if ($password != "") {
@@ -662,7 +665,7 @@ if (isset($_GET["mongo"])) {
}
function support($feature) {
return preg_match("~database|indexes~", $feature);
return preg_match("~database|indexes|descidx~", $feature);
}
function db_collation($db, $collations) {

View File

@@ -24,7 +24,13 @@ if (isset($_GET["mssql"])) {
}
function connect($server, $username, $password) {
$this->_link = @sqlsrv_connect(preg_replace('~:~', ',', $server), array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8"));
global $adminer;
$db = $adminer->database();
$connection_info = array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8");
if ($db != "") {
$connection_info["Database"] = $db;
}
$this->_link = @sqlsrv_connect(preg_replace('~:~', ',', $server), $connection_info);
if ($this->_link) {
$info = sqlsrv_server_info($this->_link);
$this->server_info = $info['SQLServerVersion'];
@@ -344,7 +350,7 @@ if (isset($_GET["mssql"])) {
function table_status($name = "") {
$return = array();
foreach (get_rows("SELECT name AS Name, type_desc AS Engine FROM sys.all_objects WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
foreach (get_rows("SELECT ao.name AS Name, ao.type_desc AS Engine, (SELECT value FROM fn_listextendedproperty(default, 'SCHEMA', schema_name(schema_id), 'TABLE', ao.name, null, null)) AS Comment FROM sys.all_objects AS ao WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
if ($name != "") {
return $row;
}
@@ -362,6 +368,7 @@ if (isset($_GET["mssql"])) {
}
function fields($table) {
$comments = get_key_vals("SELECT objname, cast(value as varchar) FROM fn_listextendedproperty('MS_DESCRIPTION', 'schema', " . q(get_schema()) . ", 'table', " . q($table) . ", 'column', NULL)");
$return = array();
foreach (get_rows("SELECT c.max_length, c.precision, c.scale, c.name, c.is_nullable, c.is_identity, c.collation_name, t.name type, CAST(d.definition as text) [default]
FROM sys.all_columns c
@@ -383,6 +390,7 @@ WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U',
"collation" => $row["collation_name"],
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
"primary" => $row["is_identity"], //! or indexes.is_primary_key
"comment" => $comments[$row["name"]],
);
}
return $return;
@@ -450,6 +458,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
$alter = array();
$comments = array();
foreach ($fields as $field) {
$column = idf_escape($field[0]);
$val = $field[1];
@@ -457,6 +466,8 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
$alter["DROP"][] = " COLUMN $column";
} else {
$val[1] = preg_replace("~( COLLATE )'(\\w+)'~", '\1\2', $val[1]);
$comments[$field[0]] = $val[5];
unset($val[5]);
if ($field[0] == "") {
$alter["ADD"][] = "\n " . implode("", $val) . ($table == "" ? substr($foreign[$val[0]], 16 + strlen($val[0])) : ""); // 16 - strlen(" FOREIGN KEY ()")
} else {
@@ -482,6 +493,11 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
return false;
}
}
foreach ($comments as $key => $val) {
$comment = substr($val, 9); // 9 - strlen(" COMMENT ")
queries("EXEC sp_dropextendedproperty @name = N'MS_Description', @level0type = N'Schema', @level0name = " . q(get_schema()) . ", @level1type = N'Table', @level1name = " . q($name) . ", @level2type = N'Column', @level2name = " . q($key));
queries("EXEC sp_addextendedproperty @name = N'MS_Description', @value = " . $comment . ", @level0type = N'Schema', @level0name = " . q(get_schema()) . ", @level1type = N'Table', @level1name = " . q($name) . ", @level2type = N'Column', @level2name = " . q($key));
}
return true;
}
@@ -526,6 +542,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
$return = array();
foreach (get_rows("EXEC sp_fkeys @fktable_name = " . q($table)) as $row) {
$foreign_key = &$return[$row["FK_NAME"]];
$foreign_key["db"] = $row["PKTABLE_QUALIFIER"];
$foreign_key["table"] = $row["PKTABLE_NAME"];
$foreign_key["source"][] = $row["FKCOLUMN_NAME"];
$foreign_key["target"][] = $row["PKCOLUMN_NAME"];
@@ -626,7 +643,7 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
}
function support($feature) {
return preg_match('~^(columns|database|drop_col|indexes|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
return preg_match('~^(comment|columns|database|drop_col|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
}
$jush = "mssql";

View File

@@ -238,11 +238,15 @@ if (!defined("DRIVER")) {
$options = array(PDO::MYSQL_ATTR_LOCAL_INFILE => false);
$ssl = $adminer->connectSsl();
if ($ssl) {
$options += array(
PDO::MYSQL_ATTR_SSL_KEY => $ssl['key'],
PDO::MYSQL_ATTR_SSL_CERT => $ssl['cert'],
PDO::MYSQL_ATTR_SSL_CA => $ssl['ca'],
);
if (!empty($ssl['key'])) {
$options[PDO::MYSQL_ATTR_SSL_KEY] = $ssl['key'];
}
if (!empty($ssl['cert'])) {
$options[PDO::MYSQL_ATTR_SSL_CERT] = $ssl['cert'];
}
if (!empty($ssl['ca'])) {
$options[PDO::MYSQL_ATTR_SSL_CA] = $ssl['ca'];
}
}
$this->dsn(
"mysql:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\d)~', ';port=\1', $server)),
@@ -551,6 +555,8 @@ if (!defined("DRIVER")) {
"privileges" => array_flip(preg_split('~, *~', $row["Privileges"])),
"comment" => $row["Comment"],
"primary" => ($row["Key"] == "PRI"),
// https://mariadb.com/kb/en/library/show-columns/, https://github.com/vrana/adminer/pull/359#pullrequestreview-276677186
"generated" => preg_match('~^(VIRTUAL|PERSISTENT|STORED)~', $row["Extra"]),
);
}
return $return;
@@ -579,7 +585,7 @@ if (!defined("DRIVER")) {
*/
function foreign_keys($table) {
global $connection, $on_actions;
static $pattern = '`(?:[^`]|``)+`';
static $pattern = '(?:`(?:[^`]|``)+`|"(?:[^"]|"")+")';
$return = array();
$create_table = $connection->result("SHOW CREATE TABLE " . table($table), 1);
if ($create_table) {
@@ -810,7 +816,7 @@ if (!defined("DRIVER")) {
queries("SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'");
foreach ($tables as $table) {
$name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
if (!queries("\nDROP TABLE IF EXISTS $name")
if (($_POST["overwrite"] && !queries("\nDROP TABLE IF EXISTS $name"))
|| !queries("CREATE TABLE $name LIKE " . table($table))
|| !queries("INSERT INTO $name SELECT * FROM " . table($table))
) {
@@ -826,9 +832,8 @@ if (!defined("DRIVER")) {
foreach ($views as $table) {
$name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
$view = view($table);
if (!queries("DROP VIEW IF EXISTS $name")
|| !queries("CREATE VIEW $name AS $view[select]") //! USE to avoid db.table
) {
if (($_POST["overwrite"] && !queries("DROP VIEW IF EXISTS $name"))
|| !queries("CREATE VIEW $name AS $view[select]")) { //! USE to avoid db.table
return false;
}
}
@@ -886,9 +891,8 @@ if (!defined("DRIVER")) {
$fields = array();
preg_match_all("~$pattern\\s*,?~is", $match[1], $matches, PREG_SET_ORDER);
foreach ($matches as $param) {
$name = str_replace("``", "`", $param[2]) . $param[3];
$fields[] = array(
"field" => $name,
"field" => str_replace("``", "`", $param[2]) . $param[3],
"type" => strtolower($param[5]),
"length" => preg_replace_callback("~$enum_length~s", 'normalize_enum', $param[6]),
"unsigned" => strtolower(preg_replace('~\s+~', ' ', trim("$param[8] $param[7]"))),
@@ -981,9 +985,10 @@ if (!defined("DRIVER")) {
/** Set current schema
* @param string
* @param Min_DB
* @return bool
*/
function set_schema($schema) {
function set_schema($schema, $connection2 = null) {
return true;
}
@@ -1080,17 +1085,17 @@ if (!defined("DRIVER")) {
$return = "CONV($return, 2, 10) + 0";
}
if (preg_match("~geometry|point|linestring|polygon~", $field["type"])) {
$return = (min_version(8) ? "ST_" : "") . "GeomFromText($return)";
$return = (min_version(8) ? "ST_" : "") . "GeomFromText($return, SRID($field[field]))";
}
return $return;
}
/** Check whether a feature is supported
* @param string "comment", "copy", "database", "drop_col", "dump", "event", "kill", "materializedview", "partitioning", "privileges", "procedure", "processlist", "routine", "scheme", "sequence", "status", "table", "trigger", "type", "variables", "view", "view_trigger"
* @param string "comment", "copy", "database", "descidx", "drop_col", "dump", "event", "indexes", "kill", "materializedview", "partitioning", "privileges", "procedure", "processlist", "routine", "scheme", "sequence", "status", "table", "trigger", "type", "variables", "view", "view_trigger"
* @return bool
*/
function support($feature) {
return !preg_match("~scheme|sequence|type|view_trigger|materializedview" . (min_version(5.1) ? "" : "|event|partitioning" . (min_version(5) ? "" : "|routine|trigger|view")) . "~", $feature);
return !preg_match("~scheme|sequence|type|view_trigger|materializedview" . (min_version(8) ? "" : "|descidx" . (min_version(5.1) ? "" : "|event|partitioning" . (min_version(5) ? "" : "|routine|trigger|view"))) . "~", $feature);
}
function kill_process($val) {

View File

@@ -367,9 +367,12 @@ AND c_src.TABLE_NAME = " . q($table);
return $connection->result("SELECT sys_context('USERENV', 'SESSION_USER') FROM dual");
}
function set_schema($scheme) {
function set_schema($scheme, $connection2 = null) {
global $connection;
return $connection->query("ALTER SESSION SET CURRENT_SCHEMA = " . idf_escape($scheme));
if (!$connection2) {
$connection2 = $connection;
}
return $connection2->query("ALTER SESSION SET CURRENT_SCHEMA = " . idf_escape($scheme));
}
function show_variables() {
@@ -398,7 +401,7 @@ ORDER BY PROCESS
}
function support($feature) {
return preg_match('~^(columns|database|drop_col|indexes|processlist|scheme|sql|status|table|variables|view|view_trigger)$~', $feature); //!
return preg_match('~^(columns|database|drop_col|indexes|descidx|processlist|scheme|sql|status|table|variables|view|view_trigger)$~', $feature); //!
}
$jush = "oracle";

View File

@@ -324,7 +324,7 @@ ORDER BY 1";
function table_status($name = "") {
$return = array();
foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_total_relation_size(c.oid) - pg_relation_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", CASE WHEN c.relhasoids THEN 'oid' ELSE '' END AS \"Oid\", c.reltuples as \"Rows\", n.nspname
foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_total_relation_size(c.oid) - pg_relation_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", " . (min_version(12) ? "''" : "CASE WHEN c.relhasoids THEN 'oid' ELSE '' END") . " AS \"Oid\", c.reltuples as \"Rows\", n.nspname
FROM pg_class c
JOIN pg_namespace n ON(n.nspname = current_schema() AND n.oid = c.relnamespace)
WHERE relkind IN ('r', 'm', 'v', 'f')
@@ -349,7 +349,10 @@ WHERE relkind IN ('r', 'm', 'v', 'f')
'timestamp without time zone' => 'timestamp',
'timestamp with time zone' => 'timestamptz',
);
foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, d.adsrc AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment
$identity_column = min_version(10) ? "(a.attidentity = 'd')::int" : '0';
foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, pg_get_expr(d.adbin, d.adrelid) AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment, $identity_column AS identity
FROM pg_class c
JOIN pg_namespace n ON c.relnamespace = n.oid
JOIN pg_attribute a ON c.oid = a.attrelid
@@ -372,8 +375,11 @@ ORDER BY a.attnum"
$row["type"] = $type;
$row["full_type"] = $row["type"] . $length . $addon . $array;
}
if ($row['identity']) {
$row['default'] = 'GENERATED BY DEFAULT AS IDENTITY';
}
$row["null"] = !$row["attnotnull"];
$row["auto_increment"] = preg_match('~^nextval\(~i', $row["default"]);
$row["auto_increment"] = $row['identity'] || preg_match('~^nextval\(~i', $row["default"]);
$row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
if (preg_match('~(.+)::[^)]+(.*)~', $row["default"], $match)) {
$row["default"] = ($match[1] == "NULL" ? null : (($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]) . $match[2]));
@@ -432,9 +438,7 @@ ORDER BY conkey, conname") as $row) {
function view($name) {
global $connection;
return array("select" => trim($connection->result("SELECT view_definition
FROM information_schema.views
WHERE table_schema = current_schema() AND table_name = " . q($name))));
return array("select" => trim($connection->result("SELECT pg_get_viewdef(" . $connection->result("SELECT oid FROM pg_class WHERE relname = " . q($name)) . ")")));
}
function collations() {
@@ -477,6 +481,9 @@ WHERE table_schema = current_schema() AND table_name = " . q($name))));
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
$alter = array();
$queries = array();
if ($table != "" && $table != $name) {
$queries[] = "ALTER TABLE " . table($table) . " RENAME TO " . table($name);
}
foreach ($fields as $field) {
$column = idf_escape($field[0]);
$val = $field[1];
@@ -492,7 +499,7 @@ WHERE table_schema = current_schema() AND table_name = " . q($name))));
$alter[] = ($table != "" ? "ADD " : " ") . implode($val);
} else {
if ($column != $val[0]) {
$queries[] = "ALTER TABLE " . table($table) . " RENAME $column TO $val[0]";
$queries[] = "ALTER TABLE " . table($name) . " RENAME $column TO $val[0]";
}
$alter[] = "ALTER $column TYPE$val[1]";
if (!$val[6]) {
@@ -501,7 +508,7 @@ WHERE table_schema = current_schema() AND table_name = " . q($name))));
}
}
if ($field[0] != "" || $val5 != "") {
$queries[] = "COMMENT ON COLUMN " . table($table) . ".$val[0] IS " . ($val5 != "" ? substr($val5, 9) : "''");
$queries[] = "COMMENT ON COLUMN " . table($name) . ".$val[0] IS " . ($val5 != "" ? substr($val5, 9) : "''");
}
}
}
@@ -511,9 +518,6 @@ WHERE table_schema = current_schema() AND table_name = " . q($name))));
} elseif ($alter) {
array_unshift($queries, "ALTER TABLE " . table($table) . "\n" . implode(",\n", $alter));
}
if ($table != "" && $table != $name) {
$queries[] = "ALTER TABLE " . table($table) . " RENAME TO " . table($name);
}
if ($table != "" || $comment != "") {
$queries[] = "COMMENT ON TABLE " . table($name) . " IS " . q($comment);
}
@@ -685,9 +689,12 @@ AND typelem = 0"
return $connection->result("SELECT current_schema()");
}
function set_schema($schema) {
function set_schema($schema, $connection2 = null) {
global $connection, $types, $structured_types;
$return = $connection->query("SET search_path TO " . idf_escape($schema));
if (!$connection2) {
$connection2 = $connection;
}
$return = $connection2->query("SET search_path TO " . idf_escape($schema));
foreach (types() as $type) { //! get types from current_schemas('t')
if (!isset($types[$type])) {
$types[$type] = 0;
@@ -758,7 +765,11 @@ AND typelem = 0"
// "basic" indexes after table definition
foreach ($indexes as $index_name => $index) {
if ($index['type'] == 'INDEX') {
$return .= "\n\nCREATE INDEX " . idf_escape($index_name) . " ON " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " USING btree (" . implode(', ', array_map('idf_escape', $index['columns'])) . ");";
$columns = array();
foreach ($index['columns'] as $key => $val) {
$columns[] = idf_escape($val) . ($index['descs'][$key] ? " DESC" : "");
}
$return .= "\n\nCREATE INDEX " . idf_escape($index_name) . " ON " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " USING btree (" . implode(', ', $columns) . ");";
}
}
@@ -814,7 +825,7 @@ AND typelem = 0"
}
function support($feature) {
return preg_match('~^(database|table|columns|sql|indexes|comment|view|' . (min_version(9.3) ? 'materializedview|' : '') . 'scheme|routine|processlist|sequence|trigger|type|variables|drop_col|kill|dump)$~', $feature);
return preg_match('~^(database|table|columns|sql|indexes|descidx|comment|view|' . (min_version(9.3) ? 'materializedview|' : '') . 'scheme|routine|processlist|sequence|trigger|type|variables|drop_col|kill|dump)$~', $feature);
}
function kill_process($val) {

View File

@@ -482,6 +482,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
global $connection;
$use_all_fields = ($table == "" || $foreign);
foreach ($fields as $field) {
if ($field[0] != "" || !$field[1] || $field[2]) {
@@ -508,16 +509,22 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
if ($table != $name && !queries("ALTER TABLE " . table($table) . " RENAME TO " . table($name))) {
return false;
}
} elseif (!recreate_table($table, $name, $alter, $originals, $foreign)) {
} elseif (!recreate_table($table, $name, $alter, $originals, $foreign, $auto_increment)) {
return false;
}
if ($auto_increment) {
queries("BEGIN");
queries("UPDATE sqlite_sequence SET seq = $auto_increment WHERE name = " . q($name)); // ignores error
if (!$connection->affected_rows) {
queries("INSERT INTO sqlite_sequence (name, seq) VALUES (" . q($name) . ", $auto_increment)");
}
queries("COMMIT");
}
return true;
}
function recreate_table($table, $name, $fields, $originals, $foreign, $indexes = array()) {
function recreate_table($table, $name, $fields, $originals, $foreign, $auto_increment, $indexes = array()) {
global $connection;
if ($table != "") {
if (!$fields) {
foreach (fields($table) as $key => $field) {
@@ -578,12 +585,13 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
$fields[$key] = " " . implode($field);
}
$fields = array_merge($fields, array_filter($foreign));
if (!queries("CREATE TABLE " . table($table != "" ? "adminer_$name" : $name) . " (\n" . implode(",\n", $fields) . "\n)")) {
$temp_name = ($table == $name ? "adminer_$name" : $name);
if (!queries("CREATE TABLE " . table($temp_name) . " (\n" . implode(",\n", $fields) . "\n)")) {
// implicit ROLLBACK to not overwrite $connection->error
return false;
}
if ($table != "") {
if ($originals && !queries("INSERT INTO " . table("adminer_$name") . " (" . implode(", ", $originals) . ") SELECT " . implode(", ", array_map('idf_escape', array_keys($originals))) . " FROM " . table($table))) {
if ($originals && !queries("INSERT INTO " . table($temp_name) . " (" . implode(", ", $originals) . ") SELECT " . implode(", ", array_map('idf_escape', array_keys($originals))) . " FROM " . table($table))) {
return false;
}
$triggers = array();
@@ -591,12 +599,15 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
$trigger = trigger($trigger_name);
$triggers[] = "CREATE TRIGGER " . idf_escape($trigger_name) . " " . implode(" ", $timing_event) . " ON " . table($name) . "\n$trigger[Statement]";
}
if (!queries("DROP TABLE " . table($table))) { // drop before creating indexes and triggers to allow using old names
$auto_increment = $auto_increment ? 0 : $connection->result("SELECT seq FROM sqlite_sequence WHERE name = " . q($table)); // if $auto_increment is set then it will be updated later
if (!queries("DROP TABLE " . table($table)) // drop before creating indexes and triggers to allow using old names
|| ($table == $name && !queries("ALTER TABLE " . table($temp_name) . " RENAME TO " . table($name)))
|| !alter_indexes($name, $indexes)
) {
return false;
}
queries("ALTER TABLE " . table("adminer_$name") . " RENAME TO " . table($name));
if (!alter_indexes($name, $indexes)) {
return false;
if ($auto_increment) {
queries("UPDATE sqlite_sequence SET seq = $auto_increment WHERE name = " . q($name)); // ignores error
}
foreach ($triggers as $trigger) {
if (!queries($trigger)) {
@@ -619,7 +630,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
function alter_indexes($table, $alter) {
foreach ($alter as $primary) {
if ($primary[0] == "PRIMARY") {
return recreate_table($table, $table, array(), array(), array(), $alter);
return recreate_table($table, $table, array(), array(), array(), 0, $alter);
}
}
foreach (array_reverse($alter) as $val) {
@@ -675,7 +686,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
$return = array();
$trigger_options = trigger_options();
foreach (get_rows("SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . q($table)) as $row) {
preg_match('~^CREATE\s+TRIGGER\s*(?:[^`"\s]+|`[^`]*`|"[^"]*")+\s*(' . implode("|", $trigger_options["Timing"]) . ')\s*(.*)\s+ON\b~iU', $row["sql"], $match);
preg_match('~^CREATE\s+TRIGGER\s*(?:[^`"\s]+|`[^`]*`|"[^"]*")+\s*(' . implode("|", $trigger_options["Timing"]) . ')\s*(.*?)\s+ON\b~i', $row["sql"], $match);
$return[$row["name"]] = array($match[1], $match[2]);
}
return $return;
@@ -770,7 +781,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function support($feature) {
return preg_match('~^(columns|database|drop_col|dump|indexes|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
return preg_match('~^(columns|database|drop_col|dump|indexes|descidx|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
}
$jush = "sqlite";

View File

@@ -126,7 +126,7 @@ page_header(lang('Export'), $error, ($_GET["export"] != "" ? array("table" => $_
?>
<form action="" method="post">
<table cellspacing="0">
<table cellspacing="0" class="layout">
<?php
$db_style = array('', 'USE', 'DROP+CREATE', 'CREATE');
$table_style = array('', 'DROP+CREATE', 'CREATE');

View File

@@ -4,7 +4,7 @@ $fields = fields($TABLE);
$where = (isset($_GET["select"]) ? ($_POST["check"] && count($_POST["check"]) == 1 ? where_check($_POST["check"][0], $fields) : "") : where($_GET, $fields));
$update = (isset($_GET["select"]) ? $_POST["edit"] : $where);
foreach ($fields as $name => $field) {
if (!isset($field["privileges"][$update ? "update" : "insert"]) || $adminer->fieldName($field) == "") {
if (!isset($field["privileges"][$update ? "update" : "insert"]) || $adminer->fieldName($field) == "" || $field["generated"]) {
unset($fields[$name]);
}
}

View File

@@ -35,13 +35,13 @@ if (!$row && $EVENT != "") {
?>
<form action="" method="post">
<table cellspacing="0">
<tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" maxlength="64" autocapitalize="off">
<table cellspacing="0" class="layout">
<tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" data-maxlength="64" autocapitalize="off">
<tr><th title="datetime"><?php echo lang('Start'); ?><td><input name="STARTS" value="<?php echo h("$row[EXECUTE_AT]$row[STARTS]"); ?>">
<tr><th title="datetime"><?php echo lang('End'); ?><td><input name="ENDS" value="<?php echo h($row["ENDS"]); ?>">
<tr><th><?php echo lang('Every'); ?><td><input type="number" name="INTERVAL_VALUE" value="<?php echo h($row["INTERVAL_VALUE"]); ?>" class="size"> <?php echo html_select("INTERVAL_FIELD", $intervals, $row["INTERVAL_FIELD"]); ?>
<tr><th><?php echo lang('Status'); ?><td><?php echo html_select("STATUS", $statuses, $row["STATUS"]); ?>
<tr><th><?php echo lang('Comment'); ?><td><input name="EVENT_COMMENT" value="<?php echo h($row["EVENT_COMMENT"]); ?>" maxlength="64">
<tr><th><?php echo lang('Comment'); ?><td><input name="EVENT_COMMENT" value="<?php echo h($row["EVENT_COMMENT"]); ?>" data-maxlength="64">
<tr><th><td><?php echo checkbox("ON_COMPLETION", "PRESERVE", $row["ON_COMPLETION"] == "PRESERVE", lang('On completion preserve')); ?>
</table>
<p><?php textarea("EVENT_DEFINITION", $row["EVENT_DEFINITION"]); ?>

View File

@@ -48,17 +48,33 @@ if ($_POST) {
$row["table"] = $TABLE;
$row["source"] = array("");
}
$source = array_keys(fields($TABLE)); //! no text and blob
$target = ($TABLE === $row["table"] ? $source : array_keys(fields($row["table"])));
$referencable = array_keys(array_filter(table_status('', true), 'fk_support'));
?>
<form action="" method="post">
<p>
<?php if ($row["db"] == "" && $row["ns"] == "") { ?>
<?php echo lang('Target table'); ?>:
<?php echo html_select("table", $referencable, $row["table"], "this.form['change-js'].value = '1'; this.form.submit();"); ?>
<?php
$source = array_keys(fields($TABLE)); //! no text and blob
if ($row["db"] != "") {
$connection->select_db($row["db"]);
}
if ($row["ns"] != "") {
set_schema($row["ns"]);
}
$referencable = array_keys(array_filter(table_status('', true), 'fk_support'));
$target = ($TABLE === $row["table"] ? $source : 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";
if ($jush == "pgsql") {
echo lang('Schema') . ": " . html_select("ns", $adminer->schemas(), $row["ns"] != "" ? $row["ns"] : $_GET["ns"], $onchange);
} elseif ($jush != "sqlite") {
$dbs = array();
foreach ($adminer->databases() as $db) {
if (!information_schema($db)) {
$dbs[] = $db;
}
}
echo lang('DB') . ": " . html_select("db", $dbs, $row["db"] != "" ? $row["db"] : $_GET["db"], $onchange);
}
?>
<input type="hidden" name="change-js" value="">
<noscript><p><input type="submit" name="change" value="<?php echo lang('Change'); ?>"></noscript>
<table cellspacing="0">
@@ -81,12 +97,11 @@ foreach ($row["source"] as $key => $val) {
'mariadb' => "foreign-keys/",
'pgsql' => "sql-createtable.html#SQL-CREATETABLE-REFERENCES",
'mssql' => "ms174979.aspx",
'oracle' => "clauses002.htm#sthref2903",
'oracle' => "https://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm#sthref2903",
)); ?>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<noscript><p><input type="submit" name="add" value="<?php echo lang('Add column'); ?>"></noscript>
<?php } ?>
<?php if ($name != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(lang('Drop %s?', $name)); ?><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -108,7 +108,7 @@ class Adminer {
$return = array();
$filename = "adminer.css";
if (file_exists($filename)) {
$return[] = $filename;
$return[] = "$filename?v=" . crc32(file_get_contents($filename));
}
return $return;
}
@@ -118,11 +118,11 @@ class Adminer {
*/
function loginForm() {
global $drivers;
echo "<table cellspacing='0'>\n";
echo $this->loginFormField('driver', '<tr><th>' . lang('System') . '<td>', html_select("auth[driver]", $drivers, DRIVER) . "\n");
echo "<table cellspacing='0' class='layout'>\n";
echo $this->loginFormField('driver', '<tr><th>' . lang('System') . '<td>', html_select("auth[driver]", $drivers, DRIVER, "loginDriver(this);") . "\n");
echo $this->loginFormField('server', '<tr><th>' . lang('Server') . '<td>', '<input name="auth[server]" value="' . h(SERVER) . '" title="hostname[:port]" placeholder="localhost" autocapitalize="off">' . "\n");
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocapitalize="off">' . script("focus(qs('#username'));"));
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]">' . "\n");
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocomplete="username" autocapitalize="off">' . script("focus(qs('#username')); qs('#username').form['auth[driver]'].onchange();"));
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]" autocomplete="current-password">' . "\n");
echo $this->loginFormField('db', '<tr><th>' . lang('Database') . '<td>', '<input name="auth[db]" value="' . h($_GET["db"]) . '" autocapitalize="off">' . "\n");
echo "</table>\n";
echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
@@ -310,6 +310,7 @@ class Adminer {
* @return null
*/
function tableStructurePrint($fields) {
echo "<div class='scrollable'>\n";
echo "<table cellspacing='0' class='nowrap'>\n";
echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . (support("comment") ? "<td>" . lang('Comment') : "") . "</thead>\n";
foreach ($fields as $field) {
@@ -322,6 +323,7 @@ class Adminer {
echo "\n";
}
echo "</table>\n";
echo "</div>\n";
}
/** Print list of indexes on table in tabular format
@@ -639,7 +641,7 @@ class Adminer {
$history[$_GET["db"]] = array();
}
if (strlen($query) > 1e6) {
$query = preg_replace('~[\x80-\xFF]+$~', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
$query = preg_replace('~[\x80-\xFF]+$~', '', substr($query, 0, 1e6)) . "\n"; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
}
$history[$_GET["db"]][] = array($query, time(), $time); // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"]
$sql_id = "sql-" . count($history[$_GET["db"]]);
@@ -843,7 +845,7 @@ class Adminer {
foreach ($row as $key => $val) {
$field = $fields[$key];
$row[$key] = ($val !== null
? unconvert_field($field, preg_match(number_type(), $field["type"]) && $val != '' ? $val : q(($val === false ? 0 : $val)))
? unconvert_field($field, preg_match(number_type(), $field["type"]) && !preg_match('~\[~', $field["full_type"]) && is_numeric($val) ? $val : q(($val === false ? 0 : $val)))
: "NULL"
);
}
@@ -925,23 +927,22 @@ class Adminer {
</h1>
<?php
if ($missing == "auth") {
$first = true;
$output = "";
foreach ((array) $_SESSION["pwds"] as $vendor => $servers) {
foreach ($servers as $server => $usernames) {
foreach ($usernames as $username => $password) {
if ($password !== null) {
if ($first) {
echo "<p id='logins'>" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
$first = false;
}
$dbs = $_SESSION["db"][$vendor][$server][$username];
foreach (($dbs ? array_keys($dbs) : array("")) as $db) {
echo "<a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@" . $this->serverName($server) : "") . ($db != "" ? " - $db" : "")) . "</a><br>\n";
$output .= "<li><a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@" . $this->serverName($server) : "") . ($db != "" ? " - $db" : "")) . "</a>\n";
}
}
}
}
}
if ($output) {
echo "<ul id='logins'>\n$output</ul>\n" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
}
} else {
if ($_GET["ns"] !== "" && !$missing && DB != "") {
$connection->select_db(DB);

View File

@@ -83,7 +83,7 @@ if ($auth) {
set_session($key, null);
}
unset_permanent();
redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.') . ' ' . lang('Thanks for using Adminer, consider <a href="%s">donating</a>.', 'https://sourceforge.net/donate/index.php?group_id=264133'));
redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.') . ' ' . lang('Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.'));
}
} elseif ($permanent && !$_SESSION["pwds"]) {
@@ -160,7 +160,7 @@ if (isset($_GET["username"]) && !class_exists("Min_DB")) {
stop_session(true);
if (isset($_GET["username"])) {
if (isset($_GET["username"]) && is_string(get_password())) {
list($host, $port) = explode(":", SERVER, 2);
if (is_numeric($port) && $port < 1024) {
auth_error(lang('Connecting to privileged ports is not allowed.'));
@@ -172,7 +172,8 @@ if (isset($_GET["username"])) {
$login = null;
if (!is_object($connection) || ($login = $adminer->login($_GET["username"], get_password())) !== true) {
auth_error((is_string($connection) ? h($connection) : (is_string($login) ? $login : lang('Invalid credentials.'))));
$error = (is_string($connection) ? h($connection) : (is_string($login) ? $login : lang('Invalid credentials.')));
auth_error($error . (preg_match('~^ | $~', get_password()) ? '<br>' . lang('There is a space in the input password which might be the cause.') : ''));
}
if ($auth && $_POST["token"]) {

View File

@@ -79,11 +79,12 @@ include "../adminer/drivers/firebird.inc.php";
include "../adminer/drivers/simpledb.inc.php";
include "../adminer/drivers/mongo.inc.php";
include "../adminer/drivers/elastic.inc.php";
include "../adminer/drivers/clickhouse.inc.php";
include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
define("SERVER", $_GET[DRIVER]); // read from pgsql=localhost
define("DB", $_GET["db"]); // for the sake of speed and size
define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\1', $_SERVER["REQUEST_URI"]) . '?'
define("ME", str_replace(":", "%3a", preg_replace('~^[^?]*/([^?]*).*~', '\1', $_SERVER["REQUEST_URI"])) . '?'
. (sid() ? SID . '&' : '')
. (SERVER !== null ? DRIVER . "=" . urlencode(SERVER) . '&' : '')
. (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '')

View File

@@ -17,6 +17,7 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
odd(''); // reset odd for each result
for ($i=0; (!$limit || $i < $limit) && ($row = $result->fetch_row()); $i++) {
if (!$i) {
echo "<div class='scrollable'>\n";
echo "<table cellspacing='0' class='nowrap'>\n";
echo "<thead><tr>";
for ($j=0; $j < count($row); $j++) {
@@ -85,7 +86,7 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
echo "<td>$val";
}
}
echo ($i ? "</table>" : "<p class='message'>" . lang('No rows.')) . "\n";
echo ($i ? "</table>\n</div>" : "<p class='message'>" . lang('No rows.')) . "\n";
return $return;
}
@@ -111,6 +112,31 @@ function referencable_primary($self) {
return $return;
}
/** Get settings stored in a cookie
* @return array
*/
function adminer_settings() {
parse_str($_COOKIE["adminer_settings"], $settings);
return $settings;
}
/** Get setting stored in a cookie
* @param string
* @return array
*/
function adminer_setting($key) {
$settings = adminer_settings();
return $settings[$key];
}
/** Store settings to a cookie
* @param array
* @return bool
*/
function set_adminer_settings($settings) {
return cookie("adminer_settings", http_build_query($settings + adminer_settings()));
}
/** Print SQL <textarea> tag
* @param string
* @param string or array in which case [0] of every element is used
@@ -151,13 +177,12 @@ if ($foreign_keys) {
$structured_types[lang('Foreign keys')] = $foreign_keys;
}
echo optionlist(array_merge($extra_types, $structured_types), $type);
?></select>
<?php echo on_help("getTarget(event).value", 1); ?>
?></select><?php echo on_help("getTarget(event).value", 1); ?>
<?php echo script("mixin(qsl('select'), {onfocus: function () { lastType = selectValue(this); }, onchange: editingTypeChange});", ""); ?>
<td><input name="<?php echo h($key); ?>[length]" value="<?php echo h($field["length"]); ?>" size="3"<?php echo (!$field["length"] && preg_match('~var(char|binary)$~', $type) ? " class='required'" : ""); //! type="number" with enabled JavaScript ?> aria-labelledby="label-length"><?php echo script("mixin(qsl('input'), {onfocus: editingLengthFocus, oninput: editingLengthChange});", ""); ?><td class="options"><?php
echo "<select name='" . h($key) . "[collation]'" . (preg_match('~(char|text|enum|set)$~', $type) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
echo ($unsigned ? "<select name='" . h($key) . "[unsigned]'" . (!$type || preg_match(number_type(), $type) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
echo (isset($field['on_update']) ? "<select name='" . h($key) . "[on_update]'" . (preg_match('~timestamp|datetime~', $type) ? "" : " class='hidden'") . '>' . optionlist(array("" => "(" . lang('ON UPDATE') . ")", "CURRENT_TIMESTAMP"), $field["on_update"]) . '</select>' : '');
echo (isset($field['on_update']) ? "<select name='" . h($key) . "[on_update]'" . (preg_match('~timestamp|datetime~', $type) ? "" : " class='hidden'") . '>' . optionlist(array("" => "(" . lang('ON UPDATE') . ")", "CURRENT_TIMESTAMP"), (preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"]) ? "CURRENT_TIMESTAMP" : $field["on_update"])) . '</select>' : '');
echo ($foreign_keys ? "<select name='" . h($key) . "[on_delete]'" . (preg_match("~`~", $type) ? "" : " class='hidden'") . "><option value=''>(" . lang('ON DELETE') . ")" . optionlist(explode("|", $on_actions), $field["on_delete"]) . "</select> " : " "); // space for IE
}
@@ -235,10 +260,9 @@ function type_class($type) {
* @param array
* @param string TABLE or PROCEDURE
* @param array returned by referencable_primary()
* @param bool display comments column
* @return null
*/
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array(), $comments = false) {
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array()) {
global $inout;
$fields = array_values($fields);
?>
@@ -258,7 +282,7 @@ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = arra
'mssql' => "ms186775.aspx",
)); ?>
<td id="label-default"><?php echo lang('Default value'); ?>
<?php echo (support("comment") ? "<td id='label-comment'" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
<?php echo (support("comment") ? "<td id='label-comment'>" . lang('Comment') : ""); ?>
<?php } ?>
<td><?php echo "<input type='image' class='icon' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>" . script("row_count = " . count($fields) . ";"); ?>
</thead>
@@ -272,14 +296,13 @@ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = arra
?>
<tr<?php echo ($display ? "" : " style='display: none;'"); ?>>
<?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", explode("|", $inout), $field["inout"]) : ""); ?>
<th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" maxlength="64" autocapitalize="off" aria-labelledby="label-name"><?php echo script("qsl('input').oninput = function () { editingNameChange.call(this);" . ($field["field"] != "" || count($fields) > 1 ? "" : " editingAddRow.call(this);") . " };", ""); ?><?php } ?>
<input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($orig); ?>">
<?php edit_type("fields[$i]", $field, $collations, $foreign_keys); ?>
<th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" data-maxlength="64" autocapitalize="off" aria-labelledby="label-name"><?php echo script("qsl('input').oninput = function () { editingNameChange.call(this);" . ($field["field"] != "" || count($fields) > 1 ? "" : " editingAddRow.call(this);") . " };", ""); ?><?php } ?>
<input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($orig); ?>"><?php edit_type("fields[$i]", $field, $collations, $foreign_keys); ?>
<?php if ($type == "TABLE") { ?>
<td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block", "label-null"); ?>
<td><label class="block"><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> aria-labelledby="label-ai"></label><td><?php
echo checkbox("fields[$i][has_default]", 1, $field["has_default"], "", "", "", "label-default"); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" aria-labelledby="label-default"><?php
echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
echo (support("comment") ? "<td><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' data-maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
}
echo "<td>";
echo (support("move_col") ?
@@ -445,12 +468,17 @@ function remove_definer($query) {
}
/** Format foreign key to use in SQL query
* @param array ("table" => string, "source" => array, "target" => array, "on_delete" => one of $on_actions, "on_update" => one of $on_actions)
* @param array ("db" => string, "ns" => string, "table" => string, "source" => array, "target" => array, "on_delete" => one of $on_actions, "on_update" => one of $on_actions)
* @return string
*/
function format_foreign_key($foreign_key) {
global $on_actions;
return " FOREIGN KEY (" . implode(", ", array_map('idf_escape', $foreign_key["source"])) . ") REFERENCES " . table($foreign_key["table"])
$db = $foreign_key["db"];
$ns = $foreign_key["ns"];
return " FOREIGN KEY (" . implode(", ", array_map('idf_escape', $foreign_key["source"])) . ") REFERENCES "
. ($db != "" && $db != $_GET["db"] ? idf_escape($db) . "." : "")
. ($ns != "" && $ns != $_GET["ns"] ? idf_escape($ns) . "." : "")
. table($foreign_key["table"])
. " (" . implode(", ", array_map('idf_escape', $foreign_key["target"])) . ")" //! reuse $name - check in older MySQL versions
. (preg_match("~^($on_actions)\$~", $foreign_key["on_delete"]) ? " ON DELETE $foreign_key[on_delete]" : "")
. (preg_match("~^($on_actions)\$~", $foreign_key["on_update"]) ? " ON UPDATE $foreign_key[on_update]" : "")
@@ -501,9 +529,9 @@ function doc_link($paths, $text = "<sup>?</sup>") {
$urls = array(
'sql' => "https://dev.mysql.com/doc/refman/$version/en/",
'sqlite' => "https://www.sqlite.org/",
'pgsql' => "https://www.postgresql.org/docs/$version/static/",
'pgsql' => "https://www.postgresql.org/docs/$version/",
'mssql' => "https://msdn.microsoft.com/library/",
'oracle' => "https://download.oracle.com/docs/cd/B19306_01/server.102/b14200/",
'oracle' => "https://www.oracle.com/pls/topic/lookup?ctx=db" . preg_replace('~^.* (\d+)\.(\d+)\.\d+\.\d+\.\d+.*~s', '\1\2', $server_info) . "&id=",
);
if (preg_match('~MariaDB~', $server_info)) {
$urls['sql'] = "https://mariadb.com/kb/en/library/";

View File

@@ -351,7 +351,7 @@ function set_password($vendor, $server, $username, $password) {
}
/** Get password from session
* @return string
* @return string or null for missing password or false for expired password
*/
function get_password() {
$return = get_session("pwds");
@@ -479,10 +479,10 @@ function where($where, $fields = array()) {
$key = bracket_escape($key, 1); // 1 - back
$column = escape_key($key);
$return[] = $column
. ($jush == "sql" && preg_match('~^[0-9]*\.[0-9]*$~', $val) ? " LIKE " . q(addcslashes($val, "%_\\"))
: ($jush == "mssql" ? " LIKE " . q(preg_replace('~[_%[]~', '[\0]', $val))
. ($jush == "sql" && is_numeric($val) && preg_match('~\.~', $val) ? " LIKE " . q($val) // LIKE because of floats but slow with ints
: ($jush == "mssql" ? " LIKE " . q(preg_replace('~[_%[]~', '[\0]', $val)) // LIKE because of text
: " = " . unconvert_field($fields[$key], q($val))
)) // LIKE because of floats but slow with ints, in MS SQL because of text
))
; //! enum and set
if ($jush == "sql" && preg_match('~char|text~', $fields[$key]["type"]) && preg_match("~[^ -@]~", $val)) { // not just [a-z] to catch non-ASCII characters
$return[] = "$column = " . q($val) . " COLLATE " . charset($connection) . "_bin";
@@ -566,8 +566,12 @@ function restart_session() {
* @return null
*/
function stop_session($force = false) {
if (!ini_bool("session.use_cookies") || ($force && @ini_set("session.use_cookies", false) !== false)) { // @ - may be disabled
$use_cookies = ini_bool("session.use_cookies");
if (!$use_cookies || $force) {
session_write_close(); // improves concurrency if a user opens several pages at once, may be restarted later
if ($use_cookies && @ini_set("session.use_cookies", false) === false) { // @ - may be disabled
session_start();
}
}
}
@@ -815,7 +819,7 @@ function shorten_utf8($string, $length = 80, $suffix = "") {
if (!preg_match("(^(" . repeat_pattern("[\t\r\n -\x{10FFFF}]", $length) . ")($)?)u", $string, $match)) { // ~s causes trash in $match[2] under some PHP versions, (.|\n) is slow
preg_match("(^(" . repeat_pattern("[\t\r\n -~]", $length) . ")($)?)", $string, $match);
}
return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i>...</i>");
return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i></i>");
}
/** Format decimal number
@@ -960,7 +964,7 @@ function input($field, $value, $function) {
}
} elseif (preg_match('~blob|bytea|raw|file~', $field["type"]) && ini_bool("file_uploads")) {
echo "<input type='file' name='fields-$name'>";
} elseif (($text = preg_match('~text|lob~', $field["type"])) || preg_match("~\n~", $value)) {
} elseif (($text = preg_match('~text|lob|memo~i', $field["type"])) || preg_match("~\n~", $value)) {
if ($text && $jush != "sqlite") {
$attrs .= " cols='50' rows='12'";
} else {
@@ -1021,7 +1025,7 @@ function process_input($field) {
return null;
}
if ($function == "orig") {
return ($field["on_update"] == "CURRENT_TIMESTAMP" ? idf_escape($field["field"]) : false);
return (preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"]) ? idf_escape($field["field"]) : false);
}
if ($function == "NULL") {
return "NULL";
@@ -1419,7 +1423,7 @@ function edit_form($TABLE, $fields, $row, $update) {
if (!$fields) {
echo "<p class='error'>" . lang('You have no privileges to update this table.') . "\n";
} else {
echo "<table cellspacing='0'>" . script("qsl('table').onkeydown = editingKeydown;");
echo "<table cellspacing='0' class='layout'>" . script("qsl('table').onkeydown = editingKeydown;");
foreach ($fields as $name => $field) {
echo "<tr><th>" . $adminer->fieldName($field);
@@ -1445,12 +1449,12 @@ function edit_form($TABLE, $fields, $row, $update) {
}
$function = ($_POST["save"]
? (string) $_POST["function"][$name]
: ($update && $field["on_update"] == "CURRENT_TIMESTAMP"
: ($update && preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"])
? "now"
: ($value === false ? null : ($value !== null ? '' : 'NULL'))
)
);
if (preg_match("~time~", $field["type"]) && $value == "CURRENT_TIMESTAMP") {
if (preg_match("~time~", $field["type"]) && preg_match('~^CURRENT_TIMESTAMP~i', $value)) {
$value = "";
$function = "now";
}
@@ -1476,7 +1480,7 @@ function edit_form($TABLE, $fields, $row, $update) {
? lang('Save and continue edit')
: lang('Save and insert next')
) . "' title='Ctrl+Shift+Enter'>\n";
echo ($update ? script("qsl('input').onclick = function () { return !ajaxForm(this.form, '" . lang('Saving') . "...', this); };") : "");
echo ($update ? script("qsl('input').onclick = function () { return !ajaxForm(this.form, '" . lang('Saving') . "', this); };") : "");
}
}
echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'>" . confirm() . "\n"

View File

@@ -23,6 +23,7 @@ $langs = array(
'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti
'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/
'ka' => 'ქართული', // Saba Khmaladze skhmaladze@uglt.org
'ko' => '한국어', // dalli - skcha67@gmail.com
'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
'ms' => 'Bahasa Melayu', // Pisyek
@@ -36,6 +37,7 @@ $langs = array(
'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz
'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com
'sr' => 'Српски', // Nikola Radovanović - cobisimo@gmail.com
'sv' => 'Svenska', // rasmusolle - https://github.com/rasmusolle
'ta' => 'த‌மிழ்', // G. Sampath Kumar, Chennai, India, sampathkumar11@gmail.com
'th' => 'ภาษาไทย', // Panya Saraphi, elect.tu@gmail.com - http://www.opencart2u.com/
'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com

View File

@@ -1,2 +1,2 @@
<?php
$VERSION = "4.6.3";
$VERSION = "4.7.5";

View File

@@ -94,6 +94,7 @@ if (!$row) {
?>
<form action="" method="post">
<div class="scrollable">
<table cellspacing="0" class="nowrap">
<thead><tr>
<th id="label-type"><?php echo lang('Index Type'); ?>
@@ -126,7 +127,7 @@ foreach ($row["indexes"] as $index) {
"partial(" . ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . ", '" . js_escape($jush == "sql" ? "" : $_GET["indexes"] . "_") . "')"
);
echo ($jush == "sql" || $jush == "mssql" ? "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "' title='" . lang('Length') . "'>" : "");
echo ($jush != "sql" ? checkbox("indexes[$j][descs][$i]", 1, $index["descs"][$key], lang('descending')) : "");
echo (support("descidx") ? checkbox("indexes[$j][descs][$i]", 1, $index["descs"][$key], lang('descending')) : "");
echo " </span>";
$i++;
}
@@ -138,6 +139,7 @@ foreach ($row["indexes"] as $index) {
}
?>
</table>
</div>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">

View File

@@ -10,8 +10,9 @@ $translations = array(
'Logout' => 'Odhlásit',
'Logged as: %s' => 'Přihlášen jako: %s',
'Logout successful.' => 'Odhlášení proběhlo v pořádku.',
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Díky za použití Admineru, <a href="%s">příspějte</a> na vývoj.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Díky za použití Admineru, <a href="https://www.adminer.org/cs/donation/">přispějte</a> na vývoj.',
'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
'There is a space in the input password which might be the cause.' => 'Problém může být, že je v zadaném hesle mezera.',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer nepodporuje přístup k databázi bez hesla, <a href="https://www.adminer.org/cs/password/"%s>více informací</a>.',
'Database does not support password.' => 'Databáze nepodporuje heslo.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minutu.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minuty.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minut.'),
@@ -126,6 +127,7 @@ $translations = array(
'Tables have been moved.' => 'Tabulky byly přesunuty.',
'Copy' => 'Zkopírovat',
'Tables have been copied.' => 'Tabulky byly zkopírovány.',
'overwrite' => 'přepsat',
'Routines' => 'Procedury a funkce',
'Routine has been called, %d row(s) affected.' => array('Procedura byla zavolána, byl změněn %d záznam.', 'Procedura byla zavolána, byly změněny %d záznamy.', 'Procedura byla zavolána, bylo změněno %d záznamů.'),

View File

@@ -2,6 +2,7 @@
$translations = array(
'Login' => 'Login',
'Logout successful.' => 'Abmeldung erfolgreich.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Danke, dass Sie Adminer genutzt haben. <a href="https://www.adminer.org/de/donation/">Spenden willkommen!</a>',
'Invalid credentials.' => 'Ungültige Anmelde-Informationen.',
'Server' => 'Server',
'Username' => 'Benutzer',

View File

@@ -279,7 +279,7 @@ $translations = array(
'Default value' => 'ערך ברירת מחדל',
'Full table scan' => 'סריקה טבלה מלאה',
'Too many unsuccessful logins, try again in %d minute(s).' => 'יותר מידי נסיונות כניסה נכשלו, אנא נסה עוד %d דקות',
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'תודה שהשתמש ב-adminer אנא שקול <a href="%s">לתרום</a>.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'תודה שהשתמש ב-adminer אנא שקול <a href="https://www.adminer.org/en/donation/">לתרום</a>.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'סיסמת המאסטר פגה <a href="https://www.adminer.org/en/extension/"%s>התקן תוסף</a> על מנת להפוך את זה לתמידי',
'If you did not send this request from Adminer then close this page.' => 'אם לא אתה שלחת בקשה ל-Adminer הינך יכול לסגור חלון זה',
'You can upload a big SQL file via FTP and import it from server.' => 'ניתן לעלות קבצים ב-FTP ואז למשוך אותם מהשרת',

View File

@@ -178,7 +178,7 @@ $translations = array(
'Optimize' => '最適化',
'Check' => 'チェック',
'Repair' => '修復',
'Truncate' => 'Truncate',
'Truncate' => '空にする',
'Move to other database' => '別のデータベースへ移動',
'Move' => '移動',
'Save and continue edit' => '保存して継続',
@@ -264,4 +264,14 @@ $translations = array(
'Permanent link' => 'パーマネントリンク',
'Edit all' => 'すべて編集',
'HH:MM:SS' => '時:分:秒',
'Selected' => '選択済',
'Modify' => '修正',
'Load more data' => '続きを読み込み',
'Loading' => '読み込み中',
'Size' => 'サイズ',
'Compute' => '算出',
'Saving' => '保存中',
'yes' => 'はい',
'no' => 'いいえ',
'Default value' => '既定値',
);

303
adminer/lang/ka.inc.php Normal file
View File

@@ -0,0 +1,303 @@
<?php
$translations = array(
'Login' => 'შესვლა',
'Logout successful.' => 'გამოხვედით სისტემიდან.',
'Invalid credentials.' => 'არასწორი მომხმარებელი ან პაროლი.',
'Server' => 'სერვერი',
'Username' => 'მომხმარებელი',
'Password' => 'პაროლი',
'Select database' => 'ბაზა',
'Invalid database.' => 'არასწორი ბაზა.',
'Table has been dropped.' => 'ცხრილი წაიშალა.',
'Table has been altered.' => 'ცხრილი შეიცვალა.',
'Table has been created.' => 'ცხრილი შეიქმნა.',
'Alter table' => 'ცხრილის შეცვლა',
'Create table' => 'ცხრილის შექმნა',
'Table name' => 'სახელი',
'engine' => 'სახეობა',
'collation' => 'კოდირება',
'Column name' => 'ველი',
'Type' => 'სახეობა',
'Length' => 'სიგრძე',
'Auto Increment' => 'ავტომატურად გაზრდა',
'Options' => 'მოქმედება',
'Save' => 'შენახვა',
'Drop' => 'წაშლა',
'Database has been dropped.' => 'ბაზა წაიშალა.',
'Database has been created.' => 'ბაზა შეიქმნა.',
'Database has been renamed.' => 'ბაზას გადაერქვა.',
'Database has been altered.' => 'ბაზა შეიცვალა.',
'Alter database' => 'ბაზის შეცვლა',
'Create database' => 'ბაზის შექმნა',
'SQL command' => 'SQL-ბრძანება',
'Logout' => 'გასვლა',
'database' => 'ბაზა',
'Use' => 'არჩევა',
'No tables.' => 'ბაზაში ცხრილი არაა.',
'select' => 'არჩევა',
'Item has been deleted.' => 'ჩანაწერი წაიშალა.',
'Item has been updated.' => 'ჩანაწერი განახლდა.',
'Item%s has been inserted.' => 'ჩანაწერი%s ჩაჯდა.',
'Edit' => 'შეცვლა',
'Insert' => 'ჩასმა',
'Save and insert next' => 'შენახვა და სხვის ჩასმა',
'Delete' => 'წაშლა',
'Database' => 'ბაზა',
'Indexes have been altered.' => 'შეიცვალა ინდექსები.',
'Indexes' => 'ინდექსები',
'Alter indexes' => 'ინდექსის შეცვლა',
'Add next' => 'კიდევ დამატება',
'Language' => 'ენა',
'Select' => 'არჩევა',
'New item' => 'ახალი ჩანაწერი',
'Search' => 'ძებნა',
'Sort' => 'დალაგება',
'descending' => 'კლებადობით',
'Limit' => 'ზღვარი',
'No rows.' => 'ჩანაწერი არაა.',
'Action' => 'მოქმედება',
'edit' => 'რედაქტირება',
'Page' => 'გვერდი',
'Query executed OK, %d row(s) affected.' => 'მოთხოვდა შესრულდა, შეიცვალა %d ჩანაწერი.',
'Error in query' => 'შეცდომა მოთხოვნაში',
'Execute' => 'შესრულება',
'Table' => 'ცხრილი',
'Foreign keys' => 'გარე გასაღები',
'Triggers' => 'ტრიგერები',
'View' => 'ნახვა',
'Unable to select the table' => 'ცხრილიდან ინფორმაცია ვერ მოვიპოვე',
'Invalid CSRF token. Send the form again.' => 'უმოქმედო CSRF-ტოკენი. ფორმის კიდევ ერთხელ გაგზავნა.',
'Comment' => 'კომენტარები',
'Default values' => 'სტანდარტული მნიშვნელობა',
'%d byte(s)' => '%d ბაიტი',
'No commands to execute.' => 'შესასრულებელი ბრძანება არაა.',
'Unable to upload a file.' => 'ფაილი არ აიტვირთა სერვერზე.',
'File upload' => 'ფაილის ატვირთვა სერვერზე',
'File uploads are disabled.' => 'ფაილის სერვერზე ატვირთვა გათიშულია.',
'Routine has been called, %d row(s) affected.' => 'გამოძახებულია პროცედურა, შეიცვალა %d ჩანაწერი.',
'Call' => 'გამოძახეება',
'No extension' => 'გაფართოება არაა',
'None of the supported PHP extensions (%s) are available.' => 'არც ერთი მხარდაჭერილი გაფართოება არ მოიძებნა (%s).',
'Session support must be enabled.' => 'ჩართული უნდა იყოს სესია.',
'Session expired, please login again.' => 'სესიის მოქმედების დრო ამოიწურა, გაიარეთ ხელახალი ავტორიზაცია.',
'Text length' => 'ტექსტის სიგრძე',
'Foreign key has been dropped.' => 'გარე გასაღები წაიშალა.',
'Foreign key has been altered.' => 'გარე გასაღები შეიცვალა.',
'Foreign key has been created.' => 'გარე გასაღები შეიქმნა.',
'Foreign key' => 'გარე გასაღები',
'Change' => 'შეცვლა',
'Source' => 'წყარო',
'Target' => 'სამიზნე',
'Add column' => 'ველის დამატება',
'Alter' => 'შეცვლა',
'Add foreign key' => 'გარე გასაღები დამატება',
'ON DELETE' => 'წაშლისას',
'ON UPDATE' => 'განახლებისას',
'Index Type' => 'ინდექსის სახეობა',
'Column (length)' => 'ველი (სიგრძე)',
'View has been dropped.' => 'წარმოდგენა წაიშალა.',
'View has been altered.' => 'წარმოდგენა შეიცვალა.',
'View has been created.' => 'წარმოდგენა შეიქმნა.',
'Alter view' => 'წარმოდგენის შეცვლა',
'Create view' => 'წარმოდგენის შექმნა',
'Name' => 'სახელი',
'Process list' => 'პროცესების სია',
'%d process(es) have been killed.' => 'გაითიშა %d პროცესი.',
'Kill' => 'დასრულება',
'Parameter name' => 'პარამეტრი',
'Database schema' => 'ბაზის სქემა',
'Create procedure' => 'პროცედურის შექმნა',
'Create function' => 'ფუნქციის შექმნა',
'Routine has been dropped.' => 'პროცედურა წაიშალა.',
'Routine has been altered.' => 'პროცედურა შეიცვალა.',
'Routine has been created.' => 'პროცედურა შეიქმნა.',
'Alter function' => 'ფუნქციის შეცვლა',
'Alter procedure' => 'პროცედურის შეცვლა',
'Return type' => 'დაბრუნების სახეობა',
'Add trigger' => 'ტრიგერის დამატება',
'Trigger has been dropped.' => 'ტრიგერი წაიშალა.',
'Trigger has been altered.' => 'ტრიგერი შეიცვალა.',
'Trigger has been created.' => 'ტრიგერი შეიქმნა.',
'Alter trigger' => 'ტრიგერის შეცვლა',
'Create trigger' => 'ტრიგერის შექმნა',
'Time' => 'დრო',
'Event' => 'ღონისძიება',
'%s version: %s through PHP extension %s' => 'ვერსია %s: %s PHP-გაფართოება %s',
'%d row(s)' => '%d რიგი',
'Remove' => 'წაშლა',
'Are you sure?' => 'ნამდვილად?',
'Privileges' => 'უფლებამოსილება',
'Create user' => 'მომხმარებლის შექმან',
'User has been dropped.' => 'მომხმარებელი წაიშალა.',
'User has been altered.' => 'მომხმარებელი შეიცვალა.',
'User has been created.' => 'მომხმარებელი შეიქმნა.',
'Hashed' => 'ჰეშირებული',
'Column' => 'ველი',
'Routine' => 'პროცედურა',
'Grant' => 'დაშვება',
'Revoke' => 'შეზღუდვა',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST ინფორმაცია ძალიან დიდია. შეამცირეთ ზომა ან გაზარდეს POST ინფორმაციის ზომა პარამეტრებიდან %s.',
'Logged as: %s' => 'შესული ხართ როგორც: %s',
'Move up' => 'ზემოთ ატანა',
'Move down' => 'ქვემოთ ჩატანა',
'Functions' => 'ფუნქციები',
'Aggregation' => 'აგრეგაცია',
'Export' => 'ექსპორტი',
'Output' => 'გამომავალი ინფორმაცია',
'open' => 'გახსნა',
'save' => 'შენახვა',
'Format' => 'ფორმატი',
'Tables' => 'ცხრილები',
'Data' => 'ინფორმაცია',
'Event has been dropped.' => 'ღონისძიება წაიშალა.',
'Event has been altered.' => 'ღონისძიება შეიცვალა.',
'Event has been created.' => 'ღონისძიება შეიქმნა.',
'Alter event' => 'ღონისძიების შეცვლა',
'Create event' => 'ღონისძიების შექმნა',
'At given time' => 'მოცემულ დროში',
'Every' => 'ყოველ',
'Events' => 'ღონისძიება',
'Schedule' => 'განრიგი',
'Start' => 'დასაწყისი',
'End' => 'დასასრული',
'Status' => 'მდგომარეობა',
'On completion preserve' => 'შენახვა დასრულებისას',
'Tables and views' => 'ცხრილები და წარმოდგენები',
'Data Length' => 'ინფორმაციის მოცულობა',
'Index Length' => 'ინდექსების მოცულობა',
'Data Free' => 'თავისუფალი სივრცე',
'Collation' => 'კოდირება',
'Analyze' => 'ანალიზი',
'Optimize' => 'ოპტიმიზაცია',
'Check' => 'შემოწმება',
'Repair' => 'გასწორება',
'Truncate' => 'გასუფთავება',
'Tables have been truncated.' => 'ცხრილი გასუფთავდა.',
'Rows' => 'რიგი',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'ცხრილი გადაადგილდა.',
'Move to other database' => 'გადატანა სხვა ბაზაში',
'Move' => 'გადატანა',
'Engine' => 'ძრავი',
'Save and continue edit' => 'შენახვა და ცვლილების გაგრძელება',
'original' => 'საწყისი',
'%d item(s) have been affected.' => 'შეიცვალა %d ჩანაწერი.',
'Whole result' => 'სრული შედეგი',
'Tables have been dropped.' => 'ცხრილები წაიშალა.',
'Clone' => 'კლონირება',
'Partition by' => 'დაყოფა',
'Partitions' => 'დანაყოფები',
'Partition name' => 'დანაყოფის სახელი',
'Values' => 'პარამეტრები',
'%d row(s) have been imported.' => 'დაიმპორტდა %d რიგი.',
'Import' => 'იმპორტი',
'Stop on error' => 'გაჩერება შეცდომისას',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'მიღწეულია დაშვებული ველების მაქსიმალური რაოდენობა, გაზარდეთ %s.',
'anywhere' => 'ნებისმიერ ადგილას',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5.$3.$1',
'[yyyy]-mm-dd' => 'დდ.თთ.[წწწწ]',
'History' => 'ისტორია',
'Variables' => 'ცვლადები',
'Relations' => 'ურთიერთობა',
'Run file' => 'ფაილის გაშვება',
'Clear' => 'გასუფთავება',
'Maximum allowed file size is %sB.' => 'ფაილის მაქსიმალური ზომა - %sB.',
'Numbers' => 'ციფრები',
'Date and time' => 'დრო და თარიღი',
'Binary' => 'ორობითი',
'Lists' => 'სია',
'Editor' => 'რედაქტორი',
'E-mail' => 'ელ. ფოსტა',
'From' => 'ავტორი:',
'Subject' => 'თემა',
'Send' => 'გაგზავნა',
'%d e-mail(s) have been sent.' => 'გაიგზავნა %d წერილი.',
'Webserver file %s' => 'ფაილი %s ვებსერვერზე',
'File does not exist.' => 'ასეთი ფაილი არ არსებობს.',
'%d in total' => 'სულ %d',
'Permanent login' => 'სისტემაში დარჩენა',
'Databases have been dropped.' => 'ბაზა წაიშალა.',
'Search data in tables' => 'ცხრილებში ძებნა',
'Schema' => 'სქემა',
'Alter schema' => 'სქემის შეცვლა',
'Create schema' => 'ახალი სქემა',
'Schema has been dropped.' => 'სქემა წაიშალა.',
'Schema has been created.' => 'შეიქმნა ახალი სქემა.',
'Schema has been altered.' => 'სქემა შეიცვალა.',
'Sequences' => 'მიმდევრობა',
'Create sequence' => 'მიმდევრობის შექმნა',
'Alter sequence' => 'მიმდევრობის შეცვლა',
'Sequence has been dropped.' => 'მიმდევრობა წაიშალა.',
'Sequence has been created.' => 'მიმდევრობა შეიქმნა.',
'Sequence has been altered.' => 'მიმდევრობა შეიცვალა.',
'User types' => 'მომხმარებლის სახეობა',
'Create type' => 'სახეობის შექმნა',
'Alter type' => 'სახეობის შეცვლა',
'Type has been dropped.' => 'სახეობა წაიშალა.',
'Type has been created.' => 'სახეობა შეიქმნა.',
'Ctrl+click on a value to modify it.' => 'შესაცვლელად გამოიყენეთ Ctrl+თაგვის ღილაკი.',
'Use edit link to modify this value.' => 'ამ მნიშვნელობის შესაცვლელად გამოიყენეთ ბმული «შეცვლა».',
'last' => 'ბოლო',
'From server' => 'სერვერიდან',
'System' => 'სისტემა',
'Select data' => 'არჩევა',
'Show structure' => 'სტრუქტურის ჩვენება',
'empty' => 'ცარიელი',
'Network' => 'ქსელი',
'Geometry' => 'გეომეტრია',
'File exists.' => 'ფაილი უკვე არსებობს.',
'Attachments' => 'მიმაგრებული ფაილები',
'%d query(s) executed OK.' => '%d მოთხოვნა შესრულდა.',
'Show only errors' => 'მხოლოდ შეცდომები',
'Refresh' => 'განახლება',
'Invalid schema.' => 'არასწორი სქემა.',
'Please use one of the extensions %s.' => 'გამოიყენეთ ერთ-ერთი გაფართოება %s.',
'now' => 'ახლა',
'ltr' => 'ltr',
'Tables have been copied.' => 'ცხრილი დაკოპირდა.',
'Copy' => 'კოპირება',
'Permanent link' => 'მუდმივი ბმული',
'Edit all' => 'ყველას შეცვლა',
'HH:MM:SS' => 'სთ:წთ:წმ',
'Tables have been optimized.' => 'ცხრილებს გაუკეთდა ოპტიმიზაცია.',
'Materialized view' => 'მატერიალური ხედი',
'Vacuum' => 'ვაკუუმი',
'Selected' => 'არჩეული',
'File must be in UTF-8 encoding.' => 'ფაილი უნდა იყოს კოდირებაში UTF-8.',
'Modify' => 'შეცვლა',
'Loading' => 'ჩატვირთვა',
'Load more data' => 'მეტი ინფორმაციის ჩატვირთვა',
'ATTACH queries are not supported.' => 'ATTACH-მოთხოვნები არაა მხარდაჭერილი.',
'%d / ' => '%d / ',
'Limit rows' => 'რიგების შეზღუდვა',
'Default value' => 'სტანდარტული მნიშვნელობა',
'Full table scan' => 'სრული ცხრილის ანალიზი',
'Too many unsuccessful logins, try again in %d minute(s).' => 'ძალიან ბევრჯერ შეგეშალათ მომხმარებელი და პაროლი. სცადეთ %d წუთში.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'ძირითად პაროლს ვადა გაუვიდა. <a href="https://www.adminer.org/en/extension/"%s>გამოიყენეთ</a> მეთოდი %s, რათა ის მუდმივი გახადოთ.',
'If you did not send this request from Adminer then close this page.' => 'ეს მოთხოვნა თქვენ თუ არ გაგიგზავნაით Adminer-იდან, დახურეთ ეს ფანჯარა..',
'You can upload a big SQL file via FTP and import it from server.' => 'დიდი ფაილი უნდა ატვირტოთ FTP-თი და შემდეგ გაუკეთოთ იმპორტი სერვერიდან.',
'Size' => 'ზომა',
'Compute' => 'გამოთვლა',
'You are offline.' => 'არ გაგივლიათ ავტორიზაცია.',
'You have no privileges to update this table.' => 'ამ ცხრილის განახლების უფლება არ გაქვთ.',
'Saving' => 'შენახვა',
'yes' => 'კი',
'no' => 'არა',
'Routines' => 'რუტინები',
'Target table' => 'მიზნობრივი ცხრილი',
'Strings' => 'ველები',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'საწყისი და მიზნობრივი ველები უნდა იყოს ერთიდაიგივე სახეობის, მიზნობრივ ველზე უნდა იყოს ინდექსი და უნდა არსებობდეს შესაბამისი ინფორმაცია.',
'Drop %s?' => 'წაიშალოს %s?',
'Warnings' => 'გაფრთხილება',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'უპაროლო წვდომა ბაზასთან არაა დაშვებული Adminer-ში, მეტი ინფორმაციისთვის ეწვიეთ <a href="https://www.adminer.org/en/password/"%s>ბმულს</a>.',
'DB' => 'ბაზა',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'მადლობას გიხდით Adminer-ით სარგებლობისთვის, გადახედეთ ბმულს <a href="https://www.adminer.org/en/donation/">შემოწირულობა</a>.',
'The action will be performed after successful login with the same credentials.' => 'მოქმედება შესრულდება იგივე მომხმარებლით წარმატებული ავტორიზაციის შემდეგ.',
'Connecting to privileged ports is not allowed.' => 'პრივილეგირებულ პორტთან წვდომა დაუშვებელია.',
'There is a space in the input password which might be the cause.' => 'პაროლში არის გამოტოვება, შეიძლება ეს ქმნის პრობლემას.',
'Unknown error.' => 'უცნობი შეცდომა.',
'Database does not support password.' => 'ბაზაში არაა მხარდაჭერილი პაროლი.',
'Disable %s or enable %s or %s extensions.' => 'გათიშეთ %s ან ჩართეთ %s ან %s გაფართოება.',
);

View File

@@ -10,7 +10,7 @@ $translations = array(
'Logout' => 'Log keluar',
'Logged as: %s' => 'Log masuk sebagai: %s',
'Logout successful.' => 'Log keluar berjaya.',
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Terima kasih kerana menggunakan Adminer, pertimbangkan untuk <a href="%s">menderma</a>.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Terima kasih kerana menggunakan Adminer, pertimbangkan untuk <a href="https://www.adminer.org/en/donation/">menderma</a>.',
'Invalid credentials.' => 'Akses tidak sah.',
'Too many unsuccessful logins, try again in %d minute(s).' => 'Terlalu banyak percubaan log masuk yang gagal, sila cuba lagi dalam masa %d minit.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Kata laluan utama telah luput. <a href="https://www.adminer.org/en/extension/"%s>Gunakan</a> cara %s untuk mengekalkannya.',

View File

@@ -10,7 +10,7 @@ $translations = array(
'Logout' => 'Wyloguj',
'Logged as: %s' => 'Zalogowany jako: %s',
'Logout successful.' => 'Wylogowano pomyślnie.',
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Dziękujemy za używanie Adminera, rozważ proszę <a href="%s">dotację</a>.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Dziękujemy za używanie Adminera, rozważ proszę <a href="https://www.adminer.org/pl/donation/">dotację</a>.',
'Invalid credentials.' => 'Nieprawidłowe dane logowania.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Za dużo nieudanych prób logowania, spróbuj ponownie za %d minutę.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minuty.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minut.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ważność hasła głównego wygasła. <a href="https://www.adminer.org/pl/extension/"%s>Zaimplementuj</a> własną metodę %s, aby ustawić je na stałe.',

View File

@@ -47,7 +47,7 @@ $translations = array(
'Indexes have been altered.' => 'Os Índices foram alterados.',
'Indexes' => 'Índices',
'Alter indexes' => 'Alterar índices',
'Add next' => 'Adicionar proximo',
'Add next' => 'Adicionar próximo',
'Language' => 'Idioma',
'Select' => 'Selecionar',
'New item' => 'Novo Registro',
@@ -66,19 +66,19 @@ $translations = array(
'Foreign keys' => 'Chaves estrangeiras',
'Triggers' => 'Triggers',
'View' => 'Visão',
'Unable to select the table' => 'Não é possivel selecionar a Tabela',
'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Enviar o formulario novamente.',
'Unable to select the table' => 'Não é possível selecionar a Tabela',
'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Enviar o formulário novamente.',
'Comment' => 'Comentário',
'Default values' => 'Valores padrões',
'%d byte(s)' => array('%d byte', '%d bytes'),
'No commands to execute.' => 'Nenhum comando para executar.',
'Unable to upload a file.' => 'Não é possível enviar o arquivo.',
'File upload' => 'Importar arquivo',
'File uploads are disabled.' => 'Importação de arquivos desablilitada.',
'File uploads are disabled.' => 'Importação de arquivos desabilitada.',
'Routine has been called, %d row(s) affected.' => array('Rotina executada, %d registro afetado.', 'Rotina executada, %d registros afetados.'),
'Call' => 'Chamar',
'No extension' => 'Não há extension',
'None of the supported PHP extensions (%s) are available.' => 'Nenhuma das extensões PHP suportadas (%s) está disponivel.',
'None of the supported PHP extensions (%s) are available.' => 'Nenhuma das extensões PHP suportadas (%s) está disponível.',
'Session support must be enabled.' => 'Suporte a sessões deve estar habilitado.',
'Session expired, please login again.' => 'Sessão expirada, por favor logue-se novamente.',
'Text length' => 'Tamanho de texto',
@@ -169,7 +169,7 @@ $translations = array(
'Index Length' => 'Tamanho de índice',
'Data Free' => 'Espaço Livre',
'Collation' => 'Colação',
'Analyze' => 'Analizar',
'Analyze' => 'Analisar',
'Optimize' => 'Otimizar',
'Check' => 'Verificar',
'Repair' => 'Reparar',
@@ -209,7 +209,7 @@ $translations = array(
'Maximum allowed file size is %sB.' => 'Tamanho máximo do arquivo permitido é %sB.',
'Numbers' => 'Números',
'Date and time' => 'Data e hora',
'Strings' => 'Cadena',
'Strings' => 'Strings',
'Binary' => 'Binário',
'Lists' => 'Listas',
'Editor' => 'Editor',

349
adminer/lang/sv.inc.php Normal file
View File

@@ -0,0 +1,349 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'System',
'Server' => 'Server',
'Username' => 'Användarnamn',
'Password' => 'Lösenord',
'Permanent login' => 'Permanent inloggning',
'Login' => 'Logga in',
'Logout' => 'Logga ut',
'Logged as: %s' => 'Inloggad som: %s',
'Logout successful.' => 'Du är nu utloggad.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Tack för att du använder Adminer, vänligen fundera över att <a href="https://www.adminer.org/en/donation/">donera</a>.',
'Invalid credentials.' => 'Ogiltiga inloggningsuppgifter.',
'There is a space in the input password which might be the cause.' => 'Det finns ett mellanslag i lösenordet, vilket kan vara anledningen.',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer tillåter inte att ansluta till en databas utan lösenord. <a href="https://www.adminer.org/en/password/"%s>Mer information</a>.',
'Database does not support password.' => 'Databasen stöder inte lösenord.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('För många misslyckade inloggningar, försök igen om %d minut.', 'För många misslyckade inloggningar, försök igen om %d minuter.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Huvudlösenordet har löpt ut. <a href="https://www.adminer.org/en/extension/"%s>Implementera</a> %s en metod för att göra det permanent.',
'Language' => 'Språk',
'Invalid CSRF token. Send the form again.' => 'Ogiltig CSRF-token. Skicka formuläret igen.',
'If you did not send this request from Adminer then close this page.' => 'Om du inte skickade en förfrågan från Adminer så kan du stänga den här sidan.',
'No extension' => 'Inget tillägg',
'None of the supported PHP extensions (%s) are available.' => 'Inga av de PHP-tilläggen som stöds (%s) är tillgängliga.',
'Connecting to privileged ports is not allowed.' => 'Anslutning till privilegierade portar är inte tillåtet.',
'Disable %s or enable %s or %s extensions.' => 'Stäng av %s eller sätt på %s eller %s tilläggen.',
'Session support must be enabled.' => 'Support för sessioner måste vara på.',
'Session expired, please login again.' => 'Session har löpt ur, vänligen logga in igen.',
'The action will be performed after successful login with the same credentials.' => 'Åtgärden kommer att utföras efter en lyckad inloggning med samma inloggningsuppgifter.',
'%s version: %s through PHP extension %s' => '%s version: %s genom PHP-tillägg %s',
'Refresh' => 'Ladda om',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Privilegier',
'Create user' => 'Skapa användare',
'User has been dropped.' => 'Användare har blivit borttagen.',
'User has been altered.' => 'Användare har blivit ändrad.',
'User has been created.' => 'Användare har blivit skapad.',
'Hashed' => 'Hashad',
'Column' => 'Kolumn',
'Routine' => 'Rutin',
'Grant' => 'Tillåt',
'Revoke' => 'Neka',
'Process list' => 'Processlista',
'%d process(es) have been killed.' => array('%d process har avslutats.', '%d processer har avslutats.'),
'Kill' => 'Avsluta',
'Variables' => 'Variabler',
'Status' => 'Status',
'SQL command' => 'SQL-kommando',
'%d query(s) executed OK.' => array('%d förfrågan lyckades.', '%d förfrågor lyckades.'),
'Query executed OK, %d row(s) affected.' => array('Förfrågan lyckades, %d rad påverkades.', 'Förfrågan lyckades, %d rader påverkades.'),
'No commands to execute.' => 'Inga kommandon att köra.',
'Error in query' => 'Fel i förfrågan',
'Unknown error.' => 'Okänt fel.',
'Warnings' => 'Varningar',
'ATTACH queries are not supported.' => 'ATTACH-förfrågor stöds inte.',
'Execute' => 'Kör',
'Stop on error' => 'Stanna på fel',
'Show only errors' => 'Visa bara fel',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Historia',
'Clear' => 'Rensa',
'Edit all' => 'Redigera alla',
'File upload' => 'Ladda upp fil',
'From server' => 'Från server',
'Webserver file %s' => 'Serverfil %s',
'Run file' => 'Kör fil',
'File does not exist.' => 'Filen finns inte.',
'File uploads are disabled.' => 'Filuppladdningar är avstängda.',
'Unable to upload a file.' => 'Det går inte add ladda upp filen.',
'Maximum allowed file size is %sB.' => 'Högsta tillåtna storlek är %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST-datan är för stor. Minska det eller höj %s-direktivet.',
'You can upload a big SQL file via FTP and import it from server.' => 'Du kan ladda upp en stor SQL-fil via FTP och importera det från servern.',
'You are offline.' => 'Du är offline.',
'Export' => 'Exportera',
'Output' => 'Utmatning',
'open' => 'Öppna',
'save' => 'Spara',
'Saving' => 'Sparar',
'Format' => 'Format',
'Data' => 'Data',
'Database' => 'Databas',
'database' => 'databas',
'DB' => 'DB',
'Use' => 'Använd',
'Select database' => 'Välj databas',
'Invalid database.' => 'Ogiltig databas.',
'Database has been dropped.' => 'Databasen har tagits bort.',
'Databases have been dropped.' => 'Databaserna har tagits bort.',
'Database has been created.' => 'Databasen har skapats.',
'Database has been renamed.' => 'Databasen har fått sitt namn ändrat.',
'Database has been altered.' => 'Databasen har ändrats.',
'Alter database' => 'Ändra databas',
'Create database' => 'Skapa databas',
'Database schema' => 'Databasschema',
// link to current database schema layout
'Permanent link' => 'Permanent länk',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Motor',
'Collation' => 'Kollationering',
'Data Length' => 'Datalängd',
'Index Length' => 'Indexlängd',
'Data Free' => 'Ledig data',
'Rows' => 'Rader',
'%d in total' => 'totalt %d',
'Analyze' => 'Analysera',
'Optimize' => 'Optimera',
'Vacuum' => 'Städa',
'Check' => 'Kolla',
'Repair' => 'Reparera',
'Truncate' => 'Avkorta',
'Tables have been truncated.' => 'Tabeller har blivit avkortade.',
'Move to other database' => 'Flytta till en annan databas',
'Move' => 'Flytta',
'Tables have been moved.' => 'Tabeller har flyttats.',
'Copy' => 'Kopiera',
'Tables have been copied.' => 'Tabeller har kopierats.',
'overwrite' => 'Skriv över',
'Routines' => 'Rutiner',
'Routine has been called, %d row(s) affected.' => array('Rutin har kallats, %d rad påverkades.', 'Rutin har kallats, %d rader påverkades.'),
'Call' => 'Kalla',
'Parameter name' => 'Namn på parameter',
'Create procedure' => 'Skapa procedur',
'Create function' => 'Skapa funktion',
'Routine has been dropped.' => 'Rutin har tagits bort.',
'Routine has been altered.' => 'Rutin har ändrats.',
'Routine has been created.' => 'Rutin har skapats.',
'Alter function' => 'Ändra funktion',
'Alter procedure' => 'Ändra procedur',
'Return type' => 'Återvändningstyp',
'Events' => 'Event',
'Event has been dropped.' => 'Event har tagits bort.',
'Event has been altered.' => 'Event har ändrats.',
'Event has been created.' => 'Event har skapats.',
'Alter event' => 'Ändra event',
'Create event' => 'Skapa event',
'At given time' => 'Vid en tid',
'Every' => 'Varje',
'Schedule' => 'Schemalägga',
'Start' => 'Start',
'End' => 'Slut',
'On completion preserve' => 'Bibehåll vid slutet',
'Tables' => 'Tabeller',
'Tables and views' => 'Tabeller och vyer',
'Table' => 'Tabell',
'No tables.' => 'Inga tabeller.',
'Alter table' => 'Ändra tabell',
'Create table' => 'Skapa tabell',
'Table has been dropped.' => 'Tabell har tagits bort.',
'Tables have been dropped.' => 'Tabeller har tagits bort.',
'Tables have been optimized.' => 'Tabeller har optimerats.',
'Table has been altered.' => 'Tabell har ändrats.',
'Table has been created.' => 'Tabell har skapats.',
'Table name' => 'Tabellnamn',
'Show structure' => 'Visa struktur',
'engine' => 'motor',
'collation' => 'kollationering',
'Column name' => 'Kolumnnamn',
'Type' => 'Typ',
'Length' => 'Längd',
'Auto Increment' => 'Automatisk uppräkning',
'Options' => 'Inställningar',
'Comment' => 'Kommentar',
'Default value' => 'Standardvärde',
'Default values' => 'Standardvärden',
'Drop' => 'Ta bort',
'Drop %s?' => 'Ta bort %s?',
'Are you sure?' => 'Är du säker?',
'Size' => 'Storlek',
'Compute' => 'Beräkna',
'Move up' => 'Flytta upp',
'Move down' => 'Flytta ner',
'Remove' => 'Ta bort',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Högsta nummer tillåtna fält är överskridet. Vänligen höj %s.',
'Partition by' => 'Partitionera om',
'Partitions' => 'Partitioner',
'Partition name' => 'Partition',
'Values' => 'Värden',
'View' => 'Vy',
'Materialized view' => 'Materialiserad vy',
'View has been dropped.' => 'Vy har tagits bort.',
'View has been altered.' => 'Vy har ändrats.',
'View has been created.' => 'Vy har skapats.',
'Alter view' => 'Ändra vy',
'Create view' => 'Skapa vy',
'Indexes' => 'Index',
'Indexes have been altered.' => 'Index har ändrats.',
'Alter indexes' => 'Ändra index',
'Add next' => 'Lägg till nästa',
'Index Type' => 'Indextyp',
'Column (length)' => 'Kolumn (längd)',
'Foreign keys' => 'Främmande nycklar',
'Foreign key' => 'Främmande nyckel',
'Foreign key has been dropped.' => 'Främmande nyckel har tagits bort.',
'Foreign key has been altered.' => 'Främmande nyckel har ändrats.',
'Foreign key has been created.' => 'Främmande nyckel har skapats.',
'Target table' => 'Måltabell',
'Change' => 'Ändra',
'Source' => 'Källa',
'Target' => 'Mål',
'Add column' => 'Lägg till kolumn',
'Alter' => 'Ändra',
'Add foreign key' => 'Lägg till främmande nyckel',
'ON DELETE' => 'VID BORTTAGNING',
'ON UPDATE' => 'VID UPPDATERING',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Käll- och mål-tabellen måste ha samma datatyp, ett index på målkolumnerna och refererad data måste finnas.',
'Triggers' => 'Avtryckare',
'Add trigger' => 'Lägg till avtryckare',
'Trigger has been dropped.' => 'Avtryckare har tagits bort.',
'Trigger has been altered.' => 'Avtryckare har ändrats.',
'Trigger has been created.' => 'Avtryckare har skapats.',
'Alter trigger' => 'Ändra avtryckare',
'Create trigger' => 'Skapa avtryckare',
'Time' => 'Tid',
'Event' => 'Event',
'Name' => 'Namn',
'select' => 'välj',
'Select' => 'Välj',
'Select data' => 'Välj data',
'Functions' => 'Funktioner',
'Aggregation' => 'Aggregation',
'Search' => 'Sök',
'anywhere' => 'överallt',
'Search data in tables' => 'Sök data i tabeller',
'Sort' => 'Sortera',
'descending' => 'Fallande',
'Limit' => 'Begränsning',
'Limit rows' => 'Begränsa rader',
'Text length' => 'Textlängd',
'Action' => 'Åtgärd',
'Full table scan' => 'Full tabellskanning',
'Unable to select the table' => 'Kunde inte välja tabellen',
'No rows.' => 'Inga rader.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d rad', '%d rader'),
'Page' => 'Sida',
'last' => 'sist',
'Load more data' => 'Ladda mer data',
'Loading' => 'Laddar',
'Whole result' => 'Hela resultatet',
'%d byte(s)' => array('%d byte', '%d bytes'),
'Import' => 'Importera',
'%d row(s) have been imported.' => array('%d rad har importerats.', '%d rader har importerats.'),
'File must be in UTF-8 encoding.' => 'Filer måste vara i UTF-8-format.',
// in-place editing in select
'Modify' => 'Ändra',
'Ctrl+click on a value to modify it.' => 'Ctrl+klicka på ett värde för att ändra det.',
'Use edit link to modify this value.' => 'Använd redigeringslänken för att ändra värdet.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Sak%s har skapats.',
'Item has been deleted.' => 'En sak har tagits bort.',
'Item has been updated.' => 'En sak har ändrats.',
'%d item(s) have been affected.' => array('%d sak har blivit förändrad.', '%d saker har blivit förändrade.'),
'New item' => 'Ny sak',
'original' => 'original',
// label for value '' in enum data type
'empty' => 'tom',
'edit' => 'redigera',
'Edit' => 'Redigera',
'Insert' => 'Infoga',
'Save' => 'Spara',
'Save and continue edit' => 'Spara och fortsätt att redigera',
'Save and insert next' => 'Spara och infoga nästa',
'Selected' => 'Vald',
'Clone' => 'Klona',
'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',
'Strings' => 'Strängar',
'Binary' => 'Binärt',
'Lists' => 'Listor',
'Network' => 'Nätverk',
'Geometry' => 'Geometri',
'Relations' => 'Relationer',
'Editor' => 'Redigerare',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'yyyy-mm-dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'nu',
'yes' => 'ja',
'no' => 'nej',
// general SQLite error in create, drop or rename database
'File exists.' => 'Filen finns redan.',
'Please use one of the extensions %s.' => 'Vänligen använd en av filändelserna %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Redigera schema',
'Create schema' => 'Skapa schema',
'Schema has been dropped.' => 'Schema har tagits bort.',
'Schema has been created.' => 'Schema har skapats.',
'Schema has been altered.' => 'Schema har ändrats.',
'Schema' => 'Schema',
'Invalid schema.' => 'Ogiltigt schema.',
// PostgreSQL sequences support
'Sequences' => 'Sekvenser',
'Create sequence' => 'Skapa sekvens',
'Sequence has been dropped.' => 'Sekvens har tagits bort.',
'Sequence has been created.' => 'Sekvens har skapats.',
'Sequence has been altered.' => 'Sekvens har ändrats.',
'Alter sequence' => 'Ändra sekvens',
// PostgreSQL user types support
'User types' => 'Användartyper',
'Create type' => 'Skapa typ',
'Type has been dropped.' => 'Typ har, typ, tagits bort.',
'Type has been created.' => 'Typ har skapats.',
'Alter type' => 'Ändra typ',
);

View File

@@ -10,7 +10,7 @@ $translations = array(
'Logout' => ıkış',
'Logged as: %s' => '%s olarak giriş yapıldı.',
'Logout successful.' => 'Oturum başarıyla sonlandı.',
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Adminer kullandığınız için teşekkür ederiz <a href="%s">bağış yapmayı düşünün</a>.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Adminer kullandığınız için teşekkür ederiz <a href="https://www.adminer.org/en/donation/">bağış yapmayı düşünün</a>.',
'Invalid credentials.' => 'Geçersiz kimlik bilgileri.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Çok fazla oturum açma denemesi yapıldı.', '%d Dakika sonra tekrar deneyiniz.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ana şifrenin süresi doldu. Kalıcı olması için <a href="https://www.adminer.org/en/extension/"%s>%s medodunu</a> kullanın.',

View File

@@ -268,7 +268,7 @@ $translations = array(
// data type descriptions
'Numbers' => 'Числа',
'Date and time' => 'Дата і час',
'Strings' => 'Радки',
'Strings' => 'Рядки',
'Binary' => 'Двійкові',
'Lists' => 'Списки',
'Network' => 'Мережа',

View File

@@ -206,8 +206,8 @@ $translations = array(
'ON UPDATE' => 'Khi cập nhật',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Cột gốc và cột đích phải cùng kiểu, phải đặt chỉ mục trong cột đích và dữ liệu tham chiếu phải tồn tại.',
'Triggers' => 'xx',
'Add trigger' => 'xx',
'Triggers' => 'Phản xạ',
'Add trigger' => 'Thêm phản xạ',
'Trigger has been dropped.' => 'Đã xoá phản xạ.',
'Trigger has been altered.' => 'Đã sửa phản xạ.',
'Trigger has been created.' => 'Đã tạo phản xạ.',
@@ -308,12 +308,12 @@ $translations = array(
'Schema has been dropped.' => 'Đã xoá schema.',
'Schema has been created.' => 'Đã tạo schema.',
'Schema has been altered.' => 'Đã thay đổi schema.',
'Schema' => 'schema',
'Invalid schema.' => 'Schema khong hợp lệ.',
'Schema' => 'Schema',
'Invalid schema.' => 'Schema không hợp lệ.',
// PostgreSQL sequences support
'Sequences' => 'Dãy số',
'Create sequence' => 'Tạo đãy số',
'Create sequence' => 'Tạo dãy số',
'Sequence has been dropped.' => 'Dãy số đã bị xoá.',
'Sequence has been created.' => 'Đã tạo dãy số.',
'Sequence has been altered.' => 'Đã sửa dãy số.',

View File

@@ -10,8 +10,9 @@ $translations = array(
'Logout' => 'Xx',
'Logged as: %s' => 'Xx: %s',
'Logout successful.' => 'Xx.',
'Thanks for using Adminer, consider <a href="%s">donating</a>.' => 'Xx <a href="%s">xx</a>.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Xx <a href="https://www.adminer.org/en/donation/">xx</a>.',
'Invalid credentials.' => 'Xx.',
'There is a space in the input password which might be the cause.' => 'Xx.',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Xx, <a href="https://www.adminer.org/en/password/"%s>xx</a>.',
'Database does not support password.' => 'Xx.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Xx %d.', 'Xx %d.'),
@@ -127,6 +128,7 @@ $translations = array(
'Tables have been moved.' => 'Xx.',
'Copy' => 'Xx',
'Tables have been copied.' => 'Xx.',
'overwrite' => 'xx',
'Routines' => 'Xx',
'Routine has been called, %d row(s) affected.' => array('Xx, %d.', 'Xx, %d.'),

View File

@@ -1,119 +1,231 @@
<?php
$translations = array(
'Login' => '登入',
'Logout successful.' => '成功登出。',
'Invalid credentials.' => '無效的憑證。',
// label for database system selection (MySQL, SQLite, ...)
'System' => '資料庫系統',
'Server' => '伺服器',
'Username' => '帳號',
'Password' => '密碼',
'Permanent login' => '永久登入',
'Login' => '登入',
'Logout' => '登出',
'Logged as: %s' => '登錄為: %s',
'Logout successful.' => '成功登出。',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => '感謝使用Adminer請考慮為我們<a href="https://www.adminer.org/en/donation/">捐款(英文網頁)</a>.',
'Invalid credentials.' => '無效的憑證。',
'There is a space in the input password which might be the cause.' => '您輸入的密碼中有一個空格,這可能是導致問題的原因。',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer預設不支援訪問沒有密碼的資料庫<a href="https://www.adminer.org/en/password/"%s>詳情見這裡</a>.',
'Database does not support password.' => '資料庫不支援密碼。',
'Too many unsuccessful logins, try again in %d minute(s).' => '登錄失敗次數過多,請 %d 分鐘後重試。',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '主密碼已過期。<a href="https://www.adminer.org/en/extension/"%s>請擴展</a> %s 方法讓它永久化。',
'Language' => '語言',
'Invalid CSRF token. Send the form again.' => '無效的 CSRF token。請重新發送表單。',
'If you did not send this request from Adminer then close this page.' => '如果您並沒有從Adminer發送請求請關閉此頁面。',
'No extension' => '無擴充模組',
'None of the supported PHP extensions (%s) are available.' => '沒有任何支援的 PHP 擴充模組(%s。',
'Connecting to privileged ports is not allowed.' => '不允許連接到特權埠。',
'Disable %s or enable %s or %s extensions.' => '禁用 %s 或啟用 %s 或 %s 擴充模組。',
'Session support must be enabled.' => 'Session 必須被啟用。',
'Session expired, please login again.' => 'Session 已過期,請重新登入。',
'The action will be performed after successful login with the same credentials.' => '此操作將在成功使用相同的憑據登錄後執行。',
'%s version: %s through PHP extension %s' => '%s 版本:%s 透過 PHP 擴充模組 %s',
'Refresh' => '重新載入',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => '權限',
'Create user' => '建立使用者',
'User has been dropped.' => '已刪除使用者。',
'User has been altered.' => '已修改使用者。',
'User has been created.' => '已建立使用者。',
'Hashed' => 'Hashed',
'Column' => '欄位',
'Routine' => '程序',
'Grant' => '授權',
'Revoke' => '廢除',
'Process list' => '處理程序列表',
'%d process(es) have been killed.' => '%d 個 Process(es) 被終止',
'Kill' => '終止',
'Variables' => '變數',
'Status' => '狀態',
'SQL command' => 'SQL 命令',
'%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
'Query executed OK, %d row(s) affected.' => '執行查詢 OK%d 行受影響。',
'No commands to execute.' => '沒有命令可執行。',
'Error in query' => '查詢發生錯誤',
'Unknown error.' => '未知錯誤。',
'Warnings' => '警告',
'ATTACH queries are not supported.' => '不支援ATTACH查詢。',
'Execute' => '執行',
'Stop on error' => '出錯時停止',
'Show only errors' => '僅顯示錯誤訊息',
// sprintf() format for time of the command
'%.3f s' => '%.3f 秒',
'History' => '紀錄',
'Clear' => '清除',
'Edit all' => '編輯全部',
'File upload' => '檔案上傳',
'From server' => '從伺服器',
'Webserver file %s' => '網頁伺服器檔案 %s',
'Run file' => '執行檔案',
'File does not exist.' => '檔案不存在',
'File uploads are disabled.' => '檔案上傳已經被停用。',
'Unable to upload a file.' => '無法上傳檔案。',
'Maximum allowed file size is %sB.' => '允許的檔案上限大小為 %sB',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 資料太大。減少資料或者增加 %s 的設定值。',
'You can upload a big SQL file via FTP and import it from server.' => '您可以通過FTP上傳大型SQL檔並從伺服器導入。',
'You are offline.' => '您離線了。',
'Export' => '匯出',
'Output' => '輸出',
'open' => '打開',
'save' => '儲存',
'Saving' => '保存中',
'Format' => '格式',
'Data' => '資料',
'Database' => '資料庫',
'database' => '資料庫',
'DB' => '資料庫',
'Use' => '使用',
'Select database' => '選擇資料庫',
'Invalid database.' => '無效的資料庫。',
'Table has been altered.' => '資料表已修改。',
'Table has been created.' => '資料表已修改。',
'Alter table' => '修改資料表',
'Create table' => '建立資料表',
'Table name' => '資料表名稱',
'engine' => '引擎',
'collation' => '校對',
'Column name' => '列名',
'Type' => '類型',
'Length' => '長度',
'Auto Increment' => '自動遞增',
'Options' => '選項',
'Save' => '儲存',
'Drop' => '刪除',
'Database has been dropped.' => '資料庫已刪除。',
'Databases have been dropped.' => '資料庫已刪除。',
'Database has been created.' => '已建立資料庫。',
'Database has been renamed.' => '已重新命名資料庫。',
'Database has been altered.' => '已修改資料庫。',
'Alter database' => '修改資料庫',
'Create database' => '建立資料庫',
'SQL command' => 'SQL命令',
'Logout' => '登出',
'database' => '資料庫',
'Use' => '使用',
'No tables.' => '沒有資料表。',
'select' => '選擇',
'Item has been updated.' => '已更新項目。',
'Item%s has been inserted.' => '已新增項目%s。',
'Edit' => '編輯',
'Insert' => '新增',
'Save and insert next' => '儲存並新增下一筆',
'Delete' => '刪除',
'Database' => '資料',
'Database schema' => '資料庫結構',
// link to current database schema layout
'Permanent link' => '永久連結',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => '引擎',
'Collation' => '校對',
'Data Length' => '資料長度',
'Index Length' => '索引長度',
'Data Free' => '資料空閒',
'Rows' => '行數',
'%d in total' => '總共 %d 個',
'Analyze' => '分析',
'Optimize' => '最佳化',
'Vacuum' => '整理Vacuum',
'Check' => '檢查',
'Repair' => '修復',
'Truncate' => '清空',
'Tables have been truncated.' => '已清空資料表。',
'Move to other database' => '轉移到其它資料庫',
'Move' => '轉移',
'Tables have been moved.' => '已轉移資料表。',
'Copy' => '複製',
'Tables have been copied.' => '資料表已經複製',
'overwrite' => '覆蓋',
'Routines' => '程序',
'Indexes have been altered.' => '已修改索引。',
'Indexes' => '索引',
'Alter indexes' => '修改索引',
'Add next' => '新增下一筆',
'Language' => '語言',
'Select' => '選擇',
'New item' => '新增項目',
'Search' => '搜尋',
'Sort' => '排序',
'descending' => '降冪(遞減)',
'Limit' => '限定',
'No rows.' => '沒有行。',
'Action' => '動作',
'edit' => '編輯',
'Page' => '頁',
'Query executed OK, %d row(s) affected.' => '執行查詢OK%d行受影響',
'Error in query' => '查詢發生錯誤',
'Execute' => '執行',
'Table' => '資料表',
'Foreign keys' => '外來鍵',
'Triggers' => '觸發器',
'View' => '檢視表',
'Unable to select the table' => '無法選擇該資料表',
'Invalid CSRF token. Send the form again.' => '無效的 CSRF token。請重新發送表單。',
'Comment' => '註解',
'Default values' => '預設值',
'%d byte(s)' => '%d byte(s)',
'No commands to execute.' => '沒有命令可執行。',
'Unable to upload a file.' => '無法上傳檔案。',
'File upload' => '檔案上傳',
'File uploads are disabled.' => '檔案上傳已經被停用。',
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d行被影響',
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d 行被影響',
'Call' => '呼叫',
'No extension' => '無擴充模組',
'None of the supported PHP extensions (%s) are available.' => '沒有任何支援的PHP擴充模組%s',
'Session support must be enabled.' => 'Session 必須被啟用。',
'Session expired, please login again.' => 'Session 已過期,請重新登入。',
'Text length' => 'Text 長度',
'Foreign key has been dropped.' => '已刪除外來鍵。',
'Foreign key has been altered.' => '修改外來鍵。',
'Foreign key has been created.' => '已建立外來鍵。',
'Foreign key' => '外來鍵',
'Target table' => '目標資料表',
'Change' => '修改',
'Source' => '來源',
'Target' => '目標',
'Add column' => '新增資料列',
'Alter' => '修改',
'Add foreign key' => '新增外來鍵',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => '索引類型',
'Column (length)' => '列(長度)',
'Parameter name' => '參數名稱',
'Create procedure' => '建立預存程序',
'Create function' => '建立函式',
'Routine has been dropped.' => '已刪除程序。',
'Routine has been altered.' => '已修改子程序。',
'Routine has been created.' => '已建立子程序。',
'Alter function' => '修改函式',
'Alter procedure' => '修改預存程序',
'Return type' => '回傳類型',
'Events' => '事件',
'Event has been dropped.' => '已刪除事件。',
'Event has been altered.' => '已修改事件。',
'Event has been created.' => '已建立事件。',
'Alter event' => '修改事件',
'Create event' => '建立事件',
'At given time' => '在指定時間',
'Every' => '',
'Schedule' => '排程',
'Start' => '開始',
'End' => '結束',
'On completion preserve' => '在完成後儲存',
'Tables' => '資料表',
'Tables and views' => '資料表和檢視表',
'Table' => '資料表',
'No tables.' => '沒有資料表。',
'Alter table' => '修改資料表',
'Create table' => '建立資料表',
'Table has been dropped.' => '已經刪除資料表。',
'Tables have been dropped.' => '已經將資料表刪除。',
'Tables have been optimized.' => '已優化資料表。',
'Table has been altered.' => '資料表已修改。',
'Table has been created.' => '資料表已建立。',
'Table name' => '資料表名稱',
'Show structure' => '顯示結構',
'engine' => '引擎',
'collation' => '校對',
'Column name' => '欄位名稱',
'Type' => '類型',
'Length' => '長度',
'Auto Increment' => '自動遞增',
'Options' => '選項',
'Comment' => '註解',
'Default value' => '預設值',
'Default values' => '預設值',
'Drop' => '刪除',
'Drop %s?' => '刪除 %s?',
'Are you sure?' => '你確定嗎?',
'Size' => '大小',
'Compute' => '計算',
'Move up' => '上移',
'Move down' => '下移',
'Remove' => '移除',
'Maximum number of allowed fields exceeded. Please increase %s.' => '超過允許的字段數量的最大值。請增加 %s。',
'Partition by' => '分區類型',
'Partitions' => '分區',
'Partition name' => '分區名稱',
'Values' => '值',
'View' => '檢視表',
'Materialized view' => '物化視圖',
'View has been dropped.' => '已刪除檢視表。',
'View has been altered.' => '已修改檢視表。',
'View has been created.' => '已建立檢視表。',
'Alter view' => '修改檢視表',
'Create view' => '建立檢視表',
'Name' => '名稱',
'Process list' => '處理程序列表',
'%d process(es) have been killed.' => '%d 個 Process(es) 被終止',
'Kill' => '終止',
'Parameter name' => '參數名稱',
'Database schema' => '資料庫架構',
'Create procedure' => '建立預存程序',
'Create function' => '建立函數',
'Routine has been dropped.' => '已刪除程序。',
'Routine has been altered.' => '已修改子程序。',
'Routine has been created.' => '已建立子程序。',
'Alter function' => '修改函數',
'Alter procedure' => '修改過程',
'Return type' => '回傳類型',
'Indexes' => '索引',
'Indexes have been altered.' => '已修改索引。',
'Alter indexes' => '修改索引',
'Add next' => '新增下一筆',
'Index Type' => '索引類型',
'Column (length)' => '欄位(長度)',
'Foreign keys' => '外來鍵',
'Foreign key' => '外來鍵',
'Foreign key has been dropped.' => '已刪除外來鍵。',
'Foreign key has been altered.' => '修改外來鍵。',
'Foreign key has been created.' => '已建立外來鍵。',
'Target table' => '目標資料表',
'Change' => '變更',
'Source' => '來源',
'Target' => '目標',
'Add column' => '新增欄位',
'Alter' => '修改',
'Add foreign key' => '新增外來鍵',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '來源列和目標列必須具有相同的資料類型,在目標列上必須有一個索引並且引用的資料必須存在。',
'Triggers' => '觸發器',
'Add trigger' => '建立觸發器',
'Trigger has been dropped.' => '已刪除觸發器。',
'Trigger has been altered.' => '已修改觸發器。',
@@ -122,146 +234,116 @@ $translations = array(
'Create trigger' => '建立觸發器',
'Time' => '時間',
'Event' => '事件',
'%s version: %s through PHP extension %s' => '%s版本%s 透過PHP擴充模組 %s',
'%d row(s)' => '%d行',
'Remove' => '移除',
'Are you sure?' => '你確定嗎?',
'Privileges' => '權限',
'Create user' => '建立使用者',
'User has been dropped.' => '已刪除使用者。',
'User has been altered.' => '已修改使用者。',
'User has been created.' => '已建立使用者。',
'Hashed' => 'Hashed',
'Column' => '列',
'Routine' => '程序',
'Grant' => '授權',
'Revoke' => '廢除',
'Logged as: %s' => '登錄為:%s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 資料太大。減少資料或者增加 %s 的設定值。',
'Move up' => '上移',
'Move down' => '下移',
'Export' => '匯出',
'Tables' => '資料表',
'Data' => '資料',
'Output' => '輸出',
'open' => '打開',
'save' => '儲存',
'Format' => '格式',
'Functions' => '函數',
'Name' => '名稱',
'select' => '選擇',
'Select' => '選擇',
'Select data' => '選擇資料',
'Functions' => '函式',
'Aggregation' => '集合',
'Event has been dropped.' => '已刪除事件。',
'Event has been altered.' => '已修改事件。',
'Event has been created.' => '已建立事件。',
'Alter event' => '修改事件',
'Create event' => '建立事件',
'Start' => '開始',
'End' => '結束',
'Every' => '每',
'Status' => '狀態',
'On completion preserve' => '在完成後儲存',
'Events' => '事件',
'Schedule' => '排程',
'At given time' => '在指定時間',
'Tables have been truncated.' => '已清空資料表。',
'Tables have been moved.' => '已轉移資料表。',
'Tables and views' => '資料表和檢視表',
'Engine' => '引擎',
'Collation' => '校對',
'Data Length' => '資料長度',
'Index Length' => '索引長度',
'Data Free' => '資料空閒',
'Rows' => '行數',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => '分析',
'Optimize' => '最佳化',
'Check' => '檢查',
'Repair' => '修復',
'Truncate' => '清空',
'Move to other database' => '轉移到其它資料庫',
'Move' => '轉移',
'Save and continue edit' => '儲存並繼續編輯',
'original' => '原始',
'%d item(s) have been affected.' => '%d個項目受到影響。',
'Whole result' => '所有結果',
'Tables have been dropped.' => '已經將資料表刪除。',
'Clone' => '複製',
'Maximum number of allowed fields exceeded. Please increase %s.' => '超過允許的字段數量的最大值。請增加%s。',
'Partition by' => '分區類型',
'Partitions' => '分區',
'Partition name' => '分區名稱',
'Values' => '值',
'%d row(s) have been imported.' => '已匯入%d行。',
'Search' => '搜尋',
'anywhere' => '任意位置',
'Search data in tables' => '在資料庫搜尋',
'Sort' => '排序',
'descending' => '降冪 (遞減)',
'Limit' => '限定',
'Limit rows' => '限制行數',
'Text length' => 'Text 長度',
'Action' => '動作',
'Full table scan' => '全資料表掃描',
'Unable to select the table' => '無法選擇該資料表',
'No rows.' => '沒有資料行。',
'%d / ' => '%d / ',
'%d row(s)' => '%d 行',
'Page' => '頁',
'last' => '最後一頁',
'Load more data' => '載入更多資料',
'Loading' => '載入中',
'Whole result' => '所有結果',
'%d byte(s)' => '%d byte(s)',
'Import' => '匯入',
'Stop on error' => '出錯時停止',
'%.3f s' => '%.3f秒',
'$1-$3-$5' => '$1.$3.$5',
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
'History' => '紀錄',
'Variables' => '變數',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '來源列和目標列必須具有相同的資料類型,在目標列上必須有一個索引並且引用的資料必須存在。',
'Relations' => '關聯',
'Run file' => '執行檔案',
'Clear' => '清除',
'Maximum allowed file size is %sB.' => '允許的檔案上限大小為%sB',
'%d row(s) have been imported.' => '已匯入 %d 行。',
'File must be in UTF-8 encoding.' => '檔必須使用UTF-8編碼。',
// in-place editing in select
'Modify' => '修改',
'Ctrl+click on a value to modify it.' => '按住Ctrl並按一下某個值進行修改。',
'Use edit link to modify this value.' => '使用編輯連結來修改。',
// %s can contain auto-increment value
'Item%s has been inserted.' => '已新增項目 %s。',
'Item has been deleted.' => '該項目已被刪除',
'Item has been updated.' => '已更新項目。',
'%d item(s) have been affected.' => '%d 個項目受到影響。',
'New item' => '新增項目',
'original' => '原始',
// label for value '' in enum data type
'empty' => '空值',
'edit' => '編輯',
'Edit' => '編輯',
'Insert' => '新增',
'Save' => '儲存',
'Save and continue edit' => '儲存並繼續編輯',
'Save and insert next' => '儲存並新增下一筆',
'Selected' => '已選中',
'Clone' => '複製',
'Delete' => '刪除',
'You have no privileges to update this table.' => '您沒有許可權更新這個資料表。',
'E-mail' => '電子郵件',
'From' => '來自',
'Subject' => '主旨',
'Attachments' => '附件',
'Send' => '寄出',
'%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。',
// data type descriptions
'Numbers' => '數字',
'Date and time' => '日期時間',
'Strings' => '字串',
'Binary' => '二進位',
'Lists' => '列表',
'Network' => '網路',
'Geometry' => '幾何',
'Relations' => '關聯',
'Editor' => '編輯器',
'E-mail' => '電子郵件',
'From' => '來自',
'Subject' => '主旨',
'Send' => '寄出',
'%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。',
'Webserver file %s' => '網頁伺服器檔案 %s',
'File does not exist.' => '檔案不存在',
'Item has been deleted.' => '該項目已被刪除',
'%d in total' => '總共 %d 個',
'Permanent login' => '永久登入',
'Table has been dropped.' => '已經刪除資料表。',
'Databases have been dropped.' => '資料庫已刪除。',
'Search data in tables' => '在資料庫搜尋',
'Schema' => '資料表結構',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1.$3.$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => '在',
'yes' => '',
'no' => '',
// general SQLite error in create, drop or rename database
'File exists.' => '檔案已存在。',
'Please use one of the extensions %s.' => '請使用下列其中一個擴充模組 %s。',
// PostgreSQL and MS SQL schema support
'Alter schema' => '修改資料表結構',
'Create schema' => '建立資料表結構',
'Schema has been dropped.' => '已刪除資料表結構。',
'Schema has been created.' => '已建立資料表結構。',
'Schema has been altered.' => '已修改資料表結構。',
'Schema' => '資料表結構',
'Invalid schema.' => '無效的資料表結構。',
// PostgreSQL sequences support
'Sequences' => '序列',
'Create sequence' => '建立序列',
'Alter sequence' => '修改序列',
'Sequence has been dropped.' => '已刪除序列。',
'Sequence has been created.' => '已建立序列。',
'Sequence has been altered.' => '已修改序列。',
'Alter sequence' => '修改序列',
// PostgreSQL user types support
'User types' => '使用者類型',
'Create type' => '建立類型',
'Alter type' => '修改類型',
'Type has been dropped.' => '已刪除類型。',
'Type has been created.' => '已建立類型。',
'Use edit link to modify this value.' => '使用編輯連結來修改。',
'last' => '最後一頁',
'From server' => '從伺服器',
'System' => '資料庫系統',
'Select data' => '選擇資料',
'Show structure' => '顯示結構',
'empty' => '空值',
'Network' => '網路',
'Geometry' => '幾何',
'File exists.' => '檔案已存在。',
'Attachments' => '附件',
'%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
'Show only errors' => '僅顯示錯誤訊息',
'Refresh' => '重新載入',
'Invalid schema.' => '無效的資料表結構。',
'Please use one of the extensions %s.' => '請使用下列其中一個擴充模組 %s。',
'now' => '現在',
'ltr' => 'ltr',
'Tables have been copied.' => '資料表已經複製',
'Copy' => '複製',
'Permanent link' => '永久連結',
'Edit all' => '編輯全部',
'HH:MM:SS' => 'HH:MM:SS',
'Alter type' => '修改類型',
);

View File

@@ -1,133 +1,38 @@
<?php
$translations = array(
'Login' => '登录',
'Logout successful.' => '注销成功。',
'Invalid credentials.' => '无效凭据。',
// label for database system selection (MySQL, SQLite, ...)
'System' => '系统',
'Server' => '服务器',
'Username' => '用户名',
'Password' => '密码',
'Select database' => '选择数据库',
'Invalid database.' => '无效数据库。',
'Table has been dropped.' => '已删除表。',
'Table has been altered.' => '已修改表。',
'Table has been created.' => '已创建表。',
'Alter table' => '修改表',
'Create table' => '创建表',
'Table name' => '表名',
'engine' => '引擎',
'collation' => '校对',
'Column name' => '字段名',
'Type' => '类型',
'Length' => '长度',
'Auto Increment' => '自动增量',
'Options' => '选项',
'Save' => '保存',
'Drop' => '删除',
'Database has been dropped.' => '已删除数据库。',
'Database has been created.' => '已创建数据库。',
'Database has been renamed.' => '已重命名数据库。',
'Database has been altered.' => '已修改数据库。',
'Alter database' => '修改数据库',
'Create database' => '创建数据库',
'SQL command' => 'SQL命令',
'Logout' => '注销',
'database' => '数据库',
'Use' => '使用',
'No tables.' => '没有表。',
'select' => '选择',
'Item has been deleted.' => '已删除项目。',
'Item has been updated.' => '已更新项目。',
'Item%s has been inserted.' => '已插入项目%s。',
'Edit' => '编辑',
'Insert' => '插入',
'Save and insert next' => '保存并插入下一个',
'Delete' => '删除',
'Database' => '数据库',
'Routines' => '子程序',
'Indexes have been altered.' => '已修改索引。',
'Indexes' => '索引',
'Alter indexes' => '修改索引',
'Add next' => '下一行插入',
'Permanent login' => '保持登录',
'Login' => '登录',
'Logout' => '登出',
'Logged as: %s' => '登录用户:%s',
'Logout successful.' => '成功登出。',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => '感谢使用Adminer请考虑为我们<a href="https://www.adminer.org/en/donation/">捐款(英文页面)</a>.',
'Invalid credentials.' => '无效凭据。',
'There is a space in the input password which might be the cause.' => '您输入的密码中有一个空格,这可能是导致问题的原因。',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer默认不支持访问没有密码的数据库<a href="https://www.adminer.org/en/password/"%s>详情见这里</a>.',
'Database does not support password.' => '数据库不支持密码。',
'Too many unsuccessful logins, try again in %d minute(s).' => '登录失败次数过多,请 %d 分钟后重试。',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '主密码已过期。<a href="https://www.adminer.org/en/extension/"%s>请扩展</a> %s 方法让它永久化。',
'Language' => '语言',
'Select' => '选择',
'New item' => '新建数据',
'Search' => '搜索',
'Sort' => '排序',
'descending' => '降序',
'Limit' => '范围',
'No rows.' => '无数据。',
'Action' => '动作',
'edit' => '编辑',
'Page' => '页面',
'Query executed OK, %d row(s) affected.' => '查询执行完毕,%d 行受影响。',
'Error in query' => '查询出错',
'Execute' => '执行',
'Table' => '表',
'Foreign keys' => '外键',
'Triggers' => '触发器',
'View' => '视图',
'Unable to select the table' => '不能选择该表',
'Invalid CSRF token. Send the form again.' => '无效 CSRF 令牌。重新发送表单。',
'Comment' => '注释',
'Default values' => '默认值',
'%d byte(s)' => '%d 字节',
'No commands to execute.' => '没有命令被执行。',
'Unable to upload a file.' => '不能上传文件。',
'File upload' => '文件上传',
'File uploads are disabled.' => '文件上传被禁用。',
'Routine has been called, %d row(s) affected.' => '子程序被调用,%d 行被影响。',
'Call' => '调用',
'Invalid CSRF token. Send the form again.' => '无效 CSRF 令牌。请重新发送表单。',
'If you did not send this request from Adminer then close this page.' => '如果您并没有从Adminer发送请求请关闭此页面。',
'No extension' => '没有扩展',
'None of the supported PHP extensions (%s) are available.' => '没有支持的 PHP 扩展可用(%s。',
'Session support must be enabled.' => 'Session 必须被启用。',
'Session expired, please login again.' => 'Session 已过期,请重新登录。',
'Text length' => '文本显示限制',
'Foreign key has been dropped.' => '已删除外键。',
'Foreign key has been altered.' => '已修改外键。',
'Foreign key has been created.' => '已创建外键。',
'Foreign key' => '外键',
'Target table' => '目标表',
'Change' => '修改',
'Source' => '源',
'Target' => '目标',
'Add column' => '增加列',
'Alter' => '修改',
'Add foreign key' => '添加外键',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => '索引类型',
'Column (length)' => '列(长度)',
'View has been dropped.' => '已删除视图。',
'View has been altered.' => '已修改视图。',
'View has been created.' => '已创建视图。',
'Alter view' => '修改视图',
'Create view' => '创建视图',
'Name' => '名称',
'Process list' => '进程列表',
'%d process(es) have been killed.' => '%d 个进程被终止',
'Kill' => '终止',
'Parameter name' => '参数名',
'Database schema' => '数据库概要',
'Create procedure' => '创建过程',
'Create function' => '创建函数',
'Routine has been dropped.' => '已删除子程序。',
'Routine has been altered.' => '已修改子程序。',
'Routine has been created.' => '已创建子程序。',
'Alter function' => '修改函数',
'Alter procedure' => '修改过程',
'Return type' => '返回类型',
'Add trigger' => '创建触发器',
'Trigger has been dropped.' => '已删除触发器。',
'Trigger has been altered.' => '已修改触发器。',
'Trigger has been created.' => '已创建触发器。',
'Alter trigger' => '修改触发器',
'Create trigger' => '创建触发器',
'Time' => '时间',
'Event' => '事件',
'Connecting to privileged ports is not allowed.' => '不允许连接到特权端口。',
'Disable %s or enable %s or %s extensions.' => '禁用 %s 或启用 %s 或 %s 扩展。',
'Session support must be enabled.' => '必须启用会话支持。',
'Session expired, please login again.' => '会话已过期,请重新登录。',
'The action will be performed after successful login with the same credentials.' => '此操作将在成功使用相同的凭据登录后执行。',
'%s version: %s through PHP extension %s' => '%s 版本:%s 使用PHP扩展 %s',
'%d row(s)' => '%d 行',
'Remove' => '移除',
'Are you sure?' => '你确定吗?',
'Refresh' => '刷新',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => '权限',
'Create user' => '创建用户',
'User has been dropped.' => '已删除用户。',
@@ -138,130 +43,307 @@ $translations = array(
'Routine' => '子程序',
'Grant' => '授权',
'Revoke' => '废除',
'Logged as: %s' => '登录用户:%s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => '太大的 POST 数据。减少数据或者增加 %s 配置命令。',
'Move up' => '上移',
'Move down' => '下移',
'Process list' => '进程列表',
'%d process(es) have been killed.' => '%d 个进程被终止',
'Kill' => '终止',
'Variables' => '变量',
'Status' => '状态',
'SQL command' => 'SQL命令',
'%d query(s) executed OK.' => '%d 条查询已成功执行。',
'Query executed OK, %d row(s) affected.' => '查询执行完毕,%d 行受影响。',
'No commands to execute.' => '没有命令被执行。',
'Error in query' => '查询出错',
'Unknown error.' => '未知错误。',
'Warnings' => '警告',
'ATTACH queries are not supported.' => '不支持ATTACH查询。',
'Execute' => '执行',
'Stop on error' => '出错时停止',
'Show only errors' => '仅显示错误',
// sprintf() format for time of the command
'%.3f s' => '%.3f 秒',
'History' => '历史',
'Clear' => '清除',
'Edit all' => '编辑全部',
'File upload' => '文件上传',
'From server' => '来自服务器',
'Webserver file %s' => 'Web服务器文件 %s',
'Run file' => '运行文件',
'File does not exist.' => '文件不存在。',
'File uploads are disabled.' => '文件上传被禁用。',
'Unable to upload a file.' => '不能上传文件。',
'Maximum allowed file size is %sB.' => '最多允许的文件大小为 %sB。',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 数据太大。请减少数据或者增加 %s 配置命令。',
'You can upload a big SQL file via FTP and import it from server.' => '您可以通过FTP上传大型SQL文件并从服务器导入。',
'You are offline.' => '您离线了。',
'Export' => '导出',
'Tables' => '表',
'Data' => '数据',
'Output' => '输出',
'open' => '打开',
'save' => '保存',
'Saving' => '保存中',
'Format' => '格式',
'Functions' => '数',
'Aggregation' => '集合',
'Event has been dropped.' => '已删除事件。',
'Event has been altered.' => '已修改事件。',
'Event has been created.' => '已创建事件。',
'Alter event' => '修改事件',
'Create event' => '创建事件',
'Start' => '开始',
'End' => '结束',
'Every' => '',
'Status' => '状态',
'On completion preserve' => '完成后保存',
'Events' => '事件',
'Schedule' => '调度',
'At given time' => '在指定时间',
'Tables have been truncated.' => '已清空表。',
'Tables have been moved.' => '已转移表。',
'Tables and views' => '表和视图',
'Data' => '数',
'Database' => '数据库',
'database' => '数据库',
'DB' => '数据库',
'Use' => '使用',
'Select database' => '选择数据库',
'Invalid database.' => '无效数据库。',
'Database has been dropped.' => '已删除数据库。',
'Databases have been dropped.' => '已删除数据库。',
'Database has been created.' => '已创建数据库。',
'Database has been renamed.' => '已重命名数据库。',
'Database has been altered.' => '已修改数据库。',
'Alter database' => '修改数据库',
'Create database' => '创建数据库',
'Database schema' => '数据库概要',
// link to current database schema layout
'Permanent link' => '固定链接',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => '引擎',
'Collation' => '校对',
'Data Length' => '数据长度',
'Index Length' => '索引长度',
'Data Free' => '数据空闲',
'Rows' => '行数',
',' => ',',
'0123456789' => '0123456789',
'%d in total' => '共计 %d',
'Analyze' => '分析',
'Optimize' => '优化',
'Vacuum' => '整理Vacuum',
'Check' => '检查',
'Repair' => '修复',
'Truncate' => '清空',
'Tables have been truncated.' => '已清空表。',
'Move to other database' => '转移到其它数据库',
'Move' => '转移',
'Save and continue edit' => '保存并继续编辑',
'original' => '原始',
'%d item(s) have been affected.' => '%d 个项目受到影响。',
'Whole result' => '所有结果',
'Tables have been moved.' => '已转移表。',
'Copy' => '复制',
'Tables have been copied.' => '已复制表。',
'overwrite' => '覆盖',
'Routines' => '子程序',
'Routine has been called, %d row(s) affected.' => '子程序被调用,%d 行被影响。',
'Call' => '调用',
'Parameter name' => '参数名',
'Create procedure' => '创建过程',
'Create function' => '创建函数',
'Routine has been dropped.' => '已删除子程序。',
'Routine has been altered.' => '已修改子程序。',
'Routine has been created.' => '已创建子程序。',
'Alter function' => '修改函数',
'Alter procedure' => '修改过程',
'Return type' => '返回类型',
'Events' => '事件',
'Event has been dropped.' => '已删除事件。',
'Event has been altered.' => '已修改事件。',
'Event has been created.' => '已创建事件。',
'Alter event' => '修改事件',
'Create event' => '创建事件',
'At given time' => '在指定时间',
'Every' => '每',
'Schedule' => '调度',
'Start' => '开始',
'End' => '结束',
'On completion preserve' => '完成后仍保留',
'Tables' => '表',
'Tables and views' => '表和视图',
'Table' => '表',
'No tables.' => '没有表。',
'Alter table' => '修改表',
'Create table' => '创建表',
'Table has been dropped.' => '已删除表。',
'Tables have been dropped.' => '已删除表。',
'Clone' => '复制',
'Tables have been optimized.' => '已优化表。',
'Table has been altered.' => '已修改表。',
'Table has been created.' => '已创建表。',
'Table name' => '表名',
'Show structure' => '显示结构',
'engine' => '引擎',
'collation' => '校对',
'Column name' => '字段名',
'Type' => '类型',
'Length' => '长度',
'Auto Increment' => '自动增量',
'Options' => '选项',
'Comment' => '注释',
'Default value' => '默认值',
'Default values' => '默认值',
'Drop' => '删除',
'Drop %s?' => '删除 %s?',
'Are you sure?' => '您确定吗?',
'Size' => '大小',
'Compute' => '计算',
'Move up' => '上移',
'Move down' => '下移',
'Remove' => '移除',
'Maximum number of allowed fields exceeded. Please increase %s.' => '超过最多允许的字段数量。请增加 %s。',
'Partition by' => '分区类型',
'Partitions' => '分区',
'Partition name' => '分区名',
'Values' => '值',
'%d row(s) have been imported.' => '%d 行已导入。',
'anywhere' => '任意位置',
'Import' => '导入',
'Stop on error' => '出错时停止',
'%.3f s' => '%.3f 秒',
'$1-$3-$5' => '$1.$3.$5',
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
'History' => '历史',
'Variables' => '变量',
'View' => '视图',
'Materialized view' => '物化视图',
'View has been dropped.' => '已删除视图。',
'View has been altered.' => '已修改视图。',
'View has been created.' => '已创建视图。',
'Alter view' => '修改视图',
'Create view' => '创建视图',
'Indexes' => '索引',
'Indexes have been altered.' => '已修改索引。',
'Alter indexes' => '修改索引',
'Add next' => '下一行插入',
'Index Type' => '索引类型',
'Column (length)' => '列(长度)',
'Foreign keys' => '外键',
'Foreign key' => '外键',
'Foreign key has been dropped.' => '已删除外键。',
'Foreign key has been altered.' => '已修改外键。',
'Foreign key has been created.' => '已创建外键。',
'Target table' => '目标表',
'Change' => '修改',
'Source' => '源',
'Target' => '目标',
'Add column' => '增加列',
'Alter' => '修改',
'Add foreign key' => '添加外键',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '源列和目标列必须具有相同的数据类型,在目标列上必须有一个索引并且引用的数据必须存在。',
'Relations' => '关联信息',
'Run file' => '运行文件',
'Clear' => '清除',
'Maximum allowed file size is %sB.' => '最多允许的文件大小为 %sB',
'Triggers' => '触发器',
'Add trigger' => '创建触发器',
'Trigger has been dropped.' => '已删除触发器。',
'Trigger has been altered.' => '已修改触发器。',
'Trigger has been created.' => '已创建触发器。',
'Alter trigger' => '修改触发器',
'Create trigger' => '创建触发器',
'Time' => '时间',
'Event' => '事件',
'Name' => '名称',
'select' => '选择',
'Select' => '选择',
'Select data' => '选择数据',
'Functions' => '函数',
'Aggregation' => '集合',
'Search' => '搜索',
'anywhere' => '任意位置',
'Search data in tables' => '在表中搜索数据',
'Sort' => '排序',
'descending' => '降序',
'Limit' => '范围',
'Limit rows' => '限制行数',
'Text length' => '文本显示限制',
'Action' => '动作',
'Full table scan' => '全表扫描',
'Unable to select the table' => '不能选择该表',
'No rows.' => '无数据。',
'%d / ' => '%d / ',
'%d row(s)' => '%d 行',
'Page' => '页面',
'last' => '最后',
'Load more data' => '加载更多数据',
'Loading' => '加载中',
'Whole result' => '所有结果',
'%d byte(s)' => '%d 字节',
'Import' => '导入',
'%d row(s) have been imported.' => '%d 行已导入。',
'File must be in UTF-8 encoding.' => '文件必须使用UTF-8编码。',
// in-place editing in select
'Modify' => '修改',
'Ctrl+click on a value to modify it.' => '按住Ctrl并单击某个值进行修改。',
'Use edit link to modify this value.' => '使用编辑链接修改该值。',
// %s can contain auto-increment value
'Item%s has been inserted.' => '已插入项目%s。',
'Item has been deleted.' => '已删除项目。',
'Item has been updated.' => '已更新项目。',
'%d item(s) have been affected.' => '%d 个项目受到影响。',
'New item' => '新建数据',
'original' => '原始',
// label for value '' in enum data type
'empty' => '空',
'edit' => '编辑',
'Edit' => '编辑',
'Insert' => '插入',
'Save' => '保存',
'Save and continue edit' => '保存并继续编辑',
'Save and insert next' => '保存并插入下一个',
'Selected' => '已选中',
'Clone' => '复制',
'Delete' => '删除',
'You have no privileges to update this table.' => '您没有权限更新这个表。',
'E-mail' => '电子邮件',
'From' => '来自',
'Subject' => '主题',
'Attachments' => '附件',
'Send' => '发送',
'%d e-mail(s) have been sent.' => '%d 封邮件已发送。',
// data type descriptions
'Numbers' => '数字',
'Date and time' => '日期时间',
'Strings' => '字符串',
'Binary' => '二进制',
'Lists' => '列表',
'Network' => '网络',
'Geometry' => '几何图形',
'Relations' => '关联信息',
'Editor' => '编辑器',
'E-mail' => '电子邮件',
'From' => '来自',
'Subject' => '主题',
'Send' => '发送',
'%d e-mail(s) have been sent.' => '%d 封邮件已发送。',
'Webserver file %s' => 'Web服务器文件 %s',
'File does not exist.' => '文件不存在。',
'%d in total' => '共计 %d',
'Permanent login' => '保持登录',
'Databases have been dropped.' => '已删除数据库。',
'Search data in tables' => '在表中搜索数据',
'Schema' => '模式',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1.$3.$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => '现在',
'yes' => '',
'no' => '',
// general SQLite error in create, drop or rename database
'File exists.' => '文件已存在。',
'Please use one of the extensions %s.' => '请使用其中一个扩展:%s。',
// PostgreSQL and MS SQL schema support
'Alter schema' => '修改模式',
'Create schema' => '创建模式',
'Schema has been dropped.' => '已删除模式。',
'Schema has been created.' => '已创建模式。',
'Schema has been altered.' => '已修改模式。',
'Schema' => '模式',
'Invalid schema.' => '非法模式。',
// PostgreSQL sequences support
'Sequences' => '序列',
'Create sequence' => '创建序列',
'Alter sequence' => '修改序列',
'Sequence has been dropped.' => '已删除序列。',
'Sequence has been created.' => '已创建序列。',
'Sequence has been altered.' => '已修改序列。',
'Alter sequence' => '修改序列',
// PostgreSQL user types support
'User types' => '用户类型',
'Create type' => '创建类型',
'Alter type' => '修改类型',
'Type has been dropped.' => '已删除类型。',
'Type has been created.' => '已创建类型。',
'Use edit link to modify this value.' => '使用编辑链接来修改该值。',
'last' => '最后',
'From server' => '来自服务器',
'System' => '系统',
'Select data' => '选择数据',
'Show structure' => '显示结构',
'empty' => '空',
'Network' => '网络',
'Geometry' => '几何图形',
'File exists.' => '文件已存在。',
'Attachments' => '附件',
'%d query(s) executed OK.' => '%d 条查询已成功执行。',
'Show only errors' => '仅显示错误',
'Refresh' => '刷新',
'Invalid schema.' => '非法模式。',
'Please use one of the extensions %s.' => '请使用这些扩展中的一个:%s。',
'now' => '现在',
'ltr' => 'ltr',
'Tables have been copied.' => '表已复制。',
'Copy' => '复制',
'Permanent link' => '固定链接',
'Edit all' => '编辑全部',
'HH:MM:SS' => 'HH:MM:SS',
'Alter type' => '修改类型',
);

View File

@@ -35,9 +35,10 @@ $routine_languages = routine_languages();
?>
<form action="" method="post" id="form">
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64" autocapitalize="off">
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" data-maxlength="64" autocapitalize="off">
<?php echo ($routine_languages ? lang('Language') . ": " . html_select("language", $routine_languages, $row["language"]) . "\n" : ""); ?>
<input type="submit" value="<?php echo lang('Save'); ?>">
<div class="scrollable">
<table cellspacing="0" class="nowrap">
<?php
edit_fields($row["fields"], $collations, $routine);
@@ -47,6 +48,7 @@ if (isset($_GET["function"])) {
}
?>
</table>
</div>
<p><?php textarea("definition", $row["definition"]); ?>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">

View File

@@ -13,6 +13,7 @@ page_header(lang('Process list'), $error);
?>
<form action="" method="post">
<div class="scrollable">
<table cellspacing="0" class="nowrap checkable">
<?php
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
@@ -26,7 +27,7 @@ foreach (process_list() as $i => $row) {
echo "<th>$key" . doc_link(array(
'sql' => "show-processlist.html#processlist_" . strtolower($key),
'pgsql' => "monitoring-stats.html#PG-STAT-ACTIVITY-VIEW",
'oracle' => "../b14237/dynviews_2088.htm",
'oracle' => "REFRN30223",
));
}
echo "</thead>\n";
@@ -45,6 +46,7 @@ foreach (process_list() as $i => $row) {
}
?>
</table>
</div>
<p>
<?php
if (support("kill")) {

View File

@@ -309,6 +309,7 @@ if (!$columns && support("table")) {
} else {
$backward_keys = $adminer->backwardKeys($TABLE, $table_name);
echo "<div class='scrollable'>";
echo "<table id='table' cellspacing='0' class='nowrap checkable'>";
echo script("mixin(qs('#table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true), onkeydown: editingKeydown});");
echo "<thead><tr>" . (!$group && $select
@@ -435,12 +436,13 @@ if (!$columns && support("table")) {
$value = $_POST["val"][$unique_idf][bracket_escape($key)];
$editable = !is_array($row[$key]) && is_utf8($val) && $rows[$n][$key] == $row[$key] && !$functions[$key];
$text = preg_match('~text|lob~', $field["type"]);
echo "<td id='$id'";
if (($_GET["modify"] && $editable) || $value !== null) {
$h_value = h($value !== null ? $value : $row[$key]);
echo "<td>" . ($text ? "<textarea name='$id' cols='30' rows='" . (substr_count($row[$key], "\n") + 1) . "'>$h_value</textarea>" : "<input name='$id' value='$h_value' size='$lengths[$key]'>");
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>");
echo "<td id='$id' data-text='" . ($long ? 2 : ($text ? 1 : 0)) . "'"
$long = strpos($val, "<i></i>");
echo " data-text='" . ($long ? 2 : ($text ? 1 : 0)) . "'"
. ($editable ? "" : " data-warning='" . h(lang('Use edit link to modify this value.')) . "'")
. ">$val</td>"
;
@@ -459,6 +461,7 @@ if (!$columns && support("table")) {
exit;
}
echo "</table>\n";
echo "</div>\n";
}
if (!is_ajax()) {
@@ -482,7 +485,7 @@ if (!$columns && support("table")) {
if ($pagination) {
echo (($found_rows === false ? count($rows) + 1 : $found_rows - $page * $limit) > $limit
? '<p><a href="' . h(remove_from_uri("page") . "&page=" . ($page + 1)) . '" class="loadmore">' . lang('Load more data') . '</a>'
. script("qsl('a').onclick = partial(selectLoadMore, " . (+$limit) . ", '" . lang('Loading') . "...');", "")
. script("qsl('a').onclick = partial(selectLoadMore, " . (+$limit) . ", '" . lang('Loading') . "');", "")
: ''
);
echo "\n";
@@ -501,12 +504,12 @@ if (!$columns && support("table")) {
if ($jush != "simpledb") {
echo "<legend><a href='" . h(remove_from_uri("page")) . "'>" . lang('Page') . "</a></legend>";
echo script("qsl('a').onclick = function () { pageClick(this.href, +prompt('" . lang('Page') . "', '" . ($page + 1) . "')); return false; };");
echo pagination(0, $page) . ($page > 5 ? " ..." : "");
echo pagination(0, $page) . ($page > 5 ? " " : "");
for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
echo pagination($i, $page);
}
if ($max_page > 0) {
echo ($page + 5 < $max_page ? " ..." : "");
echo ($page + 5 < $max_page ? " " : "");
echo ($exact_count && $found_rows !== false
? pagination($max_page, $page)
: " <a href='" . h(remove_from_uri("page") . "&page=last") . "' title='~$max_page'>" . lang('last') . "</a>"
@@ -514,9 +517,9 @@ if (!$columns && support("table")) {
}
} else {
echo "<legend>" . lang('Page') . "</legend>";
echo pagination(0, $page) . ($page > 1 ? " ..." : "");
echo pagination(0, $page) . ($page > 1 ? " " : "");
echo ($page ? pagination($page, $page) : "");
echo ($max_page > $page ? pagination($page + 1, $page) . ($max_page > $page + 1 ? " ..." : "") : "");
echo ($max_page > $page ? pagination($page + 1, $page) . ($max_page > $page + 1 ? " " : "") : "");
}
echo "</fieldset>\n";
}

View File

@@ -53,6 +53,9 @@ if (!$error && $_POST) {
$connection2 = connect(); // connection for exploring indexes and EXPLAIN (to not replace FOUND_ROWS()) //! PDO - silent error
if (is_object($connection2) && DB != "") {
$connection2->select_db(DB);
if ($_GET["ns"] != "") {
set_schema($_GET["ns"], $connection2);
}
}
$commands = 0;
$errors = array();
@@ -219,7 +222,7 @@ if (!isset($_GET["import"])) {
}
echo "<p>";
textarea("query", $q, 20);
echo ($_POST ? "" : script("qs('textarea').focus();"));
echo script(($_POST ? "" : "qs('textarea').focus();\n") . "qs('#form').onsubmit = partial(sqlSubmit, qs('#form'), '" . remove_from_uri("sql|limit|error_stops|only_errors") . "');");
echo "<p>$execute\n";
echo lang('Limit rows') . ": <input type='number' name='limit' class='size' value='" . h($_POST ? $_POST["limit"] : $_GET["limit"]) . "'>\n";
@@ -231,10 +234,13 @@ if (!isset($_GET["import"])) {
: lang('File uploads are disabled.')
);
echo "</div></fieldset>\n";
echo "<fieldset><legend>" . lang('From server') . "</legend><div>";
echo lang('Webserver file %s', "<code>" . h($adminer->importServerPath()) . "$gz</code>");
echo ' <input type="submit" name="webfile" value="' . lang('Run file') . '">';
echo "</div></fieldset>\n";
$importServerPath = $adminer->importServerPath();
if ($importServerPath) {
echo "<fieldset><legend>" . lang('From server') . "</legend><div>";
echo lang('Webserver file %s', "<code>" . h($importServerPath) . "$gz</code>");
echo ' <input type="submit" name="webfile" value="' . lang('Run file') . '">';
echo "</div></fieldset>\n";
}
echo "<p>";
}

View File

@@ -1,5 +1,5 @@
/** @author Ondrej Valka, http://valka.info */
body { color: #000; background: #fff; font: 90%/1.25 Verdana, Arial, Helvetica, sans-serif; margin: 0; }
body { color: #000; background: #fff; font: 90%/1.25 Verdana, Arial, Helvetica, sans-serif; margin: 0; width: -moz-fit-content; width: fit-content; }
a { color: blue; text-decoration: none; }
a:visited { color: navy; }
a:link:hover, a:visited:hover { color: red; text-decoration: underline; }
@@ -66,8 +66,8 @@ input.wayoff { left: -1000px; position: absolute; }
.loadmore { margin-left: 1ex; }
/* .edit used in designs */
#menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; }
#menu p, #tables { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
#tables li{ list-style: none; }
#menu p, #logins, #tables { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
#logins li, #tables li { list-style: none; }
#dbs { overflow: hidden; }
#logins, #tables { white-space: nowrap; overflow: auto; }
#logins a, #tables a, #tables span { background: #fff; }

View File

@@ -15,7 +15,11 @@ function bodyLoad(version, maria) {
key = 0;
if (maria) {
for (var i = 1; i < obj.length; i++) {
obj[i] = obj[i].replace(/\.html/, '/');
obj[i] = obj[i]
.replace(/\.html/, '/')
.replace(/(numeric)(-type-overview)/, '$1-data$2')
.replace(/#statvar_.*/, '#$$1')
;
}
}
}
@@ -30,7 +34,7 @@ function bodyLoad(version, maria) {
jush.custom_links = jushLinks;
}
jush.highlight_tag('code', 0);
var tags = qsa('textarea', document);
var tags = qsa('textarea');
for (var i = 0; i < tags.length; i++) {
if (/(^|\s)jush-/.test(tags[i].className)) {
var pre = jush.textarea(tags[i]);
@@ -68,9 +72,10 @@ function typePassword(el, disable) {
}
/** Install toggle handler
* @param [HTMLElement]
*/
function messagesPrint() {
var els = qsa('.toggle', document);
function messagesPrint(el) {
var els = qsa('.toggle', el);
for (var i = 0; i < els.length; i++) {
els[i].onclick = partial(toggle, els[i].getAttribute('href').substr(1));
}
@@ -78,6 +83,18 @@ function messagesPrint() {
/** Hide or show some login rows for selected driver
* @param HTMLSelectElement
*/
function loginDriver(driver) {
var trs = parentTag(driver, 'table').rows;
var disabled = /sqlite/.test(selectValue(driver));
alterClass(trs[1], 'hidden', disabled); // 1 - row with server
trs[1].getElementsByTagName('input')[0].disabled = disabled;
}
var dbCtrl;
var dbPrevious = {};
@@ -444,14 +461,6 @@ function columnShow(checked, column) {
}
}
/** Hide column with default values in narrow window
*/
function editingHideDefaults() {
if (innerWidth < document.documentElement.scrollWidth) {
qs('#form')['defaults'].checked = false;
}
}
/** Display partition options
* @this HTMLSelectElement
*/
@@ -473,14 +482,14 @@ function partitionNameChange() {
}
/** Show or hide comment fields
* @param HTMLInputElement
* @param [boolean] whether to focus Comment if checked
* @this HTMLInputElement
*/
function editingCommentsClick(focus) {
var comment = this.form['Comment'];
columnShow(this.checked, 6);
alterClass(comment, 'hidden', !this.checked);
if (focus && this.checked) {
function editingCommentsClick(el, focus) {
var comment = el.form['Comment'];
columnShow(el.checked, 6);
alterClass(comment, 'hidden', !el.checked);
if (focus && el.checked) {
comment.focus();
}
}
@@ -509,8 +518,8 @@ function dumpClick(event) {
* @this HTMLSelectElement
*/
function foreignAddRow() {
this.onchange = function () { };
var row = cloneNode(parentTag(this, 'tr'));
this.onchange = function () { };
var selects = qsa('select', row);
for (var i=0; i < selects.length; i++) {
selects[i].name = selects[i].name.replace(/\]/, '1$&');
@@ -525,8 +534,8 @@ function foreignAddRow() {
* @this HTMLSelectElement
*/
function indexesAddRow() {
this.onchange = function () { };
var row = cloneNode(parentTag(this, 'tr'));
this.onchange = function () { };
var selects = qsa('select', row);
for (var i=0; i < selects.length; i++) {
selects[i].name = selects[i].name.replace(/indexes\[\d+/, '$&1');
@@ -595,6 +604,23 @@ function indexesAddColumn(prefix) {
/** Updates the form action
* @param HTMLFormElement
* @param string
*/
function sqlSubmit(form, root) {
if (encodeURIComponent(form['query'].value).length < 2e3) {
form.action = root
+ '&sql=' + encodeURIComponent(form['query'].value)
+ (form['limit'].value ? '&limit=' + +form['limit'].value : '')
+ (form['error_stops'].checked ? '&error_stops=1' : '')
+ (form['only_errors'].checked ? '&only_errors=1' : '')
;
}
}
/** Handle changing trigger time or event
* @param RegExp
* @param string

View File

@@ -14,17 +14,17 @@ function qs(selector, context) {
* @return HTMLElement
*/
function qsl(selector, context) {
var els = qsa(selector, context || document);
var els = qsa(selector, context);
return els[els.length - 1];
}
/** Get all elements by selector
* @param string
* @param HTMLElement
* @param [HTMLElement] defaults to document
* @return NodeList
*/
function qsa(selector, context) {
return context.querySelectorAll(selector);
return (context || document).querySelectorAll(selector);
}
/** Return a function calling fn with the next arguments
@@ -143,7 +143,7 @@ function selectValue(select) {
*/
function isTag(el, tag) {
var re = new RegExp('^(' + tag + ')$', 'i');
return re.test(el.tagName);
return el && re.test(el.tagName);
}
/** Get parent node with specified tag name
@@ -205,7 +205,7 @@ function formCheck(name) {
/** Check all rows in <table class="checkable">
*/
function tableCheck() {
var inputs = qsa('table.checkable td:first-child input', document);
var inputs = qsa('table.checkable td:first-child input');
for (var i=0; i < inputs.length; i++) {
trCheck(inputs[i]);
}
@@ -491,6 +491,9 @@ function bodyKeydown(event, button) {
if (button) {
target.form[button].click();
} else {
if (target.form.onsubmit) {
target.form.onsubmit();
}
target.form.submit();
}
target.focus();
@@ -540,20 +543,22 @@ function editingKeydown(event) {
*/
function functionChange() {
var input = this.form[this.name.replace(/^function/, 'fields')];
if (selectValue(this)) {
if (input.origType === undefined) {
input.origType = input.type;
input.origMaxLength = input.getAttribute('data-maxlength');
}
input.removeAttribute('data-maxlength');
input.type = 'text';
} else if (input.origType) {
input.type = input.origType;
if (input.origMaxLength >= 0) {
input.setAttribute('data-maxlength', input.origMaxLength);
if (input) { // undefined with the set data type
if (selectValue(this)) {
if (input.origType === undefined) {
input.origType = input.type;
input.origMaxLength = input.getAttribute('data-maxlength');
}
input.removeAttribute('data-maxlength');
input.type = 'text';
} else if (input.origType) {
input.type = input.origType;
if (input.origMaxLength >= 0) {
input.setAttribute('data-maxlength', input.origMaxLength);
}
}
oninput({target: input});
}
oninput({target: input});
helpClose();
}
@@ -667,6 +672,7 @@ function ajaxForm(form, message, button) {
if (window.jush) {
jush.highlight_tag(qsa('code', qs('#ajaxstatus')), 0);
}
messagesPrint(qs('#ajaxstatus'));
}, data, message);
}
@@ -702,7 +708,7 @@ function selectClick(event, text, warning) {
}
};
var pos = event.rangeOffset;
var value = td.firstChild.alt || td.textContent || td.innerText;
var value = (td.firstChild && td.firstChild.alt) || td.textContent || td.innerText;
input.style.width = Math.max(td.clientWidth - 14, 20) + 'px'; // 14 = 2 * (td.border + td.padding + input.border)
if (text) {
var rows = 1;

View File

@@ -33,13 +33,13 @@ page_header(($name != "" ? lang('Alter trigger') . ": " . h($name) : lang('Creat
?>
<form action="" method="post" id="form">
<table cellspacing="0">
<table cellspacing="0" class="layout">
<tr><th><?php echo lang('Time'); ?><td><?php echo html_select("Timing", $trigger_options["Timing"], $row["Timing"], "triggerChange(/^" . preg_quote($TABLE, "/") . "_[ba][iud]$/, '" . js_escape($TABLE) . "', this.form);"); ?>
<tr><th><?php echo lang('Event'); ?><td><?php echo html_select("Event", $trigger_options["Event"], $row["Event"], "this.form['Timing'].onchange();"); ?>
<?php echo (in_array("UPDATE OF", $trigger_options["Event"]) ? " <input name='Of' value='" . h($row["Of"]) . "' class='hidden'>": ""); ?>
<tr><th><?php echo lang('Type'); ?><td><?php echo html_select("Type", $trigger_options["Type"], $row["Type"]); ?>
</table>
<p><?php echo lang('Name'); ?>: <input name="Trigger" value="<?php echo h($row["Trigger"]); ?>" maxlength="64" autocapitalize="off">
<p><?php echo lang('Name'); ?>: <input name="Trigger" value="<?php echo h($row["Trigger"]); ?>" data-maxlength="64" autocapitalize="off">
<?php echo script("qs('#form')['Timing'].onchange();"); ?>
<p><?php textarea("Statement", $row["Statement"]); ?>
<p>

View File

@@ -52,7 +52,7 @@ if ($_POST && !$error) {
} else {
$new_user = q($_POST["user"]) . "@" . q($_POST["host"]); // if $_GET["host"] is not set then $new_user is always different
$pass = $_POST["pass"];
if ($pass != '' && !$_POST["hashed"]) {
if ($pass != '' && !$_POST["hashed"] && !min_version(8)) {
// compute hash in a separate query so that plain text password is not saved to history
$pass = $connection->result("SELECT PASSWORD(" . q($pass) . ")");
$error = !$pass;
@@ -61,7 +61,7 @@ if ($_POST && !$error) {
$created = false;
if (!$error) {
if ($old_user != $new_user) {
$created = queries((min_version(5) ? "CREATE USER" : "GRANT USAGE ON *.* TO") . " $new_user IDENTIFIED BY PASSWORD " . q($pass));
$created = queries((min_version(5) ? "CREATE USER" : "GRANT USAGE ON *.* TO") . " $new_user IDENTIFIED BY " . (min_version(8) ? "" : "PASSWORD ") . q($pass));
$error = !$created;
} elseif ($pass != $old_pass) {
queries("SET PASSWORD FOR $new_user = " . q($pass));
@@ -131,12 +131,12 @@ if ($_POST) {
?>
<form action="" method="post">
<table cellspacing="0">
<tr><th><?php echo lang('Server'); ?><td><input name="host" maxlength="60" value="<?php echo h($row["host"]); ?>" autocapitalize="off">
<tr><th><?php echo lang('Username'); ?><td><input name="user" maxlength="16" value="<?php echo h($row["user"]); ?>" autocapitalize="off">
<table cellspacing="0" class="layout">
<tr><th><?php echo lang('Server'); ?><td><input name="host" data-maxlength="60" value="<?php echo h($row["host"]); ?>" autocapitalize="off">
<tr><th><?php echo lang('Username'); ?><td><input name="user" data-maxlength="80" value="<?php echo h($row["user"]); ?>" autocapitalize="off">
<tr><th><?php echo lang('Password'); ?><td><input name="pass" id="pass" value="<?php echo h($row["pass"]); ?>" autocomplete="new-password">
<?php if (!$row["hashed"]) { echo script("typePassword(qs('#pass'));"); } ?>
<?php echo checkbox("hashed", 1, $row["hashed"], lang('Hashed'), "typePassword(this.form['pass'], this.checked);"); ?>
<?php echo (min_version(8) ? "" : checkbox("hashed", 1, $row["hashed"], lang('Hashed'), "typePassword(this.form['pass'], this.checked);")); ?>
</table>
<?php

View File

@@ -48,7 +48,7 @@ page_header(($TABLE != "" ? lang('Alter view') : lang('Create view')), $error, a
?>
<form action="" method="post">
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64" autocapitalize="off">
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" data-maxlength="64" autocapitalize="off">
<?php echo (support("materializedview") ? " " . checkbox("materialized", 1, $row["materialized"], lang('Materialized view')) : ""); ?>
<p><?php textarea("select", $row["select"]); ?>
<p>

View File

@@ -1,3 +1,70 @@
Adminer 4.7.5 (released 2019-11-13):
Add id="" to cells with failed inline edit (bug #708)
PostgreSQL: Fix getting default value in PostgreSQL 12 (bug #719)
PostgreSQL, Oracle: Set schema for EXPLAIN queries in SQL command (bug #706)
ClickHouse: SQL command
Swedish translation
Adminer 4.7.4 (released 2019-10-22):
Fix XSS if Adminer is accessible at URL /data:
Adminer 4.7.3 (released 2019-08-27):
Allow editing foreign keys pointing to tables in other database/schema (bug #694)
Fix blocking of concurrent instances in PHP >7.2 (bug #703)
MySQL: Speed up displaying tables in large databases (bug #700, regression from 4.7.2)
MySQL: Allow editing rows identified by negative floats (bug #695)
MySQL: Skip editing generated columns
SQLite: Quote strings stored in integer columns in export (bug #696)
SQLite: Handle error in altering table (bug #697)
SQLite: Allow setting auto increment for empty tables
SQLite: Preserve auto increment when recreating table
MS SQL: Support foreign keys to other DB
MongoDB: Allow setting authSource from environment variable
Adminer 4.7.2 (released 2019-07-18):
Do not attempt logging in without password (bug #676)
Stretch footer over the whole table width (bug #624)
Allow overwriting tables when copying them
Fix displaying SQL command after Save and continue edit
Cache busting for adminer.css
MySQL: Fix displaying multi-columns foreign keys (bug #675, regression from 4.7.0)
MySQL: Fix creating users and changing password in MySQL 8 (bug #663)
MySQL: Pass SRID to GeomFromText
PostgreSQL: Fix setting column comments on new table
PostgreSQL: Display definitions of materialized views (bug #682)
PostgreSQL: Fix table status in PostgreSQL 12 (bug #683)
MS SQL: Support comments
Elasticsearch: Fix setting number of rows
Adminer 4.7.1 (released 2019-01-24):
Display the tables scrollbar (bug #647)
Remember visible columns in Create Table form (bug #493)
Add autocomplete attributes to login form
PHP <5.4 compatibility even with ClickHouse enabled (regression from 4.7.0)
SQLite: Hide server field in login form
Editor: Allow disabling boolean fields in PostgreSQL (bug #640)
Adminer 4.7.0 (released 2018-11-24):
Simplify storing executed SQL queries to bookmarks
Warn when using password with leading or trailing spaces
Hide import from server if importServerPath() returns an empty string
Fix inline editing of empty cells (regression from 4.6.3)
Allow adding more than two indexes and forign key columns at a time (regression from 4.4.0)
Avoid overwriting existing tables when copying tables (bug #642)
Fix function change with set data type
Increase username maxlength to 80 (bug #623)
Make maxlength in all fields a soft limit
Make tables horizontally scrollable
MySQL: Support foreign keys created with ANSI quotes (bug #620)
MySQL: Recognize ON UPDATE current_timestamp() (bug #632, bug #638)
MySQL: Descending indexes in MySQL 8 (bug #643)
PostgreSQL: Quote array values in export (bug #621)
PostgreSQL: Export DESC indexes (bug #639)
PostgreSQL: Support GENERATED BY DEFAULT AS IDENTITY in PostgreSQL 10
MS SQL: Pass database when connecting
ClickHouse: Connect, databases list, tables list, select, SQL command
Georgian translation
Adminer 4.6.3 (released 2018-06-28):
Disallow using password-less databases
Copy triggers when copying table

View File

@@ -403,6 +403,12 @@ if ($driver) {
$file = str_replace('<?php echo html_select("auth[driver]", $drivers, DRIVER) . "\n"; ?>', "<input type='hidden' name='auth[driver]' value='" . ($driver == "mysql" ? "server" : $driver) . "'>" . reset($drivers), $file);
}
$file = preg_replace('(;../externals/jush/modules/jush-(?!textarea\.|txt\.|js\.|' . preg_quote($driver == "mysql" ? "sql" : $driver) . '\.)[^.]+.js)', '', $file);
$file = preg_replace_callback('~doc_link\(array\((.*)\)\)~sU', function ($match) use ($driver) {
list(, $links) = $match;
$links = preg_replace("~'(?!(" . ($driver == "mysql" ? "sql|mariadb" : $driver) . ")')[^']*' => [^,]*,?~", '', $links);
return (trim($links) ? "doc_link(array($links))" : "''");
}, $file);
//! strip doc_link() definition
}
if ($project == "editor") {
$file = preg_replace('~;.\.\/externals/jush/jush\.css~', '', $file);

View File

@@ -46,8 +46,8 @@ border:5px solid #ccc;margin:0}
#menu a:hover{background:#333;color:#fff;border-color:#333}
#menu a.h1,#menu a.h1:hover{display:block;height:0;width:175px;padding:40px 0 0 0;overflow:hidden;float:left;border:0;margin:0;
outline:0;background:url(//www.bradezone.com/random/adminer_logo.gif) no-repeat;line-height:32px}
#menu p,#tables{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0}
#breadcrumb{background:#333;color:#fff;position:fixed;top:0;left:320px;width:100%;line-height:40px;padding:0;z-index:1;margin:0}
#menu p,#logins,#tables{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0}
#breadcrumb{background:#333;color:#fff;position:fixed;top:0;left:320px;line-height:40px;padding:0;z-index:1;margin:0}
#breadcrumb a{color:#ff9}
#breadcrumb a:hover{background:transparent;color:#ff9;border-color:#ff9}
#schema .table{padding:4px 8px;background:#f3f3f3}

View File

@@ -339,7 +339,7 @@ border: 1px solid #E3E3E3;
#menu form {
margin: 0;
}
#menu p, #tables {
#menu p, #logins, #tables {
padding-left: 8px;
border-bottom: none;
}

View File

@@ -173,7 +173,7 @@ h3{
margin:0;}
#menu form{
margin:0;}
#menu p,#tables{
#menu p,#logins,#tables{
padding-left:8px;
border-bottom:none;}
#menu form p{

View File

@@ -733,7 +733,7 @@ legend{
}
/* tables */
#tables{
#logins, #tables{
border-bottom: none;
line-height: 20px;
padding: 18px 0;
@@ -759,12 +759,20 @@ legend{
font-size: 14px;
}
#logins a {
display: block;
padding: 5px 18px 9px;
color: inherit;
font-size: 14px;
}
#tables a.select.active,
#tables a.select:hover
{
color: #fba;
}
#logins a:hover,
#tables a[title]:hover,
#tables a.active,
#tables a.select:hover + a,
@@ -979,4 +987,4 @@ code.jush-sql ~ a:first-of-type::before{
body > form{
position: absolute;
}
}

View File

@@ -3,15 +3,15 @@
*
* Klemens Häckel [http://clickdimension.wordpress.com/]
*
* update 2018-02
* adapted for adminer 4.6.1
*
* new remaster based on style for WT-NMP 13.12
*
* Created by Miroslav Pokorný [http://fuch.cz].
* Icons by Yusuke Kamiyamane [http://p.yusukekamiyamane.com/] (some of them were modified).
* Slightly inspired by themes created by Martin Hořínek and Klemens Häckel.
*
* updated 2018-02 by Jan [http://cloux.org]
* - fixes and usability improvements for Adminer 4.6.1
*
*/
/*** Fonts ***/
@@ -139,10 +139,15 @@ html>/**/body #menu li a[href*="&select="]:link:hover {
/* Menu - Show structure */
html>/**/body #menu li a[href*="&table="] {
width: 263px;
width: 280px;
float: left;
}
/* Hide "new version" link in the top bar */
/*
html>body #menu h1 a#version {
display: none;
}
*/
/*** Tables and views ***/
/* set default alignment to left */
@@ -388,7 +393,7 @@ h2 {
display: none;
}
#content {
margin-left: 325px;
margin-left: 355px;
}
.tabs {
margin: 12px auto 10px auto;
@@ -429,7 +434,7 @@ td, th {
border-width: 0 1px 1px 0;
font-size: 0.83em; /* x-small; font size */
}
#tables a {
#logins a, #tables a {
height: 18px;
line-height: 18px;
}
@@ -458,7 +463,7 @@ a:link:hover, a:visited:hover {
#menu {
background-color: #f8f8f8;
box-shadow: 0px 0px 3px rgba(0,0,0,0.50) !important;
width: 310px;
width: 330px;
margin: 0;
top: 0;
padding-bottom: 0;

View File

@@ -1,11 +1,13 @@
/*
Theme by Hever [http://hev.cz] - January 2014, ver 0.2.1
Theme by Hever [http://hev.cz] - September 2019, ver 0.2.5
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;}
@@ -16,7 +18,7 @@ a[href$="&dump="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgA
a[href*="&import="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEJFDQPlDJUDwAAAiNJREFUOMutk0tI1FEUh7//Y9TJghyc1KQ20lMthRAlgoKgVkWte6wid0EICUHUQjdBErRqHYmQghgU5KLQGB8FKVEMCi0G1JmRbPLJ/O89p8XYOAMZBB24HM5dfL/fOfdcB6Aj1j6kqm2qWv/o5NMk/xBOR6z9dVVpzbmQEyKxPMcBc5svbheHs91YK1hRjJWCY7FGsSKT3VcPtviquqaqVJVVY6xlZu0hYpRrpyJ/Vb7fN3sMwAG4965Hw+ElKrzdlPphPqTHaYw0EdiAQEwuW4MRg7GGzrYu7j6L8/hGg+MD7DNXmF7tpDpSg6MOYpWbzbe2VV/dMATGAuADTLt3UFEmU+OICCpK72hqW8CFExGymwAAnrya15X1QJ+PJFVVtW90QQvjRay4TmfW9XrPpOYdBFYQVXwP+mMpPM9lYCyF44K7KTI4kQJVQj4cqd1BNihowVpBAd9zuNQSZXAizcWWPXmH/WPJonp27ifGCEUOVMB34eXHNJ6Xy5C7+w3xHRDg6N4ylEKAEVSVkAfnm6MMTy1y9nhlXvHNpzSthyrYFfYBiCcylJf6WwAjOZrnOgxPLQLks+tAIDDydSkPrIuWYG2BA2NMbgYunGms5O3nRU43bDkYGEtzuTWar+OJDN5ma1szUKVh/07mv69TVxXm28JK/i/U15YQT2SKdkFEpeAV9P2D3pmmrJXywFgCY7FGCKxgrPnjMv1Y3hjif8QvwdlGGi2XXTgAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;}
a[href$="&import="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEJFDMETKEbQAAAAjZJREFUOMuVkjFoU2EUhc//3gsvptFCIdRHh2CrQ1AcmsUYHTKJDkJrFUdx6uJkpuLspCI4xaJLNik4SMGlOKgEdekQ0EEwFhJqCw+a16RJ//+/x0Heo6XN4B0v537nHLgKAKqNxXckSyTPPyu//IP/GFVtLL6f9INrKZXC791f3UvDysPP3tryjcHt7yTPkRQRaZL8KSKvRGRtbm7OxgCPZJ8kJtOnYaw99ZUfl8UQ5XK5kMlkQBI7OzuzURTNbmxs3Nne3v60srJyd2FhoQ0AztPLtflOv/22tdtCVo3hwvhFUATZbBaO48B1XUxMTCCfz6NUKmF6evqKtfZxnMABgOdXl+c7vTZ87wQUFcRyZOepqSmIyPWkAgA8+HCfFMG3rS8QEVCIvb09pFIpkES/30cYhmi325iZmYGI4BDgReW1Wl1d3apUKrler4coitBqtUASxhh0u10Mh0N4ngeSRwEAQBIk4bou0uk0PM+D53nQWsMYA/JfLRGBtfYoQEQSx/hIKQVrbbJzHGd0ghgQHxhj4LourLXQWkNrDdd1E81IQCy21iaAOEFcU2t9PEBEEvcYeDBZrNvf38ehPwAAay3CMEQul4Pv+4f/XSkEQYBisYhOpzMywb1Go/GmUCiM5fN5+L4PpRRIIggCRFGEZrOJ9fX1TWPMzQR+0Kler58RkUcicstxnPFMJgNjDMIwxGAw2DTG1K21T5aWlraOBRycWq120hhz1hgjWusf1Wp1eJzuL3uxkTGLHB98AAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
@media all and (min-device-width: 880px) {
@media all and (min-device-width: 881px) {
#menu .links {height:22px; transition:.2s;}
#menu .links:hover {height:5em;}
#menu .links a {color:transparent; transition:.2s; display:block; margin-bottom:-1.25em;}
@@ -27,9 +29,8 @@ a[href$="&import="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEU
#menu .links a:hover {color:red;}
}
#tables li a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll left bottom; clear:left; display:block; float:left; height:16px; margin-right:8px; padding-top:1px; overflow:hidden; padding-left:16px; width:0; text-decoration:none;}
#tables li a[href*="&table="], tables li a[href*="&view="] {clear:right; margin-left:24px; display:block; height:17px; padding-bottom:1px; text-decoration:none;}
#menu ul#tables a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll right bottom; display:inline-block; height:16px; margin-right:4px; vertical-align:middle; overflow:hidden; padding-left:16px; width:0;}
#menu ul#tables a.active[href*="&select="] {border-left:2px solid #00f; margin-left:-4px; padding-left:18px;}
.links a[href*="&create="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ6SURBVDjLpZNZSNRRGMV//2XGsjFrMg2z0so2K21xIFpepYUiAsGIICLffI8eWiBBeg3qQV+KwBYKLB8qpHUmrahcKLc0QsxldNSxdPz/79LD1ChBUXTh8sG93POdc75zDa01/7NsgGvPR09rzQmpVZZSCqlAKIWUCqk0QqoZWyKFRir1uvxIbsAGUFqXHQqkpP1L57M3Pm5MMJBKpQHUdF9BKIGQAlcJXOlOVykSdye3leO6MmkGQNyHw+uO/1X3bzGBK+S0B1IqAKqDg3986HeCZPffwvJtoNT7lOZLvUdtAPEDAKBkRzo3QwMUb89InN1uGGD3spdE214xe8MRUnM2MfppNW0Pqy7YAK5UKK2xLbhdP4hlmdxpGMQwwQT8ziNiI534c7cT6WrFazikzF2Eb8HS1IQEDdiWwcHAQmpehTkQSAcgNvSMiYFW5uUUMdV3HW+ywefGNqITJsbUUL75k4FWYJtQ+yaMZcXrk1ANk/33mbdiD7EvlRieETy+FJLkMFcjRRSW3emIAwiF1hqPBfu2LGSWbbA1uZ41SfWkrtxPrPcypsfFiWYzFGzGKTjFV28WEJeIUHETLdOgrmkI1VdHpCdEet5enP4qLK9mKrqMgedv6cyrAP+qxOTiUxAi7oEJi8frELoFoTLpa7nI/HQvscgSRt+0kV1SSW7qYtp7xrBMphm4Mi5h/VIfTcEq1u0oJaknSEdNiMYHET7UvcMpPEN31Ed7zxgASmk1I0g6dK66s8CRak5mVxjnfS05+TsZCw/T9baTx1nnGb47DrQksjE6HrsHYPz6nYt3+Sc3L8+wA2tz0J6pF5OD4WP7Kpq7f5fO79DfSxjdtCtDAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
.links a[href$="&create="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIpSURBVDjLpZNPSFRRFMZ/749/Kt3IqFTSRoSMmrGIYTTbpEJtjBCCok1Em9JVG1dRC8FFEES5aGFEgRRZWq1iLKKxBiNqLDcltQgmHR9hY6LOu+feFm+YGVsZXbh8nHO53/nud8+xjDH8z3IB7r5avGgMZ8XoBq01okFpjYhGtEGJLtmCKINo/XbgVFPUBdDG9PVEq0P/UvnSvdlwQYFoHQIY/3obpRVKFL5W+OIXUVThrL91AN+XihKCwIeTu85sqPryqsJXUvRARAMwkshsiKB7fw25UgKVJwA40V7H/cl5jh+oL+RGk/P0xIqxl11dr8AXjTYG14HRNxkcx+ZhMoNlg52/ND6VAWMoc6F5+2Zy/l9PMIDrWByL1jI+tcDRaN06BaXxbDqLUnq9AqPBteHpuwUcJ0AIcgBXH93h+/wEyyuLrPk5cmv7gNY8gdIYYyhz4PDeWuIpj85IsS2ujQ2zJAk6DkZpqGnixcwYyU+PifUOX7Eh6DoAx7aIpzwA4imPeMrj+bTH+88PaNkZQWwhsrULsXxie9oAzgcESgUe2NAZCeE6AXZGQhwKh/Cyc5RZVXQ39wFwoeMmjXVhgMqiB8awe0cVP36u0Fi/iW9zvwuzkF3+xUz6Nal0gv6uWww+O02lUwGwmv8FM3l55EtLTvQWXwm+EkRpfNEoUZRXHCE5PUFbuJ0nH4cot1wSH14C3LA2Os6x3m2DwDmgGlgChpLX0/1/AIu8MA7WsWBMAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;}
@@ -59,12 +60,12 @@ table a[href*="&edit="][href*="&where"] {background:url("data:image/png;base64,i
table input + a[href*="&edit="][href*="&where"] {width:0; float:left; display:block; height:16px; overflow:hidden; text-decoration:none; padding:0 0 0 18px; background-position:2px bottom;}
table thead #all-page + a {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC") no-repeat scroll right bottom; padding-right:18px;}
table thead #all-page + a {width:0; display:inline-block; height:16px; overflow:hidden; text-decoration:none; padding:0 0 0 16px;}
table thead a[href*="&modify=1"] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEKDjA70u7s9gAAAMZJREFUOMvtksFpwzAUhr9fcUsWyAQewWDIHt6iLrlriBDIBl4maARPYNH6VtAh2FEuCSQksUV77Qc66Ef63nvw5JyLTNA0DXme03UdVVU9PnDOxWEYJk9d109z733MrqLN/oAkiBEJEAjYfqwJIbzsMLu9vC9XoIgxJ94yEX6+meNOoAXACWPAmEsnqQIBx/CFgEGRo0DEdMHuc81vkPd+soy1lqIoaNsWa+2jYG4PkkYoy/IuHMcx6XPf9xj+yL8gYQ/mOAPpeHRKiIdANAAAAABJRU5ErkJggg==") no-repeat scroll right bottom; }
table thead a[href*="&modify=1"] {width:0; display:inline-block; height:16px; overflow:hidden; text-decoration:none; padding:0 0 0 16px; vertical-align: middle;}
table td:first-child {white-space:nowrap;}
input[name="delete"], input[name="drop"] {background:transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHSSURBVHjapFM5bsJQEB2zSIDFJrHYpEtyAyoKJAp6CrqIkBPkNDlBAKXjBEgUpKOBCyQNijFiEZvZl8z7wsjESYpkpNFfPO/Nmz9j6Xg80n/M9fWi3W7fMOnd4XAo8qogAbvO5xKvL6lU6s0aL1kVMDjP5ye/36+Gw2FyOp3EQFqtVtTr9WixWHT5/JhOp6s2ghP4ORaLyaFQiGazGa3Xa0HgdrvJ6/WSpmk0Go0MjnvIZDLVM0Gr1brm/WskEkkA3O/3abvdQjq5XC6xgoiVka7rNB6PNT6ns9nsu+OkpODxeBLBYJAGgwHt9/uzQ8Vms6Hdbie+KYqC+ASTFrARBMx2HwgEaDKZiHqn0yktl0uxtzrMMAyKx+MCc+4Cs13hwQCC1GQy+W3Lms2mUIUygbEqEBLNun8z8zswVgUfLO0WD4Z6kekn8/l8okNM8GFVUMYDoVWQ6HA4bEAzoyzL1O12kbRsJajwhYZhiUajJEnShWSAQaqqKnU6HahEGysXg9RoNPJ8+cwZZLSKp47m8/k5Kxzg4XBocNxDLper2ka5Xq+LUeatilahJLN1mEJ+ZDHKJthGAKvVauJnYi9ysHIqQee1xOsLg3/+mf5inwIMAJMhb74NwG5wAAAAAElFTkSuQmCC") no-repeat scroll left center; padding:1px 5px 1px 18px; border:0; cursor:pointer; font-size:.9em;}
input[name="delete"]:hover, input[name="drop"]:hover {color:red; background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJdSURBVDjLpZP7S1NhGMf9W7YfogSJboSEUVCY8zJ31trcps6zTI9bLGJpjp1hmkGNxVz4Q6ildtXKXzJNbJRaRmrXoeWx8tJOTWptnrNryre5YCYuI3rh+8vL+/m8PA/PkwIg5X+y5mJWrxfOUBXm91QZM6UluUmthntHqplxUml2lciF6wrmdHriI0Wx3xw2hAediLwZRWRkCPzdDswaSvGqkGCfq8VEUsEyPF1O8Qu3O7A09RbRvjuIttsRbT6HHzebsDjcB4/JgFFlNv9MnkmsEszodIIY7Oaut2OJcSF68Qx8dgv8tmqEL1gQaaARtp5A+N4NzB0lMXxon/uxbI8gIYjB9HytGYuusfiPIQcN71kjgnW6VeFOkgh3XcHLvAwMSDPohOADdYQJdF1FtLMZPmslvhZJk2ahkgRvq4HHUoWHRDqTEDDl2mDkfheiDgt8pw340/EocuClCuFvboQzb0cwIZgki4KhzlaE6w0InipbVzBfqoK/qRH94i0rgokSFeO11iBkp8EdV8cfJo0yD75aE2ZNRvSJ0lZKcBXLaUYmQrCzDT6tDN5SyRqYlWeDLZAg0H4JQ+Jt6M3atNLE10VSwQsN4Z6r0CBwqzXesHmV+BeoyAUri8EyMfi2FowXS5dhd7doo2DVII0V5BAjigP89GEVAtda8b2ehodU4rNaAW+dGfzlFkyo89GTlcrHYCLpKD+V7yeeHNzLjkp24Uu1Ed6G8/F8qjqGRzlbl2H2dzjpMg1KdwsHxOlmJ7GTeZC/nesXbeZ6c9OYnuxUc3fmBuFft/Ff8xMd0s65SXIb/gAAAABJRU5ErkJggg==")}
input[name="logout"] {background:transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJHSURBVDjLlZPNi81hFMc/z7137p1mTCFvNZfGSzLIWNjZKRvFRoqNhRCSYm8xS3+AxRRZ2JAFJWJHSQqTQkbEzYwIM+6Yid/znJfH4prLXShOnb6r8/nWOd8Tcs78bz0/f+KMu50y05nK/wy+uHDylbutqS5extvGcxaWqtoGDA8PZ3dnrs2srQc2Zko41UXLmLdyDW5OfvsUkUgbYGbU63UAQggdmvMzFmzZCgTi7CQmkZwdEaX0JwDgTnGbTCaE0G4zw80omhPI92lcEtkNkdgJCCHwJX7mZvNaB0A14SaYJlwTrpHsTkoFlV1nt2c3x5YYo1/vM9A/gKpxdfwyu/v3teCayKq4JEwT5EB2R6WgYmrs2bYbcUNNUVfEhIfFYy69uci+1fuRX84mkawFSxd/4nVWUopUVIykwlQxRTJBTIDA4Pp1jBZPuNW4wUAPmCqWIn29X1k4f5Ku8g9mpKCkakRLVEs1auVuauVuyqHMo8ejNCe+sWPVTkQKXCMmkeZUmUZjETF1tc6ooly+fgUVw9So1/tRN6YnZji46QghBFKKuAouERNhMlbAHZFE6e7pB+He8MMw+GGI4xtOMf1+lsl3TQ4NHf19BSlaO1DB9BfMHdX0O0iqSgiBbJkjm491hClJbA1LxCURgpPzXwAHhg63necAIi3XngXLcRU0fof8ETMljIyM5LGxMcbHxzvy/6fuXdWgt6+PWncv1e4euqo1ZmabvHs5+jn8yzufO7hiiZmuNpNBM13rbvVSpbrXJE7/BMkHtU9jFIC/AAAAAElFTkSuQmCC") no-repeat scroll right center; padding:1px 22px 1px 5px; border:0; cursor:pointer; font-size:.9em;}
input[name="logout"]:hover {color:red;}
input[name="logout"]:hover {color:red;}

View File

@@ -18,10 +18,10 @@ img { vertical-align: middle; margin: 0; padding: 0; }
.message { color: black; background: #dedede; padding: .5em .8em; border: 1px solid black; }
#menu { overflow: scroll; position: absolute; top: 0; left: 0; width: 270px; white-space: nowrap; background: #FFE594 url('data:image/gif;base64,R0lGODlhXgEBAIIAAPzabPzijvzihPzefvzmnPzedPzmlPzadCwAAAAAXgEBAAIDYEi63P5wGTXJvNZew7sJBNiBwWeWaPoFbNq+cCzPs8DaeJDvuGAPOh9wIBgWAwMjMblsOpnQqHRKrRaY1+sguz1sB4esN0wulM+HtNqMZqsBafgBTp/PAfQ8fs/v+/8ACQA7') top left repeat-y; height: 100%; _height: 650px; border: 1px solid #a3a3a3; }
#menu form { margin: 0; }
#menu p, #tables li { text-align: center; font-size: 11px; }
#menu p a, #tables li a { color: black; }
#menu p a:hover, #tables li a:hover { color: #626262; text-decoration: none; }
#tables a, #tables span { background: #FFE594; }
#menu p, #logins li, #tables li { text-align: center; font-size: 11px; }
#menu p a, #logins li a, #tables li a { color: black; }
#menu p a:hover, #logins li a:hover, #tables li a:hover { color: #626262; text-decoration: none; }
#logins a, #tables a, #tables span { background: #FFE594; }
#content { margin: 1.5em 0 0 293px; padding: 10px 20px 20px 0; }
#lang { margin: 0; padding: 0; text-align: center; font-size: 10px; width: 270px; background-color: #d9dadb; border-bottom: 1px solid black; }
#lang a { color: black; font-weight: bold; }

View File

@@ -106,7 +106,7 @@ img {vertical-align: middle; margin: 0; padding: 0;}
#breadcrumb {margin: 0; height: 21px; display: block; position: absolute; top: 0; left: 300px; background-color: #f1f1f1; border: 1px solid #E3E3E3; padding: 2px 12px; line-height: 1.25em }
#menu {position: absolute; padding: 10px; margin: 0; top: 28px; left: 0; width: 250px; background-color: #f1f1f1; border: 1px solid #E3E3E3;}
#menu form {margin: 0;}
#menu p, #tables {padding-left: 8px; font-size: 10pt; border-bottom: none;}
#menu p, #logins, #tables {padding-left: 8px; font-size: 10pt; border-bottom: none;}
#menu form p {padding-left: 0; text-align: left;}
h1 .h1:hover {text-decoration: underline;}
h1, h2 {font: italic normal normal 24px/29px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; margin: 0; padding: 14px 15px 3px 10px; line-height: 35px; text-shadow: rgba(255,255,255,1) 0 1px 0px; background: none;}

View File

@@ -1,4 +1,7 @@
/*
A colourful RTL-friendly theme.
Update from https://github.com/vrana/adminer/raw/master/designs/lucas-sandery/adminer.css
Icons from http://FlatIcon.com:
"Translation" by Freepik
"Power" by Vectors Market
@@ -12,13 +15,14 @@ Icons from http://FlatIcon.com:
Background from "All Work and No Play", http://thenewcode.com/1008/SVG-Movie-Backgrounds-Andys-Room-and-Overlook-Hotel
*/
html,
body {
html {
height: 100%;
}
body {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 340.6 491.8' width='56px' height='81px'%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='229.9,208.7 170.5,243 111,208.7 111,140 170.5,105.7 229.9,140'/%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='0,305.3 59.5,339.6 59.5,408.3 0,442.6'/%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='342.8,442.6 283.3,408.3 283.3,339.6 342.8,305.3'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='91.6,0 0,52.9 0,0'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='340.6,0 340.6,52.9 248.8,0'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='21.4,264.6 102.8,311.6 102.8,431.7 -1.2,491.8 0,544.5 149.7,458.1 149.1,285.1 68.2,236.7 68.2,116.6 172.2,56.5 276.2,116.6 276.2,236.7 192.5,285 192.5,337.1 192.5,337.1 192.5,458.1 342.2,544.5 341,491.8 237,431.7 237,311.6 320.8,263.3 320.8,90.2 171.1,3.8 21.4,90.2'/%3E%3C/svg%3E");
width: 100%;
min-height: 100%;
display: flex;
background: #41658a;
}
p {
margin-right: 0;
@@ -37,7 +41,7 @@ a:visited:focus {
text-decoration: underline;
outline: none;
}
:-moz-focus-inner {
::-moz-focus-inner {
border: 0;
}
#noindex {
@@ -48,14 +52,14 @@ input:not([type="image"]),
select,
textarea,
fieldset {
border: 1px solid rgba(65, 101, 138, 0.3);
border: thin solid rgba(65, 101, 138, 0.3);
}
label {
white-space: nowrap;
}
.sqlarea {
background: #fff;
border: 1px solid rgba(65, 101, 138, 0.3) !important;
border: thin solid rgba(65, 101, 138, 0.3) !important;
width: auto !important;
}
legend {
@@ -73,7 +77,8 @@ input[type="button"] {
margin-right: 0;
color: #fff;
}
.error, .error b {
.error,
.error b {
background: #ae1010;
}
.error b {
@@ -134,9 +139,6 @@ code.jush-sql {
-webkit-box-decoration-break: clone;
-o-box-decoration-break: clone;
box-decoration-break: clone;
box-sizing: border-box;
max-width: 100%;
overflow: auto;
}
th > code {
background: transparent;
@@ -145,46 +147,46 @@ th > code {
color: #fff;
white-space: nowrap;
}
/*
html:lang(en) .version:before,
html:lang(en) #version:before {
content: 'v';
}
*/
#version:empty {
display: none;
}
#content,
#menu {
padding: 0 20px 2em;
#menu,
.rtl #content,
.rtl #menu {
margin: 0;
padding: 0 20px 1.5em;
box-sizing: border-box;
}
#content {
min-height: 100%;
padding-bottom: 3em;
border-left: 20em solid #41658a;
order: 2;
flex: 1 1 auto;
max-width: calc(100% - 20em);
}
.rtl #content {
margin: 0;
padding: 0 20px 3em;
border-left-style: none;
border-right: 20em solid #41658a;
#content,
.footer {
background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 340.6 491.8' width='56px' height='81px'%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='229.9,208.7 170.5,243 111,208.7 111,140 170.5,105.7 229.9,140'/%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='0,305.3 59.5,339.6 59.5,408.3 0,442.6'/%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='342.8,442.6 283.3,408.3 283.3,339.6 342.8,305.3'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='91.6,0 0,52.9 0,0'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='340.6,0 340.6,52.9 248.8,0'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='21.4,264.6 102.8,311.6 102.8,431.7 -1.2,491.8 0,544.5 149.7,458.1 149.1,285.1 68.2,236.7 68.2,116.6 172.2,56.5 276.2,116.6 276.2,236.7 192.5,285 192.5,337.1 192.5,337.1 192.5,458.1 342.2,544.5 341,491.8 237,431.7 237,311.6 320.8,263.3 320.8,90.2 171.1,3.8 21.4,90.2'/%3E%3C/svg%3E") fixed;
}
.scrollable {
overflow: auto;
}
h1,
h2,
#breadcrumb {
position: sticky;
top: 0;
z-index: 1;
}
#breadcrumb {
position: relative;
z-index: 1;
z-index: 2;
white-space: normal;
background: #70a37f;
color: #fff;
padding: 0.1em 2.5em 0.1em 20px;
height: auto;
margin: 0 -20px -2em;
top: auto;
left: auto;
}
.rtl #breadcrumb {
right: auto;
left: 0;
margin: 0 -20px -2em;
padding-right: 20px;
padding-left: 2.5em;
@@ -197,11 +199,15 @@ thead a:visited,
}
h1,
h2 {
margin: 0 -20px 1em;
padding: 2em 20px 0.5em;
border-bottom-style: none;
color: #fff;
}
h1,
h2,
.rtl h2 {
margin: 0 -20px 1em;
}
#h1,
h2 a {
color: inherit;
@@ -212,19 +218,17 @@ h2 a {
}
h2 {
background: #79b473;
position: relative;
}
.rtl h2 {
margin: 0 -20px 1em;
}
#content > form {
overflow: auto;
position: relative;
margin-top: 1em;
}
#content > form > :first-child {
h2 + *,
h2 + .hidden + *,
h2 + * > :first-child,
h2 + .hidden + * > :first-child {
margin-top: 0;
}
h3 {
font-size: 110%;
font-weight: bold;
}
fieldset {
display: inline-block;
}
@@ -237,7 +241,7 @@ input.default {
box-shadow: none;
}
input.required {
outline: 1px dashed #ec5f12;
outline: thin dashed #ec5f12;
outline-offset: 1px;
box-shadow: none;
}
@@ -247,35 +251,33 @@ table {
}
td,
th {
border-bottom-style: none;
border-right-color: #dde5ef;
border-color: #dde5ef;
border-width: 0 thin 0 0;
padding: 0.3em 0.8em 0.4em;
background: rgba(65, 101, 138, 0.02);
}
.rtl td,
.rtl th {
border-right-style: none;
border-left: 1px solid #dde5ef;
border-width: 0 0 0 thin;
}
td a,
th a {
vertical-align: inherit;
}
th {
background: rgba(65, 64, 115, 0.02);
}
td:last-child,
th:last-child {
border-right-style: none;
border-width: 0;
}
thead th,
thead td {
border-right-color: #fff;
border-color: #fff;
padding: 0.5em 0.8em 0.6em;
background: #414073;
color: #fff;
}
.rtl thead th,
.rtl thead td {
border-right-style: none;
border-left-color: #fff;
}
thead th {
text-align: left;
font-weight: normal;
@@ -346,52 +348,26 @@ tbody tr:nth-child(n):hover th {
background: #4c3957 center no-repeat;
background-size: 66%;
}
.icon[src*="plus.gif"] {
.icon[src*="file=plus.gif"] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' width='512px' height='512px' viewBox='0 0 456 456' style='enable-background:new 0 0 456 456;'%3E%3Cg%3E%3Cpolygon points='456,157.566 298.433,157.566 298.433,0 157.567,0 157.567,157.566 0,157.566 0,298.434 157.567,298.434 157.567,456 298.433,456 298.433,298.434 456,298.434' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
}
.icon[src*="minus.gif"] {
.icon[src*="file=minus.gif"] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' width='512px' height='512px' viewBox='0 0 456 456' style='enable-background:new 0 0 456 456;'%3E%3Cg%3E%3Cpolygon points='456,157.566 0,157.566 0,298.434 456,298.434' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
}
.column a[href*="&asc%5B"],
.icon[src*="up.gif"] {
.icon[src*="file=up.gif"] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' viewBox='0 0 490 490' style='enable-background:new 0 0 490 490;' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='M490,474.459H0L245.009,15.541L490,474.459z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
}
.column a[href*="&desc%5B"],
.icon[src*="down.gif"] {
.icon[src*="file=down.gif"] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' viewBox='0 0 490 490' style='enable-background:new 0 0 490 490;' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='M0,15.541h490L244.991,474.459L0,15.541z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
}
.icon[src*="cross.gif"] {
.icon[src*="file=cross.gif"] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' viewBox='0 0 174.239 174.239' style='enable-background:new 0 0 174.239 174.239;' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='M146.537,1.047c-1.396-1.396-3.681-1.396-5.077,0L89.658,52.849c-1.396,1.396-3.681,1.396-5.077,0L32.78,1.047 c-1.396-1.396-3.681-1.396-5.077,0L1.047,27.702c-1.396,1.396-1.396,3.681,0,5.077l51.802,51.802c1.396,1.396,1.396,3.681,0,5.077 L1.047,141.46c-1.396,1.396-1.396,3.681,0,5.077l26.655,26.655c1.396,1.396,3.681,1.396,5.077,0l51.802-51.802 c1.396-1.396,3.681-1.396,5.077,0l51.801,51.801c1.396,1.396,3.681,1.396,5.077,0l26.655-26.655c1.396-1.396,1.396-3.681,0-5.077 l-51.801-51.801c-1.396-1.396-1.396-3.681,0-5.077l51.801-51.801c1.396-1.396,1.396-3.681,0-5.077L146.537,1.047z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
}
.column a[href="#fieldset-search"] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' viewBox='0 0 310.088 310.088' enable-background='new 0 0 310.088 310.088' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='m299.85,250.413l-62.808-62.808c-3.982-3.982-10.437-3.982-14.418,0l-3.539,3.539-18.586-18.586c29.709-42.872 25.472-102.152-12.716-140.34-42.958-42.958-112.606-42.958-155.563,0s-42.958,112.606 0,155.563c38.189,38.188 97.468,42.425 140.34,12.716l18.586,18.586-3.539,3.539c-3.982,3.981-3.982,10.437 0,14.418l62.808,62.808c13.651,13.651 35.785,13.651 49.436,0s13.65-35.784-0.001-49.435zm-251.368-78.895c-33.921-33.921-33.921-89.115-0.001-123.036 33.922-33.921 89.117-33.922 123.037-0.001v0.001c33.922,33.921 33.922,89.115 0,123.036-16.96,16.961-39.239,25.441-61.518,25.441-22.279,0-44.558-8.48-61.518-25.441z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
}
.pages {
display: inline-block;
background: #4c3957;
color: #f39561;
border-color: rgba(255, 255, 255, 0.8);
border-bottom-style: none;
padding: 0.3em;
padding-right: 0.7em;
left: 20em;
margin-left: 19px;
}
.rtl .pages {
padding-right: 0.3em;
padding-left: 0.7em;
right: 20em;
margin-left: 0;
margin-right: 19px;
}
.pages span {
color: #fff;
}
.pages a {
color: #fff;
display: inline-block;
padding: 0.1em 0.4em 0.2em;
}
.loadmore {
margin-right: -0.4em;
}
@@ -399,16 +375,20 @@ tbody tr:nth-child(n):hover th {
margin-right: 0;
margin-left: -0.4em;
}
.pages a:hover,
.pages a:focus,
.pages a:visited:hover,
.pages a:focus:hover {
color: #fff;
text-decoration: none;
background: #ec5f12;
.footer {
margin: 0;
padding-top: 1em;
border-style: none;
-webkit-mask-image: linear-gradient(rgba(255, 255, 255, 0), #fff 1em);
mask-image: linear-gradient(rgba(255, 255, 255, 0), #fff 1em);
}
.footer > div {
background: transparent;
padding: 0;
}
#lang,
.logout {
z-index: 3;
margin: 0;
padding: 0;
overflow: hidden;
@@ -417,14 +397,10 @@ tbody tr:nth-child(n):hover th {
}
#lang {
left: 18em;
z-index: 1;
}
.rtl #lang {
right: 18em;
}
.logout {
z-index: 2;
}
.rtl .logout {
margin: 0;
left: 0;
@@ -466,16 +442,15 @@ tbody tr:nth-child(n):hover th {
background-color: #ec5f12;
}
#menu {
position: relative;
top: 0;
width: 20em;
background: #41658a;
}
.rtl #menu {
left: auto;
right: 0;
width: auto;
flex: 0 0 20em;
max-width: 20em;
}
h1 {
background: #414073;
margin-bottom: 0;
}
#h1 {
font-style: normal;
@@ -500,9 +475,13 @@ h1 {
#dbs span {
display: none;
}
#menu p, #tables {
padding: 0;
#menu p {
margin: 1.5em 0 0;
}
#menu p,
#logins,
#tables {
padding: 0;
border-bottom-style: none;
}
#menu .message,
@@ -551,72 +530,81 @@ button:disabled {
font-weight: normal;
background-color: #414073;
}
#menu .links {
display: flex;
flex-wrap: wrap;
margin: 1em -5px -5px;
}
#menu .links:after {
content: " ";
display: table;
clear: both;
}
#menu .links a {
float: left;
box-sizing: border-box;
width: 48%;
width: calc(50% - 5px);
flex: 1 1 7em;
margin: 5px;
}
.rtl #menu .links a {
float: right;
#logins,
#tables {
margin: 0.7em -20px -20px;
padding: 0 20px 20px;
overflow: hidden !important;
}
#menu .links a:nth-child(even) {
float: right;
#logins:hover,
#tables:hover {
overflow: visible !important;
}
.rtl #menu .links a:nth-child(even) {
float: left;
}
#menu .links a:nth-child(n+3) {
margin-top: 10px;
#logins li,
#tables li {
background: #41658a;
}
#logins a,
#tables a,
#tables span {
background: #41658a;
color: #fff;
padding: 0.2em 0.4em 0.3em 0;
}
.rtl #logins a,
.rtl #tables a,
.rtl #tables span {
padding-left: 0.4em;
padding-right: 0;
}
#logins {
line-height: 2;
}
#tables a.select {
display: inline-block;
vertical-align: middle;
width: 1em;
height: 1em;
position: relative;
width: 1.13em;
height: 1.3em;
overflow: hidden;
background: transparent;
color: transparent;
position: relative;
margin-right: 0.3em;
margin-left: -0.2em;
white-space: nowrap;
padding: 0.1em 0.2em;
top: 0.4em;
}
.rtl #tables a.select {
margin-right: 0;
margin-left: 0.3em;
margin-left: 0;
margin-right: -0.2em;
}
#tables a.select + a {
display: inline-block;
padding: 0.3em 0.6em 0.3em 0;
margin-top: -0.3em;
}
.rtl #tables a.select + a {
padding-right: 0;
padding-left: 0.6em;
}
#tables a.select:after {
#tables a.select:before {
content: ' ';
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' width='512px' height='512px' viewBox='0 0 16 16'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M0 1v15h16v-15h-16zM5 15h-4v-2h4v2zM5 12h-4v-2h4v2zM5 9h-4v-2h4v2zM5 6h-4v-2h4v2zM10 15h-4v-2h4v2zM10 12h-4v-2h4v2zM10 9h-4v-2h4v2zM10 6h-4v-2h4v2zM15 15h-4v-2h4v2zM15 12h-4v-2h4v2zM15 9h-4v-2h4v2zM15 6h-4v-2h4v2z'/%3E%3C/g%3E%3C/svg%3E") center no-repeat;
background-size: contain;
display: block;
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: -0.1em;
}
#tables a.select:hover,
#tables a.select:focus,
#tables a.select.active {
background-color: #ec5f12;
}
#tables a.select.active ~ .structure {
font-weight: bold;
}
#routines + .links a {
margin-right: 0.45em;
@@ -638,22 +626,21 @@ button:disabled {
margin-left: 0;
}
@media all and (max-device-width:880px) {
@media all and (max-device-width: 880px) {
body {
padding-bottom: 2em;
}
#content {
min-height: 0;
border-left-style: none;
}
.rtl #content {
border-right-style: none;
body,
#content,
#content > form:last-of-type,
#menu {
display: block;
}
.rtl #content,
.rtl #menu,
#content,
#menu {
/*! margin: 0; */
max-width: none;
padding: 0 10px 2em;
width: auto;
}
@@ -665,6 +652,8 @@ button:disabled {
overflow: auto;
position: static;
white-space: nowrap;
width: 100%;
box-sizing: border-box;
}
.rtl #breadcrumb {
padding: 0 10px 0 0;
@@ -690,13 +679,6 @@ button:disabled {
-o-box-decoration-break: clone;
box-decoration-break: clone;
}
.pages {
position: static;
margin-left: 0;
}
.rtl .pages {
margin-right: 0;
}
#lang {
margin-left: auto;
position: relative;
@@ -709,4 +691,9 @@ button:disabled {
margin-left: 0;
margin-right: auto;
}
#logins,
#tables {
margin: 0.7em -10px -10px;
padding: 0 10px 10px;
}
}

View File

@@ -0,0 +1,202 @@
/*
VERSION: mancave-hever1-27.1.alpha
*/
/* Merged and fixed version of Hever's and Frank Bueltge's skins by Oguz KONYA. I liked Bueltge's skin but I wanted the icons, too.
So I merged them into one file, fixed a couple of problems, added some paddings here and there, voila! */
/* Redesigned (iconized) by Hever [hev.cz] - June 2009, ver 0.1.3 */
/**
* * Alternative style for Adminer by Frank Bueltge
* * @link http://bueltge.de/
* */
/* Added icons */
/* IE doesn't support inline images - using some hack that eliminate IE*/
html/*\*/>/*/*/body .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;}
html/*\*/>/*/*/body .message, #menu p.message {background:#49526D 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;}
html/*\*/>/*/*/body a[href$="sql="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHGSURBVHjaxFPNLkNREP5aB6WhaKLSVtKFiIUqK1sLT2DhTXgDL2FlxSOw8FOLRiyQWhDRiKSEhKQJou49P9fMnFsLsevCJCcz594z3/m+mTmJKIrQjSXRpXUNoGqbm39qcMbAkbyIvbVwYQhD3tIeWsOQ1+QVH86Xyz+JXJPIOb9iAI4ZpOMd/yN/vb/vAdiC93cP0El2dNA6z4RjYyW2MaPU0BB0u+0BOGGsVML49LSA3J+cYDCblb0l6jeHBwg/26isrOB0a8uzYBlBgKShgD8M53J4aTTQqFaRSCYl+WxnG83zcxTmKpKg+vtFu9W8NDQDMCXW+VivYyAzjKmlJahUSpiYUKPVbCKTz0sCGzOyOpBLzdcXlCMdDDIxO4vboyoyhQIKlYocLi0uIjczIyBcA98dYqx9NywxUEyDi/P29IyF1VU5dFeroS+dRnF+Xvajk5N0ayjx8tq6+FuSyiwUF4LRHi/reLg4o9ijs6xG9RjWGowUi/h4fcXexoa0L4oc0mNZuVgFzID09VKBnFXoUb7Pnb5zQrvVovpkZC4QzwfiN6QM1eBqdxcmnq6IAA395Mlz8eTxTZwg/pcl/v01fgswAESqYZbsIsnLAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;}
html/*\*/>/*/*/body a[href*="dump="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJrSURBVHjajFPPaxNREP72V8ymTbGQbRB/IT0otdV6CcWTgqCoUFQQEXoSEQ/+AypK755E1KsULIpGgw1F9KC22lgstFgQLdoWhSab2PRHTNrs7nvObGhSsRa/ZXjv7c6b+eabWUVKiX9AJQuRRci2k+260N91VwgJIQSEV1mVnjf5axTjvCfFFn7hCcBlBzJNVRA0gAZTQ1ODgXC4gDtjV9AW2QNFUTA0/Q66kPLSqVg4shYF8vEdKQ7mln+i+/VVRM0oFpbmETLq/SS6J4R/OfHtHmV24XouHFo94REDAyE9hMZgBMkvT2GZFqxQE6by0/g4P74SoKLB2ZZzWA8ffqRQLBcxNTuFjRTwxpmbfad7Oo/rHhdN6B20/6JvaKyBCnODhqNbL+PRxHXUGXWINV5kl9TDrkQct/pnZKHkyPsDGcl4MJiWq5Ecsf84LxTL8nbyK2+Pke3XHWJAQkLXgMdDNjRNRTxlQ6UmakRD0vN8NEd7EBsFO6Impu1fzGCCrOSXwCro5HEiZiExnEVnrKlaypNhG4fba02aTC8ik1/ibZrM9RlIkkGnjH0jWWJQWRn8TpLI8fcZ6MSA1WrZFERx2eHPTEPqjksBqASDLh7ZZ+HlWA6H9tYyvhjNomNnI8Km7p8/f5+HGdB46/lJeOoYPHV8mbGy8gA59HngU74asNkKYKVzlQCuW9GA6B5si+DVeA4HWmsM4qksTnZY1TMz0NRauysaUAmt2+oxM1tCM6k8mS74WXjIdm8O+JdWg36oKgXqgnzb3TvRXvZEneN6YPNIFw7MY70W5haXnlUHbp3f+b/wW4ABAAtWTLcKdqLcAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
html/*\*/>/*/*/body a[href$="dump="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHzSURBVHjajJPPS+NQEMcnaaxpdWsp6Q8vtWtdkIo9+B948SjIgruCUg8F/wGP/glePe5JcBehwl4qePGm0J6KQj30UBHEzaFLUromTfPizJMnrxhhB4bJvDfzme97SZQgCOB/be98J2AsAMYYMP81KjKg0WhMYljHtS30RSz4gjkGdot559F7OLt8vvi1bJRBURS4vr8CTTQ3m80SFv1MpVJlwzBA13XuNGUwGKyY1p+Vk9aPzWw8C7ZjQXximu+9ATA5KhQK5Uwmw+nCIpEIJBIJOLjah3Q8w7379x5urFsOUEUhTl/C6R+ef35mARzPhW6vC+q/iHvyvaYwXwIQje6j1+tBv98H13VhNBpxxyPA5tw2TI50MPQsrMbXbOo53fmtaJIC7iSZAMPhkOe+73MA5Ruz3yCfz9NlvykLBUSjUR41TQPP8zhE7JNSyj8E0CbJpkiXKRoIRFABeQcQd0DFwlVV5evUTFBZRSiATEwnp4lCAa0LI2AoQC4WimRl4qgyYOw12rYNyWSSX6L4mKiBnukDK5VKYJrmmBpZwW6r1TotFotTuVyOQwQgnU7zV9npdKDdbj+hgnXRN/Yz1ev1zwg6QP+KU2disRiXblkWOI7zhJOPce+wWq2aoQDZarXaJ2xYQGfod5VKxQ2rexFgAI4OiAKxKkWeAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
html/*\*/>/*/*/body select[name="db"] {background:white 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:16px; background: #49526D;}
html/*\*/>/*/*/body select[name="db"] option {padding-left:18px;}
html/*\*/>/*/*/body #menu li a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll left bottom; clear:left; display:block; float:left; height:16px; margin-right:8px; padding-top:1px; overflow:hidden; padding-left:16px; width:0; text-decoration:none;}
html/*\*/>/*/*/body #menu li a[href*="&table="], html/*\*/>/*/*/body #menu li a[href*="&view="] {clear:right; margin-left:24px; display:block; height:17px; padding-bottom:1px; text-decoration:none;}
html/*\*/>/*/*/body #menu p#tables br {display:none;}
html/*\*/>/*/*/body a[href*="&create="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ6SURBVDjLpZNZSNRRGMV//2XGsjFrMg2z0so2K21xIFpepYUiAsGIICLffI8eWiBBeg3qQV+KwBYKLB8qpHUmrahcKLc0QsxldNSxdPz/79LD1ChBUXTh8sG93POdc75zDa01/7NsgGvPR09rzQmpVZZSCqlAKIWUCqk0QqoZWyKFRir1uvxIbsAGUFqXHQqkpP1L57M3Pm5MMJBKpQHUdF9BKIGQAlcJXOlOVykSdye3leO6MmkGQNyHw+uO/1X3bzGBK+S0B1IqAKqDg3986HeCZPffwvJtoNT7lOZLvUdtAPEDAKBkRzo3QwMUb89InN1uGGD3spdE214xe8MRUnM2MfppNW0Pqy7YAK5UKK2xLbhdP4hlmdxpGMQwwQT8ziNiI534c7cT6WrFazikzF2Eb8HS1IQEDdiWwcHAQmpehTkQSAcgNvSMiYFW5uUUMdV3HW+ywefGNqITJsbUUL75k4FWYJtQ+yaMZcXrk1ANk/33mbdiD7EvlRieETy+FJLkMFcjRRSW3emIAwiF1hqPBfu2LGSWbbA1uZ41SfWkrtxPrPcypsfFiWYzFGzGKTjFV28WEJeIUHETLdOgrmkI1VdHpCdEet5enP4qLK9mKrqMgedv6cyrAP+qxOTiUxAi7oEJi8frELoFoTLpa7nI/HQvscgSRt+0kV1SSW7qYtp7xrBMphm4Mi5h/VIfTcEq1u0oJaknSEdNiMYHET7UvcMpPEN31Ed7zxgASmk1I0g6dK66s8CRak5mVxjnfS05+TsZCw/T9baTx1nnGb47DrQksjE6HrsHYPz6nYt3+Sc3L8+wA2tz0J6pF5OD4WP7Kpq7f5fO79DfSxjdtCtDAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
html/*\*/>/*/*/body a[href$="&create="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIpSURBVDjLpZNPSFRRFMZ/749/Kt3IqFTSRoSMmrGIYTTbpEJtjBCCok1Em9JVG1dRC8FFEES5aGFEgRRZWq1iLKKxBiNqLDcltQgmHR9hY6LOu+feFm+YGVsZXbh8nHO53/nud8+xjDH8z3IB7r5avGgMZ8XoBq01okFpjYhGtEGJLtmCKINo/XbgVFPUBdDG9PVEq0P/UvnSvdlwQYFoHQIY/3obpRVKFL5W+OIXUVThrL91AN+XihKCwIeTu85sqPryqsJXUvRARAMwkshsiKB7fw25UgKVJwA40V7H/cl5jh+oL+RGk/P0xIqxl11dr8AXjTYG14HRNxkcx+ZhMoNlg52/ND6VAWMoc6F5+2Zy/l9PMIDrWByL1jI+tcDRaN06BaXxbDqLUnq9AqPBteHpuwUcJ0AIcgBXH93h+/wEyyuLrPk5cmv7gNY8gdIYYyhz4PDeWuIpj85IsS2ujQ2zJAk6DkZpqGnixcwYyU+PifUOX7Eh6DoAx7aIpzwA4imPeMrj+bTH+88PaNkZQWwhsrULsXxie9oAzgcESgUe2NAZCeE6AXZGQhwKh/Cyc5RZVXQ39wFwoeMmjXVhgMqiB8awe0cVP36u0Fi/iW9zvwuzkF3+xUz6Nal0gv6uWww+O02lUwGwmv8FM3l55EtLTvQWXwm+EkRpfNEoUZRXHCE5PUFbuJ0nH4cot1wSH14C3LA2Os6x3m2DwDmgGlgChpLX0/1/AIu8MA7WsWBMAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;}
html/*\*/>/*/*/body #content p a {padding-left:2px;}
html/*\*/>/*/*/body #content p a[href*="&create="] {padding-left:22px;}
html/*\*/>/*/*/body #content p a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;}
html/*\*/>/*/*/body #content p a[href*="&page="] {background-image:none; padding-left:0;}
html/*\*/>/*/*/body #content p a[href$="?database="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIkSURBVDjLpVNNiFJRFP7eU1E0KSLTMpAwYSxyaidDtChm0WYQ3NSutv2s2kwwm2igNgMtooUQEQhhA9GqhSDTQsZZFDbNDBgVg5bSw9J8rzFF33udc+HGg0ladOHj3nPe+b7zc99VbNvG/yy30yiVSl4SnCNcsixrivYEgY7WJu0faX9EKGUyGVNyFFkBkY/T+WkoFEpFIhEEAgH4/X7w916vB8Mw0Gg00G63y+S7mM1mm4LIAYxisbhSr9c5nT1pjUYju1qt2oVC4YnkqbIUMk6Ew+F/9hyNRkFJLuyaATmFoqZp8Pl88Hq98Hg8wtfv99HpdNBsNhGPx0XsRAG3241ut4vBYCDs8XgMXdcxHA7FN/b9VUD25HK5RAUczKC+hYgcNpNN05xcAQdLkqIoIlj6VFWdXIEUkAQGV8M2k2vaG3z6sYGfVR39XzsHlm/dX3h5d31xlwAHM5goBd5+LuO75z3OnU3jyP4EVrZeKGub2p309cP7VKcAQ2Znoiz3deMVTk1Nw1RNTB+ahamMkD45w7RrfwSYwFdFf6K4Quf6pmvwKHswl7wh7Jvnc4gfTPHR52zhcqVSeZZMJgOxWEyI8BC5CmOnh63WKtZbZczPPsa94hX4XCLJQHG+xnw+f5SEFghZmvhefgvcTqn2HN3gBmZSZ5CInMaHr1Wsvivjy3ZvSZn0nHO5XJDIxwgWDbW2vL10m9xXCUGCQXi49qA1/xvyq6BCh7yZeQAAAABJRU5ErkJggg==") no-repeat scroll 2px bottom; padding-left:22px;}
html/*\*/>/*/*/body #content p a[href*="&edit="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJvSURBVDjLpZPrS5NhGIf9W7YvBYOkhlkoqCklWChv2WyKik7blnNris72bi6dus0DLZ0TDxW1odtopDs4D8MDZuLU0kXq61CijSIIasOvv94VTUfLiB74fXngup7nvrnvJABJ/5PfLnTTdcwOj4RsdYmo5glBWP6iOtzwvIKSWstI0Wgx80SBblpKtE9KQs/We7EaWoT/8wbWP61gMmCH0lMDvokT4j25TiQU/ITFkek9Ow6+7WH2gwsmahCPdwyw75uw9HEO2gUZSkfyI9zBPCJOoJ2SMmg46N61YO/rNoa39Xi41oFuXysMfh36/Fp0b7bAfWAH6RGi0HglWNCbzYgJaFjRv6zGuy+b9It96N3SQvNKiV9HvSaDfFEIxXItnPs23BzJQd6DDEVM0OKsoVwBG/1VMzpXVWhbkUM2K4oJBDYuGmbKIJ0qxsAbHfRLzbjcnUbFBIpx/qH3vQv9b3U03IQ/HfFkERTzfFj8w8jSpR7GBE123uFEYAzaDRIqX/2JAtJbDat/COkd7CNBva2cMvq0MGxp0PRSCPF8BXjWG3FgNHc9XPT71Ojy3sMFdfJRCeKxEsVtKwFHwALZfCUk3tIfNR8XiJwc1LmL4dg141JPKtj3WUdNFJqLGFVPC4OkR4BxajTWsChY64wmCnMxsWPCHcutKBxMVp5mxA1S+aMComToaqTRUQknLTH62kHOVEE+VQnjahscNCy0cMBWsSI0TCQcZc5ALkEYckL5A5noWSBhfm2AecMAjbcRWV0pUTh0HE64TNf0mczcnnQyu/MilaFJCae1nw2fbz1DnVOxyGTlKeZft/Ff8x1BRssfACjTwQAAAABJRU5ErkJggg==") no-repeat scroll 2px bottom; padding-left:22px;}
html/*\*/>/*/*/body #content p a[href*="&table="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJcSURBVDjLpZPtT5JhFMafrW997I9rscA+FFu2QRurtlw5cQ4InLpwBogIPNFSiNJ4C+JVkj0QTBHQKFPQlJfwlanY1tXz3ARkn2jd27Wz++yc33XOvd0UAOp/RNGR/X5zeH9rOlTDVKAK3fsqJrxlqN27GHPuYHh+G4rXRQzZNjEws47Hli/oo/PxNsAU3qvWT3/gX3TPuHrWBhiC30nSktXDtKLB1NI4NKkxqBMqjDByPFkcxNBCPwbCfXgUeEBq705m0AZM+qsk2e3hau88W+4ANOy+XPLFQrkrcbW31KkOYJx9rBaAOzPR0gVHW6x593q9cDgcqB6e4sZoogMYdXzD0ck5ZhfLsHGKVfAqVoadKcMdzcLr82PuwwZCoRACgQCWVzdhoK2gaVpDAMNzWzhkAXamQpze/I4t13w+j2AwiFwuh7W1NXg8HmQyGSgUCshkssuU3F7AQf0c84kK3n68KFc4hXQ6DavVCqlUCqVSSdaIx+NQq9UGMsHg7Ab2jxtwp5rOvqUqia3CUqnEObWn0mp1KBaLcLlckMvloPpfrhOAl230/SGLxQK3241CoQC9Xg9nskKk1emQzWZZkBZCoRBU3/NP2GMBgXTTObjSjI1GA8lkEgzDwO/3E4iObXY6nYhEIhCJRHoWcIW6b1pF7egMlYNT7NROUKzU8XX3GJ+3D2E0GgmAm4Zbh2s0mUyIRqMcAGKx+BIlMeSiYu1K/fbEMm4+TaFnJIHrSgZX5TFIZNPo7e1Fj9QOs9kMlUqFaw9pCASCnzwe7x15xG6/rUQiAZ/Px9/5XyhZOMVGKlOdAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
html/*\*/>/*/*/body #content a[href*="&database="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKRSURBVDjLhVNLTBNRFD3TTju1FCcBaxuaQEr94ydiZIHGpcFISBOi0YREZWHCVoyRxKUxxq0LXcACQyLsjO6KjSEiDfHDz0S0CLSxlFKd2g7MTDudGd+bMAQCxJucuXfuu+fcO/PeYwzDALVoNMqRuI3guq7rR4g/SEBC/Svxc8T3EUTD4bCGTcZQAUI+RvxLr9d70u/3o6KiAm63G3Qtn89DFEUkk0lks9lRkrvW3t6e2lCgRZFI5F0ikaDtjN1MVVVjYmLCGBoa6qccC7Z1kQafz4f/WSAQAGlyaXOOpQ+SNNUymQxcLhc4joPD4TBzkiRBEASkUimEQiGzdlcBlmWRy+WgKIr5Xi6XUSgUUCwWzTVN+IAzeOOde71orP0eAaOkbrDWf6Cw2+3mBLSYgny3KULXPOUY2BUB/hMd4IOn8XfhMGYjvU+2TECLLRLDMNA0zYw5JYa6Ghke/hyEn9/gZEqo3OuHp7qW3yJgESjoNPSdlb8gWCOCr29BMT0Ip5tBYnIWqlL6o8irzVsEaHcKSqQCen4cweok+FAblNRz2JxlODx1cEkzGWmVbTl7Z/jHhgCF1Z3GYjIKf+U8+ANhQn4Gm6OMUiGI9MhHg5Gl1sbu8UnKNc8B7Ui3ipxEcwvlpVFw6hz2N1xGabkXdqeBYqEOmfefEZWac4e6xz9Z22hbn+BmLBZbi8fjEBdG4NF/QdUDSM88hQ4FawKJR6cxLDZl86qzZdtdoDYwMBAkQg/2LL/ovNLVh++Dd7G0OAau9hTkrKgnnE39GW3f/Z6enpUdBSx7ePu4eq+zi4VNw+TbV0gsxFd5b9X5i4+mpnY63tsErl6okhvrfWzT0SAMR3FMXsnean08Pb/b/fgHqpjCspi90kkAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;}
html/*\*/>/*/*/body #content p a[href*="&schema="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFOSURBVDjLtVK7SgNRED0b9iuM2lr4QK1DQIyk0FZsJAj+gH+ilRZb2NjaRHTLmA9QFKz9huzm7t37Hu+u7IJgQjR6YLjDzOXMmcMERIR5EE5qXA4z4sqACYWEC5wfLQXf/WtMIuDSoL0A7DZDjBj/uYI0l8jzEEJYJMkvCEZM4PqZIxlzpGk+kSCY18TGtGYcx9Tv96dOqBUMBgNyzsFaC621312Ac+59yJFlGRhj5VvVoigKvniglEK32w1mkd3r9ejPPAjOhqdknYX18p1/rzo3pYqTh0OSRkJI5UMgPn4s61sX66SkhtEGcISGsQad5gH2FvehfV5BaIF2cwet5RZyKeu68pe5ubKG7dUNP5AQGltMN57Mosgr5EIiVQmYGvtc1PVicqHY+dXpk8Dg7v22XKFo1ARe9v1bDOlXKKKCs4Sn1xdU1v3vIc2CD3bN4xJjfJWvAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
html/*\*/>/*/*/body #content p a[href*="&sql="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ5SURBVHjapFNLaxNRFP4mnZmQZtKYpJ2I8ZE0NSbSWKpgBYNUhIJQUDddCaILwb34C0RcCi60vpa14sZFoSjxUWxTFEubFkxf9kFS+7Jp0yQmM5mH905SF9pSwQt3vnPnnvPNd86cA13Xsds+23XKsdMdQx//s0z/6hi54he3e8/0d3ZuK0FTFGhUJkVVhSbLUAiq5IxSCQrBEkGWOu8Lh38HGrlpWnlXCKhNSbZQo3cEE9FomYAuKZstE2wFa8RR1cpKqK2o4JhxmLVJVAlh5Df6IFj5MgENcHq9EAMBg2RucBDVLpdxVon0iXdvIf8sQHRIsNReht3XjI3ZI8iuPAOrkDyorBq3G6vT08ikUuAsFiN46HkXXL56eI41QV1/BMF+GulvCfCMDFvNXtSIHrC0KDTPhXgc7lAQdQ2thk2XIpewnkzCJvTA4T8PabEbfDWD+ZFxyEUdX94sw6QVCkZlxWAQU+8/YGZgALV+v0HgbWmBNzQMR0M7it8fg+HWwQk2cLkkcvJh5NNFsCVJMgq1ubiE5o4OI5CS8FYrya8b9saLKC48gIlTIG/6sBaLw3PpHrTEMrSXr4kPIaAKFkbjSA0PEVuFlB+DO8Ah2HoB8tITVPE6iplDWOn7jLn0CSQevoDV6TI+zEpUASkkZzaTYrLIrH3C/qMCFEbE4th9OEQexfQBrPYP44d+DuY91eBp+1dGgFVIDb729kKpdJfQtIy2yFNMdN/E5McYzAebUEhOYjZuQXaj5+9W/nOYbl9vLN26doOFScVI9BXmZ6dy9jpnpO1O5dfsRtBxxlk4Xu9mT4Z80DkpVlhZvdp+d3RmpyH7JcAAnHiAVYWMsdkAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:24px;}
html/*\*/>/*/*/body table tbody input[name*="check"] {display:block; float:left;}
html/*\*/>/*/*/body table a[href*="&edit="][href*="&where"] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC") no-repeat scroll right bottom; padding-right:18px;}
html/*\*/>/*/*/body table input + a[href*="&edit="][href*="&where"] {width:0; float:left; display:block; height:16px; overflow:hidden; text-decoration:none; padding:0 0 0 18px; background-position:2px bottom; margin-left:5px;}
html/*\*/>/*/*/body table tbody td:first-child {white-space:normal;}
html/*\*/>/*/*/body table thead input {margin-right: 5px;}
html/*\*/>/*/*/body input[name="delete"], html/*\*/>/*/*/body input[name="drop"] {background:transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHSSURBVHjapFM5bsJQEB2zSIDFJrHYpEtyAyoKJAp6CrqIkBPkNDlBAKXjBEgUpKOBCyQNijFiEZvZl8z7wsjESYpkpNFfPO/Nmz9j6Xg80n/M9fWi3W7fMOnd4XAo8qogAbvO5xKvL6lU6s0aL1kVMDjP5ye/36+Gw2FyOp3EQFqtVtTr9WixWHT5/JhOp6s2ghP4ORaLyaFQiGazGa3Xa0HgdrvJ6/WSpmk0Go0MjnvIZDLVM0Gr1brm/WskEkkA3O/3abvdQjq5XC6xgoiVka7rNB6PNT6ns9nsu+OkpODxeBLBYJAGgwHt9/uzQ8Vms6Hdbie+KYqC+ASTFrARBMx2HwgEaDKZiHqn0yktl0uxtzrMMAyKx+MCc+4Cs13hwQCC1GQy+W3Lms2mUIUygbEqEBLNun8z8zswVgUfLO0WD4Z6kekn8/l8okNM8GFVUMYDoVWQ6HA4bEAzoyzL1O12kbRsJajwhYZhiUajJEnShWSAQaqqKnU6HahEGysXg9RoNPJ8+cwZZLSKp47m8/k5Kxzg4XBocNxDLper2ka5Xq+LUeatilahJLN1mEJ+ZDHKJthGAKvVauJnYi9ysHIqQee1xOsLg3/+mf5inwIMAJMhb74NwG5wAAAAAElFTkSuQmCC") no-repeat scroll left center; padding:1px 5px 1px 18px; border:0; cursor:pointer; font-size:.9em;}
html/*\*/>/*/*/body input[name="delete"]:hover, html/*\*/>/*/*/body input[name="drop"]:hover {color:red; background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJdSURBVDjLpZP7S1NhGMf9W7YfogSJboSEUVCY8zJ31trcps6zTI9bLGJpjp1hmkGNxVz4Q6ildtXKXzJNbJRaRmrXoeWx8tJOTWptnrNryre5YCYuI3rh+8vL+/m8PA/PkwIg5X+y5mJWrxfOUBXm91QZM6UluUmthntHqplxUml2lciF6wrmdHriI0Wx3xw2hAediLwZRWRkCPzdDswaSvGqkGCfq8VEUsEyPF1O8Qu3O7A09RbRvjuIttsRbT6HHzebsDjcB4/JgFFlNv9MnkmsEszodIIY7Oaut2OJcSF68Qx8dgv8tmqEL1gQaaARtp5A+N4NzB0lMXxon/uxbI8gIYjB9HytGYuusfiPIQcN71kjgnW6VeFOkgh3XcHLvAwMSDPohOADdYQJdF1FtLMZPmslvhZJk2ahkgRvq4HHUoWHRDqTEDDl2mDkfheiDgt8pw340/EocuClCuFvboQzb0cwIZgki4KhzlaE6w0InipbVzBfqoK/qRH94i0rgokSFeO11iBkp8EdV8cfJo0yD75aE2ZNRvSJ0lZKcBXLaUYmQrCzDT6tDN5SyRqYlWeDLZAg0H4JQ+Jt6M3atNLE10VSwQsN4Z6r0CBwqzXesHmV+BeoyAUri8EyMfi2FowXS5dhd7doo2DVII0V5BAjigP89GEVAtda8b2ehodU4rNaAW+dGfzlFkyo89GTlcrHYCLpKD+V7yeeHNzLjkp24Uu1Ed6G8/F8qjqGRzlbl2H2dzjpMg1KdwsHxOlmJ7GTeZC/nesXbeZ6c9OYnuxUc3fmBuFft/Ff8xMd0s65SXIb/gAAAABJRU5ErkJggg==")}
.logout {font-size: 8pt !important;}
#logout{ height:17px; border: none; background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJHSURBVDjLlZPNi81hFMc/z7137p1mTCFvNZfGSzLIWNjZKRvFRoqNhRCSYm8xS3+AxRRZ2JAFJWJHSQqTQkbEzYwIM+6Yid/znJfH4prLXShOnb6r8/nWOd8Tcs78bz0/f+KMu50y05nK/wy+uHDylbutqS5extvGcxaWqtoGDA8PZ3dnrs2srQc2Zko41UXLmLdyDW5OfvsUkUgbYGbU63UAQggdmvMzFmzZCgTi7CQmkZwdEaX0JwDgTnGbTCaE0G4zw80omhPI92lcEtkNkdgJCCHwJX7mZvNaB0A14SaYJlwTrpHsTkoFlV1nt2c3x5YYo1/vM9A/gKpxdfwyu/v3teCayKq4JEwT5EB2R6WgYmrs2bYbcUNNUVfEhIfFYy69uci+1fuRX84mkawFSxd/4nVWUopUVIykwlQxRTJBTIDA4Pp1jBZPuNW4wUAPmCqWIn29X1k4f5Ku8g9mpKCkakRLVEs1auVuauVuyqHMo8ejNCe+sWPVTkQKXCMmkeZUmUZjETF1tc6ooly+fgUVw9So1/tRN6YnZji46QghBFKKuAouERNhMlbAHZFE6e7pB+He8MMw+GGI4xtOMf1+lsl3TQ4NHf19BSlaO1DB9BfMHdX0O0iqSgiBbJkjm491hClJbA1LxCURgpPzXwAHhg63necAIi3XngXLcRU0fof8ETMljIyM5LGxMcbHxzvy/6fuXdWgt6+PWncv1e4euqo1ZmabvHs5+jn8yzufO7hiiZmuNpNBM13rbvVSpbrXJE7/BMkHtU9jFIC/AAAAAElFTkSuQmCC") no-repeat center left; overflow: hidden; text-indent: 18px; line-height: 0px; cursor:pointer; margin-left:6px; color: #21759B; text-decoration: underline;}
#logout:hover {text-decoration: none; color: #D54E21;}
#logins a, #tables a {background: none repeat scroll 0 0 transparent;}
/*body {margin: 0; line-height: 1.25em; font-size: 13px; background: #F9F9F9;}*/
body {margin: 0; line-height: 1.25em; font-size: 13px; background: #110236; color: #fff;}
body, select, option, optgroup, button {font-family: "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif;} /* IE6 */
input[type='submit'], input[type='reset'], input[type='button'], input[type='file'] {font-family: "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif;}
input, textarea, pre, code, samp, kbd, var {font-family: "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif; font-size: 12px;}
/*a {color: #21759B;}
a:visited {color: #21759B;}
a:hover {text-decoration: none; color: #D54E21;}*/
a {color: #F1E5B3;}
a:visited {color: #F1E5B3;}
a:hover {text-decoration: none; color: #D68D20;}
form {margin: 0;}
table {margin: 10px 12px 12px 0; border: 1px #BBB solid; font-size: 90%;}
th {text-align: left;}
/*td, th {background-color: #fff; padding: 4px 6px; border: 1px #DfDfDf solid; border-width: 1px 0 0 1px;}*/
td, th {background-color: #1D294D; padding: 4px 6px; border: 1px #DfDfDf solid; border-width: 1px 0 0 1px;}
tr:first-child td, tr:first-child th {border-top-width: 0;}
tr:first-child th {padding-right: 30px;}
td:first-child, th:first-child {border-left-width: 0;}
/*thead td, thead th {background-color: #DFDFDF; border: none; border-bottom: 1px #BBB solid;}*/
thead td, thead th {background-color: #110236; border: none; border-bottom: 1px #BBB solid;}
thead tr:hover td, thead tr:hover th {background-color: #110236 !important;}
/*tr:nth-child(2n) td, tr:nth-child(2n) th, .odd td, .odd th, tr.odd {background-color: #F1F1F1;}*/
tr:nth-child(2n) td, tr:nth-child(2n) th, .odd td, .odd th, tr.odd {background-color: #49526D;}
/*tr:hover td, tr:hover th {background-color: #BCD;}*/
tr:hover td, tr:hover th {background-color: red; /* #3D4E80;*/}
/*fieldset {display: inline; vertical-align: top; padding: 2px 12px; margin: 25px 12px 12px 0; border: none; background-color: #F1F1F1; border: 1px solid #E3E3E3; position: relative; padding-top: 14px;}*/
fieldset {display: inline; vertical-align: top; padding: 2px 12px; margin: 25px 12px 12px 0; border: none; background-color: #1D294D; border: 1px solid #E3E3E3; position: relative; padding-top: 14px;}
fieldset, x:-moz-any-link {padding-top: 4px;}
fieldset {%padding-top: 14px;}
legend {font-weight: 900; color: #fff; position: absolute; top: -1.666em; left: -1em; padding: 0 4px;}
input[name='limit'], input[name*='length'] {width: 3em; xtext-align: right;}
input[name='text_length'] {width: 5em;}
select + input, select + select {margin-left: 2px;}
/*textarea, input, select {border-width: 1px; border-style: solid; -moz-border-radius: 4px; -khtml-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; border-color: #DFDFDF;}*/
textarea, input, select {border-width: 1px; border-style: solid; -moz-border-radius: 4px; -khtml-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; border-color: #5C5C5C; background-color: #49526D; color: #ccc}
input[type="checkbox"], input[type="radio"], input[type="image"] {border: 0 none;}
/*input[type=button], input[type=submit] {border-color: #bbb; color: #464646;}*/
input[type=button], input[type=submit] {border-color: #999; color: #fff;}
/*input[type=button]:hover, input[type=submit]:hover {color: #fff; border-color: #666;}*/
input[type=button]:hover, input[type=submit]:hover {color: #fff; border-color: #fff; background-color:#49526D;}
input[type=button], input[type=submit] {text-decoration: none; font-size: 11px !important; line-height: 14px; padding: 2px 8px; cursor: pointer; border-width: 1px; border-style: solid; -moz-border-radius: 11px; -khtml-border-radius: 11px; -webkit-border-radius: 11px; border-radius: 11px; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; -khtml-box-sizing: content-box; box-sizing: content-box;background-color:#49526D;}
input + label input, select + label input {margin-left: 4px;}
td input[type='checkbox']:first-child, td input[type='radio']:first-child {margin-left: 2px;}
label:hover {text-decoration: underline;}
fieldset div {margin-bottom: 2px;}
input[name='Comment'] { /* !!! */ width: 24em;}
input[name='Auto_increment'] { /* !!! */width: 6em;}
img {vertical-align: middle; margin: 0; padding: 0;}
.error {padding: 8px; color: red; background-color: #FEE;}
/*.message {padding: 8px; background-color: #DDD;}*/
.message {padding: 8px; background-color: #49526D;}
.char {color: #070;}
.date {color: #707;}
.enum {color: #077;}
.binary {color: red;}
/*.jush-sql {padding: 2px 4px; margin-right: 4px; outline: 1px #BBB dashed; font-size: 9pt;}*/
.jush-sql {padding: 2px 4px; margin-right: 4px; font-size: 9pt;background-color:#49526D;}
.jush a {
color: #B4D5FF !important;
}
.jush, .jush-bac {
color: #fff;
}
#content {margin: 2px 0 0 300px; padding: 10px 20px 20px 0;}
#lang {height: 23px; width: 250px; display: block; padding: 1px 10px; position: absolute; top: 0; left: 0; text-align: center; background-color: #f1f1f1; border: 1px solid #E3E3E3; line-height: 1.25em;}
#lang select {font-size: 8pt;}
/*#breadcrumb {margin: 0; height: 21px; display: block; position: absolute; top: 0; left: 300px; background-color: #f1f1f1; border: 1px solid #E3E3E3; padding: 2px 12px; line-height: 1.25em }
#menu {position: absolute; padding: 10px; margin: 0; top: 28px; left: 0; width: 250px; background-color: #f1f1f1; border: 1px solid #E3E3E3;}*/
#breadcrumb {margin: 0; height: 21px; display: block; position: absolute; top: 0; left: 300px; background-color: #000; border: 1px solid #E3E3E3; padding: 2px 12px; line-height: 1.25em; color:#ccc; }
#breadcrumb a {
color:red;
}
#menu {position: absolute; padding: 10px; margin: 0; top: 28px; left: 0; width: 250px; background-color: #110236; border: 1px solid #E3E3E3;}
#menu form {margin: 0;}
#menu p {padding-left: 8px; font-size: 10pt; border-bottom: none;}
#menu form p {padding-left: 0; text-align: left;}
h1 .h1:hover {text-decoration: underline;}
/*h1, h2 {font: italic normal normal 24px/29px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; margin: 0; padding: 14px 15px 3px 10px; line-height: 35px; text-shadow: rgba(255,255,255,1) 0 1px 0px; background: none;}*/
h1, h2 {font: italic normal normal 24px/29px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; margin: 0; padding: 14px 15px 3px 10px; line-height: 35px; /*text-shadow: rgba(185,185,185,1) 0 1px 0px;*/ background: none;color:#A3A3A3}
h1 {font-size: 12px;}
h1 .h1 {font-size: 12px;}
h2 {padding: 22px 0 0 10px;}
h3 {margin: 40px 0 0; font-weight: 400; font-size: 130%;}
#schema {margin: 1.5em 0 0 220px; position: relative;}
/*#schema .table {border: 1px solid #E3E3E3; background-color: #F1F1F1; padding: 0 2px; cursor: move; position: absolute;}*/
#schema .table {border: 1px solid #E3E3E3; background-color: #110236; padding: 0 2px; cursor: move; position: absolute;}
#schema .references {position: absolute;}
.js .hidden {display: inline;}
.js td.hidden, .js input.hidden {display: none;}
legend a {color: #F1E5B3; text-decoration: none; cursor: default;}
legend a:hover {color: #333;}
code {background: transparent;}
fieldset, legend, h2, table, .error, .message {-moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px;border-radius: 5px;}
#breadcrumb, #lang, #menu {-moz-border-radius-bottomright: 5px; -khtml-border-bottom-right-radius: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px;}
#breadcrumb {-moz-border-radius-bottomleft: 5px; -khtml-border-bottom-left-radius: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px;}
#menu {-moz-border-radius-topright: 5px; -khtml-border-top-right-radius: 5px; -webkit-border-top-right-radius: 5px; border-bottom-top-radius: 5px;}
#loader {margin-left: 35px;}
/*custom*/
.js .checked td,.js .checked th, .js .checkable .checked td, .js .checkable .checked th{
background:#5A3901;
}
tbody tr:hover td,tbody tr:hover th{
background:#333333;
}
.js .column {
background: none repeat scroll 0 0 #110236;
margin-top: -0.3em;
padding: 0.3em 1ex 0.3em 0;
position: absolute;
}
.js:hover .column:hover {
background: none repeat scroll 0 0 #110236;
}
#content pre {background-color:#49526D}
#lang{background:#110236;}
.pages {background:#43486F;}
.pages {background:#999671;}
.pages {background:#817F5A;}
#logins a:hover, #tables a[title]:hover, #tables a.active, #tables a.select:hover + a, #tables a.select.active + a {
color: red;
}
.footer, .footer>div {
background-color: #49526D;
opacity: .9;
}
.footer {
border-image: none;
padding: 30px 12px 0px;
border: 1px #BBB solid;
margin: 12px -20px 12px -1px;
margin-right: none;
}

View File

@@ -1,6 +1,6 @@
/*
VERSION: adminer-theme-mancave2-2.0.alpha
VERSION: adminer-theme-mancave2-2.1.alpha
AUTHORS: panreach@gmail.com, dev@monolithforge.com //NOTE: CREDITS below that we stole from ;-)
@@ -244,6 +244,8 @@ h1{
line-height: 70px;
color: #555;
background: none;
position: relative;
top: 12px;
}
h2{
@@ -717,6 +719,10 @@ legend{
color: #999;
}
.footer legend {
background-color: #49526D;
}
/* menu
----------------------------------------------------------------------- */
@@ -751,7 +757,7 @@ legend{
.version {
color: #555;
font-size: inherit;
font-size: 18px;
}
/* db select */
@@ -794,7 +800,7 @@ legend{
}
/* tables */
#tables{
#logins, #tables{
border-bottom: none;
line-height: 20px;
padding: 18px 0;
@@ -820,12 +826,21 @@ legend{
font-size: 14px;
}
#logins a {
display: block;
padding: 5px 18px;
line-height: 14px;
color: #F1E5B3;
font-size: 14px;
}
#tables a.select.active,
#tables a.select:hover
{
color: red;
}
#logins a:hover,
#tables a[title]:hover,
#tables a.active,
#tables a.select:hover + a,
@@ -1187,3 +1202,13 @@ html/*\*/>/*/*/body table a[href*="&edit="][href*="&where"]:hover::before {
.pages {background:#817F5A;}
.footer, .footer>div {
background-color: #49526D;
opacity: .9;
}
.footer {
border-image: none;
padding: 20px 12px 0px;
border: 1px #BBB dashed;
margin: 12px;
}

818
designs/mvt/adminer.css Normal file
View File

@@ -0,0 +1,818 @@
/**
* Adminer theme by Aleksey M. (alekseymvt@gmail.com)
* @link https://github.com/alekseymvt/Adminer.theme
* @link https://github.com/vrana/adminer/
* @link https://www.adminer.org/
* -----------
* Based on work by:
* FLAT UI Flavored Adminer Theme by M. Mahbubur Rahman (mahbub@mahbubblog.com)
* designs/pappu687/adminer.css
* -----------
* Based on work by : Lukáš Brandejs
* https://raw.github.com/vrana/adminer/master/designs/ng9/adminer.css
*/
/*! normalize.css v4.2.0 | MIT License | github.com/necolas/normalize.css */
html {
font-family: sans-serif;
line-height: 1.15;
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section,
summary {
display: block;
}
body {
margin: 0;
}
h1 {
font-size: 2em;
margin: .67em 0;
}
hr {
box-sizing: content-box;
height: 1px;
border: 0;
background: gray;
}
a {
background-color: transparent;
-webkit-text-decoration-skip: objects;
cursor: pointer;
}
a:active, a:hover {
outline-width: 0;
}
abbr[title] {
border-bottom: none;
text-decoration: underline dotted;
}
code, kbd, pre, samp {
font-family: monospace, monospace;
font-size: 1em;
}
dfn {
font-style: italic;
}
mark {
background-color: #ff0;
color: #000;
}
small {
font-size: 80%;
}
sub, sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -.25em;
}
sup {
top: -.5em;
}
audio,
video {
display: inline-block;
}
audio:not([controls]) {
display: none;
height: 0;
}
img {
border-style: none;
}
svg:not(:root) {
overflow: hidden;
}
button,
input,
optgroup,
select,
textarea {
font: inherit;
margin: 0;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
display: inline-block;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
input[type=date]::-webkit-inner-spin-button,
input[type=date]::-webkit-clear-button {
display: none;
}
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: .35em .625em .75em;
}
legend {
color: inherit;
border: 0;
padding: 0;
max-width: 100%;
}
textarea {
overflow: auto;
}
[type="checkbox"],
[type="radio"] {
box-sizing: border-box;
padding: 0;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
-webkit-appearance: button;
font: inherit;
}
details,
menu {
display: block;
}
summary {
display: list-item;
}
[hidden], template {
display: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
td, th {
padding: 2px;
}
/** -------------- Adminer.css ---------------*/
html {
font-size: 14px
}
*, :after, :before {
box-sizing: border-box
}
body, html {
margin: 0;
padding: 0
}
h1, h2, h3 {
margin: 0
}
body {
background: #eef0f0;
font: 14px/1.36 Verdana, Arial, Helvetica, sans-serif;
font-size: inherit;
}
a, a:visited {
color: #2980b9;
text-decoration: none;
padding: 3px 1px
}
h1 {
font-size: 1.5em;
font-weight: normal;
background: #fff;
color: #1e5eb6;
border-bottom: 1px solid #55708b;
padding: 20px
}
.error, .message, h2, h3, th a {
font-weight: bold
}
h2, h3 {
font-size: 1.7em;
background: 0 0;
color: #34495e;
border-bottom: 1px solid #f4f4f4;
padding: 10px 0
}
fieldset {
padding: 5px;
border: 1px solid #dedede
}
input, select, textarea {
border: 1px solid #dedede;
display: inline-block;
vertical-align: middle;
padding: 5px
}
input[type=submit] {
background: #27ae60;
cursor: pointer
}
input[type=submit]:hover {
background: #2c3e50
}
input[type=checkbox] {
margin-right: 5px
}
input[type=image] {
border: 1px solid #d0cdc4
}
input[type=checkbox], input[type=radio] {
border: 1px solid #e5e5e5;
padding: 2px 5px
}
input[name*=length], input[name=limit] {
width: 5em;
}
input[name=text_length] {
width: 5em
}
code {
background: #f0ffe1;
border: 1px dashed #d5f1b9;
padding: 2px 4px;
font-family: Monaco, "Courier New", monospace;
}
code a:hover {
background: 0 0
}
table {
margin: 10px 0;
border: 1px solid #e6e6e6;
background-color: #fff;
position: relative;
box-shadow: 0 0 10px rgba(119, 119, 119, .2)
}
td, th {
border: 1px solid #e9e9e9;
padding: 3px 6px;
vertical-align: top;
}
th {
background: #fff
}
th a {
padding-bottom: 0;
text-shadow: 1px 1px 1px #fff
}
tbody tr:hover td, tbody tr:hover th {
background: #edf4ff
}
thead td, thead th {
text-align: center;
vertical-align: middle;
font-weight: bold;
white-space: nowrap;
border-right: 1px solid #fff;
background: #31587d;
color: #fff;
padding: 7px 2px;
}
thead td acronym, thead td sup, thead th acronym, thead th sup {
color: #cdf
}
tr.odd td {
background: #fcfaf5
}
.nowrap td, .nowrap th, td.nowrap, p.nowrap {
white-space: nowrap;
}
.hidden {
display: none;
}
.error, .message {
padding: 0;
background: 0 0;
}
.error {
color: #c00;
}
.message {
color: #090;
}
.js .hidden {
display: initial;
}
.js input.hidden, .js td.hidden {
display: none
}
.logout {
top: 28px;
}
.js .column {
background: #ecf0f1
}
a:hover {
text-decoration: underline
}
input[name=logout] {
color: #fce2e2;
background: #d73e3e
}
input[name=drop] {
background-color: #c0392b
}
input[name=logout]:hover {
background: #ea0202
}
input[type=submit] {
border-radius: 2px;
border: 0;
padding: 5px 15px;
text-decoration: none;
background-color: #65adc3;
color: #fff;
text-shadow: 0 1px 0 #287ace;
box-shadow: inset 0 0 0 0 #cae3fc
}
input[type=submit]:hover {
background-color: #34495e;
text-shadow: 0 1px 0 #000
}
input[type=submit]:active {
position: relative;
top: 1px
}
table tbody input[name*=check] {
display: block;
float: left
}
table thead a[href*="&modify"] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC) right bottom no-repeat;
padding-right: 18px
}
table thead input ~ a[href*="&modify"] {
width: 0;
display: inline-block;
height: 16px;
overflow: hidden;
text-decoration: none;
padding: 0 0 0 18px;
background-position: 2px bottom
}
table tbody a[href*="&edit="][href*="&where"] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC) right bottom no-repeat;
padding-right: 18px
}
table tbody input ~ a[href*="&edit="][href*="&where"] {
width: 0;
display: inline-block;
height: 16px;
overflow: hidden;
text-decoration: none;
padding: 0 0 0 18px;
background-position: 2px bottom
}
#schema .table {
padding: 5px;
background: #fcfaf5;
border: 1px solid #d0cdc4
}
#schema .table b {
color: #006aeb;
font-weight: bold;
text-decoration: underline;
}
#schema .table b:hover {
color: #fff
}
#dbs input[name=db] {
background: inherit;
color: #fff;
padding: 3px;
width: 10rem;
}
#dbs input[name=db] + input {
padding: 5px;
}
#dbs span {
color: #fff
}
#breadcrumb, #breadcrumb a {
font-weight: bold;
color: #ecf0f1
}
#breadcrumb, #lang {
z-index: 2;
padding: 5px
}
#lang {
position: absolute;
top: 0;
right: 0;
width: auto;
line-height: 1;
left: initial;
font-size: 11px
}
#lang select {
font-size: inherit
}
#breadcrumb {
left: 21.5rem;
background: #31587d;
right: 0;
height: auto;
position: fixed;
top: 0;
}
#logins, #tables {
padding: 0 0 0 5px;
margin: 0;
list-style: none;
}
#menu {
background: #213d58;
position: fixed;
top: 0;
color: #fff;
padding: 0;
bottom: 0;
overflow: auto;
left: 0;
width: 20rem;
margin: 0;
}
#menu h1 {
padding: 0 10px;
background: 0 0
}
#menu .links {
padding: 5px;
line-height: 1;
text-align: center;
font-size: 11px;
}
#menu a, #logins a, #tables .select {
display: inline-block;
vertical-align: middle;
margin-right: 5px
}
#menu select {
background: inherit;
color: #fff;
padding: 3px;
width: 15rem;
}
#menu select option {
background: #fff;
color: #000;
}
#menu p {
border-bottom: 1px solid #55708b;
padding: .8em .5em
}
#menu a {
color: #fff;
}
#logins a, #tables a {
background: 0 0
}
#logout {
color: #fff;
text-decoration: none
}
#logout:hover {
color: red
}
#version, .version {
font-size: 50%
}
#h1:hover {
color: #fff
}
#tables .select {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=) left center no-repeat;
height: 15px;
padding: 0;
overflow: hidden;
width: 15px;
text-decoration: none;
line-height: 1;
color: transparent;
margin-right: 0;
}
/* editor */
#tables .select[title] {
height: auto;
padding: 3px 20px;
overflow: visible;
width: auto;
text-decoration: none;
line-height: inherit;
color: white;
}
#tables .structure {
min-width: calc(100% - 5px - 25px);
padding-left: 5px;
}
#tables .structure.active, #tables .select.active + .structure {
background-color: #1a5fa5;
}
#menu a[href$="sql="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHGSURBVHjaxFPNLkNREP5aB6WhaKLSVtKFiIUqK1sLT2DhTXgDL2FlxSOw8FOLRiyQWhDRiKSEhKQJou49P9fMnFsLsevCJCcz594z3/m+mTmJKIrQjSXRpXUNoGqbm39qcMbAkbyIvbVwYQhD3tIeWsOQ1+QVH86Xyz+JXJPIOb9iAI4ZpOMd/yN/vb/vAdiC93cP0El2dNA6z4RjYyW2MaPU0BB0u+0BOGGsVML49LSA3J+cYDCblb0l6jeHBwg/26isrOB0a8uzYBlBgKShgD8M53J4aTTQqFaRSCYl+WxnG83zcxTmKpKg+vtFu9W8NDQDMCXW+VivYyAzjKmlJahUSpiYUKPVbCKTz0sCGzOyOpBLzdcXlCMdDDIxO4vboyoyhQIKlYocLi0uIjczIyBcA98dYqx9NywxUEyDi/P29IyF1VU5dFeroS+dRnF+Xvajk5N0ayjx8tq6+FuSyiwUF4LRHi/reLg4o9ijs6xG9RjWGowUi/h4fcXexoa0L4oc0mNZuVgFzID09VKBnFXoUb7Pnb5zQrvVovpkZC4QzwfiN6QM1eBqdxcmnq6IAA395Mlz8eTxTZwg/pcl/v01fgswAESqYZbsIsnLAAAAAElFTkSuQmCC) left center no-repeat;
display: inline-block;
color: transparent;
overflow: hidden;
width: 18px;
}
#menu a[href$="import="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=) left center no-repeat;
display: inline-block;
padding-left: 20px;
vertical-align: middle;
}
#menu a[href*="dump="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJrSURBVHjajFPPaxNREP72V8ymTbGQbRB/IT0otdV6CcWTgqCoUFQQEXoSEQ/+AypK755E1KsULIpGgw1F9KC22lgstFgQLdoWhSab2PRHTNrs7nvObGhSsRa/ZXjv7c6b+eabWUVKiX9AJQuRRci2k+260N91VwgJIQSEV1mVnjf5axTjvCfFFn7hCcBlBzJNVRA0gAZTQ1ODgXC4gDtjV9AW2QNFUTA0/Q66kPLSqVg4shYF8vEdKQ7mln+i+/VVRM0oFpbmETLq/SS6J4R/OfHtHmV24XouHFo94REDAyE9hMZgBMkvT2GZFqxQE6by0/g4P74SoKLB2ZZzWA8ffqRQLBcxNTuFjRTwxpmbfad7Oo/rHhdN6B20/6JvaKyBCnODhqNbL+PRxHXUGXWINV5kl9TDrkQct/pnZKHkyPsDGcl4MJiWq5Ecsf84LxTL8nbyK2+Pke3XHWJAQkLXgMdDNjRNRTxlQ6UmakRD0vN8NEd7EBsFO6Impu1fzGCCrOSXwCro5HEiZiExnEVnrKlaypNhG4fba02aTC8ik1/ibZrM9RlIkkGnjH0jWWJQWRn8TpLI8fcZ6MSA1WrZFERx2eHPTEPqjksBqASDLh7ZZ+HlWA6H9tYyvhjNomNnI8Km7p8/f5+HGdB46/lJeOoYPHV8mbGy8gA59HngU74asNkKYKVzlQCuW9GA6B5si+DVeA4HWmsM4qksTnZY1TMz0NRauysaUAmt2+oxM1tCM6k8mS74WXjIdm8O+JdWg36oKgXqgnzb3TvRXvZEneN6YPNIFw7MY70W5haXnlUHbp3f+b/wW4ABAAtWTLcKdqLcAAAAAElFTkSuQmCC) left center no-repeat;
display: inline-block;
padding-left: 20px;
vertical-align: middle;
}
#menu a[href$="&create="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIpSURBVDjLpZNPSFRRFMZ/749/Kt3IqFTSRoSMmrGIYTTbpEJtjBCCok1Em9JVG1dRC8FFEES5aGFEgRRZWq1iLKKxBiNqLDcltQgmHR9hY6LOu+feFm+YGVsZXbh8nHO53/nud8+xjDH8z3IB7r5avGgMZ8XoBq01okFpjYhGtEGJLtmCKINo/XbgVFPUBdDG9PVEq0P/UvnSvdlwQYFoHQIY/3obpRVKFL5W+OIXUVThrL91AN+XihKCwIeTu85sqPryqsJXUvRARAMwkshsiKB7fw25UgKVJwA40V7H/cl5jh+oL+RGk/P0xIqxl11dr8AXjTYG14HRNxkcx+ZhMoNlg52/ND6VAWMoc6F5+2Zy/l9PMIDrWByL1jI+tcDRaN06BaXxbDqLUnq9AqPBteHpuwUcJ0AIcgBXH93h+/wEyyuLrPk5cmv7gNY8gdIYYyhz4PDeWuIpj85IsS2ujQ2zJAk6DkZpqGnixcwYyU+PifUOX7Eh6DoAx7aIpzwA4imPeMrj+bTH+88PaNkZQWwhsrULsXxie9oAzgcESgUe2NAZCeE6AXZGQhwKh/Cyc5RZVXQ39wFwoeMmjXVhgMqiB8awe0cVP36u0Fi/iW9zvwuzkF3+xUz6Nal0gv6uWww+O02lUwGwmv8FM3l55EtLTvQWXwm+EkRpfNEoUZRXHCE5PUFbuJ0nH4cot1wSH14C3LA2Os6x3m2DwDmgGlgChpLX0/1/AIu8MA7WsWBMAAAAAElFTkSuQmCC) left center no-repeat;
display: inline-block;
color: transparent;
overflow: hidden;
vertical-align: middle;
width: 18px;
}
#content {
margin: 0 0 0 20rem;
padding: 35px 5px 20px .5rem;
}
#content table thead a.text:hover {
text-decoration: none
}
#content table thead a, #content table thead span {
font-weight: bold;
color: #fff;
text-shadow: 0 1px 0 #000;
background: 0 0;
white-space: nowrap;
position: static
}
#content table thead a:hover {
background: 0 0;
text-decoration: underline;
color: #000
}
#content tbody tr.checked td, tr.checked.odd td {
background: #fbe2e2;
color: red
}
#content p a[href*="&select="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=) left center no-repeat;
padding-left: 22px
}
#content p a[href*="&page="] {
background-image: none;
padding-left: 0
}
#content p a[href$="?database="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIkSURBVDjLpVNNiFJRFP7eU1E0KSLTMpAwYSxyaidDtChm0WYQ3NSutv2s2kwwm2igNgMtooUQEQhhA9GqhSDTQsZZFDbNDBgVg5bSw9J8rzFF33udc+HGg0ladOHj3nPe+b7zc99VbNvG/yy30yiVSl4SnCNcsixrivYEgY7WJu0faX9EKGUyGVNyFFkBkY/T+WkoFEpFIhEEAgH4/X7w916vB8Mw0Gg00G63y+S7mM1mm4LIAYxisbhSr9c5nT1pjUYju1qt2oVC4YnkqbIUMk6Ew+F/9hyNRkFJLuyaATmFoqZp8Pl88Hq98Hg8wtfv99HpdNBsNhGPx0XsRAG3241ut4vBYCDs8XgMXdcxHA7FN/b9VUD25HK5RAUczKC+hYgcNpNN05xcAQdLkqIoIlj6VFWdXIEUkAQGV8M2k2vaG3z6sYGfVR39XzsHlm/dX3h5d31xlwAHM5goBd5+LuO75z3OnU3jyP4EVrZeKGub2p309cP7VKcAQ2Znoiz3deMVTk1Nw1RNTB+ahamMkD45w7RrfwSYwFdFf6K4Quf6pmvwKHswl7wh7Jvnc4gfTPHR52zhcqVSeZZMJgOxWEyI8BC5CmOnh63WKtZbZczPPsa94hX4XCLJQHG+xnw+f5SEFghZmvhefgvcTqn2HN3gBmZSZ5CInMaHr1Wsvivjy3ZvSZn0nHO5XJDIxwgWDbW2vL10m9xXCUGCQXi49qA1/xvyq6BCh7yZeQAAAABJRU5ErkJggg==) 2px bottom no-repeat;
padding-left: 22px
}
#content p a[href*="&edit="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJvSURBVDjLpZPrS5NhGIf9W7YvBYOkhlkoqCklWChv2WyKik7blnNris72bi6dus0DLZ0TDxW1odtopDs4D8MDZuLU0kXq61CijSIIasOvv94VTUfLiB74fXngup7nvrnvJABJ/5PfLnTTdcwOj4RsdYmo5glBWP6iOtzwvIKSWstI0Wgx80SBblpKtE9KQs/We7EaWoT/8wbWP61gMmCH0lMDvokT4j25TiQU/ITFkek9Ow6+7WH2gwsmahCPdwyw75uw9HEO2gUZSkfyI9zBPCJOoJ2SMmg46N61YO/rNoa39Xi41oFuXysMfh36/Fp0b7bAfWAH6RGi0HglWNCbzYgJaFjRv6zGuy+b9It96N3SQvNKiV9HvSaDfFEIxXItnPs23BzJQd6DDEVM0OKsoVwBG/1VMzpXVWhbkUM2K4oJBDYuGmbKIJ0qxsAbHfRLzbjcnUbFBIpx/qH3vQv9b3U03IQ/HfFkERTzfFj8w8jSpR7GBE123uFEYAzaDRIqX/2JAtJbDat/COkd7CNBva2cMvq0MGxp0PRSCPF8BXjWG3FgNHc9XPT71Ojy3sMFdfJRCeKxEsVtKwFHwALZfCUk3tIfNR8XiJwc1LmL4dg141JPKtj3WUdNFJqLGFVPC4OkR4BxajTWsChY64wmCnMxsWPCHcutKBxMVp5mxA1S+aMComToaqTRUQknLTH62kHOVEE+VQnjahscNCy0cMBWsSI0TCQcZc5ALkEYckL5A5noWSBhfm2AecMAjbcRWV0pUTh0HE64TNf0mczcnnQyu/MilaFJCae1nw2fbz1DnVOxyGTlKeZft/Ff8x1BRssfACjTwQAAAABJRU5ErkJggg==) left center no-repeat;
padding-left: 22px
}
#content p a[href*="&table="].jush-custom {
font-weight: bold
}
#content p.links a[href*="&table="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJcSURBVDjLpZPtT5JhFMafrW997I9rscA+FFu2QRurtlw5cQ4InLpwBogIPNFSiNJ4C+JVkj0QTBHQKFPQlJfwlanY1tXz3ARkn2jd27Wz++yc33XOvd0UAOp/RNGR/X5zeH9rOlTDVKAK3fsqJrxlqN27GHPuYHh+G4rXRQzZNjEws47Hli/oo/PxNsAU3qvWT3/gX3TPuHrWBhiC30nSktXDtKLB1NI4NKkxqBMqjDByPFkcxNBCPwbCfXgUeEBq705m0AZM+qsk2e3hau88W+4ANOy+XPLFQrkrcbW31KkOYJx9rBaAOzPR0gVHW6x593q9cDgcqB6e4sZoogMYdXzD0ck5ZhfLsHGKVfAqVoadKcMdzcLr82PuwwZCoRACgQCWVzdhoK2gaVpDAMNzWzhkAXamQpze/I4t13w+j2AwiFwuh7W1NXg8HmQyGSgUCshkssuU3F7AQf0c84kK3n68KFc4hXQ6DavVCqlUCqVSSdaIx+NQq9UGMsHg7Ab2jxtwp5rOvqUqia3CUqnEObWn0mp1KBaLcLlckMvloPpfrhOAl230/SGLxQK3241CoQC9Xg9nskKk1emQzWZZkBZCoRBU3/NP2GMBgXTTObjSjI1GA8lkEgzDwO/3E4iObXY6nYhEIhCJRHoWcIW6b1pF7egMlYNT7NROUKzU8XX3GJ+3D2E0GgmAm4Zbh2s0mUyIRqMcAGKx+BIlMeSiYu1K/fbEMm4+TaFnJIHrSgZX5TFIZNPo7e1Fj9QOs9kMlUqFaw9pCASCnzwe7x15xG6/rUQiAZ/Px9/5XyhZOMVGKlOdAAAAAElFTkSuQmCC) left center no-repeat;
padding-left: 22px
}
#content p.links a[href*="&create="],
#content p.links a[href*="&view="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIpSURBVDjLpZNPSFRRFMZ/749/Kt3IqFTSRoSMmrGIYTTbpEJtjBCCok1Em9JVG1dRC8FFEES5aGFEgRRZWq1iLKKxBiNqLDcltQgmHR9hY6LOu+feFm+YGVsZXbh8nHO53/nud8+xjDH8z3IB7r5avGgMZ8XoBq01okFpjYhGtEGJLtmCKINo/XbgVFPUBdDG9PVEq0P/UvnSvdlwQYFoHQIY/3obpRVKFL5W+OIXUVThrL91AN+XihKCwIeTu85sqPryqsJXUvRARAMwkshsiKB7fw25UgKVJwA40V7H/cl5jh+oL+RGk/P0xIqxl11dr8AXjTYG14HRNxkcx+ZhMoNlg52/ND6VAWMoc6F5+2Zy/l9PMIDrWByL1jI+tcDRaN06BaXxbDqLUnq9AqPBteHpuwUcJ0AIcgBXH93h+/wEyyuLrPk5cmv7gNY8gdIYYyhz4PDeWuIpj85IsS2ujQ2zJAk6DkZpqGnixcwYyU+PifUOX7Eh6DoAx7aIpzwA4imPeMrj+bTH+88PaNkZQWwhsrULsXxie9oAzgcESgUe2NAZCeE6AXZGQhwKh/Cyc5RZVXQ39wFwoeMmjXVhgMqiB8awe0cVP36u0Fi/iW9zvwuzkF3+xUz6Nal0gv6uWww+O02lUwGwmv8FM3l55EtLTvQWXwm+EkRpfNEoUZRXHCE5PUFbuJ0nH4cot1wSH14C3LA2Os6x3m2DwDmgGlgChpLX0/1/AIu8MA7WsWBMAAAAAElFTkSuQmCC) left center no-repeat;
padding-left: 22px;
}
#content a[href*="&database="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKRSURBVDjLhVNLTBNRFD3TTju1FCcBaxuaQEr94ydiZIHGpcFISBOi0YREZWHCVoyRxKUxxq0LXcACQyLsjO6KjSEiDfHDz0S0CLSxlFKd2g7MTDudGd+bMAQCxJucuXfuu+fcO/PeYwzDALVoNMqRuI3guq7rR4g/SEBC/Svxc8T3EUTD4bCGTcZQAUI+RvxLr9d70u/3o6KiAm63G3Qtn89DFEUkk0lks9lRkrvW3t6e2lCgRZFI5F0ikaDtjN1MVVVjYmLCGBoa6qccC7Z1kQafz4f/WSAQAGlyaXOOpQ+SNNUymQxcLhc4joPD4TBzkiRBEASkUimEQiGzdlcBlmWRy+WgKIr5Xi6XUSgUUCwWzTVN+IAzeOOde71orP0eAaOkbrDWf6Cw2+3mBLSYgny3KULXPOUY2BUB/hMd4IOn8XfhMGYjvU+2TECLLRLDMNA0zYw5JYa6Ghke/hyEn9/gZEqo3OuHp7qW3yJgESjoNPSdlb8gWCOCr29BMT0Ip5tBYnIWqlL6o8irzVsEaHcKSqQCen4cweok+FAblNRz2JxlODx1cEkzGWmVbTl7Z/jHhgCF1Z3GYjIKf+U8+ANhQn4Gm6OMUiGI9MhHg5Gl1sbu8UnKNc8B7Ui3ipxEcwvlpVFw6hz2N1xGabkXdqeBYqEOmfefEZWac4e6xz9Z22hbn+BmLBZbi8fjEBdG4NF/QdUDSM88hQ4FawKJR6cxLDZl86qzZdtdoDYwMBAkQg/2LL/ovNLVh++Dd7G0OAau9hTkrKgnnE39GW3f/Z6enpUdBSx7ePu4eq+zi4VNw+TbV0gsxFd5b9X5i4+mpnY63tsErl6okhvrfWzT0SAMR3FMXsnean08Pb/b/fgHqpjCspi90kkAAAAASUVORK5CYII=) 2px bottom no-repeat;
padding-left: 22px
}
#content p a[href*="&schema="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFOSURBVDjLtVK7SgNRED0b9iuM2lr4QK1DQIyk0FZsJAj+gH+ilRZb2NjaRHTLmA9QFKz9huzm7t37Hu+u7IJgQjR6YLjDzOXMmcMERIR5EE5qXA4z4sqACYWEC5wfLQXf/WtMIuDSoL0A7DZDjBj/uYI0l8jzEEJYJMkvCEZM4PqZIxlzpGk+kSCY18TGtGYcx9Tv96dOqBUMBgNyzsFaC621312Ac+59yJFlGRhj5VvVoigKvniglEK32w1mkd3r9ejPPAjOhqdknYX18p1/rzo3pYqTh0OSRkJI5UMgPn4s61sX66SkhtEGcISGsQad5gH2FvehfV5BaIF2cwet5RZyKeu68pe5ubKG7dUNP5AQGltMN57Mosgr5EIiVQmYGvtc1PVicqHY+dXpk8Dg7v22XKFo1ARe9v1bDOlXKKKCs4Sn1xdU1v3vIc2CD3bN4xJjfJWvAAAAAElFTkSuQmCC) 2px bottom no-repeat;
padding-left: 22px
}
#content p a[href*="&sql="] {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ5SURBVHjapFNLaxNRFP4mnZmQZtKYpJ2I8ZE0NSbSWKpgBYNUhIJQUDddCaILwb34C0RcCi60vpa14sZFoSjxUWxTFEubFkxf9kFS+7Jp0yQmM5mH905SF9pSwQt3vnPnnvPNd86cA13Xsds+23XKsdMdQx//s0z/6hi54he3e8/0d3ZuK0FTFGhUJkVVhSbLUAiq5IxSCQrBEkGWOu8Lh38HGrlpWnlXCKhNSbZQo3cEE9FomYAuKZstE2wFa8RR1cpKqK2o4JhxmLVJVAlh5Df6IFj5MgENcHq9EAMBg2RucBDVLpdxVon0iXdvIf8sQHRIsNReht3XjI3ZI8iuPAOrkDyorBq3G6vT08ikUuAsFiN46HkXXL56eI41QV1/BMF+GulvCfCMDFvNXtSIHrC0KDTPhXgc7lAQdQ2thk2XIpewnkzCJvTA4T8PabEbfDWD+ZFxyEUdX94sw6QVCkZlxWAQU+8/YGZgALV+v0HgbWmBNzQMR0M7it8fg+HWwQk2cLkkcvJh5NNFsCVJMgq1ubiE5o4OI5CS8FYrya8b9saLKC48gIlTIG/6sBaLw3PpHrTEMrSXr4kPIaAKFkbjSA0PEVuFlB+DO8Ah2HoB8tITVPE6iplDWOn7jLn0CSQevoDV6TI+zEpUASkkZzaTYrLIrH3C/qMCFEbE4th9OEQexfQBrPYP44d+DuY91eBp+1dGgFVIDb729kKpdJfQtIy2yFNMdN/E5McYzAebUEhOYjZuQXaj5+9W/nOYbl9vLN26doOFScVI9BXmZ6dy9jpnpO1O5dfsRtBxxlk4Xu9mT4Z80DkpVlhZvdp+d3RmpyH7JcAAnHiAVYWMsdkAAAAASUVORK5CYII=) 2px bottom no-repeat;
padding-left: 24px
}
#table input {
padding: 3px 5px;
}
#edit-fields tbody th, #edit-fields tbody td {
border: 0;
border-right: 1px solid #213d58;
padding: 1px;
vertical-align: top;
text-align: center;
}
#edit-fields tbody th:last-child, #edit-fields tbody td:last-child {
border-right: 0;
}
#edit-fields .icon {
padding: 2px;
}
#partition-table.hidden {
display: none;
}
#partition-table td {
padding: 1px;
}
.footer {
border-top: 1px solid #dedede;
border-bottom: 1px solid #dedede;
border-image: none;
margin: .5rem 0;
margin-right: initial;
}
.footer > div {
padding: 5px;
}

View File

@@ -282,7 +282,7 @@ table code {
margin-right: 4px;
}
#tables a {
#logins a, #tables a {
padding: 1px 2px;
}
@@ -290,7 +290,7 @@ table code {
color: #FFF;
}
#menu p, #tables {
#menu p, #logins, #tables {
border: none;
margin: 0 0 4px;
padding: 0 0 4px;
@@ -383,7 +383,7 @@ a[href$="dump="] {
}
select[name="db"] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll left center white;
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll 90% center white;
padding-left: 16px;
}

View File

@@ -268,7 +268,7 @@ td.nowrap {
padding: 0 0 30px 0;
background: #f1f1f1;
}
#menu p, #tables {
#menu p, #logins, #tables {
margin: 0;
padding: .8em 1em;
border-bottom: 1px solid #c7c7c7;

View File

@@ -232,7 +232,7 @@ tr.odd td {
border-right:2px solid #34495e;
}
#menu p, #tables{
#menu p, #logins, #tables{
border-bottom:1px solid rgb(85, 112, 139);
}

View File

@@ -177,11 +177,11 @@ h3 {
top: 38px;
width: 180px;
background-color: #DEF; }
#menu p, #tables {
#menu p, #logins, #tables {
padding-left: 8px;
font-size: 10pt;
border-bottom: none; }
#tables a, #tables span {
#logins a, #tables a, #tables span {
background: #DEF;
}

View File

@@ -336,7 +336,7 @@ p code + a:visited:hover {
#tables {
max-height: 100%;
margin: 0 -15px !important;
margin: 32px -15px !important;
position: absolute;
left: 15px;
right: 15px;
@@ -575,7 +575,7 @@ label {
top: 55px;
right: 100%;
z-index: 10;
margin-right: -331px;
margin-right: -340px;
line-height: normal;
padding: 0;
left: auto;

View File

@@ -51,11 +51,17 @@
width: 270px;
}
#tables li {
#logins li, #tables li {
position: relative;
height: 23px;
}
#logins a {
display: block;
margin-top: 5px;
padding: 0 10px;
}
#tables a {
display: block;
margin: 0;

View File

@@ -244,7 +244,7 @@ td, th {
border-color: #bbb;
border-width: 0 1px 1px 0;
}
#tables a {
#logins a, #tables a {
height: 18px;
line-height: 18px;
}
@@ -270,7 +270,7 @@ a, a:visited {
padding-bottom: 0;
top: 0;
}
#tables a, #tables span {
#logins a, #tables a, #tables span {
background: #fafafa;
}
/*** Forms ***/

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -7,6 +7,7 @@ if ($adminer->homepage()) {
if ($_POST["query"] != "") {
search_tables();
}
echo "<div class='scrollable'>\n";
echo "<table cellspacing='0' class='nowrap checkable'>\n";
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
echo '<thead><tr class="wrap">';
@@ -26,6 +27,7 @@ if ($adminer->homepage()) {
}
echo "</table>\n";
echo "</div>\n";
echo "</form>\n";
echo script("tableCheck();");
}

View File

@@ -71,9 +71,9 @@ class Adminer {
}
function loginForm() {
echo "<table cellspacing='0'>\n";
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input type="hidden" name="auth[driver]" value="server"><input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocapitalize="off">' . script("focus(qs('#username'));"));
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]">' . "\n");
echo "<table cellspacing='0' class='layout'>\n";
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input type="hidden" name="auth[driver]" value="server"><input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocomplete="username" autocapitalize="off">' . script("focus(qs('#username'));"));
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]" autocomplete="current-password">' . "\n");
echo "</table>\n";
echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
@@ -485,7 +485,7 @@ qsl('div').onclick = whisperClick;", "")
);
}
if (like_bool($field)) {
return '<input type="checkbox" value="' . h($value ? $value : 1) . '"' . (preg_match('~^(1|t|true|y|yes|on)$~i', $value) ? ' checked' : '') . "$attrs>";
return '<input type="checkbox" value="1"' . (preg_match('~^(1|t|true|y|yes|on)$~i', $value) ? ' checked' : '') . "$attrs>";
}
$hint = "";
if (preg_match('~time~', $field["type"])) {
@@ -517,7 +517,7 @@ qsl('div').onclick = whisperClick;", "")
}
$return = ($field["type"] == "bit" && preg_match('~^[0-9]+$~', $value) ? $return : q($return));
if ($value == "" && like_bool($field)) {
$return = "0";
$return = "'0'";
} elseif ($value == "" && ($field["null"] || !preg_match('~char|text~', $field["type"]))) {
$return = "NULL";
} elseif (preg_match('~^(md5|sha1)$~', $function)) {
@@ -537,7 +537,7 @@ qsl('div').onclick = whisperClick;", "")
function dumpDatabase($db) {
}
function dumpTable() {
function dumpTable($table, $style, $is_view = 0) {
echo "\xef\xbb\xbf"; // UTF-8 byte order mark
}
@@ -586,11 +586,11 @@ qsl('div').onclick = whisperClick;", "")
foreach ($servers[""] as $username => $password) {
if ($password !== null) {
if ($first) {
echo "<p id='logins'>";
echo "<ul id='logins'>";
echo script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
$first = false;
}
echo "<a href='" . h(auth_url($vendor, "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a><br>\n";
echo "<li><a href='" . h(auth_url($vendor, "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a>\n";
}
}
}

View File

@@ -55,8 +55,8 @@ function whisperClick(event) {
* @this HTMLInputElement
*/
function emailFileChange() {
this.onchange = function () { };
var el = this.cloneNode(true);
this.onchange = function () { };
el.value = '';
this.parentNode.appendChild(el);
}

View File

@@ -67,7 +67,7 @@ SELECT @adminer_alter;
}
}
function dumpTable($table, $style, $is_view = false) {
function dumpTable($table, $style, $is_view = 0) {
if ($_POST["format"] == "sql_alter") {
$create = create_sql($table, $_POST["auto_increment"], $style);
if ($is_view) {

View File

@@ -14,7 +14,7 @@ class AdminerDumpJson {
return array('json' => 'JSON');
}
function dumpTable($table, $style, $is_view = false) {
function dumpTable($table, $style, $is_view = 0) {
if ($_POST["format"] == "json") {
return true;
}

View File

@@ -20,7 +20,7 @@ class AdminerDumpPhp {
}
}
function dumpTable($table) {
function dumpTable($table, $style, $is_view = 0) {
if ($_POST['format'] == 'php') {
$this->output[$table] = array();
if (!$this->shutdown_callback) {

View File

@@ -14,7 +14,7 @@ class AdminerDumpXml {
return array('xml' => 'XML');
}
function dumpTable($table, $style, $is_view = false) {
function dumpTable($table, $style, $is_view = 0) {
if ($_POST["format"] == "xml") {
return true;
}

View File

@@ -44,7 +44,7 @@ class AdminerEditCalendar {
if (preg_match("~date|time~", $field["type"])) {
$dateFormat = "changeYear: true, dateFormat: 'yy-mm-dd'"; //! yy-mm-dd regional
$timeFormat = "showSecond: true, timeFormat: 'HH:mm:ss', timeInput: true";
return "<input id='fields-" . h($field["field"]) . "' value='" . h($value) . "'" . (@+$field["length"] ? " maxlength='" . (+$field["length"]) . "'" : "") . "$attrs>" . script(
return "<input id='fields-" . h($field["field"]) . "' value='" . h($value) . "'" . (@+$field["length"] ? " data-maxlength='" . (+$field["length"]) . "'" : "") . "$attrs>" . script(
"jQuery('#fields-" . js_escape($field["field"]) . "')."
. ($field["type"] == "time" ? "timepicker({ $timeFormat })"
: (preg_match("~time~", $field["type"]) ? "datetimepicker({ $dateFormat, $timeFormat })"

View File

@@ -16,7 +16,7 @@ class AdminerJsonColumn {
}
private function _buildTable($json) {
echo '<table cellspacing="0" style="margin:2px">';
echo '<table cellspacing="0" style="margin:2px; font-size:100%;">';
foreach ($json as $key => $val) {
echo '<tr>';
echo '<th>' . h($key) . '</th>';

42
plugins/login-ip.php Normal file
View File

@@ -0,0 +1,42 @@
<?php
/** Check IP address and allow empty password
* @link https://www.adminer.org/plugins/#use
* @author Jakub Vrana, https://www.vrana.cz/
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/
class AdminerLoginIp {
/** @access protected */
var $ips;
/** @access protected */
var $forwarded_for;
/** Set allowed IP addresses
* @param array IP address prefixes
* @param array X-Forwarded-For prefixes if IP address matches, empty array means anything
*/
function __construct($ips, $forwarded_for = array()) {
$this->ips = $ips;
$this->forwarded_for= $forwarded_for;
}
function login($login, $password) {
foreach ($this->ips as $ip) {
if (strncasecmp($_SERVER["REMOTE_ADDR"], $ip, strlen($ip))) {
if (!$this->forwarded_for) {
return true;
}
if ($_SERVER["HTTP_X_FORWARDED_FOR"]) {
foreach ($this->forwarded_for as $forwarded_for) {
if (strncasecmp(preg_replace('~.*, *~', '', $_SERVER["HTTP_X_FORWARDED_FOR"]), $forwarded_for, strlen($forwarded_for))) {
return true;
}
}
}
}
}
return false;
}
}

View File

@@ -110,6 +110,11 @@ class AdminerPlugin extends Adminer {
return $this->_applyPlugin(__FUNCTION__, $args);
}
function bruteForceKey() {
$args = func_get_args();
return $this->_applyPlugin(__FUNCTION__, $args);
}
function serverName($server) {
$args = func_get_args();
return $this->_applyPlugin(__FUNCTION__, $args);

View File

@@ -0,0 +1,40 @@
<?php
/** Pretty print JSON values in edit
*/
class AdminerPrettyJsonColumn {
/** @var AdminerPlugin */
protected $adminer;
public function __construct($adminer) {
$this->adminer = $adminer;
}
private function _testJson($value) {
if ((substr($value, 0, 1) == '{' || substr($value, 0, 1) == '[') && ($json = json_decode($value, true))) {
return $json;
}
return $value;
}
function editInput($table, $field, $attrs, $value) {
$json = $this->_testJson($value);
if ($json !== $value) {
$jsonText = json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
return <<<HTML
<textarea $attrs cols="50" rows="20">$jsonText</textarea>
HTML;
}
return '';
}
function processInput($field, $value, $function = '') {
if ($function === '') {
$json = $this->_testJson($value);
if ($json !== $value) {
$value = json_encode($json);
}
}
return $this->adminer->_callParent('processInput', array($field, $value, $function));
}
}

View File

@@ -34,7 +34,7 @@ class AdminerSlugify {
}
$slug = $slugify[$field["field"]];
if ($slug !== null) {
return "<input value='" . h($value) . "' maxlength='$field[length]' size='40'$attrs>"
return "<input value='" . h($value) . "' data-maxlength='$field[length]' size='40'$attrs>"
. script("qsl('input').onchange = function () {
var find = '$this->from';
var repl = '$this->to';

View File

@@ -13,6 +13,7 @@ class AdminerTableStructure {
* @return bool
*/
function tableStructurePrint($fields) {
echo "<div class='scrollable'>\n";
echo "<table cellspacing='0' class='nowrap'>\n";
echo "<thead><tr><th>" . lang('Column') . "<th>" . lang('Type') . "<th>" . lang('Nullable') . "<th>" . lang('Default') . (support("comment") ? "<th>" . lang('Comment') : "") . "</thead>\n";
foreach ($fields as $field) {
@@ -26,6 +27,7 @@ class AdminerTableStructure {
echo "\n";
}
echo "</table>\n";
echo "</div>\n";
return true;
}
}

View File

@@ -53,7 +53,7 @@ function tablesFilterInput() {
tablesFilterTimeout = window.setTimeout(tablesFilter, 200);
}
if (sessionStorage){
sessionStorage && document.addEventListener('DOMContentLoaded', function () {
var db = qs('#dbs').querySelector('select');
db = db.options[db.selectedIndex].text;
if (db == sessionStorage.getItem('adminer_tables_filter_db') && sessionStorage.getItem('adminer_tables_filter')){
@@ -61,7 +61,7 @@ if (sessionStorage){
tablesFilter();
}
sessionStorage.setItem('adminer_tables_filter_db', db);
}
});
</script>
<p class="jsonly"><input id="filter-field" autocomplete="off"><?php echo script("qs('#filter-field').oninput = tablesFilterInput;"); ?>
<?php

View File

@@ -40,14 +40,16 @@ tinyMCE.init({
function selectVal(&$val, $link, $field, $original) {
if (preg_match("~_html~", $field["field"]) && $val != '') {
$shortened = (substr($val, -10) == "<i>...</i>");
$ellipsis = "<i></i>";
$length = strlen($ellipsis);
$shortened = (substr($val, -$length) == $ellipsis);
if ($shortened) {
$val = substr($val, 0, -10);
$val = substr($val, 0, -$length);
}
//! shorten with regard to HTML tags - http://php.vrana.cz/zkraceni-textu-s-xhtml-znackami.php
$val = preg_replace('~<[^>]*$~', '', html_entity_decode($val, ENT_QUOTES)); // remove ending incomplete tag (text can be shortened)
if ($shortened) {
$val .= "<i>...</i>";
$val .= $ellipsis;
}
if (class_exists('DOMDocument')) { // close all opened tags
$dom = new DOMDocument;

View File

@@ -10,7 +10,7 @@ CREATE TABLE translation (
);
*/
/** Translate all table and field comments, enum and set values from the translation table (inserts new translations)
/** Translate all table and field comments, enum and set values in Editor from the translation table (inserts new translations)
* @link https://www.adminer.org/plugins/#use
* @author Jakub Vrana, https://www.vrana.cz/
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0

View File

@@ -8,8 +8,9 @@
*/
class AdminerVersionNoverify {
function navigation($missing) {
function head() {
echo script("verifyVersion = function () {};");
return true;
}
}

View File

@@ -29,14 +29,16 @@ class AdminerWymeditor {
function selectVal(&$val, $link, $field, $original) {
// copied from tinymce.php
if (preg_match("~_html~", $field["field"]) && $val != '') {
$shortened = (substr($val, -10) == "<i>...</i>");
$ellipsis = "<i></i>";
$length = strlen($ellipsis);
$shortened = (substr($val, -$length) == $ellipsis);
if ($shortened) {
$val = substr($val, 0, -10);
$val = substr($val, 0, -$length);
}
//! shorten with regard to HTML tags - http://php.vrana.cz/zkraceni-textu-s-xhtml-znackami.php
$val = preg_replace('~<[^>]*$~', '', html_entity_decode($val, ENT_QUOTES)); // remove ending incomplete tag (text can be shortened)
if ($shortened) {
$val .= "<i>...</i>";
$val .= $ellipsis;
}
if (class_exists('DOMDocument')) { // close all opened tags
$dom = new DOMDocument;