1
0
mirror of https://github.com/vrana/adminer.git synced 2025-09-03 11:22:35 +02:00

Compare commits

..

147 Commits

Author SHA1 Message Date
Jakub Vrana
f4204386c7 Release 2011-07-27 10:16:57 +02:00
Jakub Vrana
f80e15f987 Typo 2011-07-27 09:08:53 +02:00
Jakub Vrana
4b4055432d Reorganize functions 2011-07-27 09:04:43 +02:00
Jakub Vrana
be4f2ef76c More thorough escaping 2011-07-27 08:58:07 +02:00
Jakub Vrana
037c547365 Fix XSS (thanks to Jigal van Hemert) 2011-07-27 08:01:51 +02:00
Jakub Vrana
71efbc545a Remove CodeMirror 2011-07-26 22:20:26 +02:00
Jakub Vrana
1c415dbcf8 WYMeditor 2011-07-26 22:10:45 +02:00
Jakub Vrana
903a0377af Lithuanian translation 2011-07-26 19:42:51 +02:00
Jakub Vrana
628a43156d Hide search for hidden enums (thanks to hever) 2011-07-25 17:20:32 +02:00
Jakub Vrana
6c1598ebaf Save bytes 2011-07-22 16:27:06 +02:00
Jan Dolecek
cde1d43e89 Fix altering of default values in PostgreSQL 2011-07-22 15:34:35 +02:00
Jan Dolecek
06aa0f842b Process list for PostgreSQL 2011-07-22 14:32:16 +02:00
Jakub Vrana
7f05e73689 Missing variable (thanks to juzna) 2011-07-22 13:41:05 +02:00
Jakub Vrana
83d82d6eee Pass $filter to remove_slashes (thanks to juzna) 2011-07-22 13:37:01 +02:00
Jakub Vrana
a3663066b0 Use $adminer->database() instead of DB (thanks to Lubor Bilek) 2011-07-19 17:58:44 +02:00
Jakub Vrana
dc4851dacd Develop 2011-07-19 15:06:16 +02:00
Jakub Vrana
492f78f6fe Fix original favicon 2011-07-19 14:44:43 +02:00
Jakub Vrana
3e3928ea05 Release 2011-07-19 14:28:57 +02:00
Jakub Vrana
3a8395d18e Update externals 2011-07-19 14:11:43 +02:00
Jakub Vrana
ad937f8665 Opera way of prevent default (bug #3367851) 2011-07-18 17:38:16 +02:00
Jakub Vrana
1c768e87fa Typo (bug #3366317) 2011-07-14 10:35:56 +02:00
Jakub Vrana
8a9642b217 Link tables and indexes from SQL command EXPLAIN 2011-07-13 16:31:47 +02:00
Jakub Vrana
ac8a64e88a Editable index names 2011-07-13 15:13:00 +02:00
Jakub Vrana
ead05e6839 Remember export and import options 2011-07-13 13:08:20 +02:00
Jakub Vrana
9e0e161253 Display foreign keys from other schemas in PostgreSQL (thanks to Ondrej Letocha) 2011-07-12 16:03:39 +02:00
Jakub Vrana
33c4623345 Hide schema link in homepage with no schema 2011-07-12 15:45:55 +02:00
Jakub Vrana
67e5cbdb6e Port hint in login form 2011-07-12 15:30:09 +02:00
Jakub Vrana
6027d181a4 Disable auto increment in copy table (bug #3363142) 2011-07-12 15:14:15 +02:00
Jakub Vrana
5fa9f84de0 Empty translation means identifier 2011-07-11 17:33:55 +02:00
Jakub Vrana
9a4cabe898 Simplify single language version 2011-07-11 17:32:52 +02:00
Jakub Vrana
55e2b7597e Save bytes 2011-07-11 16:35:17 +02:00
Jakub Vrana
0474c21108 Hide null byte in HTML (bug #3358372) 2011-07-11 11:32:44 +02:00
Jakub Vrana
7fa8263629 Explain links 2011-07-11 09:55:47 +02:00
Jakub Vrana
a9b2ac915d Display searched columns 2011-07-01 17:15:45 +02:00
Jakub Vrana
d26fb6276e Backslash is special with LIKE (bug #3344307) 2011-06-29 17:37:57 +02:00
Jakub Vrana
87137e55c9 Update translations 2011-06-29 11:16:33 +02:00
Jakub Vrana
46c99c9a0c Comment 2011-06-28 15:52:39 +02:00
Jakub Vrana
ddfe924a38 Update translations 2011-06-27 10:24:05 +02:00
Jakub Vrana
50a2823d36 New design 2011-06-24 09:47:18 +02:00
Jakub Vrana
d938efb1a8 Update translations 2011-06-24 09:47:18 +02:00
Jakub Vrana
7ff2a67ae8 textareaKeydown is Adminer specific 2011-06-24 09:47:17 +02:00
Jakub Vrana
0060c608d6 Save bytes 2011-06-24 09:47:17 +02:00
Jakub Vrana
0d427ad5a8 Save bytes 2011-06-24 09:47:17 +02:00
Jakub Vrana
3ab609188b Comment 2011-06-24 09:47:16 +02:00
Jakub Vrana
c101a1f8bd Comment 2011-06-23 22:11:49 +02:00
Jakub Vrana
08e70e6309 Edit foreign plugin 2011-06-23 22:11:08 +02:00
Jakub Vrana
f8ae1d6360 Prefer NULL to empty string in foreign keys (bug #3323800) 2011-06-23 22:11:08 +02:00
Jakub Vrana
d9c2e80100 Show only errors with Webserver file 2011-06-15 17:16:13 +02:00
Jakub Vrana
aa29b01724 Ctrl+Shift+Enter for Save and continue edit 2011-06-15 17:16:13 +02:00
Jakub Vrana
5576d84980 Display "EXPLAIN SELECT invalid_column" error (thanks to Michal Vrabel) 2011-06-14 10:46:06 +02:00
Jakub Vrana
e0773c0072 Ctrl+Shift+Enter for Save and continue edit 2011-06-14 10:34:04 +02:00
Jakub Vrana
c2965bc88d Save TinyMCE under AJAX 2011-06-13 18:02:16 +02:00
Jakub Vrana
9c370ad504 Check form.onsubmit in ajaxForm 2011-06-13 16:23:51 +02:00
Jakub Vrana
98a00bacc5 Move init to head 2011-06-10 13:36:17 +02:00
Jakub Vrana
e6b520212b Properties @access 2011-06-10 13:32:46 +02:00
Jakub Vrana
2eee7a75aa Get e-mail subject and message from database (Adminer Editor) 2011-06-10 13:25:01 +02:00
Jakub Vrana
3c066debf3 Update translation 2011-06-09 13:50:19 +02:00
Jakub Vrana
c561d70486 Keyboard shortcuts (thanks to Konrad Cerny) 2011-06-08 14:09:20 +02:00
Jakub Vrana
c0c21d4d12 Preserve original timestamp value in multiple update (bug #3312614) 2011-06-08 12:48:39 +02:00
Jakub Vrana
2140f09b68 Don't scroll with AJAX image buttons 2011-06-08 11:23:08 +02:00
Jakub Vrana
56a1bdd7fc Support for other drivers 2011-06-07 15:47:11 +02:00
Jakub Vrana
3a148454c1 Respect defaults and comments checkbox after post (bug #3311791) 2011-06-07 15:00:18 +02:00
Jakub Vrana
05ad2268fa Romanian translation (thanks to .nick .messing) 2011-06-07 14:18:17 +02:00
Jakub Vrana
4bcc0ca27c Display default column value in table overview (thanks to bene) 2011-06-05 08:35:15 +02:00
Jakub Vrana
8372913ab5 Save bytes 2011-06-04 04:28:17 +02:00
Jakub Vrana
955e6b44b3 PostgreSQL supports only functions 2011-06-04 04:19:14 +02:00
Jakub Vrana
bf0c626224 Hide routine language if not required 2011-06-04 03:37:43 +02:00
Jakub Vrana
04127bcbf5 Prepare PostgreSQL routines (thanks to Martin Major) 2011-06-03 15:52:55 +02:00
Jakub Vrana
ce3d18e538 Allow specifying routine language 2011-06-03 15:45:33 +02:00
Jakub Vrana
4787b57d30 Revert "Highlight SQL code in textarea"
This reverts commit 2a1c409681.
2011-06-03 14:55:09 +02:00
Jakub Vrana
42a422e623 Valign image buttons 2011-06-03 14:33:52 +02:00
Jakub Vrana
ae50ef7594 Don't overwrite privileges for existing users 2011-06-03 14:02:19 +02:00
Jakub Vrana
16a72b4521 Shortcut for database privileges 2011-06-03 13:50:20 +02:00
Jakub Vrana
98e410f42d Move schema link to Adminer::homepage method 2011-06-03 13:49:47 +02:00
Jakub Vrana
d09f05b01b Display column collation in tooltip (thanks to bene) 2011-06-01 17:05:09 +02:00
Jakub Vrana
ea4eba4761 Display default column value in tooltip (thanks to bene) 2011-06-01 10:48:07 +02:00
Jakub Vrana
00342a1532 Init TinyMCE in head 2011-05-31 08:01:49 +02:00
Jakub Vrana
0f00277b82 Easier sending of default headers (customization) 2011-05-31 08:01:48 +02:00
Jakub Vrana
2b9bd6f05d Documentation 2011-05-31 08:01:48 +02:00
Jakub Vrana
e8aad6a580 Display foreign key name (thanks to Vladimir Kriska) 2011-05-31 08:01:48 +02:00
Jakub Vrana
5bc419ef32 Plugin tables filter 2011-05-24 17:35:57 +02:00
Jakub Vrana
e641e5ceba Limit commands and import in customization (bug #3194432) 2011-05-24 17:16:13 +02:00
Jakub Vrana
d2c513d1c2 Column names customization (bug #3194500) 2011-05-24 17:03:48 +02:00
Jakub Vrana
6a491373c2 Pagination support in Oracle (bug #3306828) 2011-05-24 15:20:13 +02:00
Jakub Vrana
baf21724cf MySQL allows only (max_allow_packet - 3)-bytes queries (thanks to kluvi) 2011-05-20 18:26:27 +02:00
Jakub Vrana
20a65465c6 PostgreSQL uses 'character varying' (thanks to Lubor Bilek) 2011-05-20 17:52:32 +02:00
Jakub Vrana
e3c4324e49 IBMDB2I engine supports foreign keys 2011-05-17 17:20:32 +02:00
Jakub Vrana
c1c598db1e Save bytes 2011-05-16 16:43:02 +02:00
Jakub Vrana
48981e9acb No manual <noscript> removal required anymore 2011-05-16 16:26:24 +02:00
Jakub Vrana
4ff2f03a0f Alter bit type default value 2011-05-16 16:14:11 +02:00
Jakub Vrana
cbdf09d868 Show version in comment (thanks to David Grudl) 2011-05-12 16:21:40 +02:00
Jakub Vrana
dd39e3aa3f Save bytes 2011-05-10 14:54:10 +02:00
Jakub Vrana
fcc773660e Use Esc to disable in-place edit (bug #3299578) 2011-05-10 11:07:39 +02:00
Jakub Vrana
9bb764162d Save and continue edit of set data type (bug #3298804) 2011-05-08 08:59:26 +02:00
Jakub Vrana
1b47195a7e Prefer speed 2011-05-06 23:08:11 +02:00
Jakub Vrana
b48d6cf42b Version alternative designs 2011-05-06 21:13:55 +02:00
Jakub Vrana
1da3ca544a Display indexes in Oracle (thanks to Marcello Verona) 2011-05-06 18:04:03 +02:00
Jakub Vrana
fb9db96e4d Better plural forms (thanks to Paulius Lescinskas) 2011-05-06 17:11:51 +02:00
Jakub Vrana
a8895c8238 Bit type default value (thanks to Jan Tojnar) 2011-05-06 15:49:23 +02:00
Jakub Vrana
2a1c409681 Highlight SQL code in textarea 2011-05-05 17:02:39 +02:00
Jakub Vrana
bd88113666 Same fields order as in login form 2011-05-05 17:02:38 +02:00
Jakub Vrana
24e66c2812 Respect numbers in autocomplete 2011-05-05 07:46:36 +02:00
Jakub Vrana
dd295df9bd No AJAX for # links 2011-05-05 07:10:09 +02:00
Jakub Vrana
1c1537b089 Fix ALTER export: add columns together with modify 2011-05-05 07:10:09 +02:00
Jakub Vrana
4358ba8181 Use AJAX in foreign key change 2011-05-05 07:10:09 +02:00
Jakub Vrana
6b4ee48ae8 Autocomplete for big foreign keys 2011-05-04 17:19:54 +02:00
Jakub Vrana
daf85306a5 Send e-mail by Ctrl+Enter (Editor) 2011-05-04 17:19:54 +02:00
Jakub Vrana
b6be64e9c0 Use nbsp in foreign keys list 2011-04-23 09:43:39 +02:00
Jakub Vrana
5792eabd9b Use server name for server dump 2011-04-20 17:20:00 +02:00
Jakub Vrana
88d473ae16 Disable auto_increment by default 2011-04-20 17:15:16 +02:00
Jakub Vrana
4091912219 Lithuanian translation 2011-04-17 04:49:50 +02:00
Jakub Vrana
417b29fe65 Fix 'Commands out of sync' (thanks to Vlasta Neubauer) 2011-04-17 04:36:48 +02:00
Jakub Vrana
d94aad0f69 Avoid re-post confirmation in AJAX (bug #3282288) 2011-04-13 06:30:21 -07:00
Jakub Vrana
374e39eb3e Close opened tags 2011-04-12 08:08:58 -07:00
Jakub Vrana
d7183def4f Typo 2011-04-12 06:58:06 -07:00
Jakub Vrana
d3d6a9ae60 Append new index with auto index selection (bug #3282127) 2011-04-09 07:36:22 -07:00
Jakub Vrana
ba357a553e Respect original memory limit (bug #3282091) 2011-04-09 06:49:36 -07:00
Jakub Vrana
91aae7332f Simplify foreign key discovery 2011-04-08 00:50:33 -06:00
Jakub Vrana
3ebfdd30c1 Simpler customization of name() link 2011-04-03 08:27:34 -07:00
Jakub Vrana
46dad6eec3 Comment 2011-04-03 08:17:33 -07:00
Jakub Vrana
d55ba18b43 Customizable favicon 2011-04-03 08:17:26 -07:00
Jakub Vrana
8e46171f14 Update translation 2011-04-01 08:44:26 -07:00
Jakub Vrana
8f046ea234 Develop 2011-03-28 12:54:13 +02:00
Jakub Vrana
8b0acfe8ca Release 2011-03-28 12:44:17 +02:00
Jakub Vrana
324b19d281 Simplify JUSH replacement 2011-03-28 12:41:02 +02:00
Jakub Vrana
87888f1048 Comment 2011-03-28 12:40:14 +02:00
Jakub Vrana
9f58dc6328 Allow more extends with plugin autoloader 2011-03-28 01:51:18 +02:00
Jakub Vrana
63f197213e Show only errors with file upload by default 2011-03-28 00:56:48 +02:00
Jakub Vrana
869193fa18 Plugin autoloader 2011-03-28 00:47:42 +02:00
Jakub Vrana
989d75886f Schema permanent link before mouse move 2011-03-26 02:26:17 +01:00
Jakub Vrana
52a67a9d7c Drop view from alter 2011-03-25 23:59:27 +01:00
Jakub Vrana
8bda0b64ba Allow replacing JS functions in head method 2011-03-25 16:03:36 +01:00
Jakub Vrana
3929e19c7f Do not depend on externals 2011-03-25 15:59:19 +01:00
Jakub Vrana
b5cbbce3cd Save memory 2011-03-25 13:36:12 +01:00
Jakub Vrana
6d0b86bffa Show only SELECT result in 'Only errors' mode 2011-03-25 13:15:49 +01:00
Jakub Vrana
3535d0a325 Parse comment before delimiter 2011-03-25 12:50:21 +01:00
Jakub Vrana
ce9270ba66 Typo 2011-03-24 16:57:43 +01:00
Jakub Vrana
aea84dda9a Fix plugin extending
http://forum.zdrojak.root.cz/index.php?topic=366.0
2011-03-24 16:23:26 +01:00
Jakub Vrana
2dbc73833b PostgreSQL bool in Editor 2011-03-24 11:37:05 +01:00
Jakub Vrana
ebc0c52f5f Comment 2011-03-24 11:33:31 +01:00
Jakub Vrana
92259121a5 Display loader above menu 2011-03-24 11:07:17 +01:00
Jakub Vrana
58347d495e Load page without POST after denied AJAX reload 2011-03-24 08:39:35 +01:00
Jakub Vrana
fa832055c8 Fix AJAX history after reload 2011-03-24 08:24:57 +01:00
Jakub Vrana
5ee14079b8 Avoid double escaping 2011-03-24 02:19:21 +01:00
Jakub Vrana
07e4476e78 Register events after loading JS functions 2011-03-24 01:30:32 +01:00
Jakub Vrana
06e3746510 No HTML tags in <title> 2011-03-23 21:07:21 +01:00
Jakub Vrana
7d2735512f Develop 2011-03-23 18:33:33 +01:00
88 changed files with 3353 additions and 535 deletions

3
.gitmodules vendored
View File

@@ -13,3 +13,6 @@
[submodule "jquery-timepicker"] [submodule "jquery-timepicker"]
path = externals/jquery-timepicker path = externals/jquery-timepicker
url = git://github.com/trentrichardson/jQuery-Timepicker-Addon.git url = git://github.com/trentrichardson/jQuery-Timepicker-Addon.git
[submodule "wymeditor"]
path = externals/wymeditor
url = git://github.com/wymeditor/wymeditor.git

View File

@@ -33,10 +33,14 @@ if (!$error && $_POST) {
if (!$connection->multi_query($query)) { if (!$connection->multi_query($query)) {
echo "<p class='error'>" . error() . "\n"; echo "<p class='error'>" . error() . "\n";
} else { } else {
$connection2 = connect();
if (is_object($connection2)) {
$connection2->select_db(DB);
}
do { do {
$result = $connection->store_result(); $result = $connection->store_result();
if (is_object($result)) { if (is_object($result)) {
select($result); select($result, $connection2);
} else { } else {
echo "<p class='message'>" . lang('Routine has been called, %d row(s) affected.', $connection->affected_rows) . "\n"; echo "<p class='message'>" . lang('Routine has been called, %d row(s) affected.', $connection->affected_rows) . "\n";
} }

View File

@@ -157,15 +157,26 @@ foreach ($engines as $engine) {
<?php echo ($collations && !ereg("sqlite|mssql", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?> <?php echo ($collations && !ereg("sqlite|mssql", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
<input type="submit" value="<?php echo lang('Save'); ?>"> <input type="submit" value="<?php echo lang('Save'); ?>">
<table cellspacing="0" id="edit-fields" class="nowrap"> <table cellspacing="0" id="edit-fields" class="nowrap">
<?php $comments = edit_fields($row["fields"], $collations, "TABLE", $suhosin, $foreign_keys, $row["Comment"] != ""); ?> <?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", $suhosin, $foreign_keys, $comments);
?>
</table> </table>
<p> <p>
<?php echo lang('Auto Increment'); ?>: <input name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>"> <?php echo lang('Auto Increment'); ?>: <input name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
<label class="jsonly"><input type="checkbox" onclick="columnShow(this.checked, 5);"><?php echo lang('Default values'); ?></label> <label class="jsonly"><input type="checkbox" name="defaults" value="1"<?php echo ($_POST["defaults"] ? " checked" : ""); ?> onclick="columnShow(this.checked, 5);"><?php echo lang('Default values'); ?></label>
<?php echo (support("comment") ? checkbox("", "", $comments, lang('Comment'), "columnShow(this.checked, 6); toggle('Comment'); if (this.checked) this.form['Comment'].focus();") . ' <input id="Comment" name="Comment" value="' . h($row["Comment"]) . '" maxlength="60"' . ($comments ? '' : ' class="hidden"') . '>' : ''); ?> <?php echo (support("comment") ? checkbox("comments", 1, $comments, lang('Comment'), "columnShow(this.checked, 6); toggle('Comment'); if (this.checked) this.form['Comment'].focus();", true) . ' <input id="Comment" name="Comment" value="' . h($row["Comment"]) . '" maxlength="60"' . ($comments ? '' : ' class="hidden"') . '>' : ''); ?>
<p> <p>
<input type="submit" value="<?php echo lang('Save'); ?>"> <input type="submit" value="<?php echo lang('Save'); ?>">
<?php if (strlen($_GET["create"])) { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?> <?php if ($_GET["create"] != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="hidden" name="token" value="<?php echo $token; ?>">
<?php <?php
if (support("partitioning")) { if (support("partitioning")) {

View File

@@ -38,7 +38,6 @@ page_header(($_GET["ns"] == "" ? lang('Database') . ": " . h(DB) : lang('Schema'
if ($adminer->homepage()) { if ($adminer->homepage()) {
if ($_GET["ns"] !== "") { if ($_GET["ns"] !== "") {
echo '<a href="' . h(ME) . 'schema=">' . lang('Database schema') . "</a>\n";
echo "<h3>" . lang('Tables and views') . "</h3>\n"; echo "<h3>" . lang('Tables and views') . "</h3>\n";
$tables_list = tables_list(); $tables_list = tables_list();
if (!$tables_list) { if (!$tables_list) {
@@ -102,14 +101,14 @@ if ($adminer->homepage()) {
odd(''); odd('');
foreach ($routines as $row) { foreach ($routines as $row) {
echo '<tr' . odd() . '>'; echo '<tr' . odd() . '>';
echo '<th><a href="' . h(ME) . ($row["ROUTINE_TYPE"] == "FUNCTION" ? 'callf=' : 'call=') . urlencode($row["ROUTINE_NAME"]) . '">' . h($row["ROUTINE_NAME"]) . '</a>'; echo '<th><a href="' . h(ME) . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'callf=' : 'call=') . urlencode($row["ROUTINE_NAME"]) . '">' . h($row["ROUTINE_NAME"]) . '</a>';
echo '<td>' . h($row["ROUTINE_TYPE"]); echo '<td>' . h($row["ROUTINE_TYPE"]);
echo '<td>' . h($row["DTD_IDENTIFIER"]); echo '<td>' . h($row["DTD_IDENTIFIER"]);
echo '<td><a href="' . h(ME) . ($row["ROUTINE_TYPE"] == "FUNCTION" ? 'function=' : 'procedure=') . urlencode($row["ROUTINE_NAME"]) . '">' . lang('Alter') . "</a>"; echo '<td><a href="' . h(ME) . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'function=' : 'procedure=') . urlencode($row["ROUTINE_NAME"]) . '">' . lang('Alter') . "</a>";
} }
echo "</table>\n"; echo "</table>\n";
} }
echo '<p><a href="' . h(ME) . 'procedure=">' . lang('Create procedure') . '</a> <a href="' . h(ME) . 'function=">' . lang('Create function') . "</a>\n"; echo '<p>' . (support("procedure") ? '<a href="' . h(ME) . 'procedure=">' . lang('Create procedure') . '</a> ' : '') . '<a href="' . h(ME) . 'function=">' . lang('Create function') . "</a>\n";
} }
if (support("sequence")) { if (support("sequence")) {

View File

@@ -334,10 +334,6 @@ WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U',
} }
function indexes($table, $connection2 = null) { function indexes($table, $connection2 = null) {
global $connection;
if (!is_object($connection2)) {
$connection2 = $connection;
}
$return = array(); $return = array();
// sp_statistics doesn't return information about primary key // sp_statistics doesn't return information about primary key
foreach (get_rows("SELECT i.name, key_ordinal, is_unique, is_primary_key, c.name AS column_name foreach (get_rows("SELECT i.name, key_ordinal, is_unique, is_primary_key, c.name AS column_name
@@ -440,16 +436,16 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
$index = array(); $index = array();
$drop = array(); $drop = array();
foreach ($alter as $val) { foreach ($alter as $val) {
if ($val[2]) { if ($val[2] == "DROP") {
if ($val[0] == "PRIMARY") { //! sometimes used also for UNIQUE if ($val[0] == "PRIMARY") { //! sometimes used also for UNIQUE
$drop[] = $val[1]; $drop[] = idf_escape($val[1]);
} else { } else {
$index[] = "$val[1] ON " . table($table); $index[] = idf_escape($val[1]) . " ON " . table($table);
} }
} elseif (!queries(($val[0] != "PRIMARY" } elseif (!queries(($val[0] != "PRIMARY"
? "CREATE" . ($val[0] != "INDEX" ? " UNIQUE" : "") . " INDEX " . idf_escape(uniqid($table . "_")) . " ON " . table($table) ? "CREATE $val[0] " . ($val[0] != "INDEX" ? "INDEX " : "") . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table)
: "ALTER TABLE " . table($table) . " ADD PRIMARY KEY" : "ALTER TABLE " . table($table) . " ADD PRIMARY KEY"
) . " $val[1]")) { ) . " $val[2]")) {
return false; return false;
} }
} }

View File

@@ -18,8 +18,8 @@ if (!defined("DRIVER")) {
list($host, $port) = explode(":", $server, 2); // part after : is used for port or socket list($host, $port) = explode(":", $server, 2); // part after : is used for port or socket
$return = @$this->real_connect( $return = @$this->real_connect(
($server != "" ? $host : ini_get("mysqli.default_host")), ($server != "" ? $host : ini_get("mysqli.default_host")),
("$server$username" != "" ? $username : ini_get("mysqli.default_user")), ($server . $username != "" ? $username : ini_get("mysqli.default_user")),
("$server$username$password" != "" ? $password : ini_get("mysqli.default_pw")), ($server . $username . $password != "" ? $password : ini_get("mysqli.default_pw")),
null, null,
(is_numeric($port) ? $port : ini_get("mysqli.default_port")), (is_numeric($port) ? $port : ini_get("mysqli.default_port")),
(!is_numeric($port) ? $port : null) (!is_numeric($port) ? $port : null)
@@ -389,7 +389,7 @@ if (!defined("DRIVER")) {
* @return bool * @return bool
*/ */
function fk_support($table_status) { function fk_support($table_status) {
return ($table_status["Engine"] == "InnoDB"); return eregi("InnoDB|IBMDB2I", $table_status["Engine"]);
} }
/** Get information about fields /** Get information about fields
@@ -425,10 +425,6 @@ if (!defined("DRIVER")) {
* @return array array($key_name => array("type" => , "columns" => array(), "lengths" => array())) * @return array array($key_name => array("type" => , "columns" => array(), "lengths" => array()))
*/ */
function indexes($table, $connection2 = null) { function indexes($table, $connection2 = null) {
global $connection;
if (!is_object($connection2)) { // use the main connection if the separate connection is unavailable
$connection2 = $connection;
}
$return = array(); $return = array();
foreach (get_rows("SHOW INDEX FROM " . table($table), $connection2) as $row) { foreach (get_rows("SHOW INDEX FROM " . table($table), $connection2) as $row) {
$return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE"))); $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE")));
@@ -440,7 +436,7 @@ if (!defined("DRIVER")) {
/** Get foreign keys in table /** Get foreign keys in table
* @param string * @param string
* @return array array($name => array("db" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => )) * @return array array($name => array("db" => , "ns" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => ))
*/ */
function foreign_keys($table) { function foreign_keys($table) {
global $connection, $on_actions; global $connection, $on_actions;
@@ -615,12 +611,15 @@ if (!defined("DRIVER")) {
/** Run commands to alter indexes /** Run commands to alter indexes
* @param string escaped table name * @param string escaped table name
* @param array of array("index type", "(columns definition)") or array("index type", "escaped name", "DROP") * @param array of array("index type", "name", "(columns definition)") or array("index type", "name", "DROP")
* @return bool * @return bool
*/ */
function alter_indexes($table, $alter) { function alter_indexes($table, $alter) {
foreach ($alter as $key => $val) { foreach ($alter as $key => $val) {
$alter[$key] = ($val[2] ? "\nDROP INDEX " : "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "")) . $val[1]; $alter[$key] = ($val[2] == "DROP"
? "\nDROP INDEX " . idf_escape($val[1])
: "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . ($val[1] != "" ? idf_escape($val[1]) . " " : "") . $val[2]
);
} }
return queries("ALTER TABLE " . table($table) . implode(",", $alter)); return queries("ALTER TABLE " . table($table) . implode(",", $alter));
} }
@@ -671,6 +670,7 @@ if (!defined("DRIVER")) {
* @return bool * @return bool
*/ */
function copy_tables($tables, $views, $target) { function copy_tables($tables, $views, $target) {
queries("SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'");
foreach ($tables as $table) { foreach ($tables as $table) {
$name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table)); $name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
if (!queries("DROP TABLE IF EXISTS $name") if (!queries("DROP TABLE IF EXISTS $name")
@@ -726,14 +726,14 @@ if (!defined("DRIVER")) {
/** Get information about stored routine /** Get information about stored routine
* @param string * @param string
* @param string FUNCTION or PROCEDURE * @param string "FUNCTION" or "PROCEDURE"
* @return array ("fields" => array("field" => , "type" => , "length" => , "unsigned" => , "inout" => , "collation" => ), "returns" => , "definition" => ) * @return array ("fields" => array("field" => , "type" => , "length" => , "unsigned" => , "inout" => , "collation" => ), "returns" => , "definition" => , "language" => )
*/ */
function routine($name, $type) { function routine($name, $type) {
global $connection, $enum_length, $inout, $types; global $connection, $enum_length, $inout, $types;
$aliases = array("bool", "boolean", "integer", "double precision", "real", "dec", "numeric", "fixed", "national char", "national varchar"); $aliases = array("bool", "boolean", "integer", "double precision", "real", "dec", "numeric", "fixed", "national char", "national varchar");
$type_pattern = "((" . implode("|", array_merge(array_keys($types), $aliases)) . ")(?:\\s*\\(((?:[^'\")]*|$enum_length)+)\\))?\\s*(zerofill\\s*)?(unsigned(?:\\s+zerofill)?)?)(?:\\s*(?:CHARSET|CHARACTER\\s+SET)\\s*['\"]?([^'\"\\s]+)['\"]?)?"; $type_pattern = "((" . implode("|", array_merge(array_keys($types), $aliases)) . ")(?:\\s*\\(((?:[^'\")]*|$enum_length)+)\\))?\\s*(zerofill\\s*)?(unsigned(?:\\s+zerofill)?)?)(?:\\s*(?:CHARSET|CHARACTER\\s+SET)\\s*['\"]?([^'\"\\s]+)['\"]?)?";
$pattern = "\\s*(" . ($type == "FUNCTION" ? "" : implode("|", $inout)) . ")?\\s*(?:`((?:[^`]|``)*)`\\s*|\\b(\\S+)\\s+)$type_pattern"; $pattern = "\\s*(" . ($type == "FUNCTION" ? "" : $inout) . ")?\\s*(?:`((?:[^`]|``)*)`\\s*|\\b(\\S+)\\s+)$type_pattern";
$create = $connection->result("SHOW CREATE $type " . idf_escape($name), 2); $create = $connection->result("SHOW CREATE $type " . idf_escape($name), 2);
preg_match("~\\(((?:$pattern\\s*,?)*)\\)" . ($type == "FUNCTION" ? "\\s*RETURNS\\s+$type_pattern" : "") . "\\s*(.*)~is", $create, $match); preg_match("~\\(((?:$pattern\\s*,?)*)\\)" . ($type == "FUNCTION" ? "\\s*RETURNS\\s+$type_pattern" : "") . "\\s*(.*)~is", $create, $match);
$fields = array(); $fields = array();
@@ -757,13 +757,24 @@ if (!defined("DRIVER")) {
"fields" => $fields, "fields" => $fields,
"returns" => array("type" => $match[12], "length" => $match[13], "unsigned" => $match[15], "collation" => $match[16]), "returns" => array("type" => $match[12], "length" => $match[13], "unsigned" => $match[15], "collation" => $match[16]),
"definition" => $match[17], "definition" => $match[17],
"language" => "SQL", // available in information_schema.ROUTINES.PARAMETER_STYLE
); );
} }
/** Get list of routines
* @return array ("ROUTINE_TYPE" => , "ROUTINE_NAME" => , "DTD_IDENTIFIER" => )
*/
function routines() { function routines() {
return get_rows("SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = " . q(DB)); return get_rows("SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = " . q(DB));
} }
/** Get list of available routine languages
* @return array
*/
function routine_languages() {
return array(); // "SQL" not required
}
/** Begin transaction /** Begin transaction
* @return bool * @return bool
*/ */
@@ -891,6 +902,13 @@ if (!defined("DRIVER")) {
return get_key_vals("SHOW VARIABLES"); return get_key_vals("SHOW VARIABLES");
} }
/** Get process list
* @return array ($row)
*/
function process_list() {
return get_rows("SHOW FULL PROCESSLIST");
}
/** Get status variables /** Get status variables
* @return array ($name => $value) * @return array ($name => $value)
*/ */
@@ -899,7 +917,7 @@ if (!defined("DRIVER")) {
} }
/** Check whether a feature is supported /** Check whether a feature is supported
* @param string "comment", "drop_col", "dump", "event", "partitioning", "routine", "scheme", "sequence", "status", "trigger", "type", "variables", "view", "copy" * @param string "comment", "copy", "drop_col", "dump", "event", "kill", "partitioning", "privileges", "procedure", "processlist", "routine", "scheme", "sequence", "status", "trigger", "type", "variables", "view"
* @return bool * @return bool
*/ */
function support($feature) { function support($feature) {

View File

@@ -153,7 +153,10 @@ if (isset($_GET["oracle"])) {
} }
function limit($query, $where, $limit, $offset = 0, $separator = " ") { function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . (isset($limit) ? ($where ? " AND" : $separator . "WHERE") . ($offset ? " rownum > $offset AND" : "") . " rownum <= " . ($limit + $offset) : ""); return ($offset ? " * FROM (SELECT t.*, rownum AS rnum FROM (SELECT $query$where) t WHERE rownum <= " . ($limit + $offset) . ") WHERE rnum > $offset"
: (isset($limit) ? " * FROM (SELECT $query$where) WHERE rownum <= " . ($limit + $offset)
: " $query$where"
));
} }
function limit1($query, $where) { function limit1($query, $where) {
@@ -232,7 +235,17 @@ UNION SELECT view_name, 'view' FROM user_views" . ($name != "" ? " WHERE view_na
} }
function indexes($table, $connection2 = null) { function indexes($table, $connection2 = null) {
return array(); //! $return = array();
foreach (get_rows("SELECT uic.*, uc.constraint_type
FROM user_ind_columns uic
LEFT JOIN user_constraints uc ON uic.index_name = uc.constraint_name AND uic.table_name = uc.table_name
WHERE uic.table_name = " . q($table) . "
ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
$return[$row["INDEX_NAME"]]["type"] = ($row["CONSTRAINT_TYPE"] == "P" ? "PRIMARY" : ($row["CONSTRAINT_TYPE"] == "U" ? "UNIQUE" : "INDEX"));
$return[$row["INDEX_NAME"]]["columns"][] = $row["COLUMN_NAME"];
$return[$row["INDEX_NAME"]]["lengths"][] = ($row["CHAR_LENGTH"] && $row["CHAR_LENGTH"] != $row["COLUMN_LENGTH"] ? $row["CHAR_LENGTH"] : null);
}
return $return;
} }
function view($name) { function view($name) {

View File

@@ -17,10 +17,12 @@ if (isset($_GET["pgsql"])) {
} }
function connect($server, $username, $password) { function connect($server, $username, $password) {
global $adminer;
$db = $adminer->database();
set_error_handler(array($this, '_error')); set_error_handler(array($this, '_error'));
$this->_string = "host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' user='" . addcslashes($username, "'\\") . "' password='" . addcslashes($password, "'\\") . "'"; $this->_string = "host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' user='" . addcslashes($username, "'\\") . "' password='" . addcslashes($password, "'\\") . "'";
$this->_link = @pg_connect($this->_string . (DB != "" ? " dbname='" . addcslashes(DB, "'\\") . "'" : " dbname='template1'"), PGSQL_CONNECT_FORCE_NEW); $this->_link = @pg_connect($this->_string . ($db != "" ? " dbname='" . addcslashes($db, "'\\") . "'" : " dbname='template1'"), PGSQL_CONNECT_FORCE_NEW);
if (!$this->_link && DB != "") { if (!$this->_link && $db != "") {
// try to connect directly with database for performance // try to connect directly with database for performance
$this->_database = false; $this->_database = false;
$this->_link = @pg_connect("$this->_string dbname='template1'", PGSQL_CONNECT_FORCE_NEW); $this->_link = @pg_connect("$this->_string dbname='template1'", PGSQL_CONNECT_FORCE_NEW);
@@ -39,7 +41,8 @@ if (isset($_GET["pgsql"])) {
} }
function select_db($database) { function select_db($database) {
if ($database == DB) { global $adminer;
if ($database == $adminer->database()) {
return $this->_database; return $this->_database;
} }
$return = @pg_connect("$this->_string dbname='" . addcslashes($database, "'\\") . "'", PGSQL_CONNECT_FORCE_NEW); $return = @pg_connect("$this->_string dbname='" . addcslashes($database, "'\\") . "'", PGSQL_CONNECT_FORCE_NEW);
@@ -126,14 +129,17 @@ if (isset($_GET["pgsql"])) {
var $extension = "PDO_PgSQL"; var $extension = "PDO_PgSQL";
function connect($server, $username, $password) { function connect($server, $username, $password) {
global $adminer;
$db = $adminer->database();
$string = "pgsql:host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' options='-c client_encoding=utf8'"; $string = "pgsql:host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' options='-c client_encoding=utf8'";
$this->dsn($string . (DB != "" ? " dbname='" . addcslashes(DB, "'\\") . "'" : ""), $username, $password); $this->dsn($string . ($db != "" ? " dbname='" . addcslashes($db, "'\\") . "'" : ""), $username, $password);
//! connect without DB in case of an error //! connect without DB in case of an error
return true; return true;
} }
function select_db($database) { function select_db($database) {
return (DB == $database); global $adminer;
return ($adminer->database() == $database);
} }
function close() { function close() {
@@ -235,6 +241,9 @@ ORDER BY a.attnum"
$row["null"] = ($row["attnotnull"] == "f"); $row["null"] = ($row["attnotnull"] == "f");
$row["auto_increment"] = eregi("^nextval\\(", $row["default"]); $row["auto_increment"] = eregi("^nextval\\(", $row["default"]);
$row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1); $row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
if (preg_match('~^(.*)::.+$~', $row["default"], $match)) {
$row["default"] = ($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]);
}
$return[$row["field"]] = $row; $return[$row["field"]] = $row;
} }
return $return; return $return;
@@ -261,13 +270,13 @@ ORDER BY a.attnum"
function foreign_keys($table) { function foreign_keys($table) {
$return = array(); $return = array();
foreach (get_rows("SELECT tc.constraint_name, kcu.column_name, rc.update_rule AS on_update, rc.delete_rule AS on_delete, ccu.table_name AS table, ccu.column_name AS ref foreach (get_rows("SELECT tc.constraint_name, kcu.column_name, rc.update_rule AS on_update, rc.delete_rule AS on_delete, unique_constraint_schema AS ns, ccu.table_name AS table, ccu.column_name AS ref
FROM information_schema.table_constraints tc FROM information_schema.table_constraints tc
LEFT JOIN information_schema.key_column_usage kcu USING (constraint_catalog, constraint_schema, constraint_name) LEFT JOIN information_schema.key_column_usage kcu USING (constraint_catalog, constraint_schema, constraint_name)
LEFT JOIN information_schema.referential_constraints rc USING (constraint_catalog, constraint_schema, constraint_name) LEFT JOIN information_schema.referential_constraints rc USING (constraint_catalog, constraint_schema, constraint_name)
LEFT JOIN information_schema.constraint_column_usage ccu ON rc.unique_constraint_catalog = ccu.constraint_catalog AND rc.unique_constraint_schema = ccu.constraint_schema AND rc.unique_constraint_name = ccu.constraint_name LEFT JOIN information_schema.constraint_column_usage ccu ON rc.unique_constraint_catalog = ccu.constraint_catalog AND rc.unique_constraint_schema = ccu.constraint_schema AND rc.unique_constraint_name = ccu.constraint_name
WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . q($table) //! there can be more unique_constraint_name WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.constraint_schema = current_schema() AND tc.table_name = " . q($table) //! there can be more unique_constraint_name
) as $row) { ) as $row) {
$foreign_key = &$return[$row["constraint_name"]]; $foreign_key = &$return[$row["constraint_name"]];
if (!$foreign_key) { if (!$foreign_key) {
$foreign_key = $row; $foreign_key = $row;
@@ -383,10 +392,13 @@ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . q($table) //! t
$drop = array(); $drop = array();
foreach ($alter as $val) { foreach ($alter as $val) {
if ($val[0] != "INDEX") { if ($val[0] != "INDEX") {
$create[] = ($val[2] ? "\nDROP CONSTRAINT " : "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "")) . $val[1]; $create[] = ($val[2] == "DROP"
} elseif ($val[2]) { ? "\nDROP CONSTRAINT " . idf_escape($val[1])
$drop[] = $val[1]; : "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . $val[2]
} elseif (!queries("CREATE INDEX " . idf_escape(uniqid($table . "_")) . " ON " . table($table) . " $val[1]")) { );
} elseif ($val[2] == "DROP") {
$drop[] = idf_escape($val[1]);
} elseif (!queries("CREATE INDEX " . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table) . " $val[2]")) {
return false; return false;
} }
} }
@@ -442,6 +454,32 @@ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . q($table) //! t
); );
} }
/*
function routine($name, $type) {
//! there can be more functions with the same name differing only in parameters, it must be also passed to DROP FUNCTION
//! no procedures, only functions
//! different syntax of CREATE FUNCTION
$rows = get_rows('SELECT pg_catalog.format_type(p.prorettype, NULL) AS "returns", p.prosrc AS "definition"
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid
WHERE n.nspname = current_schema() AND p.proname = ' . q($name));
$rows[0]["fields"] = array(); //!
return $rows[0];
}
*/
function routines() {
return get_rows('SELECT p.proname AS "ROUTINE_NAME", p.proargtypes AS "ROUTINE_TYPE", pg_catalog.format_type(p.prorettype, NULL) AS "DTD_IDENTIFIER"
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid
WHERE n.nspname = current_schema()
ORDER BY p.proname');
}
function routine_languages() {
return get_vals("SELECT langname FROM pg_catalog.pg_language");
}
function begin() { function begin() {
return queries("BEGIN"); return queries("BEGIN");
} }
@@ -510,12 +548,16 @@ AND typelem = 0"
function show_variables() { function show_variables() {
return get_key_vals("SHOW ALL"); return get_key_vals("SHOW ALL");
} }
function process_list() {
return get_rows("SELECT * FROM pg_stat_activity ORDER BY procpid");
}
function show_status() { function show_status() {
} }
function support($feature) { function support($feature) {
return ereg('^(comment|view|scheme|sequence|trigger|type|variables|drop_col)$', $feature); //! routine| return ereg('^(comment|view|scheme|processlist|sequence|trigger|type|variables|drop_col)$', $feature); //! routine|
} }
$jush = "pgsql"; $jush = "pgsql";

View File

@@ -422,7 +422,10 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
function alter_indexes($table, $alter) { function alter_indexes($table, $alter) {
foreach ($alter as $val) { foreach ($alter as $val) {
if (!queries(($val[2] ? "DROP INDEX" : "CREATE" . ($val[0] != "INDEX" ? " UNIQUE" : "") . " INDEX " . idf_escape(uniqid($table . "_")) . " ON " . table($table)) . " $val[1]")) { if (!queries($val[2] == "DROP"
? "DROP INDEX " . idf_escape($val[1])
: "CREATE $val[0] " . ($val[0] != "INDEX" ? "INDEX " : "") . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table) . " $val[2]"
)) {
return false; return false;
} }
} }
@@ -475,6 +478,10 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
// not supported by SQLite // not supported by SQLite
} }
function routine_languages() {
// not supported by SQLite
}
function begin() { function begin() {
return queries("BEGIN"); return queries("BEGIN");
} }

View File

@@ -165,7 +165,7 @@ if (!$row) {
} }
if (!isset($row["events"])) { // backwards compatibility if (!isset($row["events"])) { // backwards compatibility
$row["routines"] = $row["events"] = ($_GET["dump"] == ""); $row["routines"] = $row["events"] = ($_GET["dump"] == "");
$row["auto_increment"] = $row["triggers"] = $row["table_style"]; $row["triggers"] = $row["table_style"];
} }
echo "<tr><th>" . lang('Output') . "<td>" . html_select("output", $adminer->dumpOutput(), $row["output"], 0) . "\n"; // 0 - radio echo "<tr><th>" . lang('Output') . "<td>" . html_select("output", $adminer->dumpOutput(), $row["output"], 0) . "\n"; // 0 - radio
echo "<tr><th>" . lang('Format') . "<td>" . html_select("format", $adminer->dumpFormat(), $row["format"], 0) . "\n"; // 0 - radio echo "<tr><th>" . lang('Format') . "<td>" . html_select("format", $adminer->dumpFormat(), $row["format"], 0) . "\n"; // 0 - radio

View File

@@ -43,7 +43,7 @@ page_header(
($update ? lang('Edit') : lang('Insert')), ($update ? lang('Edit') : lang('Insert')),
$error, $error,
array("select" => array($TABLE, $table_name)), array("select" => array($TABLE, $table_name)),
$table_name $table_name //! two calls of h()
); );
$row = null; $row = null;
@@ -72,13 +72,13 @@ if ($fields) {
echo "<tr><th>" . $adminer->fieldName($field); echo "<tr><th>" . $adminer->fieldName($field);
$default = $_GET["set"][bracket_escape($name)]; $default = $_GET["set"][bracket_escape($name)];
$value = (isset($row) $value = (isset($row)
? ($row[$name] != "" && ereg("enum|set", $field["type"]) ? +$row[$name] : $row[$name]) ? ($row[$name] != "" && ereg("enum|set", $field["type"]) ? (is_array($row[$name]) ? array_sum($row[$name]) : +$row[$name]) : $row[$name])
: (!$update && $field["auto_increment"] ? "" : (isset($_GET["select"]) ? false : (isset($default) ? $default : $field["default"]))) : (!$update && $field["auto_increment"] ? "" : (isset($_GET["select"]) ? false : (isset($default) ? $default : $field["default"])))
); );
if (!$_POST["save"] && is_string($value)) { if (!$_POST["save"] && is_string($value)) {
$value = $adminer->editVal($value, $field); $value = $adminer->editVal($value, $field);
} }
$function = ($_POST["save"] ? (string) $_POST["function"][$name] : ($where && $field["on_update"] == "CURRENT_TIMESTAMP" ? "now" : ($value === false ? null : (isset($value) ? '' : 'NULL')))); $function = ($_POST["save"] ? (string) $_POST["function"][$name] : ($update && $field["on_update"] == "CURRENT_TIMESTAMP" ? "now" : ($value === false ? null : (isset($value) ? '' : 'NULL'))));
if ($field["type"] == "timestamp" && $value == "CURRENT_TIMESTAMP") { if ($field["type"] == "timestamp" && $value == "CURRENT_TIMESTAMP") {
$value = ""; $value = "";
$function = "now"; $function = "now";
@@ -94,7 +94,7 @@ if ($fields) {
if ($fields) { if ($fields) {
echo "<input type='submit' value='" . lang('Save') . "'>\n"; echo "<input type='submit' value='" . lang('Save') . "'>\n";
if (!isset($_GET["select"])) { if (!isset($_GET["select"])) {
echo '<input type="submit" name="insert" value="' . ($update ? lang('Save and continue edit') : lang('Save and insert next')) . "\">\n"; echo "<input type='submit' name='insert' value='" . ($update ? lang('Save and continue edit') : lang('Save and insert next')) . "' title='Ctrl+Shift+Enter'>\n";
} }
} }
echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "' onclick=\"return confirm('" . lang('Are you sure?') . "');\">\n" echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "' onclick=\"return confirm('" . lang('Are you sure?') . "');\">\n"

View File

@@ -12,7 +12,7 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["change"] && !$_POST["change-
} }
query_redirect("ALTER TABLE " . table($TABLE) query_redirect("ALTER TABLE " . table($TABLE)
. ($_GET["name"] != "" ? "\nDROP FOREIGN KEY " . idf_escape($_GET["name"]) . "," : "") . ($_GET["name"] != "" ? "\nDROP FOREIGN KEY " . idf_escape($_GET["name"]) . "," : "")
. "\nADD FOREIGN KEY (" . implode(", ", array_map('idf_escape', $source)) . ") REFERENCES " . table($_POST["table"]) . " (" . implode(", ", array_map('idf_escape', $target)) . ")" . "\nADD FOREIGN KEY (" . implode(", ", array_map('idf_escape', $source)) . ") REFERENCES " . table($_POST["table"]) . " (" . implode(", ", array_map('idf_escape', $target)) . ")" //! reuse $_GET["name"] - check in older MySQL versions
. (in_array($_POST["on_delete"], $on_actions) ? " ON DELETE $_POST[on_delete]" : "") . (in_array($_POST["on_delete"], $on_actions) ? " ON DELETE $_POST[on_delete]" : "")
. (in_array($_POST["on_update"], $on_actions) ? " ON UPDATE $_POST[on_update]" : "") . (in_array($_POST["on_update"], $on_actions) ? " ON UPDATE $_POST[on_update]" : "")
, ME . "table=" . urlencode($TABLE), ($_GET["name"] != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.'))); , ME . "table=" . urlencode($TABLE), ($_GET["name"] != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.')));
@@ -49,9 +49,9 @@ foreach (table_status() as $name => $table_status) {
<form action="" method="post"> <form action="" method="post">
<p> <p>
<?php if ($row["db"] == "") { ?> <?php if ($row["db"] == "" && $row["ns"] == "") { ?>
<?php echo lang('Target table'); ?>: <?php echo lang('Target table'); ?>:
<?php echo html_select("table", $referencable, $row["table"], "this.form['change-js'].value = '1'; this.form.submit();"); ?> <?php echo html_select("table", $referencable, $row["table"], "this.form['change-js'].value = '1'; if (!ajaxForm(this.form)) this.form.submit();"); ?>
<input type="hidden" name="change-js" value=""> <input type="hidden" name="change-js" value="">
<noscript><p><input type="submit" name="change" value="<?php echo lang('Change'); ?>"></noscript> <noscript><p><input type="submit" name="change" value="<?php echo lang('Change'); ?>"></noscript>
<table cellspacing="0"> <table cellspacing="0">

View File

@@ -1,13 +1,15 @@
<?php <?php
// any method change in this file should be transferred to editor/include/adminer.inc.php and plugins/plugin.php
class Adminer { class Adminer {
/** @var array operators used in select, null for all operators */ /** @var array operators used in select, null for all operators */
var $operators; var $operators;
/** Name in title and navigation /** Name in title and navigation
* @return string * @return string HTML code
*/ */
function name() { function name() {
return "Adminer"; return "<a href='http://www.adminer.org/' id='h1'>Adminer</a>";
} }
/** Connection parameters /** Connection parameters
@@ -33,11 +35,10 @@ class Adminer {
} }
/** Headers to send before HTML output /** Headers to send before HTML output
* @return null * @return bool true to send security headers
*/ */
function headers() { function headers() {
header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, Firefox 3.6.9 return true;
header("X-XSS-Protection: 0"); // prevents introducing XSS in IE8 by removing safe parts of the page
} }
/** Print HTML code inside <head> /** Print HTML code inside <head>
@@ -55,7 +56,7 @@ class Adminer {
?> ?>
<table cellspacing="0"> <table cellspacing="0">
<tr><th><?php echo lang('System'); ?><td><?php echo html_select("driver", $drivers, DRIVER, "loginDriver(this);"); ?> <tr><th><?php echo lang('System'); ?><td><?php echo html_select("driver", $drivers, DRIVER, "loginDriver(this);"); ?>
<tr><th><?php echo lang('Server'); ?><td><input name="server" value="<?php echo h(SERVER); ?>"> <tr><th><?php echo lang('Server'); ?><td><input name="server" value="<?php echo h(SERVER); ?>" title="hostname[:port]">
<tr><th><?php echo lang('Username'); ?><td><input id="username" name="username" value="<?php echo h($_GET["username"]); ?>"> <tr><th><?php echo lang('Username'); ?><td><input id="username" name="username" value="<?php echo h($_GET["username"]); ?>">
<tr><th><?php echo lang('Password'); ?><td><input type="password" name="password"> <tr><th><?php echo lang('Password'); ?><td><input type="password" name="password">
</table> </table>
@@ -80,7 +81,7 @@ username.form['driver'].onchange();
/** Table caption used in navigation and headings /** Table caption used in navigation and headings
* @param array result of SHOW TABLE STATUS * @param array result of SHOW TABLE STATUS
* @return string * @return string HTML code, "" to ignore table
*/ */
function tableName($tableStatus) { function tableName($tableStatus) {
return h($tableStatus["Name"]); return h($tableStatus["Name"]);
@@ -89,7 +90,7 @@ username.form['driver'].onchange();
/** Field caption used in select and edit /** Field caption used in select and edit
* @param array single field returned from fields() * @param array single field returned from fields()
* @param int order of column in select * @param int order of column in select
* @return string * @return string HTML code, "" to ignore field
*/ */
function fieldName($field, $order = 0) { function fieldName($field, $order = 0) {
return '<span title="' . h($field["full_type"]) . '">' . h($field["field"]) . '</span>'; return '<span title="' . h($field["full_type"]) . '">' . h($field["field"]) . '</span>';
@@ -192,7 +193,7 @@ username.form['driver'].onchange();
} }
/** Print columns box in select /** Print columns box in select
* @param array result of selectColumnsProcess() * @param array result of selectColumnsProcess()[0]
* @param array selectable columns * @param array selectable columns
* @return null * @return null
*/ */
@@ -295,6 +296,20 @@ username.form['driver'].onchange();
echo "</div></fieldset>\n"; echo "</div></fieldset>\n";
} }
/** Print command box in select
* @return bool whether to print default commands
*/
function selectCommandPrint() {
return !information_schema(DB);
}
/** Print import box in select
* @return bool whether to print default import
*/
function selectImportPrint() {
return true;
}
/** Print extra text in the end of a select form /** Print extra text in the end of a select form
* @param array fields holding e-mails * @param array fields holding e-mails
* @param array selectable columns * @param array selectable columns
@@ -418,7 +433,7 @@ username.form['driver'].onchange();
if (strlen($query) > 1e6) { // not DB - reset in drop database if (strlen($query) > 1e6) { // not DB - reset in drop database
$query = ereg_replace('[\x80-\xFF]+$', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment $query = ereg_replace('[\x80-\xFF]+$', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
} }
$history[$_GET["db"]][] = $query; //! respect $_GET["ns"] $history[$_GET["db"]][] = $query; // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"]
return " <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a><div id='$id' class='hidden'><pre><code class='jush-$jush'>" . shorten_utf8($query, 1000) . '</code></pre><p><a href="' . h(str_replace("db=" . urlencode(DB), "db=" . urlencode($_GET["db"]), ME) . 'sql=&history=' . (count($history[$_GET["db"]]) - 1)) . '">' . lang('Edit') . '</a></div>'; return " <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a><div id='$id' class='hidden'><pre><code class='jush-$jush'>" . shorten_utf8($query, 1000) . '</code></pre><p><a href="' . h(str_replace("db=" . urlencode(DB), "db=" . urlencode($_GET["db"]), ME) . 'sql=&history=' . (count($history[$_GET["db"]]) - 1)) . '">' . lang('Edit') . '</a></div>';
} }
@@ -472,7 +487,7 @@ username.form['driver'].onchange();
return $value; // SQL injection return $value; // SQL injection
} }
$name = $field["field"]; $name = $field["field"];
$return = ($field["type"] == "bit" && ereg('^[0-9]+$', $value) ? $value : q($value)); $return = ($field["type"] == "bit" && ereg("^([0-9]+|b'[0-1]+')\$", $value) ? $value : q($value));
if (ereg('^(now|getdate|uuid)$', $function)) { if (ereg('^(now|getdate|uuid)$', $function)) {
$return = "$function()"; $return = "$function()";
} elseif (ereg('^current_(date|timestamp)$', $function)) { } elseif (ereg('^current_(date|timestamp)$', $function)) {
@@ -582,10 +597,10 @@ CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN
foreach ($fields as $row) { foreach ($fields as $row) {
echo " echo "
WHEN " . q($row["COLUMN_NAME"]) . " THEN WHEN " . q($row["COLUMN_NAME"]) . " THEN
SET add_columns = REPLACE(add_columns, ', ADD $row[alter]', ''); SET add_columns = REPLACE(add_columns, ', ADD $row[alter]', IF(
IF NOT (_column_default <=> $row[default]) OR _is_nullable != '$row[IS_NULLABLE]' OR _collation_name != '$row[COLLATION_NAME]' OR _column_type != " . q($row["COLUMN_TYPE"]) . " OR _extra != '$row[EXTRA]' OR _column_comment != " . q($row["COLUMN_COMMENT"]) . " OR after != $row[after] THEN _column_default <=> $row[default] AND _is_nullable = '$row[IS_NULLABLE]' AND _collation_name <=> " . (isset($row["COLLATION_NAME"]) ? "'$row[COLLATION_NAME]'" : "NULL") . " AND _column_type = " . q($row["COLUMN_TYPE"]) . " AND _extra = '$row[EXTRA]' AND _column_comment = " . q($row["COLUMN_COMMENT"]) . " AND after = $row[after]
SET @alter_table = CONCAT(@alter_table, ', MODIFY $row[alter]'); , '', ', MODIFY $row[alter]'));"
END IF;"; //! don't replace in comment ; //! don't replace in comment
} }
echo " echo "
ELSE ELSE
@@ -657,11 +672,10 @@ DROP PROCEDURE adminer_alter;
$s = ($max_packet ? "\n" : " ") . "($s)"; $s = ($max_packet ? "\n" : " ") . "($s)";
if (!$buffer) { if (!$buffer) {
$buffer = $insert . $s; $buffer = $insert . $s;
} elseif (strlen($buffer) + 2 + strlen($s) < $max_packet) { // 2 - separator and terminator length } elseif (strlen($buffer) + 4 + strlen($s) < $max_packet) { // 4 - length specification
$buffer .= ",$s"; $buffer .= ",$s";
} else { } else {
$buffer .= ";\n"; echo "$buffer;\n";
echo $buffer;
$buffer = $insert . $s; $buffer = $insert . $s;
} }
} }
@@ -705,9 +719,9 @@ DROP PROCEDURE adminer_alter;
*/ */
function homepage() { function homepage() {
echo '<p>' . ($_GET["ns"] == "" ? '<a href="' . h(ME) . 'database=">' . lang('Alter database') . "</a>\n" : ""); echo '<p>' . ($_GET["ns"] == "" ? '<a href="' . h(ME) . 'database=">' . lang('Alter database') . "</a>\n" : "");
if (support("scheme")) { echo (support("scheme") ? "<a href='" . h(ME) . "scheme='>" . ($_GET["ns"] != "" ? lang('Alter schema') : lang('Create schema')) . "</a>\n" : "");
echo "<a href='" . h(ME) . "scheme='>" . ($_GET["ns"] != "" ? lang('Alter schema') : lang('Create schema')) . "</a>\n"; echo ($_GET["ns"] !== "" ? '<a href="' . h(ME) . 'schema=">' . lang('Database schema') . "</a>\n" : "");
} echo (support("privileges") ? "<a href='" . h(ME) . "privileges='>" . lang('Privileges') . "</a>\n" : "");
return true; return true;
} }
@@ -719,8 +733,7 @@ DROP PROCEDURE adminer_alter;
global $VERSION, $connection, $token, $jush, $drivers; global $VERSION, $connection, $token, $jush, $drivers;
?> ?>
<h1> <h1>
<a href="http://www.adminer.org/" id="h1"><?php echo $this->name(); ?></a> <?php echo $this->name(); ?> <span class="version"><?php echo $VERSION; ?></span>
<span class="version"><?php echo $VERSION; ?></span>
<a href="http://www.adminer.org/#download" id="version"><?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?></a> <a href="http://www.adminer.org/#download" id="version"><?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?></a>
</h1> </h1>
<?php <?php

View File

@@ -4,8 +4,8 @@ error_reporting(6135); // errors and warnings
include "../adminer/include/coverage.inc.php"; include "../adminer/include/coverage.inc.php";
// disable filter.default // disable filter.default
$filter = (!ereg('^(unsafe_raw)?$', ini_get("filter.default")) || ini_get("filter.default_flags")); $filter = (!ereg('^(unsafe_raw)?$', ini_get("filter.default")));
if ($filter) { if ($filter || ini_get("filter.default_flags")) {
foreach (array('_GET', '_POST', '_COOKIE', '_SERVER') as $val) { foreach (array('_GET', '_POST', '_COOKIE', '_SERVER') as $val) {
$unsafe = filter_input_array(constant("INPUT$val"), FILTER_UNSAFE_RAW); $unsafe = filter_input_array(constant("INPUT$val"), FILTER_UNSAFE_RAW);
if ($unsafe) { if ($unsafe) {
@@ -39,7 +39,7 @@ if (!defined("SID")) {
} }
// disable magic quotes to be able to use database escaping function // disable magic quotes to be able to use database escaping function
remove_slashes(array(&$_GET, &$_POST, &$_COOKIE)); remove_slashes(array(&$_GET, &$_POST, &$_COOKIE), $filter);
if (function_exists("set_magic_quotes_runtime")) { // removed in PHP 6 if (function_exists("set_magic_quotes_runtime")) { // removed in PHP 6
set_magic_quotes_runtime(false); set_magic_quotes_runtime(false);
} }

View File

@@ -1,17 +1,20 @@
<?php <?php
/** Print HTML header /** Print HTML header
* @param string used in title, breadcrumb and heading * @param string used in title, breadcrumb and heading, should be HTML escaped
* @param string * @param string
* @param mixed array("key" => "link=desc", "key2" => array("link", "desc")), null for nothing, false for driver only, true for driver and server * @param mixed array("key" => "link=desc", "key2" => array("link", "desc")), null for nothing, false for driver only, true for driver and server
* @param string used after colon in title and heading * @param string used after colon in title and heading, will be HTML escaped
* @return null * @return null
*/ */
function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") { function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
global $LANG, $adminer, $connection, $drivers; global $LANG, $adminer, $connection, $drivers;
header("Content-Type: text/html; charset=utf-8"); header("Content-Type: text/html; charset=utf-8");
$adminer->headers(); if ($adminer->headers()) {
header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, Firefox 3.6.9
header("X-XSS-Protection: 0"); // prevents introducing XSS in IE8 by removing safe parts of the page
}
$title_all = $title . ($title2 != "" ? ": " . h($title2) : ""); $title_all = $title . ($title2 != "" ? ": " . h($title2) : "");
$title_page = $title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name(); $title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name());
if (is_ajax()) { if (is_ajax()) {
header("X-AJAX-Title: " . rawurlencode($title_page)); header("X-AJAX-Title: " . rawurlencode($title_page));
} else { } else {
@@ -22,31 +25,36 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
<meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Script-Type" content="text/javascript">
<meta name="robots" content="noindex"> <meta name="robots" content="noindex">
<title><?php echo $title_page; ?></title> <title><?php echo $title_page; ?></title>
<link rel="shortcut icon" type="image/x-icon" href="../adminer/static/favicon.ico" id="favicon">
<link rel="stylesheet" type="text/css" href="../adminer/static/default.css"> <link rel="stylesheet" type="text/css" href="../adminer/static/default.css">
<?php if ($adminer->head() && file_exists("adminer.css")) { ?>
<link rel="stylesheet" type="text/css" href="adminer.css">
<?php } ?>
<body class="<?php echo lang('ltr'); ?> nojs" onclick="return bodyClick(event, '<?php echo js_escape(DB); ?>', '<?php echo js_escape($_GET["ns"]); ?>');" onkeydown="bodyKeydown(event);" onload="bodyLoad('<?php echo (is_object($connection) ? substr($connection->server_info, 0, 3) : ""); ?>');<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " verifyVersion('$protocol');"); ?>">
<script type="text/javascript"> <script type="text/javascript">
var areYouSure = '<?php echo lang('Resend POST data?'); ?>'; var areYouSure = '<?php echo lang('Resend POST data?'); ?>';
</script> </script>
<script type="text/javascript" src="../adminer/static/functions.js"></script> <script type="text/javascript" src="../adminer/static/functions.js"></script>
<script type="text/javascript" src="static/editing.js"></script> <script type="text/javascript" src="static/editing.js"></script>
<?php if ($adminer->head()) { ?>
<link rel="shortcut icon" type="image/x-icon" href="../adminer/static/favicon.ico" id="favicon">
<?php if (file_exists("adminer.css")) { ?>
<link rel="stylesheet" type="text/css" href="adminer.css">
<?php } ?>
<?php } ?>
<body class="<?php echo lang('ltr'); ?> nojs"<?php echo ($_POST ? "" : " onclick=\"return bodyClick(event, '" . h(js_escape(DB) . "', '" . js_escape($_GET["ns"])) . "');\""); // avoid re-post confirmation after refreshing the next page in Google Chrome ?> onkeydown="bodyKeydown(event);" onload="bodyLoad('<?php echo (is_object($connection) ? substr($connection->server_info, 0, 3) : ""); ?>');<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " verifyVersion();"); ?>">
<script type="text/javascript">
document.body.className = document.body.className.replace(/(^|\s)nojs(\s|$)/, '$1js$2');
</script>
<div id="content"> <div id="content">
<?php <?php
} }
if (isset($breadcrumb)) { if (isset($breadcrumb)) {
$link = substr(preg_replace('~(username|db|ns)=[^&]*&~', '', ME), 0, -1); $link = substr(preg_replace('~(username|db|ns)=[^&]*&~', '', ME), 0, -1);
echo '<p id="breadcrumb"><a href="' . ($link ? h($link) : ".") . '">' . $drivers[DRIVER] . '</a> &raquo; '; echo '<p id="breadcrumb"><a href="' . h($link ? $link : ".") . '">' . $drivers[DRIVER] . '</a> &raquo; ';
$link = substr(preg_replace('~(db|ns)=[^&]*&~', '', ME), 0, -1); $link = substr(preg_replace('~(db|ns)=[^&]*&~', '', ME), 0, -1);
$server = (SERVER != "" ? h(SERVER) : lang('Server')); $server = (SERVER != "" ? h(SERVER) : lang('Server'));
if ($breadcrumb === false) { if ($breadcrumb === false) {
echo "$server\n"; echo "$server\n";
} else { } else {
echo "<a href='" . ($link ? h($link) : ".") . "'>$server</a> &raquo; "; echo "<a href='" . ($link ? h($link) : ".") . "' accesskey='1' title='Alt+Shift+1'>$server</a> &raquo; ";
if ($_GET["ns"] != "" || (DB != "" && is_array($breadcrumb))) { if ($_GET["ns"] != "" || (DB != "" && is_array($breadcrumb))) {
echo '<a href="' . h($link . "&db=" . urlencode(DB) . (support("scheme") ? "&ns=" : "")) . '">' . h(DB) . '</a> &raquo; '; echo '<a href="' . h($link . "&db=" . urlencode(DB) . (support("scheme") ? "&ns=" : "")) . '">' . h(DB) . '</a> &raquo; ';
} }

View File

@@ -18,9 +18,12 @@ function select($result, $connection2 = null, $href = "") {
echo "<thead><tr>"; echo "<thead><tr>";
for ($j=0; $j < count($row); $j++) { for ($j=0; $j < count($row); $j++) {
$field = $result->fetch_field(); $field = $result->fetch_field();
$name = $field->name;
$orgtable = $field->orgtable; $orgtable = $field->orgtable;
$orgname = $field->orgname; $orgname = $field->orgname;
if ($orgtable != "") { if ($href) { // MySQL EXPLAIN
$links[$j] = ($name == "table" ? "table=" : ($name == "possible_keys" ? "indexes=" : null));
} elseif ($orgtable != "") {
if (!isset($indexes[$orgtable])) { if (!isset($indexes[$orgtable])) {
// find primary key in each table // find primary key in each table
$indexes[$orgtable] = array(); $indexes[$orgtable] = array();
@@ -42,7 +45,7 @@ function select($result, $connection2 = null, $href = "") {
$blobs[$j] = true; $blobs[$j] = true;
} }
$types[$j] = $field->type; $types[$j] = $field->type;
$name = h($field->name); $name = h($name);
echo "<th" . ($orgtable != "" || $field->name != $orgname ? " title='" . h(($orgtable != "" ? "$orgtable." : "") . $orgname) . "'" : "") . ">" . ($href ? "<a href='$href" . strtolower($name) . "' target='_blank' rel='noreferrer'>$name</a>" : $name); echo "<th" . ($orgtable != "" || $field->name != $orgname ? " title='" . h(($orgtable != "" ? "$orgtable." : "") . $orgname) . "'" : "") . ">" . ($href ? "<a href='$href" . strtolower($name) . "' target='_blank' rel='noreferrer'>$name</a>" : $name);
} }
echo "</thead>\n"; echo "</thead>\n";
@@ -51,24 +54,26 @@ function select($result, $connection2 = null, $href = "") {
foreach ($row as $key => $val) { foreach ($row as $key => $val) {
if (!isset($val)) { if (!isset($val)) {
$val = "<i>NULL</i>"; $val = "<i>NULL</i>";
} elseif ($blobs[$key] && !is_utf8($val)) {
$val = "<i>" . lang('%d byte(s)', strlen($val)) . "</i>"; //! link to download
} elseif (!strlen($val)) { // strlen - SQLite can return int
$val = "&nbsp;"; // some content to print a border
} else { } else {
if ($blobs[$key] && !is_utf8($val)) { $val = h($val);
$val = "<i>" . lang('%d byte(s)', strlen($val)) . "</i>"; //! link to download if ($types[$key] == 254) { // 254 - char
} elseif (!strlen($val)) { // strlen - SQLite can return int $val = "<code>$val</code>";
$val = "&nbsp;"; // some content to print a border
} else {
$val = h($val);
if ($types[$key] == 254) { // 254 - char
$val = "<code>$val</code>";
}
} }
if (isset($links[$key]) && !$columns[$links[$key]]) { }
if (isset($links[$key]) && !$columns[$links[$key]]) {
if ($href) { // MySQL EXPLAIN
$link = $links[$key] . urlencode($row[array_search("table=", $links)]);
} else {
$link = "edit=" . urlencode($links[$key]); $link = "edit=" . urlencode($links[$key]);
foreach ($indexes[$links[$key]] as $col => $j) { foreach ($indexes[$links[$key]] as $col => $j) {
$link .= "&where" . urlencode("[" . bracket_escape($col) . "]") . "=" . urlencode($row[$j]); $link .= "&where" . urlencode("[" . bracket_escape($col) . "]") . "=" . urlencode($row[$j]);
} }
$val = "<a href='" . h(ME . $link) . "'>$val</a>";
} }
$val = "<a href='" . h(ME . $link) . "'>$val</a>";
} }
echo "<td>$val"; echo "<td>$val";
} }
@@ -118,12 +123,12 @@ function textarea($name, $value, $rows = 10, $cols = 80) {
} }
/** Format time difference /** Format time difference
* @param array ($sec, $sec) * @param string output of microtime()
* @param array ($sec, $sec) * @param string output of microtime()
* @return string HTML code * @return string HTML code
*/ */
function format_time($start, $end) { function format_time($start, $end) {
return " <span class='time'>(" . lang('%.3f s', max(0, $end[0] - $start[0] + $end[1] - $start[1])) . ")</span>"; return " <span class='time'>(" . lang('%.3f s', max(0, array_sum(explode(" ", $end)) - array_sum(explode(" ", $start)))) . ")</span>";
} }
/** Print table columns for type edit /** Print table columns for type edit
@@ -176,7 +181,7 @@ function process_field($field, $type_field) {
idf_escape($field["field"]), idf_escape($field["field"]),
process_type($type_field), process_type($type_field),
($field["null"] ? " NULL" : " NOT NULL"), // NULL for timestamp ($field["null"] ? " NULL" : " NOT NULL"), // NULL for timestamp
(isset($field["default"]) ? " DEFAULT " . ($field["type"] == "timestamp" && eregi("^CURRENT_TIMESTAMP$", $field["default"]) ? $field["default"] : q($field["default"])) : ""), (isset($field["default"]) ? " DEFAULT " . (($field["type"] == "timestamp" && eregi('^CURRENT_TIMESTAMP$', $field["default"])) || ($field["type"] == "bit" && ereg("^([0-9]+|b'[0-1]+')\$", $field["default"])) ? $field["default"] : q($field["default"])) : ""),
($field["on_update"] ? " ON UPDATE $field[on_update]" : ""), ($field["on_update"] ? " ON UPDATE $field[on_update]" : ""),
(support("comment") && $field["comment"] != "" ? " COMMENT " . q($field["comment"]) : ""), (support("comment") && $field["comment"] != "" ? " COMMENT " . q($field["comment"]) : ""),
($field["auto_increment"] ? auto_increment() : null), ($field["auto_increment"] ? auto_increment() : null),
@@ -206,16 +211,11 @@ function type_class($type) {
* @param string TABLE or PROCEDURE * @param string TABLE or PROCEDURE
* @param int number of fields allowed by Suhosin * @param int number of fields allowed by Suhosin
* @param array returned by referencable_primary() * @param array returned by referencable_primary()
* @return bool column comments used * @param bool display comments column
* @return null
*/ */
function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array(), $comments = false) { function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array(), $comments = false) {
global $inout; global $inout;
foreach ($fields as $field) {
if ($field["comment"] != "") {
$comments = true;
break;
}
}
?> ?>
<thead><tr class="wrap"> <thead><tr class="wrap">
<?php if ($type == "PROCEDURE") { ?><td>&nbsp;<?php } ?> <?php if ($type == "PROCEDURE") { ?><td>&nbsp;<?php } ?>
@@ -226,7 +226,7 @@ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $forei
<?php if ($type == "TABLE") { ?> <?php if ($type == "TABLE") { ?>
<td>NULL <td>NULL
<td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">AI</acronym> <td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">AI</acronym>
<td class="hidden"><?php echo lang('Default values'); ?> <td<?php echo ($_POST["defaults"] ? "" : " class='hidden'"); ?>><?php echo lang('Default values'); ?>
<?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?> <?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
<?php } ?> <?php } ?>
<td><?php echo "<input type='image' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?><script type="text/javascript">row_count = <?php echo count($fields); ?>;</script> <td><?php echo "<input type='image' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?><script type="text/javascript">row_count = <?php echo count($fields); ?>;</script>
@@ -239,13 +239,13 @@ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $forei
$display = (isset($_POST["add"][$i-1]) || (isset($field["field"]) && !$_POST["drop_col"][$i])) && (support("drop_col") || $orig == ""); $display = (isset($_POST["add"][$i-1]) || (isset($field["field"]) && !$_POST["drop_col"][$i])) && (support("drop_col") || $orig == "");
?> ?>
<tr<?php echo ($display ? "" : " style='display: none;'"); ?>> <tr<?php echo ($display ? "" : " style='display: none;'"); ?>>
<?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", $inout, $field["inout"]) : ""); ?> <?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", explode("|", $inout), $field["inout"]) : ""); ?>
<th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" onchange="<?php echo ($field["field"] != "" || count($fields) > 1 ? "" : "editingAddRow(this, $allowed); "); ?>editingNameChange(this);" maxlength="64"><?php } ?><input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($orig); ?>"> <th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" onchange="<?php echo ($field["field"] != "" || count($fields) > 1 ? "" : "editingAddRow(this, $allowed); "); ?>editingNameChange(this);" maxlength="64"><?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 edit_type("fields[$i]", $field, $collations, $foreign_keys); ?>
<?php if ($type == "TABLE") { ?> <?php if ($type == "TABLE") { ?>
<td><?php echo checkbox("fields[$i][null]", 1, $field["null"]); ?> <td><?php echo checkbox("fields[$i][null]", 1, $field["null"]); ?>
<td><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> onclick="var field = this.form['fields[' + this.value + '][field]']; if (!field.value) { field.value = 'id'; field.onchange(); }"> <td><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> onclick="var field = this.form['fields[' + this.value + '][field]']; if (!field.value) { field.value = 'id'; field.onchange(); }">
<td class="hidden"><?php echo checkbox("fields[$i][has_default]", 1, $field["has_default"]); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" onchange="this.previousSibling.checked = true;"> <td<?php echo ($_POST["defaults"] ? "" : " class='hidden'"); ?>><?php echo checkbox("fields[$i][has_default]", 1, $field["has_default"]); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" onchange="this.previousSibling.checked = true;">
<?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='255'>" : ""); ?> <?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='255'>" : ""); ?>
<?php } ?> <?php } ?>
<?php <?php
@@ -258,7 +258,6 @@ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $forei
echo ($orig == "" || support("drop_col") ? "<input type='image' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick='return !editingRemoveRow(this);'>" : ""); echo ($orig == "" || support("drop_col") ? "<input type='image' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick='return !editingRemoveRow(this);'>" : "");
echo "\n"; echo "\n";
} }
return $comments;
} }
/** Move fields up and down or add field /** Move fields up and down or add field

View File

@@ -27,9 +27,10 @@ function escape_string($val) {
/** Disable magic_quotes_gpc /** Disable magic_quotes_gpc
* @param array e.g. (&$_GET, &$_POST, &$_COOKIE) * @param array e.g. (&$_GET, &$_POST, &$_COOKIE)
* @param bool whether to leave values as is
* @return null modified in place * @return null modified in place
*/ */
function remove_slashes($process) { function remove_slashes($process, $filter = false) {
if (get_magic_quotes_gpc()) { if (get_magic_quotes_gpc()) {
while (list($key, $val) = each($process)) { while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) { foreach ($val as $k => $v) {
@@ -61,7 +62,7 @@ function bracket_escape($idf, $back = false) {
* @return string * @return string
*/ */
function h($string) { function h($string) {
return htmlspecialchars($string, ENT_QUOTES); return htmlspecialchars(str_replace("\0", "", $string), ENT_QUOTES);
} }
/** Escape for TD /** Escape for TD
@@ -86,12 +87,13 @@ function nl_br($string) {
* @param bool * @param bool
* @param string * @param string
* @param string * @param string
* @param bool
* @return string * @return string
*/ */
function checkbox($name, $value, $checked, $label = "", $onclick = "") { function checkbox($name, $value, $checked, $label = "", $onclick = "", $jsonly = false) {
static $id = 0; static $id = 0;
$id++; $id++;
$return = "<input type='checkbox'" . ($name ? " name='$name' value='" . h($value) . "'" : " class='jsonly'") . ($checked ? " checked" : "") . ($onclick ? " onclick=\"$onclick\"" : "") . " id='checkbox-$id'>"; $return = "<input type='checkbox' name='$name' value='" . h($value) . "'" . ($checked ? " checked" : "") . ($onclick ? ' onclick="' . h($onclick) . '"' : '') . ($jsonly ? " class='jsonly'" : "") . " id='checkbox-$id'>";
return ($label != "" ? "<label for='checkbox-$id'>$return" . h($label) . "</label>" : $return); return ($label != "" ? "<label for='checkbox-$id'>$return" . h($label) . "</label>" : $return);
} }
@@ -128,7 +130,7 @@ function optionlist($options, $selected = null, $use_keys = false) {
*/ */
function html_select($name, $options, $value = "", $onchange = true) { function html_select($name, $options, $value = "", $onchange = true) {
if ($onchange) { if ($onchange) {
return "<select name='" . h($name) . "'" . (is_string($onchange) ? " onchange=\"$onchange\"" : "") . ">" . optionlist($options, $value) . "</select>"; return "<select name='" . h($name) . "'" . (is_string($onchange) ? ' onchange="' . h($onchange) . '"' : "") . ">" . optionlist($options, $value) . "</select>";
} }
$return = ""; $return = "";
foreach ($options as $key => $val) { foreach ($options as $key => $val) {
@@ -146,6 +148,37 @@ function confirm($count = "", $stop = false) {
return " onclick=\"" . ($stop ? "eventStop(event); " : "") . "return confirm('" . lang('Are you sure?') . ($count ? " (' + $count + ')" : "") . "');\""; return " onclick=\"" . ($stop ? "eventStop(event); " : "") . "return confirm('" . lang('Are you sure?') . ($count ? " (' + $count + ')" : "") . "');\"";
} }
/** Print header for hidden fieldset (close by </div></fieldset>)
* @param string
* @param string
* @param bool
* @param string
* @return null
*/
function print_fieldset($id, $legend, $visible = false, $onclick = "") {
echo "<fieldset><legend><a href='#fieldset-$id' onclick=\"" . h($onclick) . "return !toggle('fieldset-$id');\">$legend</a></legend><div id='fieldset-$id'" . ($visible ? "" : " class='hidden'") . ">\n";
}
/** Return class='active' if $bold is true
* @param bool
* @return string
*/
function bold($bold) {
return ($bold ? " class='active'" : "");
}
/** Generate class for odd rows
* @param string return this for odd rows, empty to reset counter
* @return string
*/
function odd($return = ' class="odd"') {
static $i = 0;
if (!$return) { // reset counter
$i = -1;
}
return ($i++ % 2 ? $return : '');
}
/** Escape string for JavaScript apostrophes /** Escape string for JavaScript apostrophes
* @param string * @param string
* @return string * @return string
@@ -154,6 +187,25 @@ function js_escape($string) {
return addcslashes($string, "\r\n'\\/"); // slash for <script> return addcslashes($string, "\r\n'\\/"); // slash for <script>
} }
/** Print one row in JSON object
* @param string or "" to close the object
* @param string
* @return null
*/
function json_row($key, $val = null) {
static $first = true;
if ($first) {
echo "{";
}
if ($key != "") {
echo ($first ? "" : ",") . "\n\t\"" . addcslashes($key, "\r\n\"\\") . '": ' . (isset($val) ? '"' . addcslashes($val, "\r\n\"\\") . '"' : 'undefined');
$first = false;
} else {
echo "\n}\n";
$first = true;
}
}
/** Get INI boolean value /** Get INI boolean value
* @param string * @param string
* @return bool * @return bool
@@ -277,7 +329,7 @@ function where($where) {
$return = array(); $return = array();
foreach ((array) $where["where"] as $key => $val) { foreach ((array) $where["where"] as $key => $val) {
$return[] = idf_escape(bracket_escape($key, 1)) // 1 - back $return[] = idf_escape(bracket_escape($key, 1)) // 1 - back
. (ereg('\\.', $val) || $jush == "mssql" ? " LIKE " . exact_value(addcslashes($val, "%_")) : " = " . exact_value($val)) // LIKE because of floats, but slow with ints, in MS SQL because of text . (ereg('\\.', $val) || $jush == "mssql" ? " LIKE " . exact_value(addcslashes($val, "%_\\")) : " = " . exact_value($val)) // LIKE because of floats, but slow with ints, in MS SQL because of text
; //! enum and set ; //! enum and set
} }
foreach ((array) $where["null"] as $key) { foreach ((array) $where["null"] as $key) {
@@ -496,10 +548,11 @@ function get_file($key, $decompress = false) {
: $file["tmp_name"] : $file["tmp_name"]
)); //! may not be reachable because of open_basedir )); //! may not be reachable because of open_basedir
if ($decompress) { if ($decompress) {
if (function_exists("iconv") && ereg("^\xFE\xFF|^\xFF\xFE", $return, $regs)) { $start = substr($return, 0, 3);
if (function_exists("iconv") && ereg("^\xFE\xFF|^\xFF\xFE", $start, $regs)) { // not ternary operator to save memory
$return = iconv("utf-16", "utf-8", $return); $return = iconv("utf-16", "utf-8", $return);
} else { // not ternary operator to save memory } elseif ($start == "\xEF\xBB\xBF") { // UTF-8 BOM
$return = ereg_replace("^\xEF\xBB\xBF", "", $return); // UTF-8 BOM $return = substr($return, 3);
} }
} }
return $return; return $return;
@@ -514,35 +567,14 @@ function upload_error($error) {
return ($error ? lang('Unable to upload a file.') . ($max_size ? " " . lang('Maximum allowed file size is %sB.', $max_size) : "") : lang('File does not exist.')); return ($error ? lang('Unable to upload a file.') . ($max_size ? " " . lang('Maximum allowed file size is %sB.', $max_size) : "") : lang('File does not exist.'));
} }
/** Generate class for odd rows /** Create repeat pattern for preg
* @param string return this for odd rows, empty to reset counter * @param string
* @param int
* @return string * @return string
*/ */
function odd($return = ' class="odd"') { function repeat_pattern($pattern, $length) {
static $i = 0; // fix for Compilation failed: number too big in {} quantifier
if (!$return) { // reset counter return str_repeat("$pattern{0,65535}", $length / 65535) . "$pattern{0," . ($length % 65535) . "}"; // can create {0,0} which is OK
$i = -1;
}
return ($i++ % 2 ? $return : '');
}
/** Print one row in JSON object
* @param string or "" to close the object
* @param string
* @return null
*/
function json_row($key, $val = null) {
static $first = true;
if ($first) {
echo "{";
}
if ($key != "") {
echo ($first ? "" : ",") . "\n\t\"" . addcslashes($key, "\r\n\"\\") . '": ' . (isset($val) ? '"' . addcslashes($val, "\r\n\"\\") . '"' : 'undefined');
$first = false;
} else {
echo "\n}\n";
$first = true;
}
} }
/** Check whether the string is in UTF-8 /** Check whether the string is in UTF-8
@@ -554,16 +586,6 @@ function is_utf8($val) {
return (preg_match('~~u', $val) && !preg_match('~[\\0-\\x8\\xB\\xC\\xE-\\x1F]~', $val)); return (preg_match('~~u', $val) && !preg_match('~[\\0-\\x8\\xB\\xC\\xE-\\x1F]~', $val));
} }
/** Create repeat pattern for preg
* @param string
* @param int
* @return string
*/
function repeat_pattern($pattern, $length) {
// fix for Compilation failed: number too big in {} quantifier
return str_repeat("$pattern{0,65535}", $length / 65535) . "$pattern{0," . ($length % 65535) . "}"; // can create {0,0} which is OK
}
/** Shorten UTF-8 string /** Shorten UTF-8 string
* @param string * @param string
* @param int * @param int
@@ -673,7 +695,7 @@ function input($field, $value, $function) {
} }
$first++; $first++;
} }
$onchange = ($first ? " onchange=\"var f = this.form['function[" . js_escape($name) . "]']; if ($first > f.selectedIndex) f.selectedIndex = $first;\"" : ""); $onchange = ($first ? " onchange=\"var f = this.form['function[" . h(js_escape(bracket_escape($field["field"]))) . "]']; if ($first > f.selectedIndex) f.selectedIndex = $first;\"" : "");
$attrs .= $onchange; $attrs .= $onchange;
echo (count($functions) > 1 ? html_select("function[$name]", $functions, !isset($function) || in_array($function, $functions) || isset($functions[$function]) ? $function : "", "functionChange(this);") : nbsp(reset($functions))) . '<td>'; echo (count($functions) > 1 ? html_select("function[$name]", $functions, !isset($function) || in_array($function, $functions) || isset($functions[$function]) ? $function : "", "functionChange(this);") : nbsp(reset($functions))) . '<td>';
$input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table $input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table
@@ -720,7 +742,7 @@ function process_input($field) {
return null; return null;
} }
if ($function == "orig") { if ($function == "orig") {
return false; return ($field["on_update"] == "CURRENT_TIMESTAMP" ? idf_escape($field["field"]) : false);
} }
if ($function == "NULL") { if ($function == "NULL") {
return "NULL"; return "NULL";
@@ -757,7 +779,7 @@ function search_tables() {
echo "<ul>\n"; echo "<ul>\n";
$found = true; $found = true;
} }
echo "<li><a href='" . h(ME . "select=" . urlencode($table) . "&where[0][op]=" . urlencode($_GET["where"][0]["op"]) . "&where[0][val]=" . urlencode($_GET["where"][0]["val"])) . "'>" . h($name) . "</a>\n"; echo "<li><a href='" . h(ME . "select=" . urlencode($table) . "&where[0][op]=" . urlencode($_GET["where"][0]["op"]) . "&where[0][val]=" . urlencode($_GET["where"][0]["val"])) . "'>$name</a>\n";
} }
} }
} }
@@ -774,7 +796,7 @@ function dump_headers($identifier, $multi_table = false) {
$return = $adminer->dumpHeaders($identifier, $multi_table); $return = $adminer->dumpHeaders($identifier, $multi_table);
$output = $_POST["output"]; $output = $_POST["output"];
if ($output != "text") { if ($output != "text") {
header("Content-Disposition: attachment; filename=" . ($identifier != "" ? friendly_url($identifier) : "dump") . ".$return" . ($output != "file" && !ereg('[^0-9a-z]', $output) ? ".$output" : "")); header("Content-Disposition: attachment; filename=" . friendly_url($identifier != "" ? $identifier : (SERVER != "" ? SERVER : "localhost")) . ".$return" . ($output != "file" && !ereg('[^0-9a-z]', $output) ? ".$output" : ""));
} }
session_write_close(); session_write_close();
return $return; return $return;
@@ -852,21 +874,3 @@ function is_url($string) {
$domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component //! IDN $domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component //! IDN
return (preg_match("~^(https?)://($domain?\\.)+$domain(:\\d+)?(/.*)?(\\?.*)?(#.*)?\$~i", $string, $match) ? strtolower($match[1]) : ""); //! restrict path, query and fragment characters return (preg_match("~^(https?)://($domain?\\.)+$domain(:\\d+)?(/.*)?(\\?.*)?(#.*)?\$~i", $string, $match) ? strtolower($match[1]) : ""); //! restrict path, query and fragment characters
} }
/** Print header for hidden fieldset (close by </div></fieldset>)
* @param string
* @param string
* @param bool
* @return null
*/
function print_fieldset($id, $legend, $visible = false) {
echo "<fieldset><legend><a href='#fieldset-$id' onclick=\"return !toggle('fieldset-$id');\">$legend</a></legend><div id='fieldset-$id'" . ($visible ? "" : " class='hidden'") . ">\n";
}
/** Return class='active' if $bold is true
* @param bool
* @return string
*/
function bold($bold) {
return ($bold ? " class='active'" : "");
}

View File

@@ -16,7 +16,9 @@ $langs = array(
'ca' => 'Català', // Joan Llosas 'ca' => 'Català', // Joan Llosas
'pt' => 'Português', // Gian Live - gian@live.com 'pt' => 'Português', // Gian Live - gian@live.com
'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com 'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com
'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com 'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com
'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com
'ru' => 'Русский язык', // Maksim Izmaylov 'ru' => 'Русский язык', // Maksim Izmaylov
'zh' => '简体中文', // Mr. Lodar 'zh' => '简体中文', // Mr. Lodar
'zh-tw' => '繁體中文', // http://tzangms.com 'zh-tw' => '繁體中文', // http://tzangms.com
@@ -41,11 +43,16 @@ function get_lang() {
function lang($idf, $number = null) { function lang($idf, $number = null) {
global $LANG, $translations; global $LANG, $translations;
$translation = $translations[$idf]; $translation = $translations[$idf];
if (is_array($translation) && $translation) { if (is_array($translation)) {
$pos = ($number == 1 || (!$number && $LANG == 'fr') ? 0 // French treat zero as singular $pos = ($number == 1 ? 0
: ($LANG == 'sl' && (!$number || $number > 2) ? 1 : 0) // Slovenian use different forms for 1, 2, 3-4, other : ($LANG == 'cs' || $LANG == 'sk' ? ($number && $number < 5 ? 1 : 2) // different forms for 1, 2-4, other
+ ((!$number || $number >= 5) && ereg('cs|sk|ru|sl|pl', $LANG) ? 2 : 1) // Slavic languages use different forms for 1, 2-4, other : ($LANG == 'fr' ? (!$number ? 0 : 1) // different forms for 0-1, other
); : ($LANG == 'pl' ? ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2) // different forms for 1, 2-4, other
: ($LANG == 'sl' ? ($number % 100 == 1 ? 0 : ($number % 100 == 2 ? 1 : ($number % 100 == 3 || $number % 100 == 4 ? 2 : 3))) // different forms for 1, 2, 3-4, other
: ($LANG == 'lt' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 12-19, other
: ($LANG == 'ru' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 2-4, other
: 1
))))))); // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
$translation = $translation[$pos]; $translation = $translation[$pos];
} }
$args = func_get_args(); $args = func_get_args();

View File

@@ -1,2 +1,2 @@
<?php <?php
$VERSION = "3.2.1"; $VERSION = "3.3.1";

View File

@@ -10,7 +10,7 @@
include "./include/bootstrap.inc.php"; include "./include/bootstrap.inc.php";
$enum_length = "'(?:''|[^'\\\\]|\\\\.)*+'"; $enum_length = "'(?:''|[^'\\\\]|\\\\.)*+'";
$inout = array("IN", "OUT", "INOUT"); $inout = "IN|OUT|INOUT";
if (isset($_GET["select"]) && ($_POST["edit"] || $_POST["clone"]) && !$_POST["save"]) { if (isset($_GET["select"]) && ($_POST["edit"] || $_POST["clone"]) && !$_POST["save"]) {
$_GET["edit"] = $_GET["select"]; $_GET["edit"] = $_GET["select"];

View File

@@ -13,6 +13,7 @@ if ($jush == "sqlite") { // doesn't support primary key
if ($_POST && !$error && !$_POST["add"]) { if ($_POST && !$error && !$_POST["add"]) {
$alter = array(); $alter = array();
foreach ($_POST["indexes"] as $index) { foreach ($_POST["indexes"] as $index) {
$name = $index["name"];
if (in_array($index["type"], $index_types)) { if (in_array($index["type"], $index_types)) {
$columns = array(); $columns = array();
$lengths = array(); $lengths = array();
@@ -27,22 +28,23 @@ if ($_POST && !$error && !$_POST["add"]) {
} }
} }
if ($columns) { if ($columns) {
foreach ($indexes as $name => $existing) { $existing = $indexes[$name];
if ($existing) {
ksort($existing["columns"]); ksort($existing["columns"]);
ksort($existing["lengths"]); ksort($existing["lengths"]);
if ($index["type"] == $existing["type"] && array_values($existing["columns"]) === $columns && (!$existing["lengths"] || array_values($existing["lengths"]) === $lengths)) { if ($index["type"] == $existing["type"] && array_values($existing["columns"]) === $columns && (!$existing["lengths"] || array_values($existing["lengths"]) === $lengths)) {
// skip existing index // skip existing index
unset($indexes[$name]); unset($indexes[$name]);
continue 2; continue;
} }
} }
$alter[] = array($index["type"], "(" . implode(", ", $set) . ")"); $alter[] = array($index["type"], $name, "(" . implode(", ", $set) . ")");
} }
} }
} }
// drop removed indexes // drop removed indexes
foreach ($indexes as $name => $existing) { foreach ($indexes as $name => $existing) {
$alter[] = array($existing["type"], idf_escape($name), "DROP"); $alter[] = array($existing["type"], $name, "DROP");
} }
if (!$alter) { if (!$alter) {
redirect(ME . "table=" . urlencode($TABLE)); redirect(ME . "table=" . urlencode($TABLE));
@@ -69,6 +71,7 @@ if ($_POST) {
} }
} else { } else {
foreach ($row["indexes"] as $key => $index) { foreach ($row["indexes"] as $key => $index) {
$row["indexes"][$key]["name"] = $key;
$row["indexes"][$key]["columns"][] = ""; $row["indexes"][$key]["columns"][] = "";
} }
$row["indexes"][] = array("columns" => array(1 => "")); $row["indexes"][] = array("columns" => array(1 => ""));
@@ -77,7 +80,7 @@ if ($_POST) {
<form action="" method="post"> <form action="" method="post">
<table cellspacing="0" class="nowrap"> <table cellspacing="0" class="nowrap">
<thead><tr><th><?php echo lang('Index Type'); ?><th><?php echo lang('Column (length)'); ?></thead> <thead><tr><th><?php echo lang('Index Type'); ?><th><?php echo lang('Column (length)'); ?><th><?php echo lang('Name'); ?></thead>
<?php <?php
$j = 1; $j = 1;
foreach ($row["indexes"] as $index) { foreach ($row["indexes"] as $index) {
@@ -85,10 +88,11 @@ foreach ($row["indexes"] as $index) {
ksort($index["columns"]); ksort($index["columns"]);
$i = 1; $i = 1;
foreach ($index["columns"] as $key => $column) { foreach ($index["columns"] as $key => $column) {
echo "<span>" . html_select("indexes[$j][columns][$i]", array(-1 => "") + $fields, $column, ($i == count($index["columns"]) ? "indexesAddColumn(this);" : 1)); echo "<span>" . html_select("indexes[$j][columns][$i]", array(-1 => "") + $fields, $column, ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . "(this, '" . js_escape($jush == "sql" ? "" : $_GET["indexes"] . "_") . "');");
echo "<input name='indexes[$j][lengths][$i]' size='2' value='" . h($index["lengths"][$key]) . "'> </span>"; //! hide for non-MySQL drivers, add ASC|DESC echo "<input name='indexes[$j][lengths][$i]' size='2' value='" . h($index["lengths"][$key]) . "'> </span>"; //! hide for non-MySQL drivers, add ASC|DESC
$i++; $i++;
} }
echo "<td><input name='indexes[$j][name]' value='" . h($index["name"]) . "'>\n";
$j++; $j++;
} }
?> ?>

View File

@@ -136,8 +136,8 @@ $translations = array(
'Hashed' => 'تلبيد', 'Hashed' => 'تلبيد',
'Column' => 'عمود', 'Column' => 'عمود',
'Routine' => 'روتين', 'Routine' => 'روتين',
'Grant' => 'Grant', 'Grant' => 'موافق',
'Revoke' => 'Revoke', 'Revoke' => 'إلغاء',
'%s version: %s through PHP extension %s' => 'النسخة %s : %s عن طريق إمتداد ال PHP %s', '%s version: %s through PHP extension %s' => 'النسخة %s : %s عن طريق إمتداد ال PHP %s',
'Logged as: %s' => 'تم تسجيل الدخول بإسم %s', 'Logged as: %s' => 'تم تسجيل الدخول بإسم %s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'معلومات POST كبيرة جدا. قم بتقليص حجم المعلومات أو قم بزيادة قيمة %s في خيارات ال PHP.', 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'معلومات POST كبيرة جدا. قم بتقليص حجم المعلومات أو قم بزيادة قيمة %s في خيارات ال PHP.',
@@ -262,6 +262,12 @@ $translations = array(
'Last page' => 'الصفحة السابقة', 'Last page' => 'الصفحة السابقة',
'Refresh' => 'تحديث', 'Refresh' => 'تحديث',
'Invalid schema.' => 'مخطط خاطئ.', 'Invalid schema.' => 'مخطط خاطئ.',
'Please use one of the extensions %s.' => 'من فضلك إستعمل إحدى الغمتدادات: %s.', 'Please use one of the extensions %s.' => 'من فضلك إستعمل إحدى الإمتدادات: %s.',
'ltr' => 'rtl', 'ltr' => 'rtl',
'Tables have been copied.' => 'تم نسخ الجداول.',
'Copy' => 'نسخ',
'Permanent link' => 'وصلة دائمة',
'Edit all' => 'تعديل الكل',
'Resend POST data?' => 'هل تود إعادة إرسال بيانات POST ؟',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -58,11 +58,11 @@ $translations = array(
'Sort' => 'Ordena', 'Sort' => 'Ordena',
'descending' => 'descendent', 'descending' => 'descendent',
'Limit' => 'Límit', 'Limit' => 'Límit',
'No rows.' => 'No hi ha cap fila.', 'No rows.' => 'No hi ha cap registre.',
'Action' => 'Acció', 'Action' => 'Acció',
'edit' => 'edita', 'edit' => 'edita',
'Page' => 'Plana', 'Page' => 'Plana',
'Query executed OK, %d row(s) affected.' => array('Consulta executada correctament, %d fila modificada.', 'Consulta executada correctament, %d files modificades.'), 'Query executed OK, %d row(s) affected.' => array('Consulta executada correctament, %d registre modificat.', 'Consulta executada correctament, %d registres modificats.'),
'Error in query' => 'Error en la consulta', 'Error in query' => 'Error en la consulta',
'Execute' => 'Executa', 'Execute' => 'Executa',
'Table' => 'Taula', 'Table' => 'Taula',
@@ -78,7 +78,7 @@ $translations = array(
'Unable to upload a file.' => 'Impossible adjuntar el fitxer.', 'Unable to upload a file.' => 'Impossible adjuntar el fitxer.',
'File upload' => 'Adjunta un fitxer', 'File upload' => 'Adjunta un fitxer',
'File uploads are disabled.' => 'L\'ddjunció de fitxers està desactivada.', 'File uploads are disabled.' => 'L\'ddjunció de fitxers està desactivada.',
'Routine has been called, %d row(s) affected.' => array('S\'ha cridat la rutina, %d fila modificada.', 'S\'ha cridat la rutina, %d files modificades.'), 'Routine has been called, %d row(s) affected.' => array('S\'ha cridat la rutina, %d registre modificat.', 'S\'ha cridat la rutina, %d registres modificats.'),
'Call' => 'Crida', 'Call' => 'Crida',
'No extension' => 'Cap extensió', 'No extension' => 'Cap extensió',
'None of the supported PHP extensions (%s) are available.' => 'No hi ha cap de les extensions PHP soporatades (%s) disponible.', 'None of the supported PHP extensions (%s) are available.' => 'No hi ha cap de les extensions PHP soporatades (%s) disponible.',
@@ -128,7 +128,7 @@ $translations = array(
'Time' => 'Temps', 'Time' => 'Temps',
'Event' => 'Event', 'Event' => 'Event',
'%s version: %s through PHP extension %s' => 'Versió %s: %s amb l\'extensió de PHP %s', '%s version: %s through PHP extension %s' => 'Versió %s: %s amb l\'extensió de PHP %s',
'%d row(s)' => array('%d fila', '%d files'), '%d row(s)' => array('%d registre', '%d registres'),
'Remove' => 'Suprimeix', 'Remove' => 'Suprimeix',
'Are you sure?' => 'Estàs segur?', 'Are you sure?' => 'Estàs segur?',
'Privileges' => 'Privilegis', 'Privileges' => 'Privilegis',
@@ -153,7 +153,7 @@ $translations = array(
'save' => 'desa', 'save' => 'desa',
'Format' => 'Format', 'Format' => 'Format',
'Tables' => 'Taules', 'Tables' => 'Taules',
'Data' => 'Data', 'Data' => 'Dades',
'Event has been dropped.' => 'S\'ha suprimit l\'event.', 'Event has been dropped.' => 'S\'ha suprimit l\'event.',
'Event has been altered.' => 'S\'ha modificat l\'event.', 'Event has been altered.' => 'S\'ha modificat l\'event.',
'Event has been created.' => 'S\'ha creat l\'event.', 'Event has been created.' => 'S\'ha creat l\'event.',
@@ -169,7 +169,7 @@ $translations = array(
'On completion preserve' => 'Conservar en completar', 'On completion preserve' => 'Conservar en completar',
'Tables and views' => 'Taules i vistes', 'Tables and views' => 'Taules i vistes',
'Data Length' => 'Longitud de les dades', 'Data Length' => 'Longitud de les dades',
'Index Length' => 'L\'ongitud de l\'índex', 'Index Length' => 'Longitud de l\'índex',
'Data Free' => 'Espai lliure', 'Data Free' => 'Espai lliure',
'Collation' => 'Compaginació', 'Collation' => 'Compaginació',
'Analyze' => 'Analitza', 'Analyze' => 'Analitza',
@@ -194,7 +194,7 @@ $translations = array(
'Partitions' => 'Particions', 'Partitions' => 'Particions',
'Partition name' => 'Nom de la partició', 'Partition name' => 'Nom de la partició',
'Values' => 'Valors', 'Values' => 'Valors',
'%d row(s) have been imported.' => array('S\'ha importat %d fila.', 'S\'han importat %d files.'), '%d row(s) have been imported.' => array('S\'ha importat %d registre.', 'S\'han importat %d registres.'),
'Import' => 'Importa', 'Import' => 'Importa',
'Show structure' => 'Mostra l\'estructura', 'Show structure' => 'Mostra l\'estructura',
'Select data' => 'Selecciona dades', 'Select data' => 'Selecciona dades',
@@ -264,4 +264,10 @@ $translations = array(
'Invalid schema.' => 'Esquema invàlid.', 'Invalid schema.' => 'Esquema invàlid.',
'Please use one of the extensions %s.' => 'Si us plau, utilitza una de les extensions %s.', 'Please use one of the extensions %s.' => 'Si us plau, utilitza una de les extensions %s.',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'S\'han copiat les taules.',
'Copy' => 'Còpia',
'Permanent link' => 'Enllaç permanent',
'Edit all' => 'Edita-ho tot',
'Resend POST data?' => 'Torna a enviar les dades POST?',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -247,7 +247,7 @@ $translations = array(
'Double click on a value to modify it.' => 'Doppelklick zum Bearbeiten des Wertes.', 'Double click on a value to modify it.' => 'Doppelklick zum Bearbeiten des Wertes.',
'Use edit link to modify this value.' => 'Benutzen Sie den Link zum editieren dieses Wertes.', 'Use edit link to modify this value.' => 'Benutzen Sie den Link zum editieren dieses Wertes.',
'last' => 'letzte', 'last' => 'letzte',
'From server' => 'Auf Server', 'From server' => 'Im Server',
'System' => 'Datenbank System', 'System' => 'Datenbank System',
'Select data' => 'Daten auswählen', 'Select data' => 'Daten auswählen',
'Show structure' => 'Struktur anzeigen', 'Show structure' => 'Struktur anzeigen',
@@ -264,4 +264,10 @@ $translations = array(
'Please use one of the extensions %s.' => 'Bitte einen der Dateitypen %s benutzen.', 'Please use one of the extensions %s.' => 'Bitte einen der Dateitypen %s benutzen.',
'now' => 'jetzt', 'now' => 'jetzt',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'Tabellen wurden kopiert.',
'Copy' => 'Kopieren',
'Permanent link' => 'Dauerhafter Link',
'Edit all' => 'Alle ändern',
'Resend POST data?' => 'POST data noch einmal senden ?',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -249,7 +249,7 @@ $translations = array(
'last' => 'último', 'last' => 'último',
'From server' => 'Desde servidor', 'From server' => 'Desde servidor',
'System' => 'Motor de base de datos', 'System' => 'Motor de base de datos',
'Select data' => 'Seleccionar datos', 'Select data' => 'Visualizar contenido',
'Show structure' => 'Mostrar estructura', 'Show structure' => 'Mostrar estructura',
'empty' => 'ningúno', 'empty' => 'ningúno',
'Network' => 'Red', 'Network' => 'Red',
@@ -264,4 +264,10 @@ $translations = array(
'Please use one of the extensions %s.' => 'Por favor use una de las extensiones %s.', 'Please use one of the extensions %s.' => 'Por favor use una de las extensiones %s.',
'now' => 'ahora', 'now' => 'ahora',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'Tablas copiadas.',
'Copy' => 'Copiar',
'Permanent link' => 'Enlace permanente',
'Edit all' => 'Editar todos',
'Resend POST data?' => 'Volver a enviar POST data?',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -264,4 +264,10 @@ $translations = array(
'Please use one of the extensions %s.' => 'Palun kasuta üht laiendustest %s.', 'Please use one of the extensions %s.' => 'Palun kasuta üht laiendustest %s.',
'now' => 'nüüd', 'now' => 'nüüd',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'Tabelid on edukalt kopeeritud.',
'Copy' => 'Kopeeri',
'Permanent link' => 'Püsilink',
'Edit all' => 'Muuda kõiki',
'Resend POST data?' => 'Saada POST andmed uuesti?',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -212,7 +212,7 @@ $translations = array(
'Strings' => 'Chaînes', 'Strings' => 'Chaînes',
'Binary' => 'Binaires', 'Binary' => 'Binaires',
'Lists' => 'Listes', 'Lists' => 'Listes',
'Editor' => 'Editeur', 'Editor' => 'Éditeur',
'E-mail' => 'Courriel', 'E-mail' => 'Courriel',
'From' => 'De', 'From' => 'De',
'Subject' => 'Sujet', 'Subject' => 'Sujet',
@@ -264,4 +264,10 @@ $translations = array(
'Invalid schema.' => 'Schéma invalide.', 'Invalid schema.' => 'Schéma invalide.',
'Please use one of the extensions %s.' => 'Veuillez utiliser l\'une des extensions %s.', 'Please use one of the extensions %s.' => 'Veuillez utiliser l\'une des extensions %s.',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'Les tables ont été copiées.',
'Copy' => 'Copier',
'Permanent link' => 'Lien permanent',
'Edit all' => 'Tout modifier',
'Resend POST data?' => 'Renvoyer les données POST ?',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -36,7 +36,7 @@ $translations = array(
'database' => 'adatbázis', 'database' => 'adatbázis',
'Use' => 'Használ', 'Use' => 'Használ',
'No tables.' => 'Nincs tábla.', 'No tables.' => 'Nincs tábla.',
'select' => 'kiválaszt', 'select' => 'kiválasztás',
'Create new table' => 'Új tábla', 'Create new table' => 'Új tábla',
'Item has been deleted.' => 'A tétel törölve.', 'Item has been deleted.' => 'A tétel törölve.',
'Item has been updated.' => 'A tétel frissítve.', 'Item has been updated.' => 'A tétel frissítve.',
@@ -52,7 +52,7 @@ $translations = array(
'Alter indexes' => 'Index módosítása', 'Alter indexes' => 'Index módosítása',
'Add next' => 'Következő hozzáadása', 'Add next' => 'Következő hozzáadása',
'Language' => 'Nyelv', 'Language' => 'Nyelv',
'Select' => 'Kiválaszt', 'Select' => 'Kiválasztás',
'New item' => 'Új tétel', 'New item' => 'Új tétel',
'Search' => 'Keresés', 'Search' => 'Keresés',
'Sort' => 'Sorba rendezés', 'Sort' => 'Sorba rendezés',
@@ -228,7 +228,7 @@ $translations = array(
'%d in total' => 'összesen %d', '%d in total' => 'összesen %d',
'Attachments' => 'Csatolmány', 'Attachments' => 'Csatolmány',
'System' => 'Adatbázis', 'System' => 'Adatbázis',
'last' => 'utoljára', 'last' => 'utol',
'Network' => 'Hálózat', 'Network' => 'Hálózat',
'Geometry' => 'Geometria', 'Geometry' => 'Geometria',
'Databases have been dropped.' => 'Adatbázis eldobva.', 'Databases have been dropped.' => 'Adatbázis eldobva.',
@@ -264,4 +264,10 @@ $translations = array(
'Invalid schema.' => 'Érvénytelen séma.', 'Invalid schema.' => 'Érvénytelen séma.',
'Please use one of the extensions %s.' => 'Használja a(z) %s kiterjesztést.', 'Please use one of the extensions %s.' => 'Használja a(z) %s kiterjesztést.',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'Táblák átmásolva.',
'Copy' => 'Másolás',
'Permanent link' => 'Hivatkozás',
'Edit all' => 'Összes szerkesztése',
'Resend POST data?' => 'Újraküldi a POST adatokat?',
'HH:MM:SS' => 'óó:pp:mm',
); );

View File

@@ -264,4 +264,10 @@ $translations = array(
'Please use one of the extensions %s.' => 'Usa una delle estensioni %s.', 'Please use one of the extensions %s.' => 'Usa una delle estensioni %s.',
'now' => 'adesso', 'now' => 'adesso',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'Le tabelle sono state copiate.',
'Copy' => 'Copia',
'Permanent link' => 'Link permanente',
'Edit all' => 'Modifica tutto',
'Resend POST data?' => 'Reinvio i dati POST?',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -264,4 +264,10 @@ $translations = array(
'Invalid schema.' => '無効なスキーマ', 'Invalid schema.' => '無効なスキーマ',
'Please use one of the extensions %s.' => 'いずれかの拡張機能を使ってください %s', 'Please use one of the extensions %s.' => 'いずれかの拡張機能を使ってください %s',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'テーブルをコピーしました',
'Copy' => 'コピー',
'Permanent link' => 'パーマネントリンク',
'Edit all' => 'すべて編集',
'Resend POST data?' => '再送信しますか?',
'HH:MM:SS' => '時:分:秒',
); );

320
adminer/lang/lt.inc.php Normal file
View File

@@ -0,0 +1,320 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistema',
'Server' => 'Serveris',
'Username' => 'Vartotojas',
'Password' => 'Slaptažodis',
'Permanent login' => 'Pastovus prisijungimas',
'Login' => 'Prisijungti',
'Logout' => 'Atsijungti',
'Logged as: %s' => 'Prisijungęs kaip: %s',
'Logout successful.' => 'Jūs atsijungėte nuo sistemos.',
'Invalid credentials.' => 'Neteisingi prisijungimo duomenys.',
'Language' => 'Kalba',
'Invalid CSRF token. Send the form again.' => 'Neteisingas CSRF tokenas. Bandykite siųsti formos duomenis dar kartą.',
'No extension' => 'Nėra plėtiio',
'None of the supported PHP extensions (%s) are available.' => 'Nėra nei vieno iš palaikomų PHP plėtinių (%s).',
'Session support must be enabled.' => 'Sesijų palaikymas turi būti įjungtas.',
'Session expired, please login again.' => 'Sesijos galiojimas baigėsi. Prisijunkite iš naujo.',
'%s version: %s through PHP extension %s' => '%s versija: %s per PHP plėtinį %s',
'Refresh' => 'Atnaujinti',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Privilegijos',
'Create user' => 'Sukurti vartotoją',
'User has been dropped.' => 'Vartotojas ištrintas.',
'User has been altered.' => 'Vartotojo duomenys pakeisti.',
'User has been created.' => 'Vartotojas sukurtas.',
'Hashed' => 'Šifruotas',
'Column' => 'Stulpelis',
'Routine' => 'Procedūra',
'Grant' => 'Suteikti',
'Revoke' => 'Atšaukti',
'Process list' => 'Procesų sąrašas',
'%d process(es) have been killed.' => array('%d procesas nutrauktas.', '%d procesai nutraukti.', '%d procesų nutraukta.'),
'Kill' => 'Nutraukti',
'Variables' => 'Kintamieji',
'Status' => 'Būsena',
'SQL command' => 'SQL užklausa',
'%d query(s) executed OK.' => array('%d užklausa įvykdyta.', '%d užklausos įvykdytos.', '%d užklausų įvykdyta.'),
'Query executed OK, %d row(s) affected.' => array('Užklausa įvykdyta. Pakeistas %d įrašas.', 'Užklausa įvykdyta. Pakeisti %d įrašai.', 'Užklausa įvykdyta. Pakeista %d įrašų.'),
'No commands to execute.' => 'Nėra vykdomų užklausų.',
'Error in query' => 'Klaida užklausoje',
'Execute' => 'Vykdyti',
'Stop on error' => 'Sustabdyti esant klaidai',
'Show only errors' => 'Rodyti tik klaidas',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Istorija',
'Clear' => 'Išvalyti',
'Edit all' => 'Redaguoti visus',
'File upload' => 'Failo įkėlimas',
'From server' => 'Iš serverio',
'Webserver file %s' => 'Failas %s iš serverio',
'Run file' => 'Vykdyti failą',
'File does not exist.' => 'Failas neegzistuoja.',
'File uploads are disabled.' => 'Failų įkėlimas išjungtas.',
'Unable to upload a file.' => 'Nepavyko įkelti failo.',
'Maximum allowed file size is %sB.' => 'Maksimalus failo dydis - %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Per daug POST duomenų. Sumažinkite duomenų kiekį arba padidinkite konfigūracijos nustatymą %s.',
'Export' => 'Eksportas',
'Dump' => 'Eksportuoti',
'Output' => 'Išvestis',
'open' => 'atidaryti',
'save' => 'išsaugoti',
'Format' => 'Formatas',
'Data' => 'Duomenys',
'Database' => 'Duomenų bazė',
'database' => 'duomenų bazė',
'Use' => 'Naudoti',
'Select database' => 'Pasirinkti duomenų bazę',
'Invalid database.' => 'Neteisinga duomenų bazė.',
'Create new database' => 'Sukurti naują duomenų bazę',
'Database has been dropped.' => 'Duomenų bazė panaikinta.',
'Databases have been dropped.' => 'Duomenų bazės panaikintos.',
'Database has been created.' => 'Duomenų bazė sukurta.',
'Database has been renamed.' => 'Duomenų bazė pervadinta.',
'Database has been altered.' => 'Duomenų bazė pakeista.',
'Alter database' => 'Redaguoti duomenų bazę',
'Create database' => 'Sukurti duomenų bazę',
'Database schema' => 'Duomenų bazės schema',
// link to current database schema layout
'Permanent link' => 'Pastovi nuoroda',
// thousands separator - must contain single byte
',' => ' ',
'Engine' => 'Variklis',
'Collation' => 'Lyginimas',
'Data Length' => 'Duomenų ilgis',
'Index Length' => 'Indekso ilgis',
'Data Free' => 'Laisvos vietos',
'Rows' => 'Įrašai',
'%d in total' => '%d iš viso',
'Analyze' => 'Analizuoti',
'Optimize' => 'Optimizuoti',
'Check' => 'Patikrinti',
'Repair' => 'Pataisyti',
'Truncate' => 'Tuštinti',
'Tables have been truncated.' => 'Lentelės buvo ištuštintos.',
'Move to other database' => 'Perkelti į kitą duomenų bazę',
'Move' => 'Perkelti',
'Tables have been moved.' => 'Lentelės perkeltos.',
'Copy' => 'Kopijuoti',
'Tables have been copied.' => 'Lentelės nukopijuotos.',
'Routines' => 'Procedūros',
'Routine has been called, %d row(s) affected.' => array('Procedūra įvykdyta. %d įrašas pakeistas.', 'Procedūra įvykdyta. %d įrašai pakeisti.', 'Procedūra įvykdyta. %d įrašų pakeista.'),
'Call' => 'Vykdyti',
'Parameter name' => 'Parametro pavadinimas',
'Create procedure' => 'Sukurti procedūrą',
'Create function' => 'Sukurti funkciją',
'Routine has been dropped.' => 'Procedūra pašalinta.',
'Routine has been altered.' => 'Procedūra pakeista.',
'Routine has been created.' => 'Procedūra sukurta.',
'Alter function' => 'Keisti funkciją',
'Alter procedure' => 'Keiskti procedūrą',
'Return type' => 'Grąžinimo tipas',
'Events' => 'Įvykiai',
'Event has been dropped.' => 'Įvykis pašalintas.',
'Event has been altered.' => 'Įvykis pakeistas.',
'Event has been created.' => 'Įvykis sukurtas.',
'Alter event' => 'Redaguoti įvykį',
'Create event' => 'Sukurti įvykį',
'At given time' => 'Nurodytu laiku',
'Every' => 'Kas',
'Schedule' => 'Grafikas',
'Start' => 'Pradžia',
'End' => 'Pabaiga',
'On completion preserve' => 'Įvykdžius išsaugoti',
'Tables' => 'Lentelės',
'Tables and views' => 'Lentelės ir vaizdai',
'Table' => 'Lentelė',
'No tables.' => 'Nėra lentelių.',
'Alter table' => 'Redaguoti lentelę',
'Create table' => 'Sukurti lentelę',
'Create new table' => 'Sukurti naują lentelę',
'Table has been dropped.' => 'Lentelė pašalinta.',
'Tables have been dropped.' => 'Lentelės pašalintos.',
'Table has been altered.' => 'Lentelė pakeista.',
'Table has been created.' => 'Lentelė sukurta.',
'Table name' => 'Lentelės pavadinimas',
'Show structure' => 'Rodyti struktūrą',
'engine' => 'variklis',
'collation' => 'palyginimas',
'Column name' => 'Stulpelio pavadinimas',
'Type' => 'Tipas',
'Length' => 'Ilgis',
'Auto Increment' => 'Auto Increment',
'Options' => 'Nustatymai',
'Comment' => 'Komentaras',
'Default values' => 'Reikšmės pagal nutylėjimą',
'Drop' => 'Pašalinti',
'Are you sure?' => 'Tikrai?',
'Move up' => 'Perkelti į viršų',
'Move down' => 'Perkelti žemyn',
'Remove' => 'Pašalinti',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Viršytas maksimalus leidžiamų stulpelių kiekis. Padidinkite %s ir %s.',
'Partition by' => 'Skirstyti pagal',
'Partitions' => 'Skirsniai',
'Partition name' => 'Skirsnio pavadinimas',
'Values' => 'Reikšmės',
'View' => 'Vaizdas',
'View has been dropped.' => 'Vaizdas pašalintas.',
'View has been altered.' => 'Vaizdas pakeistas.',
'View has been created.' => 'Vaizdas sukurtas.',
'Alter view' => 'Redaguoti vaizdą',
'Create view' => 'Sukurti vaizdą',
'Indexes' => 'Indeksai',
'Indexes have been altered.' => 'Indeksai pakeisti.',
'Alter indexes' => 'Redaguoti indeksus',
'Add next' => 'Pridėti kitą',
'Index Type' => 'Indekso tipas',
'Column (length)' => 'Stulpelis (ilgis)',
'Foreign keys' => 'Išoriniai raktai',
'Foreign key' => 'Išorinis raktas',
'Foreign key has been dropped.' => 'Išorinis raktas pašalintas.',
'Foreign key has been altered.' => 'Išorinis raktas pakeistas.',
'Foreign key has been created.' => 'Išorinis raktas sukurtas.',
'Target table' => 'Tikslinė lentelė',
'Change' => 'Pakeisti',
'Source' => 'Šaltinis',
'Target' => 'Tikslas',
'Add column' => 'Pridėti stulpelį',
'Alter' => 'Redaguoti',
'Add foreign key' => 'Pridėti išorinį raktą',
'ON DELETE' => 'Ištrinant',
'ON UPDATE' => 'Atnaujinant',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Šaltinio ir tikslinis stulpelis turi būti to paties tipo, tiksliniame stulpelyje turi būti naudojamas indeksas ir duomenys turi egzistuoti.',
'Triggers' => 'Trigeriai',
'Add trigger' => 'Pridėti trigerį',
'Trigger has been dropped.' => 'Trigeris pašalintas.',
'Trigger has been altered.' => 'Trigeris pakeistas.',
'Trigger has been created.' => 'Trigeris sukurtas.',
'Alter trigger' => 'Keisti trigerį',
'Create trigger' => 'Sukurti trigerį',
'Time' => 'Laikas',
'Event' => 'Įvykis',
'Name' => 'Pavadinimas',
'select' => 'atrinkti',
'Select' => 'Atrinkti',
'Select data' => 'Atrinkti duomenis',
'Functions' => 'Funkcijos',
'Aggregation' => 'Agregacija',
'Search' => 'Ieškoti',
'anywhere' => 'visur',
'Search data in tables' => 'Ieškoti duomenų lentelėse',
'Sort' => 'Rikiuoti',
'descending' => 'mažėjimo tvarka',
'Limit' => 'Limitas',
'Text length' => 'Teksto ilgis',
'Action' => 'Veiksmas',
'Unable to select the table' => 'Neįmanoma atrinkti lentelės',
'No rows.' => 'Nėra įrašų.',
'%d row(s)' => array('%d įrašas', '%d įrašai', '%d įrašų'),
'Page' => 'Puslapis',
'last' => 'paskutinis',
'Last page' => 'Paskutinis puslapis',
'whole result' => 'visas rezultatas',
'%d byte(s)' => array('%d baitas', '%d baigai', '%d baitų'),
'Import' => 'Importas',
'%d row(s) have been imported.' => array('%d įrašas įkelta.', '%d įrašai įkelti.', '%d įrašų įkelta.'),
// in-place editing in select
'Double click on a value to modify it.' => 'Du kartus spragtelėkite pelyte norėdami redaguoti.',
'Use edit link to modify this value.' => 'Norėdami redaguoti reikšmę naudokite redagavimo nuorodą.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Įrašas%s sukurtas.',
'Item has been deleted.' => 'Įrašas ištrintas.',
'Item has been updated.' => 'Įrašas pakeistas.',
'%d item(s) have been affected.' => array('Pakeistas %d įrašas.', 'Pakeisti %d įrašai.', 'Pakeistas %d įrašų.'),
'New item' => 'Naujas įrašas',
'original' => 'originalas',
// label for value '' in enum data type
'empty' => 'tuščia',
'edit' => 'redaguoti',
'Edit' => 'Redaguoti',
'Insert' => 'Įrašyti',
'Save' => 'Išsaugoti',
'Save and continue edit' => 'Išsaugoti ir tęsti redagavimą',
'Save and insert next' => 'Išsaugoti ir įrašyti kitą',
'Clone' => 'Klonuoti',
'Delete' => 'Trinti',
'E-mail' => 'El. paštas',
'From' => 'Nuo',
'Subject' => 'Antraštė',
'Attachments' => 'Priedai',
'Send' => 'Siųsti',
'%d e-mail(s) have been sent.' => array('Išsiųstas %d laiškas.', 'Išsiųsti %d laiškai.', 'Išsiųsta %d laiškų.'),
// data type descriptions
'Numbers' => 'Skaičiai',
'Date and time' => 'Data ir laikas',
'Strings' => 'Tekstas',
'Binary' => 'Dvejetainis',
'Lists' => 'Sąrašai',
'Network' => 'Tinklas',
'Geometry' => 'Geometrija',
'Relations' => 'Ryšiai',
// reload confirmation in AJAX
'Resend POST data?' => 'Persiųsti POST duomenis?',
'Editor' => 'Redaktorius',
// 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' => 'dabar',
// general SQLite error in create, drop or rename database
'File exists.' => 'Failas egzistuoja.',
'Please use one of the extensions %s.' => 'Naudokite vieną iš plėtinių %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Keisti schemą',
'Create schema' => 'Sukurti schemą',
'Schema has been dropped.' => 'Schema pašalinta.',
'Schema has been created.' => 'Schema sukurta.',
'Schema has been altered.' => 'Schema pakeista.',
'schema' => 'schema',
'Schema' => 'Schema',
'Invalid schema.' => 'Neteisinga schema.',
// PostgreSQL sequences support
'Sequences' => 'Sekos',
'Create sequence' => 'Sukurti seką',
'Sequence has been dropped.' => 'Seka pašalinta.',
'Sequence has been created.' => 'Seka sukurta.',
'Sequence has been altered.' => 'Seka pakeista.',
'Alter sequence' => 'Keisti seką',
// PostgreSQL user types support
'User types' => 'Vartotojų tipai',
'Create type' => 'Sukurti tipą',
'Type has been dropped.' => 'Tipas pašalintas.',
'Type has been created.' => 'Tipas sukurtas.',
'Alter type' => 'Keisti tipą',
);

View File

@@ -264,4 +264,10 @@ $translations = array(
'Please use one of the extensions %s.' => 'Gebruik 1 van volgende extensies: %s.', 'Please use one of the extensions %s.' => 'Gebruik 1 van volgende extensies: %s.',
'now' => 'nu', 'now' => 'nu',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'De tabellen zijn gekopieerd.',
'Copy' => 'Kopieren',
'Permanent link' => 'Permanente link',
'Edit all' => 'Alles bewerken',
'Resend POST data?' => 'POST data opnieuw verzenden',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -53,6 +53,7 @@ $translations = array(
'%.3f s' => '%.3f s', '%.3f s' => '%.3f s',
'History' => 'Historia', 'History' => 'Historia',
'Clear' => 'Wyczyść', 'Clear' => 'Wyczyść',
'Edit all' => 'Edytuj wszystkie',
'File upload' => 'Wgranie pliku', 'File upload' => 'Wgranie pliku',
'From server' => 'Z serwera', 'From server' => 'Z serwera',
@@ -276,11 +277,16 @@ $translations = array(
'Geometry' => 'Geometria', 'Geometry' => 'Geometria',
'Relations' => 'Relacje', 'Relations' => 'Relacje',
// reload confirmation in AJAX
'Resend POST data?' => 'Wysłać dane ponownie?',
'Editor' => 'Edytor', 'Editor' => 'Edytor',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$6.$4.$1', '$1-$3-$5' => '$6.$4.$1',
// hint for date format - use language equivalents for day, month and year shortcuts // hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'd.m.[rrrr]', '[yyyy]-mm-dd' => 'd.m.[rrrr]',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'teraz', 'now' => 'teraz',
// general SQLite error in create, drop or rename database // general SQLite error in create, drop or rename database

273
adminer/lang/ro.inc.php Normal file
View File

@@ -0,0 +1,273 @@
<?php
$translations = array(
'Login' => 'Intră',
'Logout successful.' => 'Ați eșit cu succes.',
'Invalid credentials.' => 'Numele de utilizator sau parola este greșită.',
'Server' => 'Server',
'Username' => 'Nume de utilizator',
'Password' => 'Parola',
'Select database' => 'Alege baza de date',
'Invalid database.' => 'Bază de deate invalidă.',
'Create new database' => 'Crează o bază de date nouă',
'Table has been dropped.' => 'Tabelul a fost șters.',
'Table has been altered.' => 'Tabelul a fost modificat.',
'Table has been created.' => 'Tabelul a fost creat.',
'Alter table' => 'Modifică tabelul',
'Create table' => 'Crează tabel',
'Table name' => 'Denumirea tabelului',
'engine' => 'tip',
'collation' => 'colaționarea',
'Column name' => 'Denumirea coloanei',
'Type' => 'Tip',
'Length' => 'Lungime',
'Auto Increment' => 'Creșterea automată',
'Options' => 'Acțiune',
'Save' => 'Salvează',
'Drop' => 'Șterge',
'Database has been dropped.' => 'Baza de date a fost ștearsă.',
'Database has been created.' => 'Baza de date a fost creată.',
'Database has been renamed.' => 'Baza de date a fost redenumită.',
'Database has been altered.' => 'Baza de date a fost modificată.',
'Alter database' => 'Modifică baza de date',
'Create database' => 'Crează baza de date',
'SQL command' => 'SQL query',
'Dump' => 'Dump',
'Logout' => 'Eșire',
'database' => 'baza de date',
'Use' => 'Alege',
'No tables.' => 'În baza de date nu sunt tabele.',
'select' => 'selectează',
'Create new table' => 'Crează tabel nou',
'Item has been deleted.' => 'Înregistrare a fost ștearsă.',
'Item has been updated.' => 'Înregistrare a fost înnoită.',
'Item%s has been inserted.' => 'Înregistrarea%s a fost inserată.',
'Edit' => 'Editează',
'Insert' => 'Inserează',
'Save and insert next' => 'Salvează și mai inserează',
'Delete' => 'Șterge',
'Database' => 'Baza de date',
'Routines' => 'Proceduri și funcții salvate',
'Indexes have been altered.' => 'Indexele au fost modificate.',
'Indexes' => 'Indexe',
'Alter indexes' => 'Modifică indexe',
'Add next' => 'Adaugă încă',
'Language' => 'Limba',
'Select' => 'Selectează',
'New item' => 'Înscriere nouă',
'Search' => 'Căutare',
'Sort' => 'Sortare',
'descending' => 'descrescător',
'Limit' => 'Limit',
'No rows.' => 'Nu sunt înscrieri.',
'Action' => 'Acțiune',
'edit' => 'editare',
'Page' => 'Pagina',
'Query executed OK, %d row(s) affected.' => array('Query executat, %d înscriere modificată.', 'Query executat, %d înscrieri modificate.'),
'Error in query' => 'Eroare în query',
'Execute' => 'Execută',
'Table' => 'Tabel',
'Foreign keys' => 'Cheiuri externe',
'Triggers' => 'Triggere',
'View' => 'Reprezentare',
'Unable to select the table' => 'Nu am putut selecta date din tabel',
'Invalid CSRF token. Send the form again.' => 'CSRF token imposibil. Retrimite forma.',
'Comment' => 'Comentariu',
'Default values' => 'Valoarea inițială',
'%d byte(s)' => array('%d octet', '%d octeți'),
'No commands to execute.' => 'Nu sunt comenzi de executat.',
'Unable to upload a file.' => 'Nu am putut încărca fișierul pe server.',
'File upload' => 'Încarcă fișierul',
'File uploads are disabled.' => 'Încărcarea fișierelor este interzisă.',
'Routine has been called, %d row(s) affected.' => array('A fost executată procedură, %d înscriere a fost modificată.', 'A fost executată procedură, %d înscrieri au fost modificate.'),
'Call' => 'Apelează',
'No extension' => 'Nu este extensie',
'None of the supported PHP extensions (%s) are available.' => 'Nu este aviabilă nici o extensie suportată (%s).',
'Session support must be enabled.' => 'Sesiunile trebuie să fie pornite.',
'Session expired, please login again.' => 'Timpul sesiunii a expirat, rog să te loghezi din nou.',
'Text length' => 'Lungimea textului',
'Foreign key has been dropped.' => 'Chei extern a fost șters.',
'Foreign key has been altered.' => 'Chei extern a fost modificat.',
'Foreign key has been created.' => 'Chei extern a fost creat.',
'Foreign key' => 'Chei extern',
'Target table' => 'Tabela scop',
'Change' => 'Modifică',
'Source' => 'Sursă',
'Target' => 'Scop',
'Add column' => 'Adaugă coloană',
'Alter' => 'Modifică',
'Add foreign key' => 'Adaugă chei extern',
'ON DELETE' => 'La ștergere',
'ON UPDATE' => 'La modificare',
'Index Type' => 'Tipul indexului',
'Column (length)' => 'Coloană (lungimea)',
'View has been dropped.' => 'Reprezentarea a fost ștearsă.',
'View has been altered.' => 'Reprezentarea a fost modificată.',
'View has been created.' => 'Reprezentarea a fost creată.',
'Alter view' => 'Modifică reprezentare',
'Create view' => 'Crează reprezentare',
'Name' => 'Titlu',
'Process list' => 'Lista proceselor',
'%d process(es) have been killed.' => array('A fost finisat %d proces.', 'Au fost finisate %d procese.'),
'Kill' => 'Termină',
'Parameter name' => 'Numele parametrului',
'Database schema' => 'Schema bazei de date',
'Create procedure' => 'Crează procedură',
'Create function' => 'Crează funcție',
'Routine has been dropped.' => 'Procedura a fost ștearsă.',
'Routine has been altered.' => 'Procedura a fost modificată.',
'Routine has been created.' => 'Procedura a fost creată.',
'Alter function' => 'Modifică funcția',
'Alter procedure' => 'Modifică procedura',
'Return type' => 'Tipul returnării',
'Add trigger' => 'Adaugă trigger',
'Trigger has been dropped.' => 'Triggerul a fost șters.',
'Trigger has been altered.' => 'Triggerul a fost modificat.',
'Trigger has been created.' => 'Triggerul a fost creat.',
'Alter trigger' => 'Modifică trigger',
'Create trigger' => 'Crează trigger',
'Time' => 'Timp',
'Event' => 'Eveniment',
'%s version: %s through PHP extension %s' => 'Versiunea %s: %s cu extensia PHP %s',
'%d row(s)' => array('%d înscriere', '%d înscrieri'),
'Remove' => 'Șterge',
'Are you sure?' => 'Ești precis?',
'Privileges' => 'Privelegii',
'Create user' => 'Crează utilizator',
'User has been dropped.' => 'Utilizatorul a fost șters.',
'User has been altered.' => 'Utilizatorul a fost modificat.',
'User has been created.' => 'Utilizatorul a fost creat.',
'Hashed' => 'Hashed',
'Column' => 'Coloană',
'Routine' => 'Procedură',
'Grant' => 'Permite',
'Revoke' => 'Interzice',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Mesajul POST este prea mare. Trimiteți mai puține date sau măriți parametrul configurației directivei %s.',
'Logged as: %s' => 'Ați intrat ca: %s',
'Move up' => 'Mișcă în sus',
'Move down' => 'Mișcă în jos',
'Functions' => 'Funcții',
'Aggregation' => 'Agregare',
'Export' => 'Export',
'Output' => 'Date de eșire',
'open' => 'deschide',
'save' => 'salvează',
'Format' => 'Format',
'Tables' => 'Tabele',
'Data' => 'Date',
'Event has been dropped.' => 'Evenimentul a fost șters.',
'Event has been altered.' => 'Evenimentul a fost modificat.',
'Event has been created.' => 'Evenimentul a fost adăugat.',
'Alter event' => 'Modifică eveniment',
'Create event' => 'Creează evenimet',
'At given time' => 'În timpul curent',
'Every' => 'Fiecare',
'Events' => 'Evenimente',
'Schedule' => 'Program',
'Start' => 'Început',
'End' => 'Svârșit',
'Status' => 'Stare',
'On completion preserve' => 'Salvează după finisare',
'Tables and views' => 'Tabele și reprezentări',
'Data Length' => 'Cantitatea de date',
'Index Length' => 'Cantitatea de indexe',
'Data Free' => 'Spațiu liber',
'Collation' => 'Colaționare',
'Analyze' => 'Analizează',
'Optimize' => 'Optimizează',
'Check' => 'Controlează',
'Repair' => 'Repară',
'Truncate' => 'Curăță',
'Tables have been truncated.' => 'Tabelele au fost curățate.',
'Rows' => 'Înscrieri',
',' => ',',
'Tables have been moved.' => 'Tabelele au fost mutate.',
'Move to other database' => 'Mută în altă bază de date',
'Move' => 'Mută',
'Engine' => 'Tip',
'Save and continue edit' => 'Salvează și continuă editarea',
'original' => 'original',
'%d item(s) have been affected.' => array('A fost modificată %d înscriere.', 'Au fost modificate %d înscrieri.'),
'whole result' => 'tot rezultatul',
'Tables have been dropped.' => 'Tabelele au fost șterse.',
'Clone' => 'Clonează',
'Partition by' => 'Împarte',
'Partitions' => 'Secțiuni',
'Partition name' => 'Denumirea secțiunii',
'Values' => 'Parametru',
'%d row(s) have been imported.' => array('%d rînd importat.', '%d rînduri importate.'),
'Import' => 'Importă',
'Stop on error' => 'Opreștete la eroare',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Numărul maxim de înscrieri disponibile a fost atins. Majorați %s și %s.',
'anywhere' => 'oriunde',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5.$3.$1',
'[yyyy]-mm-dd' => 'dd.mm.[yyyy]',
'History' => 'Istoria',
'Variables' => 'Variabile',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Coloanele ar trebui să aibă aceleaşi tipuri de date, trebuie să existe date de referinţă și un index pe coloanela-ţintă.',
'Relations' => 'Relații',
'Run file' => 'Execută fișier',
'Clear' => 'Curățp',
'Maximum allowed file size is %sB.' => 'Fișierul maxim admis - %sO.',
'Numbers' => 'Număr',
'Date and time' => 'Data și timpul',
'Strings' => 'Șire de caractere',
'Binary' => 'Tip binar',
'Lists' => 'Liste',
'Editor' => 'Editor',
'E-mail' => 'Poșta electronică',
'From' => 'De la',
'Subject' => 'Pentru',
'Send' => 'Trimite',
'%d e-mail(s) have been sent.' => array('A fost trimisă %d scrisoare.', 'Au fost trimise %d scrisori.'),
'Webserver file %s' => 'Fișierul %s pe server',
'File does not exist.' => 'Așa fișier nu există.',
'%d in total' => 'În total %d',
'Permanent login' => 'Logare permanentă',
'Databases have been dropped.' => 'Baze de date au fost șterse.',
'Search data in tables' => 'Caută în tabele',
'schema' => 'schema',
'Schema' => 'Schema',
'Alter schema' => 'Modifică schema',
'Create schema' => 'Crează o schemă',
'Schema has been dropped.' => 'Schema a fost ștearsă.',
'Schema has been created.' => 'Schema a fost creată.',
'Schema has been altered.' => 'Schema a fost modificată.',
'Sequences' => '«Secvențe»',
'Create sequence' => 'Crează «secvență»',
'Alter sequence' => 'Modifică «secvență»',
'Sequence has been dropped.' => '«secvența» a fost ștearsă.',
'Sequence has been created.' => '«secvența» a fost creată.',
'Sequence has been altered.' => '«secvența» a fost modificată.',
'User types' => 'Tipuri de utilizatori',
'Create type' => 'Crează tip noi',
'Alter type' => 'Modifică tip',
'Type has been dropped.' => 'Tiipul a fost șters.',
'Type has been created.' => 'Crează tip nou.',
'Double click on a value to modify it.' => 'Dublu click pe o valoare pentru a o modifica.',
'Use edit link to modify this value.' => 'Valoare poate fi modificată cu ajutorul butonului «modifică».',
'last' => 'ultima',
'From server' => 'De pe server',
'System' => 'Sistema',
'Select data' => 'Selectează',
'Show structure' => 'Arată structura',
'empty' => 'gol',
'Network' => 'Rețea',
'Geometry' => 'Geometrie',
'File exists.' => 'Fișierul deja există.',
'Attachments' => 'Fișiere atașate',
'%d query(s) executed OK.' => array('%d query executat.', '%d query-uri executate cu succes.'),
'Show only errors' => 'Arată doar greșeli',
'Last page' => 'Ultima pagină',
'Refresh' => 'Împrospătează',
'Invalid schema.' => 'Schemă incorectă.',
'Please use one of the extensions %s.' => 'Folosiți una din următoarele extensii %s.',
'now' => 'acum',
'ltr' => 'ltr',
'Tables have been copied.' => 'Tabelele au fost copiate',
'Copy' => 'Copiază',
'Permanent link' => 'Adresă permanentă',
'Edit all' => 'Editează tot',
'Resend POST data?' => 'Retrimite datele POST?',
'HH:MM:SS' => 'HH:MM:SS',
);

View File

@@ -264,4 +264,10 @@ $translations = array(
'Please use one of the extensions %s.' => 'Используйте одно из этих расширений %s.', 'Please use one of the extensions %s.' => 'Используйте одно из этих расширений %s.',
'now' => 'сейчас', 'now' => 'сейчас',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'Таблицы скопированы.',
'Copy' => 'Копировать',
'Permanent link' => 'Постоянная ссылка',
'Edit all' => 'Редактировать всё',
'Resend POST data?' => 'Еще раз послать данные POST запроса?',
'HH:MM:SS' => 'ЧЧ:ММ:СС',
); );

View File

@@ -264,4 +264,10 @@ $translations = array(
'Please use one of the extensions %s.' => 'Prosím vyberte jednu z koncoviek %s.', 'Please use one of the extensions %s.' => 'Prosím vyberte jednu z koncoviek %s.',
'now' => 'teraz', 'now' => 'teraz',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'Tabuľky boli skopírované.',
'Copy' => 'Kopírovať',
'Permanent link' => 'Permanentný odkaz',
'Edit all' => 'Upraviť všetko',
'Resend POST data?' => 'Znovu poslať POST data?',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -264,4 +264,10 @@ $translations = array(
'Invalid schema.' => 'அமைப்புமுறை ச‌ரியான‌த‌ல்ல‌ (Invalid Schema).', 'Invalid schema.' => 'அமைப்புமுறை ச‌ரியான‌த‌ல்ல‌ (Invalid Schema).',
'Please use one of the extensions %s.' => 'த‌ய‌வு செய்து ஒரு விரிவினை %s (extension) உப‌யோகிக்க‌வும்.', 'Please use one of the extensions %s.' => 'த‌ய‌வு செய்து ஒரு விரிவினை %s (extension) உப‌யோகிக்க‌வும்.',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => 'அட்டவணைகள் நகலெடுக்கப் பட்டது.',
'Copy' => 'நகல்',
'Permanent link' => 'நிரந்தர இணைப்பு',
'Edit all' => 'அனைத்தையும் தொகு',
'Resend POST data?' => 'POST data வை மீண்டும் அனுப்பவா?',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -264,4 +264,10 @@ $translations = array(
'Please use one of the extensions %s.' => '請使用下列其中一個 extension %s。', 'Please use one of the extensions %s.' => '請使用下列其中一個 extension %s。',
'now' => '現在', 'now' => '現在',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => '表格已經複製',
'Copy' => '複製',
'Permanent link' => '永久鏈接',
'Edit all' => '編輯全部',
'Resend POST data?' => '重新發送表單資料?',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -264,4 +264,10 @@ $translations = array(
'Please use one of the extensions %s.' => '请使用这些扩展中的一个:%s。', 'Please use one of the extensions %s.' => '请使用这些扩展中的一个:%s。',
'now' => '现在', 'now' => '现在',
'ltr' => 'ltr', 'ltr' => 'ltr',
'Tables have been copied.' => '表已复制。',
'Copy' => '复制',
'Permanent link' => '固定链接',
'Edit all' => '编辑全部',
'Resend POST data?' => '重新发送 POST 数据?',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -8,24 +8,29 @@ function adminer_object() {
include_once $filename; include_once $filename;
} }
$plugins = array(
// specify enabled plugins here
new AdminerDumpZip,
new AdminerDumpXml,
//~ new AdminerEditCalendar("<script type='text/javascript' src='../externals/jquery-ui/jquery-1.4.4.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.core.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.widget.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.datepicker.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.mouse.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.slider.js'></script>\n<script type='text/javascript' src='../externals/jquery-timepicker/jquery-ui-timepicker-addon.js'></script>\n<link rel='stylesheet' href='../externals/jquery-ui/themes/base/jquery.ui.all.css'>\n<style type='text/css'>\n.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }\n.ui-timepicker-div dl { text-align: left; }\n.ui-timepicker-div dl dt { height: 25px; }\n.ui-timepicker-div dl dd { margin: -25px 0 10px 65px; }\n.ui-timepicker-div td { font-size: 90%; }\n</style>\n", "../externals/jquery-ui/ui/i18n/jquery.ui.datepicker-%s.js"),
//~ new AdminerTinymce("../externals/tinymce/jscripts/tiny_mce/tiny_mce_dev.js"),
//~ new AdminerWymeditor(array("../externals/wymeditor/src/jquery/jquery.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.explorer.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.mozilla.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.opera.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.safari.js")),
new AdminerFileUpload(""),
new AdminerSlugify,
new AdminerTranslation,
new AdminerForeignSystem,
new AdminerEnumOption,
new AdminerTablesFilter,
new AdminerEditForeign,
);
/* It is possible to combine customization and plugins: /* It is possible to combine customization and plugins:
class AdminerCustomization extends AdminerPlugin { class AdminerCustomization extends AdminerPlugin {
} }
return new AdminerCustomization($plugins); return new AdminerCustomization($plugins);
*/ */
return new AdminerPlugin(array( return new AdminerPlugin($plugins);
// specify enabled plugins here
new AdminerDumpZip,
new AdminerDumpXml,
new AdminerEditCalendar("<script type='text/javascript' src='../externals/jquery-ui/jquery-1.4.4.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.core.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.widget.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.datepicker.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.mouse.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.slider.js'></script>\n<script type='text/javascript' src='../externals/jquery-timepicker/jquery-ui-timepicker-addon.js'></script>\n<link rel='stylesheet' href='../externals/jquery-ui/themes/base/jquery.ui.all.css'>\n<style type='text/css'>\n.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }\n.ui-timepicker-div dl { text-align: left; }\n.ui-timepicker-div dl dt { height: 25px; }\n.ui-timepicker-div dl dd { margin: -25px 0 10px 65px; }\n.ui-timepicker-div td { font-size: 90%; }\n</style>\n", "../externals/jquery-ui/ui/i18n/jquery.ui.datepicker-%s.js"),
new AdminerTinymce("../externals/tinymce/jscripts/tiny_mce/tiny_mce_dev.js"),
new AdminerFileUpload(""),
new AdminerSlugify,
new AdminerTranslation,
new AdminerForeignSystem,
new AdminerEnumOption,
));
} }
// include original Adminer or Adminer Editor (usually named adminer.php) // include original Adminer or Adminer Editor (usually named adminer.php)

View File

@@ -1,7 +1,7 @@
<?php <?php
page_header(lang('Privileges')); page_header(lang('Privileges'));
$result = $connection->query("SELECT User, Host FROM mysql.user ORDER BY Host, User"); $result = $connection->query("SELECT User, Host FROM mysql." . (DB == "" ? "user" : "db WHERE " . q($_GET["db"]) . " LIKE Db") . " ORDER BY Host, User");
if (!$result) { if (!$result) {
?> ?>
<form action=""><p> <form action=""><p>

View File

@@ -1,6 +1,7 @@
<?php <?php
$PROCEDURE = $_GET["procedure"]; $PROCEDURE = $_GET["procedure"];
$routine = (isset($_GET["function"]) ? "FUNCTION" : "PROCEDURE"); $routine = (isset($_GET["function"]) ? "FUNCTION" : "PROCEDURE");
$routine_languages = routine_languages();
$dropped = false; $dropped = false;
if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"] && !$_POST["down"]) { if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"] && !$_POST["down"]) {
@@ -9,12 +10,12 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"]
ksort($fields); // enforce fields order ksort($fields); // enforce fields order
foreach ($fields as $field) { foreach ($fields as $field) {
if ($field["field"] != "") { if ($field["field"] != "") {
$set[] = (in_array($field["inout"], $inout) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET"); $set[] = (ereg("^($inout)\$", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET");
} }
} }
$dropped = drop_create( $dropped = drop_create(
"DROP $routine " . idf_escape($PROCEDURE), "DROP $routine " . idf_escape($PROCEDURE),
"CREATE $routine " . idf_escape($_POST["name"]) . " (" . implode(", ", $set) . ")" . (isset($_GET["function"]) ? " RETURNS" . process_type($_POST["returns"], "CHARACTER SET") : "") . rtrim("\n$_POST[definition]", ";") . ";", "CREATE $routine " . idf_escape($_POST["name"]) . " (" . implode(", ", $set) . ")" . (isset($_GET["function"]) ? " RETURNS" . process_type($_POST["returns"], "CHARACTER SET") : "") . (in_array($_POST["language"], $routine_languages) ? " LANGUAGE $_POST[language]" : "") . rtrim("\n$_POST[definition]", ";") . ";",
substr(ME, 0, -1), substr(ME, 0, -1),
lang('Routine has been dropped.'), lang('Routine has been dropped.'),
lang('Routine has been altered.'), lang('Routine has been altered.'),
@@ -40,6 +41,7 @@ if ($_POST) {
<form action="" method="post" id="form"> <form action="" method="post" id="form">
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64"> <p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64">
<?php echo ($routine_languages ? lang('Language') . ": " . html_select("language", $routine_languages, $row["language"]) : ""); ?>
<table cellspacing="0" class="nowrap"> <table cellspacing="0" class="nowrap">
<?php <?php
edit_fields($row["fields"], $collations, $routine); edit_fields($row["fields"], $collations, $routine);

View File

@@ -1,5 +1,5 @@
<?php <?php
if ($_POST && !$error) { if (support("kill") && $_POST && !$error) {
$killed = 0; $killed = 0;
foreach ((array) $_POST["kill"] as $val) { foreach ((array) $_POST["kill"] as $val) {
if (queries("KILL " . (+$val))) { if (queries("KILL " . (+$val))) {
@@ -16,20 +16,24 @@ page_header(lang('Process list'), $error);
<table cellspacing="0" onclick="tableClick(event);" class="nowrap"> <table cellspacing="0" onclick="tableClick(event);" class="nowrap">
<?php <?php
$i = -1; $i = -1;
foreach (get_rows("SHOW FULL PROCESSLIST") as $i => $row) { foreach (process_list() as $i => $row) {
if (!$i) { if (!$i) {
echo "<thead><tr lang='en'><th>&nbsp;<th>" . implode("<th>", array_keys($row)) . "</thead>\n"; echo "<thead><tr lang='en'>" . (support("kill") ? "<th>&nbsp;" : "") . "<th>" . implode("<th>", array_keys($row)) . "</thead>\n";
} }
echo "<tr" . odd() . "><td>" . checkbox("kill[]", $row["Id"], 0); echo "<tr" . odd() . ">" . (support("kill") ? "<td>" . checkbox("kill[]", $row["Id"], 0) : "");
foreach ($row as $key => $val) { foreach ($row as $key => $val) {
echo "<td>" . ($key == "Info" && $val != "" ? "<code class='jush-$jush'>" . shorten_utf8($val, 100, "</code>") . ' <a href="' . h(ME . ($row["db"] != "" ? "db=" . urlencode($row["db"]) . "&" : "") . "sql=" . urlencode($val)) . '">' . lang('Edit') . '</a>' : nbsp($val)); echo "<td>" . (($jush == "sql" ? $key == "Info" && $val != "" : $key == "current_query" && $val != "<IDLE>") ? "<code class='jush-$jush'>" . shorten_utf8($val, 100, "</code>") . ' <a href="' . h(ME . ($row["db"] != "" ? "db=" . urlencode($row["db"]) . "&" : "") . "sql=" . urlencode($val)) . '">' . lang('Edit') . '</a>' : nbsp($val));
} }
echo "\n"; echo "\n";
} }
?> ?>
</table> </table>
<p><?php echo ($i + 1) . "/" . lang('%d in total', $connection->result("SELECT @@max_connections")); ?>
<p> <p>
<input type="submit" value="<?php echo lang('Kill'); ?>"> <?php
if (support("kill")) {
echo ($i + 1) . "/" . lang('%d in total', $connection->result("SELECT @@max_connections"));
echo "<p><input type='submit' value='" . lang('Kill') . "'>\n";
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="hidden" name="token" value="<?php echo $token; ?>">
</form> </form>

View File

@@ -5,7 +5,8 @@ $table_pos = array();
$table_pos_js = array(); $table_pos_js = array();
// saved in one cookie because there is a limit of 20 cookies per domain // saved in one cookie because there is a limit of 20 cookies per domain
$name = "adminer_schema"; $name = "adminer_schema";
preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~', ($_GET["schema"] ? $_GET["schema"] : $_COOKIE[($_COOKIE["$name-" . DB] ? "$name-" . DB : $name)]), $matches, PREG_SET_ORDER); // $_COOKIE["adminer_schema"] was used before 3.2.0 //! ':' in table name $SCHEMA = ($_GET["schema"] ? $_GET["schema"] : $_COOKIE[($_COOKIE["$name-" . DB] ? "$name-" . DB : $name)]); // $_COOKIE["adminer_schema"] was used before 3.2.0 //! ':' in table name
preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~', $SCHEMA, $matches, PREG_SET_ORDER);
foreach ($matches as $i => $match) { foreach ($matches as $i => $match) {
$table_pos[$match[1]] = array($match[2], $match[3]); $table_pos[$match[1]] = array($match[2], $match[3]);
$table_pos_js[] = "\n\t'" . js_escape($match[1]) . "': [ $match[2], $match[3] ]"; $table_pos_js[] = "\n\t'" . js_escape($match[1]) . "': [ $match[2], $match[3] ]";
@@ -103,4 +104,4 @@ foreach ($schema as $name => $table) {
} }
?> ?>
</div> </div>
<p><a href="<?php echo h($_SERVER["REQUEST_URI"]); ?>" id="schema-link"><?php echo lang('Permanent link'); ?></a> <p><a href="<?php echo h(ME . "schema=" . urlencode($SCHEMA)); ?>" id="schema-link"><?php echo lang('Permanent link'); ?></a>

View File

@@ -7,6 +7,7 @@ $foreign_keys = column_foreign_keys($TABLE);
if ($table_status["Oid"] == "t") { if ($table_status["Oid"] == "t") {
$indexes[] = array("type" => "PRIMARY", "columns" => array("oid")); $indexes[] = array("type" => "PRIMARY", "columns" => array("oid"));
} }
parse_str($_COOKIE["adminer_import"], $adminer_import);
$rights = array(); // privilege => 0 $rights = array(); // privilege => 0
$columns = array(); // selectable columns $columns = array(); // selectable columns
@@ -47,13 +48,13 @@ if ($_POST && !$error) {
break; break;
} }
} }
foreach ($select as $key => $val) { foreach ((array) $unselected as $key => $val) {
$val = $_GET["columns"][$key]; if (in_array(idf_escape($key), $select)) {
if (!$val["fun"]) { unset($unselected[$key]);
unset($unselected[$val["col"]]);
} }
} }
if ($_POST["export"]) { if ($_POST["export"]) {
cookie("adminer_import", "output=" . urlencode($_POST["output"]) . "&format=" . urlencode($_POST["format"]));
dump_headers($TABLE); dump_headers($TABLE);
$adminer->dumpTable($TABLE, ""); $adminer->dumpTable($TABLE, "");
if (!is_array($_POST["check"]) || $unselected === array()) { if (!is_array($_POST["check"]) || $unselected === array()) {
@@ -142,6 +143,7 @@ if ($_POST && !$error) {
} }
} elseif (is_string($file = get_file("csv_file", true))) { } elseif (is_string($file = get_file("csv_file", true))) {
//! character set //! character set
cookie("adminer_import", "output=" . urlencode($adminer_import["output"]) . "&format=" . urlencode($_POST["separator"]));
$result = true; $result = true;
$cols = array_keys($fields); $cols = array_keys($fields);
preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~', $file, $matches); preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~', $file, $matches);
@@ -207,7 +209,7 @@ if (!$columns) {
$adminer->selectOrderPrint($order, $columns, $indexes); $adminer->selectOrderPrint($order, $columns, $indexes);
$adminer->selectLimitPrint($limit); $adminer->selectLimitPrint($limit);
$adminer->selectLengthPrint($text_length); $adminer->selectLengthPrint($text_length);
$adminer->selectActionPrint($text_length); $adminer->selectActionPrint();
echo "</form>\n"; echo "</form>\n";
$page = $_GET["page"]; $page = $_GET["page"];
@@ -230,6 +232,9 @@ if (!$columns) {
echo "<form action='' method='post' enctype='multipart/form-data'>\n"; echo "<form action='' method='post' enctype='multipart/form-data'>\n";
$rows = array(); $rows = array();
while ($row = $result->fetch_assoc()) { while ($row = $result->fetch_assoc()) {
if ($page && $jush == "oracle") {
unset($row["RNUM"]);
}
$rows[] = $row; $rows[] = $row;
} }
// use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest) // use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest)
@@ -254,13 +259,15 @@ if (!$columns) {
foreach ($rows[0] as $key => $val) { foreach ($rows[0] as $key => $val) {
if ($table_status["Oid"] != "t" || $key != "oid") { if ($table_status["Oid"] != "t" || $key != "oid") {
$val = $_GET["columns"][key($select)]; $val = $_GET["columns"][key($select)];
$field = $fields[$select ? $val["col"] : $key]; $field = $fields[$select ? ($val ? $val["col"] : current($select)) : $key];
$name = ($field ? $adminer->fieldName($field, $rank) : "*"); $name = ($field ? $adminer->fieldName($field, $rank) : "*");
if ($name != "") { if ($name != "") {
$rank++; $rank++;
$names[$key] = $name; $names[$key] = $name;
$column = idf_escape($key); $column = idf_escape($key);
echo '<th><a href="' . h(remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key) . ($order[0] == $column || $order[0] == $key || (!$order && $group[0] == $column) ? '&desc%5B0%5D=1' : '')) . '">' . apply_sql_function($val["fun"], $name) . "</a>"; // $order[0] == $key - COUNT(*) //! columns looking like functions echo '<th><a href="' . h(remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key)
. ($order[0] == $column || $order[0] == $key || (!$order && count($group) < count($select) && $group[0] == $column) ? '&desc%5B0%5D=1' : '') // $order[0] == $key - COUNT(*)
) . '">' . (!$select || $val ? apply_sql_function($val["fun"], $name) : h(current($select))) . "</a>"; //! columns looking like functions
} }
$functions[$key] = $val["fun"]; $functions[$key] = $val["fun"];
next($select); next($select);
@@ -363,8 +370,6 @@ if (!$columns) {
echo "</table>\n"; echo "</table>\n";
} }
parse_str($_COOKIE["adminer_export"], $adminer_export);
if ($rows || $page) { if ($rows || $page) {
$exact_count = true; $exact_count = true;
if ($_GET["page"] != "last" && +$limit && count($group) >= count($select) && ($found_rows >= $limit || $page)) { if ($_GET["page"] != "last" && +$limit && count($group) >= count($select) && ($found_rows >= $limit || $page)) {
@@ -391,7 +396,7 @@ if (!$columns) {
} }
echo " (" . ($exact_count ? "" : "~ ") . lang('%d row(s)', $found_rows) . ") " . checkbox("all", 1, 0, lang('whole result')) . "\n"; echo " (" . ($exact_count ? "" : "~ ") . lang('%d row(s)', $found_rows) . ") " . checkbox("all", 1, 0, lang('whole result')) . "\n";
if (!information_schema(DB)) { if ($adminer->selectCommandPrint()) {
?> ?>
<fieldset><legend><?php echo lang('Edit'); ?></legend><div> <fieldset><legend><?php echo lang('Edit'); ?></legend><div>
<input type="submit" value="<?php echo lang('Save'); ?>" title="<?php echo lang('Double click on a value to modify it.'); ?>" class="jsonly"> <input type="submit" value="<?php echo lang('Save'); ?>" title="<?php echo lang('Double click on a value to modify it.'); ?>" class="jsonly">
@@ -403,17 +408,19 @@ if (!$columns) {
} }
print_fieldset("export", lang('Export')); print_fieldset("export", lang('Export'));
$output = $adminer->dumpOutput(); $output = $adminer->dumpOutput();
echo ($output ? html_select("output", $output, $adminer_export["output"]) . " " : ""); echo ($output ? html_select("output", $output, $adminer_import["output"]) . " " : "");
echo html_select("format", $adminer->dumpFormat(), $adminer_export["format"]); echo html_select("format", $adminer->dumpFormat(), $adminer_import["format"]);
echo " <input type='submit' name='export' value='" . lang('Export') . "' onclick='eventStop(event);'>\n"; echo " <input type='submit' name='export' value='" . lang('Export') . "' onclick='eventStop(event);'>\n";
echo "</div></fieldset>\n"; echo "</div></fieldset>\n";
} }
print_fieldset("import", lang('Import'), !$rows); if ($adminer->selectImportPrint()) {
echo "<input type='file' name='csv_file'> "; print_fieldset("import", lang('Import'), !$rows);
echo html_select("separator", array("csv" => "CSV,", "csv;" => "CSV;", "tsv" => "TSV"), $adminer_export["format"], 1); // 1 - select echo "<input type='file' name='csv_file'> ";
echo " <input type='submit' name='import' value='" . lang('Import') . "'>"; echo html_select("separator", array("csv" => "CSV,", "csv;" => "CSV;", "tsv" => "TSV"), $adminer_import["format"], 1); // 1 - select
echo "<input type='hidden' name='token' value='$token'>\n"; echo " <input type='submit' name='import' value='" . lang('Import') . "'>";
echo "</div></fieldset>\n"; echo "<input type='hidden' name='token' value='$token'>\n";
echo "</div></fieldset>\n";
}
$adminer->selectEmailPrint(array_filter($email_fields, 'strlen'), $columns); $adminer->selectEmailPrint(array_filter($email_fields, 'strlen'), $columns);

View File

@@ -30,7 +30,7 @@ if (!$error && $_POST) {
} }
if (is_string($query)) { // get_file() returns error as number, fread() as false if (is_string($query)) { // get_file() returns error as number, fread() as false
if (function_exists('memory_get_usage')) { if (function_exists('memory_get_usage')) {
@ini_set("memory_limit", 2 * strlen($query) + memory_get_usage() + 8e6); // @ - may be disabled, 2 - substr and trim, 8e6 - other variables @ini_set("memory_limit", max(ini_get("memory_limit"), 2 * strlen($query) + memory_get_usage() + 8e6)); // @ - may be disabled, 2 - substr and trim, 8e6 - other variables
} }
if ($query != "" && strlen($query) < 1e6) { // don't add big queries if ($query != "" && strlen($query) < 1e6) { // don't add big queries
$q = $query . (ereg(';$', $query) ? "" : ";"); //! doesn't work with DELIMITER | $q = $query . (ereg(';$', $query) ? "" : ";"); //! doesn't work with DELIMITER |
@@ -38,7 +38,7 @@ if (!$error && $_POST) {
$history[] = $q; $history[] = $q;
} }
} }
$space = "(\\s|/\\*.*\\*/|(#|-- )[^\n]*\n|--\n)"; $space = "(?:\\s|/\\*.*\\*/|(?:#|-- )[^\n]*\n|--\n)";
if (!ini_bool("session.use_cookies")) { if (!ini_bool("session.use_cookies")) {
session_write_close(); session_write_close();
} }
@@ -52,12 +52,12 @@ if (!$error && $_POST) {
$commands = 0; $commands = 0;
$errors = array(); $errors = array();
$parse = '[\'`"]' . ($jush == "pgsql" ? '|\\$[^$]*\\$' : ($jush == "mssql" || $jush == "sqlite" ? '|\\[' : '')) . '|/\\*|-- |#'; //! ` and # not everywhere $parse = '[\'`"]' . ($jush == "pgsql" ? '|\\$[^$]*\\$' : ($jush == "mssql" || $jush == "sqlite" ? '|\\[' : '')) . '|/\\*|-- |#'; //! ` and # not everywhere
$total_start = explode(" ", microtime()); $total_start = microtime();
parse_str($_COOKIE["adminer_export"], $adminer_export); parse_str($_COOKIE["adminer_export"], $adminer_export);
$dump_format = $adminer->dumpFormat(); $dump_format = $adminer->dumpFormat();
unset($dump_format["sql"]); unset($dump_format["sql"]);
while ($query != "") { while ($query != "") {
if (!$offset && $jush == "sql" && preg_match('~^\\s*DELIMITER\\s+(.+)~i', $query, $match)) { if (!$offset && $jush == "sql" && preg_match("~^$space*DELIMITER\\s+(.+)~i", $query, $match)) {
$delimiter = $match[1]; $delimiter = $match[1];
$query = substr($query, strlen($match[0])); $query = substr($query, strlen($match[0]));
} else { } else {
@@ -90,31 +90,25 @@ if (!$error && $_POST) {
ob_flush(); ob_flush();
flush(); // can take a long time - show the running query flush(); // can take a long time - show the running query
} }
$start = explode(" ", microtime()); // microtime(true) is available since PHP 5 $start = microtime(); // microtime(true) is available since PHP 5
//! don't allow changing of character_set_results, convert encoding of displayed query //! don't allow changing of character_set_results, convert encoding of displayed query
if ($connection->multi_query($q)) { if ($connection->multi_query($q) && is_object($connection2) && preg_match("~^$space*USE\\b~isU", $q)) {
if (is_object($connection2) && preg_match("~^$space*(USE)\\b~isU", $q)) { $connection2->query($q);
$connection2->query($q); }
} do {
do { $result = $connection->store_result();
$result = $connection->store_result(); $end = microtime();
$end = explode(" ", microtime()); $time = format_time($start, $end) . (strlen($q) < 1000 ? " <a href='" . h(ME) . "sql=" . urlencode(trim($q)) . "'>" . lang('Edit') . "</a>" : ""); // 1000 - maximum length of encoded URL in IE is 2083 characters
$time = format_time($start, $end) . (strlen($q) < 1000 ? " <a href='" . h(ME) . "sql=" . urlencode(trim($q)) . "'>" . lang('Edit') . "</a>" : ""); // 1000 - maximum length of encoded URL in IE is 2083 characters if ($connection->error) {
if (!is_object($result)) { echo ($_POST["only_errors"] ? $print : "");
if (preg_match("~^$space*(CREATE|DROP|ALTER)$space+(DATABASE|SCHEMA)\\b~isU", $q)) { echo "<p class='error'>" . lang('Error in query') . ": " . error() . "\n";
restart_session(); $errors[] = " <a href='#sql-$commands'>$commands</a>";
set_session("dbs", null); // clear cache if ($_POST["error_stops"]) {
session_write_close(); break;
} }
if (!$_POST["only_errors"]) { } elseif (is_object($result)) {
echo "<p class='message' title='" . h($connection->info) . "'>" . lang('Query executed OK, %d row(s) affected.', $connection->affected_rows) . "$time\n"; select($result, $connection2);
} if (!$_POST["only_errors"]) {
} else {
if ($_POST["only_errors"]) {
echo $print;
$print = "";
}
select($result, $connection2);
echo "<form action='' method='post'>\n"; echo "<form action='' method='post'>\n";
echo "<p>" . ($result->num_rows ? lang('%d row(s)', $result->num_rows) : "") . $time; echo "<p>" . ($result->num_rows ? lang('%d row(s)', $result->num_rows) : "") . $time;
$id = "export-$commands"; $id = "export-$commands";
@@ -122,29 +116,31 @@ if (!$error && $_POST) {
. html_select("output", $adminer->dumpOutput(), $adminer_export["output"]) . " " . html_select("output", $adminer->dumpOutput(), $adminer_export["output"]) . " "
. html_select("format", $dump_format, $adminer_export["format"]) . html_select("format", $dump_format, $adminer_export["format"])
. "<input type='hidden' name='query' value='" . h($q) . "'>" . "<input type='hidden' name='query' value='" . h($q) . "'>"
. " <input type='submit' name='export' value='" . lang('Export') . "' onclick='eventStop(event);'><input type='hidden' name='token' value='$token'></span>" . " <input type='submit' name='export' value='" . lang('Export') . "' onclick='eventStop(event);'><input type='hidden' name='token' value='$token'></span>\n"
; ;
if ($connection2 && preg_match("~^($space|\\()*SELECT\\b~isU", $q) && ($explain = explain($connection2, $q))) { if ($connection2 && preg_match("~^($space|\\()*SELECT\\b~isU", $q) && ($explain = explain($connection2, $q))) {
$id = "explain-$commands"; $id = "explain-$commands";
echo ", <a href='#$id' onclick=\"return !toggle('$id');\">EXPLAIN</a>$export\n"; echo ", <a href='#$id' onclick=\"return !toggle('$id');\">EXPLAIN</a>$export";
echo "<div id='$id' class='hidden'>\n"; echo "<div id='$id' class='hidden'>\n";
select($explain, $connection2, ($jush == "sql" ? "http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/explain-output.html#" : "")); select($explain, $connection2, ($jush == "sql" ? "http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/explain-output.html#explain_" : ""));
echo "</div>\n"; echo "</div>\n";
} else { } else {
echo "$export\n"; echo $export;
} }
echo "</form>\n"; echo "</form>\n";
} }
$start = $end; } else {
} while ($connection->next_result()); if (preg_match("~^$space*(CREATE|DROP|ALTER)$space+(DATABASE|SCHEMA)\\b~isU", $q)) {
} elseif ($connection->error) { restart_session();
echo ($_POST["only_errors"] ? $print : ""); set_session("dbs", null); // clear cache
echo "<p class='error'>" . lang('Error in query') . ": " . error() . "\n"; session_write_close();
$errors[] = " <a href='#sql-$commands'>$commands</a>"; }
if ($_POST["error_stops"]) { if (!$_POST["only_errors"]) {
break; echo "<p class='message' title='" . h($connection->info) . "'>" . lang('Query executed OK, %d row(s) affected.', $connection->affected_rows) . "$time\n";
}
} }
} $start = $end;
} while ($connection->next_result());
$query = substr($query, $offset); $query = substr($query, $offset);
$offset = 0; $offset = 0;
} }
@@ -154,7 +150,7 @@ if (!$error && $_POST) {
if ($empty) { if ($empty) {
echo "<p class='message'>" . lang('No commands to execute.') . "\n"; echo "<p class='message'>" . lang('No commands to execute.') . "\n";
} elseif ($_POST["only_errors"]) { } elseif ($_POST["only_errors"]) {
echo "<p class='message'>" . lang('%d query(s) executed OK.', $commands - count($errors)) . format_time($total_start, explode(" ", microtime())) . "\n"; echo "<p class='message'>" . lang('%d query(s) executed OK.', $commands - count($errors)) . format_time($total_start, microtime()) . "\n";
} elseif ($errors && $commands > 1) { } elseif ($errors && $commands > 1) {
echo "<p class='error'>" . lang('Error in query') . ": " . implode("", $errors) . "\n"; echo "<p class='error'>" . lang('Error in query') . ": " . implode("", $errors) . "\n";
} }
@@ -165,7 +161,7 @@ if (!$error && $_POST) {
} }
?> ?>
<form action="" method="post" enctype="multipart/form-data"> <form action="" method="post" enctype="multipart/form-data" id="form">
<p><?php <p><?php
$q = $_GET["sql"]; // overwrite $q from if ($_POST) to save memory $q = $_GET["sql"]; // overwrite $q from if ($_POST) to save memory
if ($_POST) { if ($_POST) {
@@ -177,7 +173,10 @@ if ($_POST) {
} }
textarea("query", $q, 20); textarea("query", $q, 20);
echo ($_POST ? "" : "<script type='text/javascript'>document.getElementsByTagName('textarea')[0].focus();</script>\n"); echo ($_POST ? "" : "<script type='text/javascript'>document.getElementsByTagName('textarea')[0].focus();</script>\n");
echo "<p>" . (ini_bool("file_uploads") ? lang('File upload') . ': <input type="file" name="sql_file"> (&lt; ' . ini_get("upload_max_filesize") . 'B)' : lang('File uploads are disabled.')); // ignore post_max_size because it is for all form fields together and bytes computing would be necessary echo "<p>" . (ini_bool("file_uploads")
? lang('File upload') . ': <input type="file" name="sql_file"' . ($_FILES && $_FILES["sql_file"]["error"] != 4 ? '' : ' onchange="this.form[\'only_errors\'].checked = true;"') . '> (&lt; ' . ini_get("upload_max_filesize") . 'B)' // ignore post_max_size because it is for all form fields together and bytes computing would be necessary
: lang('File uploads are disabled.')
);
?> ?>
<p> <p>
@@ -187,7 +186,7 @@ echo "<p>" . (ini_bool("file_uploads") ? lang('File upload') . ': <input type="f
echo checkbox("error_stops", 1, $_POST["error_stops"], lang('Stop on error')) . "\n"; echo checkbox("error_stops", 1, $_POST["error_stops"], lang('Stop on error')) . "\n";
echo checkbox("only_errors", 1, $_POST["only_errors"], lang('Show only errors')) . "\n"; echo checkbox("only_errors", 1, $_POST["only_errors"], lang('Show only errors')) . "\n";
print_fieldset("webfile", lang('From server'), $_POST["webfile"]); print_fieldset("webfile", lang('From server'), $_POST["webfile"], "document.getElementById('form')['only_errors'].checked = true; ");
$compress = array(); $compress = array();
foreach (array("gz" => "zlib", "bz2" => "bz2") as $key => $val) { foreach (array("gz" => "zlib", "bz2" => "bz2") as $key => $val) {
if (extension_loaded($val)) { if (extension_loaded($val)) {

View File

@@ -19,6 +19,7 @@ td img { max-width: 200px; max-height: 200px; }
code { background: #eee; } code { background: #eee; }
tr:hover td, tr:hover th { background: #ddf; } tr:hover td, tr:hover th { background: #ddf; }
pre { margin: 1em 0 0; } pre { margin: 1em 0 0; }
input[type=image] { vertical-align: middle; }
.version { color: #777; font-size: 67%; } .version { color: #777; font-size: 67%; }
.js .hidden, .nojs .jsonly { display: none; } .js .hidden, .nojs .jsonly { display: none; }
.nowrap td, .nowrap th, td.nowrap { white-space: pre; } .nowrap td, .nowrap th, td.nowrap { white-space: pre; }
@@ -45,7 +46,7 @@ pre { margin: 1em 0 0; }
#content { margin: 2em 0 0 21em; padding: 10px 20px 20px 0; } #content { margin: 2em 0 0 21em; padding: 10px 20px 20px 0; }
#lang { position: absolute; top: 0; left: 0; line-height: 1.8em; padding: .3em 1em; } #lang { position: absolute; top: 0; left: 0; line-height: 1.8em; padding: .3em 1em; }
#breadcrumb { white-space: nowrap; position: absolute; top: 0; left: 21em; background: #eee; height: 2em; line-height: 1.8em; padding: 0 1em; margin: 0 0 0 -18px; } #breadcrumb { white-space: nowrap; position: absolute; top: 0; left: 21em; background: #eee; height: 2em; line-height: 1.8em; padding: 0 1em; margin: 0 0 0 -18px; }
#loader { position: fixed; top: 0; left: 18em; } #loader { position: fixed; top: 0; left: 18em; z-index: 1; }
#h1 { color: #777; text-decoration: none; font-style: italic; } #h1 { color: #777; text-decoration: none; font-style: italic; }
#version { font-size: 67%; color: red; } #version { font-size: 67%; color: red; }
#schema { margin-left: 60px; position: relative; } #schema { margin-left: 60px; position: relative; }

View File

@@ -1,33 +1,38 @@
// Adminer specific functions // Adminer specific functions
var jushRoot = '../externals/jush/'; // global variable to allow simple customization
/** Load syntax highlighting /** Load syntax highlighting
* @param string first three characters of database system version * @param string first three characters of database system version
*/ */
function bodyLoad(version) { function bodyLoad(version) {
onpopstate(history); // copied from editor/static/editing.js if (history.state !== undefined) { // copied from editor/static/editing.js
var jushRoot = '../externals/jush/'; onpopstate(history);
var script = document.createElement('script'); }
script.src = jushRoot + 'jush.js'; if (jushRoot) {
script.onload = function () { var script = document.createElement('script');
if (window.jush) { // IE runs in case of an error too script.src = jushRoot + 'jush.js';
jush.create_links = ' target="_blank" rel="noreferrer"'; script.onload = function () {
jush.urls.sql_sqlset = jush.urls.sql[0] = jush.urls.sqlset[0] = jush.urls.sqlstatus[0] = 'http://dev.mysql.com/doc/refman/' + version + '/en/$key'; if (window.jush) { // IE runs in case of an error too
var pgsql = 'http://www.postgresql.org/docs/' + version + '/static/'; jush.create_links = ' target="_blank" rel="noreferrer"';
jush.urls.pgsql_pgsqlset = jush.urls.pgsql[0] = pgsql + '$key'; jush.urls.sql_sqlset = jush.urls.sql[0] = jush.urls.sqlset[0] = jush.urls.sqlstatus[0] = 'http://dev.mysql.com/doc/refman/' + version + '/en/$key';
jush.urls.pgsqlset[0] = pgsql + 'runtime-config-$key.html#GUC-$1'; var pgsql = 'http://www.postgresql.org/docs/' + version + '/static/';
jush.style(jushRoot + 'jush.css'); jush.urls.pgsql_pgsqlset = jush.urls.pgsql[0] = pgsql + '$key';
if (window.jushLinks) { jush.urls.pgsqlset[0] = pgsql + 'runtime-config-$key.html#GUC-$1';
jush.custom_links = jushLinks; jush.style(jushRoot + 'jush.css');
if (window.jushLinks) {
jush.custom_links = jushLinks;
}
jush.highlight_tag('code', 0);
} }
jush.highlight_tag('code', 0); };
} script.onreadystatechange = function () {
}; if (/^(loaded|complete)$/.test(script.readyState)) {
script.onreadystatechange = function () { script.onload();
if (/^(loaded|complete)$/.test(script.readyState)) { }
script.onload(); };
} document.body.appendChild(script);
}; }
document.body.appendChild(script);
} }
/** Get value of dynamically created form field /** Get value of dynamically created form field
@@ -64,6 +69,43 @@ function loginDriver(driver) {
/** Handle Tab and Esc in textarea
* @param HTMLTextAreaElement
* @param KeyboardEvent
* @return boolean
*/
function textareaKeydown(target, event) {
if (!event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey) {
if (event.keyCode == 9) { // 9 - Tab
// inspired by http://pallieter.org/Projects/insertTab/
if (target.setSelectionRange) {
var start = target.selectionStart;
var scrolled = target.scrollTop;
target.value = target.value.substr(0, start) + '\t' + target.value.substr(target.selectionEnd);
target.setSelectionRange(start + 1, start + 1);
target.scrollTop = scrolled;
return false; //! still loses focus in Opera, can be solved by handling onblur
} else if (target.createTextRange) {
document.selection.createRange().text = '\t';
return false;
}
}
if (event.keyCode == 27) { // 27 - Esc
var els = target.form.elements;
for (var i=1; i < els.length; i++) {
if (els[i-1] == target) {
els[i].focus();
break;
}
}
return false;
}
}
return true;
}
var added = '.', rowCount; var added = '.', rowCount;
/** Check if val is equal to a-delimiter-b where delimiter is '_', '' or big letter /** Check if val is equal to a-delimiter-b where delimiter is '_', '' or big letter
@@ -294,39 +336,59 @@ function foreignAddRow(field) {
*/ */
function indexesAddRow(field) { function indexesAddRow(field) {
field.onchange = function () { }; field.onchange = function () { };
var row = field.parentNode.parentNode.cloneNode(true); var parent = field.parentNode.parentNode;
var spans = row.getElementsByTagName('span'); var row = parent.cloneNode(true);
for (var i=0; i < spans.length - 1; i++) {
row.removeChild(spans[i]);
}
var selects = row.getElementsByTagName('select'); var selects = row.getElementsByTagName('select');
for (var i=0; i < selects.length; i++) { for (var i=0; i < selects.length; i++) {
selects[i].name = selects[i].name.replace(/indexes\[\d+/, '$&1'); selects[i].name = selects[i].name.replace(/indexes\[\d+/, '$&1');
selects[i].selectedIndex = 0; selects[i].selectedIndex = 0;
} }
var input = row.getElementsByTagName('input')[0]; var inputs = row.getElementsByTagName('input');
input.name = input.name.replace(/indexes\[\d+/, '$&1'); for (var i=0; i < inputs.length; i++) {
input.value = ''; inputs[i].name = inputs[i].name.replace(/indexes\[\d+/, '$&1');
field.parentNode.parentNode.parentNode.appendChild(row); inputs[i].value = '';
}
parent.parentNode.appendChild(row);
}
/** Change column in index
* @param HTMLSelectElement
* @param string name prefix
*/
function indexesChangeColumn(field, prefix) {
var columns = field.parentNode.parentNode.getElementsByTagName('select');
var names = [];
for (var i=0; i < columns.length; i++) {
var value = selectValue(columns[i]);
if (value) {
names.push(value);
}
}
field.form[field.name.replace(/\].*/, '][name]')].value = prefix + names.join('_');
} }
/** Add column for index /** Add column for index
* @param HTMLSelectElement * @param HTMLSelectElement
* @param string name prefix
*/ */
function indexesAddColumn(field) { function indexesAddColumn(field, prefix) {
field.onchange = function () { }; field.onchange = function () {
indexesChangeColumn(field, prefix);
};
var select = field.form[field.name.replace(/\].*/, '][type]')];
if (!select.selectedIndex) {
select.selectedIndex = 3;
select.onchange();
}
var column = field.parentNode.cloneNode(true); var column = field.parentNode.cloneNode(true);
var select = column.getElementsByTagName('select')[0]; select = column.getElementsByTagName('select')[0];
select.name = select.name.replace(/\]\[\d+/, '$&1'); select.name = select.name.replace(/\]\[\d+/, '$&1');
select.selectedIndex = 0; select.selectedIndex = 0;
var input = column.getElementsByTagName('input')[0]; var input = column.getElementsByTagName('input')[0];
input.name = input.name.replace(/\]\[\d+/, '$&1'); input.name = input.name.replace(/\]\[\d+/, '$&1');
input.value = ''; input.value = '';
field.parentNode.parentNode.appendChild(column); field.parentNode.parentNode.appendChild(column);
select = field.form[field.name.replace(/\].*/, '][type]')]; field.onchange();
if (!select.selectedIndex) {
select.selectedIndex = 3;
}
} }

View File

@@ -1,5 +1,3 @@
// to hide elements displayed by JavaScript
document.body.className = document.body.className.replace(/(^|\s)nojs(\s|$)/, '$1js$2');
/** Toggle visibility /** Toggle visibility
* @param string * @param string
@@ -102,7 +100,7 @@ function setHtml(id, html) {
if (html == undefined) { if (html == undefined) {
el.parentNode.innerHTML = '&nbsp;'; el.parentNode.innerHTML = '&nbsp;';
} else { } else {
el.innerHTML = html.replace(/<noscript>.*<\/noscript>/i, ''); // required for Google Chrome // hopes that there will be only one <noscript> on each line el.innerHTML = html;
} }
} }
} }
@@ -157,54 +155,25 @@ function selectAddRow(field) {
/** Handle Tab and Esc in textarea /** Send form by Ctrl+Enter on <select> and <textarea>
* @param HTMLTextAreaElement
* @param KeyboardEvent * @param KeyboardEvent
* @param [string]
* @return boolean * @return boolean
*/ */
function textareaKeydown(target, event) { function bodyKeydown(event, button) {
if (!event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey) {
if (event.keyCode == 9) { // 9 - Tab
// inspired by http://pallieter.org/Projects/insertTab/
if (target.setSelectionRange) {
var start = target.selectionStart;
var scrolled = target.scrollTop;
target.value = target.value.substr(0, start) + '\t' + target.value.substr(target.selectionEnd);
target.setSelectionRange(start + 1, start + 1);
target.scrollTop = scrolled;
return false; //! still loses focus in Opera, can be solved by handling onblur
} else if (target.createTextRange) {
document.selection.createRange().text = '\t';
return false;
}
}
if (event.keyCode == 27) { // 27 - Esc
var els = target.form.elements;
for (var i=1; i < els.length; i++) {
if (els[i-1] == target) {
els[i].focus();
break;
}
}
return false;
}
}
return true;
}
/** Send form by Enter on <select>
* @param KeyboardEvent
* @return boolean
*/
function bodyKeydown(event) {
var target = event.target || event.srcElement; var target = event.target || event.srcElement;
if (event.ctrlKey && (event.keyCode == 13 || event.keyCode == 10) && !event.altKey && !event.metaKey && /select|textarea/i.test(target.tagName)) { // 13|10 - Enter, shiftKey allowed if (event.ctrlKey && (event.keyCode == 13 || event.keyCode == 10) && !event.altKey && !event.metaKey && /select|textarea|input/i.test(target.tagName)) { // 13|10 - Enter, shiftKey allowed
target.blur(); target.blur();
if ((!target.form.onsubmit || target.form.onsubmit() !== false) && !ajaxForm(target.form)) { if (!ajaxForm(target.form, (button ? button + '=1' : ''))) {
target.form.submit(); if (button) {
target.form[button].click();
} else {
target.form.submit();
}
} }
return false; return false;
} }
return true;
} }
@@ -223,6 +192,10 @@ function editingKeydown(event) {
} }
return false; return false;
} }
if (event.shiftKey && !bodyKeydown(event, 'insert')) {
eventStop(event);
return false;
}
return true; return true;
} }
@@ -282,13 +255,17 @@ function ajaxSetHtml(url) {
}); });
} }
var originalFavicon;
/** Replace favicon /** Replace favicon
* @param string * @param string
*/ */
function replaceFavicon(href) { function replaceFavicon(href) {
var favicon = document.getElementById('favicon'); var favicon = document.getElementById('favicon');
favicon.href = href; if (favicon) {
favicon.parentNode.appendChild(favicon); // to replace the icon in Firefox favicon.href = href;
favicon.parentNode.appendChild(favicon); // to replace the icon in Firefox
}
} }
var ajaxState = 0; var ajaxState = 0;
@@ -297,14 +274,18 @@ var ajaxState = 0;
* @param string * @param string
* @param [string] * @param [string]
* @param [boolean] * @param [boolean]
* @param [boolean]
* @return XMLHttpRequest or false in case of an error * @return XMLHttpRequest or false in case of an error
*/ */
function ajaxSend(url, data, popState) { function ajaxSend(url, data, popState, noscroll) {
if (!history.pushState) { if (!history.pushState) {
return false; return false;
} }
var currentState = ++ajaxState; var currentState = ++ajaxState;
onblur = function () { onblur = function () {
if (!originalFavicon) {
originalFavicon = (document.getElementById('favicon') || {}).href;
}
replaceFavicon('../adminer/static/loader.gif'); replaceFavicon('../adminer/static/loader.gif');
}; };
setHtml('loader', '<img src="../adminer/static/loader.gif" alt="">'); setHtml('loader', '<img src="../adminer/static/loader.gif" alt="">');
@@ -319,14 +300,16 @@ function ajaxSend(url, data, popState) {
return ajaxSend(redirect, '', popState); return ajaxSend(redirect, '', popState);
} }
onblur = function () { }; onblur = function () { };
replaceFavicon('../adminer/static/favicon.ico'); replaceFavicon(originalFavicon);
if (!xmlhttp.status) { if (!xmlhttp.status) {
setHtml('loader', ''); setHtml('loader', '');
} else { } else {
if (!popState) { if (!popState) {
if (data || url != location.href) { if (data || url != location.href) {
history.pushState(data, '', url); history.pushState(data, '', url); //! remember window position
} }
}
if (!noscroll) {
scrollTo(0, 0); scrollTo(0, 0);
} }
setHtml('content', xmlhttp.responseText); setHtml('content', xmlhttp.responseText);
@@ -342,11 +325,7 @@ function ajaxSend(url, data, popState) {
var as = document.getElementById('menu').getElementsByTagName('a'); var as = document.getElementById('menu').getElementsByTagName('a');
var href = location.href.replace(/(&(sql=|dump=|(select|table)=[^&]*)).*/, '$1'); var href = location.href.replace(/(&(sql=|dump=|(select|table)=[^&]*)).*/, '$1');
for (var i=0; i < as.length; i++) { for (var i=0; i < as.length; i++) {
if (href == as[i].href) { as[i].className = (href == as[i].href ? 'active' : '');
as[i].className = 'active';
} else if (as[i].className == 'active') {
as[i].className = '';
}
} }
var dump = document.getElementById('dump'); var dump = document.getElementById('dump');
if (dump) { if (dump) {
@@ -367,18 +346,21 @@ function ajaxSend(url, data, popState) {
* @param PopStateEvent|history * @param PopStateEvent|history
*/ */
onpopstate = function (event) { onpopstate = function (event) {
if (event.state ? confirm(areYouSure) : ajaxState) { if ((ajaxState || event.state) && !/#/.test(location.href)) {
ajaxSend(location.href, event.state, 1); // 1 - disable pushState ajaxSend(location.href, (event.state && confirm(areYouSure) ? event.state : ''), 1); // 1 - disable pushState
} else {
ajaxState++;
} }
} };
/** Send form by AJAX GET /** Send form by AJAX GET
* @param HTMLFormElement * @param HTMLFormElement
* @param [string] * @param [string]
* @param [boolean]
* @return XMLHttpRequest or false in case of an error * @return XMLHttpRequest or false in case of an error
*/ */
function ajaxForm(form, data) { function ajaxForm(form, data, noscroll) {
if (/&(database|scheme|create|view|sql|user|dump|call)=/.test(location.href) && !/\./.test(data)) { // . - type="image" if ((/&(database|scheme|create|view|sql|user|dump|call)=/.test(location.href) && !/\./.test(data)) || (form.onsubmit && form.onsubmit() === false)) { // . - type="image"
return false; return false;
} }
var params = [ ]; var params = [ ];
@@ -394,9 +376,9 @@ function ajaxForm(form, data) {
params.push(data); params.push(data);
} }
if (form.method == 'post') { if (form.method == 'post') {
return ajaxSend((/\?/.test(form.action) ? form.action : location.href), params.join('&')); // ? - always part of Adminer URL return ajaxSend((/\?/.test(form.action) ? form.action : location.href), params.join('&'), noscroll); // ? - always part of Adminer URL
} }
return ajaxSend((form.action || location.href).replace(/\?.*/, '') + '?' + params.join('&')); return ajaxSend((form.action || location.href).replace(/\?.*/, '') + '?' + params.join('&'), noscroll);
} }
@@ -407,10 +389,21 @@ function ajaxForm(form, data) {
* @param number display textarea instead of input, 2 - load long text * @param number display textarea instead of input, 2 - load long text
*/ */
function selectDblClick(td, event, text) { function selectDblClick(td, event, text) {
td.ondblclick = function () { }; if (/input|textarea/i.test(td.firstChild.tagName)) {
var pos = event.rangeOffset; return;
var value = (td.firstChild.alt ? td.firstChild.alt : (td.textContent ? td.textContent : td.innerText)); }
var original = td.innerHTML;
var input = document.createElement(text ? 'textarea' : 'input'); var input = document.createElement(text ? 'textarea' : 'input');
input.onkeydown = function (event) {
if (!event) {
event = window.event;
}
if (event.keyCode == 27 && !(event.ctrlKey || event.shiftKey || event.altKey || event.metaKey)) { // 27 - Esc
td.innerHTML = original;
}
};
var pos = event.rangeOffset;
var value = 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) input.style.width = Math.max(td.clientWidth - 14, 20) + 'px'; // 14 = 2 * (td.border + td.padding + input.border)
if (text) { if (text) {
var rows = 1; var rows = 1;
@@ -464,20 +457,20 @@ function bodyClick(event, db, ns) {
if (event.button || event.ctrlKey || event.shiftKey || event.altKey || event.metaKey) { if (event.button || event.ctrlKey || event.shiftKey || event.altKey || event.metaKey) {
return; return;
} }
if (event.getPreventDefault ? event.getPreventDefault() : event.returnValue === false) { if (event.getPreventDefault ? event.getPreventDefault() : event.returnValue === false || event.defaultPrevented) {
return false; return false;
} }
var el = event.target || event.srcElement; var el = event.target || event.srcElement;
if (/^a$/i.test(el.parentNode.tagName)) { if (/^a$/i.test(el.parentNode.tagName)) {
el = el.parentNode; el = el.parentNode;
} }
if (/^a$/i.test(el.tagName) && !/^:|#|&download=/i.test(el.getAttribute('href')) && /[&?]username=/.test(el.href)) { if (/^a$/i.test(el.tagName) && !/:|#|&download=/i.test(el.getAttribute('href')) && /[&?]username=/.test(el.href)) {
var match = /&db=([^&]*)/.exec(el.href); var match = /&db=([^&]*)/.exec(el.href);
var match2 = /&ns=([^&]*)/.exec(el.href); var match2 = /&ns=([^&]*)/.exec(el.href);
return !(db == (match ? match[1] : '') && ns == (match2 ? match2[1] : '') && ajaxSend(el.href)); return !(db == (match ? match[1] : '') && ns == (match2 ? match2[1] : '') && ajaxSend(el.href));
} }
if (/^input$/i.test(el.tagName) && /image|submit/.test(el.type)) { if (/^input$/i.test(el.tagName) && /image|submit/.test(el.type)) {
return !ajaxForm(el.form, (el.name ? encodeURIComponent(el.name) + (el.type == 'image' ? '.x' : '') + '=1' : '')); return !ajaxForm(el.form, (el.name ? encodeURIComponent(el.name) + (el.type == 'image' ? '.x' : '') + '=1' : ''), el.type == 'image');
} }
return true; return true;
} }

View File

@@ -18,7 +18,8 @@ if ($fields) {
echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . (support("comment") ? "<td>" . lang('Comment') : "") . "</thead>\n"; echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . (support("comment") ? "<td>" . lang('Comment') : "") . "</thead>\n";
foreach ($fields as $field) { foreach ($fields as $field) {
echo "<tr" . odd() . "><th>" . h($field["field"]); echo "<tr" . odd() . "><th>" . h($field["field"]);
echo "<td>" . h($field["full_type"]) . ($field["null"] ? " <i>NULL</i>" : "") . ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : ""); echo "<td title='" . h($field["collation"]) . "'>" . h($field["full_type"]) . ($field["null"] ? " <i>NULL</i>" : "") . ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : "");
echo (isset($field["default"]) ? " [<b>" . h($field["default"]) . "</b>]" : "");
echo (support("comment") ? "<td>" . nbsp($field["comment"]) : ""); echo (support("comment") ? "<td>" . nbsp($field["comment"]) : "");
echo "\n"; echo "\n";
} }
@@ -48,13 +49,15 @@ if ($fields) {
echo "<table cellspacing='0'>\n"; echo "<table cellspacing='0'>\n";
echo "<thead><tr><th>" . lang('Source') . "<td>" . lang('Target') . "<td>" . lang('ON DELETE') . "<td>" . lang('ON UPDATE') . ($jush != "sqlite" ? "<td>&nbsp;" : "") . "</thead>\n"; echo "<thead><tr><th>" . lang('Source') . "<td>" . lang('Target') . "<td>" . lang('ON DELETE') . "<td>" . lang('ON UPDATE') . ($jush != "sqlite" ? "<td>&nbsp;" : "") . "</thead>\n";
foreach ($foreign_keys as $name => $foreign_key) { foreach ($foreign_keys as $name => $foreign_key) {
$link = ($foreign_key["db"] != "" ? "<b>" . h($foreign_key["db"]) . "</b>." : "") . h($foreign_key["table"]); echo "<tr title='" . h($name) . "'>";
echo "<tr>";
echo "<th><i>" . implode("</i>, <i>", array_map('h', $foreign_key["source"])) . "</i>"; echo "<th><i>" . implode("</i>, <i>", array_map('h', $foreign_key["source"])) . "</i>";
echo "<td><a href='" . h($foreign_key["db"] != "" ? preg_replace('~db=[^&]*~', "db=" . urlencode($foreign_key["db"]), ME) : ME) . "table=" . urlencode($foreign_key["table"]) . "'>$link</a>"; echo "<td><a href='" . h($foreign_key["db"] != "" ? preg_replace('~db=[^&]*~', "db=" . urlencode($foreign_key["db"]), ME) : ($foreign_key["ns"] != "" ? preg_replace('~ns=[^&]*~', "ns=" . urlencode($foreign_key["ns"]), ME) : ME)) . "table=" . urlencode($foreign_key["table"]) . "'>"
. ($foreign_key["db"] != "" ? "<b>" . h($foreign_key["db"]) . "</b>." : "") . ($foreign_key["ns"] != "" ? "<b>" . h($foreign_key["ns"]) . "</b>." : "") . h($foreign_key["table"])
. "</a>"
;
echo "(<i>" . implode("</i>, <i>", array_map('h', $foreign_key["target"])) . "</i>)"; echo "(<i>" . implode("</i>, <i>", array_map('h', $foreign_key["target"])) . "</i>)";
echo "<td>$foreign_key[on_delete]\n"; echo "<td>" . nbsp($foreign_key["on_delete"]) . "\n";
echo "<td>$foreign_key[on_update]\n"; echo "<td>" . nbsp($foreign_key["on_update"]) . "\n";
if ($jush != "sqlite") { if ($jush != "sqlite") {
echo '<td><a href="' . h(ME . 'foreign=' . urlencode($TABLE) . '&name=' . urlencode($name)) . '">' . lang('Alter') . '</a>'; echo '<td><a href="' . h(ME . 'foreign=' . urlencode($TABLE) . '&name=' . urlencode($name)) . '">' . lang('Alter') . '</a>';
} }

View File

@@ -30,7 +30,7 @@ if ($_POST) {
<form action="" method="post" id="form"> <form action="" method="post" id="form">
<table cellspacing="0"> <table cellspacing="0">
<tr><th><?php echo lang('Time'); ?><td><?php echo html_select("Timing", $trigger_options["Timing"], $row["Timing"], "if (/^" . h(preg_quote($TABLE, "/")) . "_[ba][iud]$/.test(this.form['Trigger'].value)) this.form['Trigger'].value = '" . h(js_escape($TABLE)) . "_' + selectValue(this).charAt(0).toLowerCase() + selectValue(this.form['Event']).charAt(0).toLowerCase();"); ?> <tr><th><?php echo lang('Time'); ?><td><?php echo html_select("Timing", $trigger_options["Timing"], $row["Timing"], "if (/^" . preg_quote($TABLE, "/") . "_[ba][iud]$/.test(this.form['Trigger'].value)) this.form['Trigger'].value = '" . js_escape($TABLE) . "_' + selectValue(this).charAt(0).toLowerCase() + selectValue(this.form['Event']).charAt(0).toLowerCase();"); ?>
<tr><th><?php echo lang('Event'); ?><td><?php echo html_select("Event", $trigger_event, $row["Event"], "this.form['Timing'].onchange();"); ?> <tr><th><?php echo lang('Event'); ?><td><?php echo html_select("Event", $trigger_event, $row["Event"], "this.form['Timing'].onchange();"); ?>
<tr><th><?php echo lang('Type'); ?><td><?php echo html_select("Type", $trigger_options["Type"], $row["Type"]); ?> <tr><th><?php echo lang('Type'); ?><td><?php echo html_select("Type", $trigger_options["Type"], $row["Type"]); ?>
</table> </table>

View File

@@ -111,14 +111,14 @@ if ($_POST) {
if ($old_pass != "") { if ($old_pass != "") {
$row["hashed"] = true; $row["hashed"] = true;
} }
$grants[""] = true; $grants[DB != "" && !isset($_GET["host"]) ? idf_escape($_GET["db"]) . ".*" : ""] = array();
} }
?> ?>
<form action="" method="post"> <form action="" method="post">
<table cellspacing="0"> <table cellspacing="0">
<tr><th><?php echo lang('Username'); ?><td><input name="user" maxlength="16" value="<?php echo h($row["user"]); ?>">
<tr><th><?php echo lang('Server'); ?><td><input name="host" maxlength="60" value="<?php echo h($row["host"]); ?>"> <tr><th><?php echo lang('Server'); ?><td><input name="host" maxlength="60" value="<?php echo h($row["host"]); ?>">
<tr><th><?php echo lang('Username'); ?><td><input name="user" maxlength="16" value="<?php echo h($row["user"]); ?>">
<tr><th><?php echo lang('Password'); ?><td><input id="pass" name="pass" value="<?php echo h($row["pass"]); ?>"> <tr><th><?php echo lang('Password'); ?><td><input id="pass" name="pass" value="<?php echo h($row["pass"]); ?>">
<?php if (!$row["hashed"]) { ?><script type="text/javascript">typePassword(document.getElementById('pass'));</script><?php } ?> <?php if (!$row["hashed"]) { ?><script type="text/javascript">typePassword(document.getElementById('pass'));</script><?php } ?>
<?php echo checkbox("hashed", 1, $row["hashed"], lang('Hashed'), "typePassword(this.form['pass'], this.checked);"); ?> <?php echo checkbox("hashed", 1, $row["hashed"], lang('Hashed'), "typePassword(this.form['pass'], this.checked);"); ?>

View File

@@ -30,5 +30,6 @@ if ($_POST) {
<p> <p>
<?php if ($dropped) { // old view was dropped but new wasn't created ?><input type="hidden" name="dropped" value="1"><?php } ?> <?php if ($dropped) { // old view was dropped but new wasn't created ?><input type="hidden" name="dropped" value="1"><?php } ?>
<input type="submit" value="<?php echo lang('Save'); ?>"> <input type="submit" value="<?php echo lang('Save'); ?>">
<?php if ($_GET["view"] != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="hidden" name="token" value="<?php echo $token; ?>">
</form> </form>

View File

@@ -1,3 +1,37 @@
Adminer 3.3.1 (released 2011-07-27):
Fix XSS introduced in Adminer 3.2.0
Fix altering default values (PostgreSQL)
Process list (PostgreSQL)
Adminer 3.3.0 (released 2011-07-19):
Use Esc to disable in-place edit
Shortcut for database privileges
Editable index names
Append new index with auto index selection (bug #3282127)
Preserve original timestamp value in multiple update (bug #3312614)
Bit type default value
Display foreign key name in tooltip
Display default column value in table overview
Display column collation in tooltip
Keyboard shortcuts: Alt+Shift+1 for homepage, Ctrl+Shift+Enter for Save and continue edit
Show only errors with Webserver file SQL command
Remember select export and import options
Link tables and indexes from SQL command EXPLAIN (MySQL)
Display error with all wrong SQL commands (MySQL)
Display foreign keys from other schemas (PostgreSQL)
Pagination support (Oracle)
Autocomplete for big foreign keys (Editor)
Display name of the referenced record in PostgreSQL (Editor)
Prefer NULL to empty string (Editor, bug #3323800)
Display searched columns (Editor)
Customizable favicon (customization)
Method name can return a link (customization)
Easier sending of default headers (customization)
Lithuanian and Romanian translation
Adminer 3.2.2 (released 2011-03-28):
Fix AJAX history after reload
Adminer 3.2.1 (released 2011-03-23): Adminer 3.2.1 (released 2011-03-23):
Ability to save expression in edit Ability to save expression in edit
Respect default database collation (bug #3191489) Respect default database collation (bug #3191489)

View File

@@ -51,14 +51,15 @@ function put_file($match) {
if (basename($match[2]) != "lang.inc.php" || !$_SESSION["lang"]) { if (basename($match[2]) != "lang.inc.php" || !$_SESSION["lang"]) {
$tokens = token_get_all($return); // to find out the last token $tokens = token_get_all($return); // to find out the last token
return "?>\n$return" . (in_array($tokens[count($tokens) - 1][0], array(T_CLOSE_TAG, T_INLINE_HTML), true) ? "<?php" : ""); return "?>\n$return" . (in_array($tokens[count($tokens) - 1][0], array(T_CLOSE_TAG, T_INLINE_HTML), true) ? "<?php" : "");
} elseif (preg_match('~\\s*(\\$pos = .*;)~sU', $return, $match2)) { } elseif (preg_match('~\\s*(\\$pos = (.+\n).+;)~sU', $return, $match2)) {
// single language lang() is used for plural // single language lang() is used for plural
return "function get_lang() { return "function get_lang() {
return '$_SESSION[lang]'; return '$_SESSION[lang]';
} }
function lang(\$translation, \$number) { function lang(\$translation, \$number) {
" . str_replace('$LANG', "'$_SESSION[lang]'", $match2[1]) . ' \$pos = $match2[2]\t\t: " . (preg_match("~\\\$LANG == '$_SESSION[lang]'.* \\? (.+)\n~U", $match2[1], $match3) ? $match3[1] : "1") . '
);
return sprintf($translation[$pos], $number); return sprintf($translation[$pos], $number);
} }
'; ';
@@ -101,6 +102,7 @@ function short_identifier($number, $chars) {
// based on http://latrine.dgx.cz/jak-zredukovat-php-skripty // based on http://latrine.dgx.cz/jak-zredukovat-php-skripty
function php_shrink($input) { function php_shrink($input) {
global $VERSION;
$special_variables = array_flip(array('$this', '$GLOBALS', '$_GET', '$_POST', '$_FILES', '$_COOKIE', '$_SESSION', '$_SERVER')); $special_variables = array_flip(array('$this', '$GLOBALS', '$_GET', '$_POST', '$_FILES', '$_COOKIE', '$_SESSION', '$_SERVER'));
$short_variables = array(); $short_variables = array();
$shortening = true; $shortening = true;
@@ -138,6 +140,7 @@ function php_shrink($input) {
} else { } else {
if ($token[0] == T_DOC_COMMENT) { if ($token[0] == T_DOC_COMMENT) {
$doc_comment = true; $doc_comment = true;
$token[1] = substr_replace($token[1], "* @version $VERSION\n", -2, 0);
} }
if ($token[0] == T_VAR) { if ($token[0] == T_VAR) {
$shortening = false; $shortening = false;
@@ -215,7 +218,7 @@ foreach (glob(dirname(__FILE__) . "/adminer/drivers/" . ($driver ? $driver : "*"
} }
include dirname(__FILE__) . "/adminer/include/pdo.inc.php"; include dirname(__FILE__) . "/adminer/include/pdo.inc.php";
$features = array("view", "event", "privileges", "user", "processlist", "variables", "trigger", "scheme", "sequence", "dump"); $features = array("call" => "routine", "dump", "event", "privileges", "procedure" => "routine", "processlist", "routine", "scheme", "sequence", "status", "trigger", "type", "user" => "privileges", "variables", "view");
foreach (array("adminer", "editor") as $project) { foreach (array("adminer", "editor") as $project) {
$lang_ids = array(); // global variable simplifies usage in a callback function $lang_ids = array(); // global variable simplifies usage in a callback function
$file = file_get_contents(dirname(__FILE__) . "/$project/index.php"); $file = file_get_contents(dirname(__FILE__) . "/$project/index.php");
@@ -223,14 +226,15 @@ foreach (array("adminer", "editor") as $project) {
$connection = (object) array("server_info" => 5.1); // MySQL support is version specific $connection = (object) array("server_info" => 5.1); // MySQL support is version specific
$_GET[$driver] = true; // to load the driver $_GET[$driver] = true; // to load the driver
include_once dirname(__FILE__) . "/adminer/drivers/$driver.inc.php"; include_once dirname(__FILE__) . "/adminer/drivers/$driver.inc.php";
foreach ($features as $feature) { foreach ($features as $key => $feature) {
if (!support($feature)) { if (!support($feature)) {
if (!is_int($key)) {
$feature = $key;
}
$file = str_replace("} elseif (isset(\$_GET[\"$feature\"])) {\n\tinclude \"./$feature.inc.php\";\n", "", $file); $file = str_replace("} elseif (isset(\$_GET[\"$feature\"])) {\n\tinclude \"./$feature.inc.php\";\n", "", $file);
} }
} }
if (!support("routine")) { if (!support("routine")) {
$file = str_replace("} elseif (isset(\$_GET[\"procedure\"])) {\n\tinclude \"./procedure.inc.php\";\n", "", $file);
$file = str_replace("} elseif (isset(\$_GET[\"call\"])) {\n\tinclude \"./call.inc.php\";\n", "", $file);
$file = str_replace("if (isset(\$_GET[\"callf\"])) {\n\t\$_GET[\"call\"] = \$_GET[\"callf\"];\n}\nif (isset(\$_GET[\"function\"])) {\n\t\$_GET[\"procedure\"] = \$_GET[\"function\"];\n}\n", "", $file); $file = str_replace("if (isset(\$_GET[\"callf\"])) {\n\t\$_GET[\"call\"] = \$_GET[\"callf\"];\n}\nif (isset(\$_GET[\"function\"])) {\n\t\$_GET[\"procedure\"] = \$_GET[\"function\"];\n}\n", "", $file);
} }
} }
@@ -262,7 +266,7 @@ foreach (array("adminer", "editor") as $project) {
$file = str_replace('<script type="text/javascript" src="static/editing.js"></script>' . "\n", "", $file); $file = str_replace('<script type="text/javascript" src="static/editing.js"></script>' . "\n", "", $file);
$file = preg_replace_callback("~compile_file\\('([^']+)', '([^']+)'\\);~", 'compile_file', $file); // integrate static files $file = preg_replace_callback("~compile_file\\('([^']+)', '([^']+)'\\);~", 'compile_file', $file); // integrate static files
$replace = 'h(preg_replace("~\\\\\\\\?.*~", "", ME)) . "?file=\\1&amp;version=' . $VERSION; $replace = 'h(preg_replace("~\\\\\\\\?.*~", "", ME)) . "?file=\\1&amp;version=' . $VERSION;
$file = preg_replace("~'\\.\\./adminer/static/(loader\\.gif|favicon\\.ico)~", "location.pathname+'?file=\\1&amp;version=$VERSION", $file); $file = preg_replace("~'\\.\\./adminer/static/(loader\\.gif)~", "location.pathname+'?file=\\1&amp;version=$VERSION", $file);
$file = preg_replace('~\\.\\./adminer/static/(loader\\.gif)~', "'+location.pathname+'?file=\\1&amp;version=$VERSION", $file); $file = preg_replace('~\\.\\./adminer/static/(loader\\.gif)~', "'+location.pathname+'?file=\\1&amp;version=$VERSION", $file);
$file = preg_replace('~\\.\\./adminer/static/(default\\.css|functions\\.js|favicon\\.ico)~', '<?php echo ' . $replace . '"; ?>', $file); $file = preg_replace('~\\.\\./adminer/static/(default\\.css|functions\\.js|favicon\\.ico)~', '<?php echo ' . $replace . '"; ?>', $file);
$file = preg_replace('~\\.\\./adminer/static/([^\'"]*)~', '" . ' . $replace, $file); $file = preg_replace('~\\.\\./adminer/static/([^\'"]*)~', '" . ' . $replace, $file);

58
designs/brade/adminer.css Normal file
View File

@@ -0,0 +1,58 @@
/* CSS by Brade - www.bradezone.com */
*{margin:0;padding:0}
body{font:13px/18px Helvetica,Arial,sans-serif;background:#fff;color:#333}
/* generic */
a,a:visited{color:#06c;text-decoration:none;border-bottom:1px dotted}
a:hover{border-bottom:1px solid #06c;background:#06c;color:#fff}
p{padding-bottom:4px;margin-bottom:4px}
h1{font-size:18px;font-weight:bold;padding-bottom:0px;height:40px;padding:0 0 8px 0;color:#666;border:0}
h2{font:32px Georgia,serif;padding:10px 0 8px;margin:0;background:transparent;border:0;color:#333}
h3{font-size:18px;font-weight:bold;padding:4px 0;margin:0}
form#form{overflow:hidden}
fieldset{float:left;min-height:48px;padding:0 4px 4px 4px;border:1px solid #ccc;margin-bottom:8px;margin-right:4px}
fieldset div{margin-top:4px}
input,select,textarea{font:13px Helvetica,Arial,sans-serif;color:#555;border:1px solid #999;padding:3px}
input[type=submit]{background:#ccc;padding:2px;cursor:pointer;color:#333}
input[type=submit]:hover{background:#bbb}
input[type=image],input[type=checkbox]{border:0;padding:0}
label input[type=checkbox],td input[type=radio],td span select{margin-right:4px}
select{border:1px solid #999;padding:2px}
fieldset select{margin-right:4px}
option{padding:0 5px}
optgroup{font-size:11px}
code{background:#eee;padding:2px 4px;font:16px/20px Courier,monospace}
code a:hover{background:transparent}
table{margin:4px 0 8px;border:1px solid #ccc;font-size:inherit}
tbody tr:hover td,tbody tr:hover th{background:#eee}
thead tr:hover td,thead tr:hover th{background:#ddd}
th,td{text-align:left;padding:2px 4px;vertical-align:top;font-weight:normal;border:1px dotted #ccc;border-width:0 0 0 1px;
margin:0;background:inherit}
thead th,thead td{white-space:nowrap;font-weight:bold;background:#ddd;border-color:#ddd}
th:first-child,td:first-child{border-color:transparent;white-space:nowrap}
td[align=right]{text-align:right}
table code{font-size:13px;line-height:18px}
.hidden{display:none}
.error,.message{padding:0;background:transparent;font-weight:bold}
.error{color:#c00}
.message{color:#090}
/* specific */
#content{margin:0 0 0 320px;padding:50px 20px 40px 0;height:100%}
#content:after{content:'.';clear:both;height:0;overflow:hidden;display:block}
#lang{background:#333;color:#fff;position:fixed;top:0;left:0;width:100%;padding:0 20px 0 40px;line-height:40px;height:40px}
#lang select{border-color:#333}
#menu{background:#eee;position:fixed;top:60px;bottom:20px;overflow:auto;left:20px;width:240px;padding:10px 15px;
border:5px solid #ccc;margin:0}
#menu a{color:#333;margin-right:4px}
#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(http://www.bradezone.com/random/adminer_logo.gif) no-repeat;line-height:32px}
#menu p{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0}
#breadcrumb{background:#333;color:#fff;position:fixed;top:0;left:320px;width:100%;line-height:40px;padding:0;z-index:1;margin:0}
#breadcrumb a{color:#ff9}
#breadcrumb a:hover{background:transparent;color:#ff9;border-color:#ff9}
#schema .table{padding:4px 8px;background:#f3f3f3}
/* IE hacks */
*+html th:first-child,*+html td:first-child{border-color:inherit;white-space:inherit}
* html #lang,* html #menu,* html #breadcrumb{position:absolute}
* html #lang{padding-top:10px;height:30px}
* html form#form{height:100%}

328
designs/bueltge/adminer.css Normal file
View File

@@ -0,0 +1,328 @@
/**
* Alternative style for Adminer by Frank Bueltge
* @link http://bueltge.de/
*/
body {
margin: 0;
line-height: 1.25em;
font-size: 12px;
background: #F9F9F9;
}
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;
}
form {
margin: 0;
}
table {
margin: 0 12px 12px 0;
border: 1px #BBB solid;
font-size: 90%;
}
th {
text-align: left;
}
td, th {
background-color: #fff;
padding: 1px 2px;
border: 1px #DfDfDf solid;
border-width: 1px 0 0 1px;
}
tr:first-child td, tr:first-child th {
border-top-width: 0;
}
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 tr:hover td, thead tr:hover th {
background-color: #DDD !important;
}
tr:nth-child(2n) td, tr:nth-child(2n) th, .odd td, .odd th, tr.odd {
background-color: #F1F1F1;
}
tr:hover td, tr:hover th {
background-color: #BCD;
}
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, x:-moz-any-link {
padding-top: 4px;
}
fieldset {
%padding-top: 14px;
}
legend {
font-weight: 900;
color: #000;
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;
}
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]:hover, input[type=submit]:hover {
color: #000;
border-color: #666;
}
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;
}
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;
}
.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;
}
#content {
margin: 2px 0 0 260px;
padding: 10px 20px 20px 0;
}
#lang {
height: 23px;
width: 250px;
display: block;
padding: 1px 0;
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: 260px;
background-color: #f1f1f1;
border: 1px solid #E3E3E3;
padding: 2px 12px;
line-height: 1.25em }
#menu {
position: absolute;
margin: 0;
top: 28px;
left: 0;
width: 250px;
background-color: #f1f1f1;
border: 1px solid #E3E3E3;
}
#menu form {
margin: 0;
}
#menu p {
padding-left: 8px;
font-size: 10pt;
border-bottom: none;
}
#menu 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 {
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 .references {
position: absolute;
}
.js .hidden {
display: inline;
}
.js td.hidden, .js input.hidden {
display: none;
}
legend a {
color: #333;
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;
}

File diff suppressed because one or more lines are too long

52
designs/hever/adminer.css Normal file
View File

@@ -0,0 +1,52 @@
/* Redesigned (iconized) by Hever [hev.cz] - June 2009, ver 0.1.3 */
/* 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:#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;}
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;}
html/*\*/>/*/*/body select[name="db"] option {padding-left:18px;}
html/*\*/>/*/*/body #menu p a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll left bottom; clear:left; display:block; float:left; height:16px; margin-right:8px; padding-top:1px; overflow:hidden; padding-left:16px; width:0; text-decoration:none;}
html/*\*/>/*/*/body #menu p a[href*="&table="], html/*\*/>/*/*/body #menu p 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;}
html/*\*/>/*/*/body table tbody td:first-child {white-space:normal;}
html/*\*/>/*/*/body table thead input {margin-right:30px;}
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==")}
html/*\*/>/*/*/body input[name="logout"]{ width:16px; height:16px; 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;}
/*Used icons: Silk icon set 1.3 by Mark James --- http://www.famfamfam.com/lab/icons/silk/ */

28
designs/jukin/adminer.css Normal file
View File

@@ -0,0 +1,28 @@
/* Redesigned by Janamou - September 2008 */
body { color: #000; background-color: #fff; line-height: 1.25em; font-family: Verdana, Arial, Helvetica, sans-serif; margin: 0; font-size: 90%; }
a { color: black; }
a:visited { color: black; }
a:hover { color: #626262; text-decoration: none; }
h1 { margin: 0; padding: 5px; }
h2 { margin: 0; padding: 7px 0px 7px 10px; border: 1px solid #a3a3a3; font-weight: normal; background: #FCE28E url('data:image/gif;base64,R0lGODlhEAAiAIMAAP/nnf/nn//nof/kk//llP/ab//Zav/aa/7aagAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAEAAiAAMERBDISSsIOOvNu/9gKI5k6VnoJKxs6wpmmsayZQ54jhN8zxfAoHBYMBiPyKTyeGg6m4iodEpFLK/YrHbL7Xq/4LB4LI4AADs=') top left repeat-x; margin-bottom: 20px; }
h3 { font-weight: normal; font-size: 130%; margin: .8em 0; }
table { margin: 0 20px .8em 0; border: 0; border-top: 1px solid #999; border-left: 1px solid #999; font-size: 90%; }
td, th { margin-bottom: 1em; border: 0; border-right: 1px solid #999; border-bottom: 1px solid #999; padding: .2em .3em; }
th { background: black; color: white; }
th a, th a:visited { color: white; text-decoration: none; }
th a:hover { color: #626262; }
fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: 0 .5em .5em 0; border: 1px solid #999; }
img { vertical-align: middle; margin: 0; padding: 0; }
.error { color: red; background: #fee; padding: .5em .8em; border: 1px solid red; }
.message { color: black; background: #dedede; padding: .5em .8em; border: 1px solid black; }
#menu { overflow: scroll; position: absolute; top: 0; left: 0; width: 270px; white-space: nowrap; background: #FFE594 url('data:image/gif;base64,R0lGODlhXgEBAIIAAPzabPzijvzihPzefvzmnPzedPzmlPzadCwAAAAAXgEBAAIDYEi63P5wGTXJvNZew7sJBNiBwWeWaPoFbNq+cCzPs8DaeJDvuGAPOh9wIBgWAwMjMblsOpnQqHRKrRaY1+sguz1sB4esN0wulM+HtNqMZqsBafgBTp/PAfQ8fs/v+/8ACQA7') top left repeat-y; height: 100%; _height: 650px; border: 1px solid #a3a3a3; }
#menu form { margin: 0; }
#menu p { text-align: center; font-size: 11px; }
#menu p a { color: black; }
#menu p a:hover { color: #626262; text-decoration: none; }
#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; }
#breadcrumb { position: absolute; top: 0; left: 293px; background: #d9dadb; font-size: 10px; margin: 0; padding: 2px 5px 2px 5px; }
#breadcrumb a { color: black; }

290
designs/kahi/adminer.css Normal file
View File

@@ -0,0 +1,290 @@
/*
Ok, it's a mess. You don't have to read it!
*/
body {
font-family: "Segoe UI", Tahoma, sans-serif;
}
body a[href^="#"] {
color:#000; text-decoration: none; border-bottom: 1px dotted #999;
}
h3 {
margin-top: 2em;
}
.jush-bac {
color:#22c !important;
}
a:hover {
color:#000; text-decoration: none;
}
/*
@group Headers (visually)
*/
#menu .logout {
border-bottom:0; height:auto; padding: 0;
}
/*
@end
*/
/*
@group Sidebar (visually)
*/
#menu {
margin:0; padding:0;
position:static; float:left; margin-left:-100%;
width:25%; padding-top:80px;
line-height:1.4;
}
/* header "adminer 2.3.2" */
h1 {
margin:0; padding:0;
position: fixed; left:0; top:0;
width:25%; height:60px;
border-bottom: 1px solid #bbb;
background-color:#efefef; background-color:rgba(240,240,240,0.9);
line-height:60px; text-indent:20px;
}
#h1 {
font-weight:bold; color:#666; font-style:normal;
}
#menu a {
padding:1px; margin-right:4px;
color:#000; font-size:small; text-decoration: none;
}
#menu a:hover {
font-weight:bold;
}
#menu #tables + p a {
color:green;
}
/*
#menu form+form, #menu #tables {
position: fixed; left:0; top:100px; width:25%;
}
#menu #tables {
max-height:100%; padding-top:130px; overflow-y:auto;
}
*/
/* @todo ev. position fixed for whole sidebar (not simple) */
/*
@end
*/
/*
@group Sidebar (based on HTML position, not visual)
*/
/* languages */
#lang {
position: absolute; left:auto; left:120px; top:0px; z-index:3;
font-size:11px; line-height:60px; text-decoration: underline; text-transform:lowercase;
opacity:0.5;
}
#lang:hover {
opacity:1;
}
#lang select {
display:none;
}
#lang:hover select {
display: inline-block;
}
/* logout */
input[name="logout"] {
position:fixed; right:15px; top:22px;
}
/*
@end
*/
/*
@group Content: main
*/
#content {
margin:0; padding:155px 0 50px 0;
position: static; float:left; margin-left:25%;
width:75%;
}
#content > * {
margin-left:20px; margin-right:20px;
}
#content h2 {
margin:0; padding:0;
position:fixed; left:25%; top:0; margin-left:-1px;
width:75%;
border-bottom: 1px solid #bbb;
background-color:#efefef; background-color:rgba(240,240,240,0.9);
font-weight:bold; line-height:60px; text-indent:20px;
}
/* breadcrumbs */
#breadcrumb {
margin:0; padding:0;
position:absolute; top:75px; left:25%;
background:url() no-repeat;
text-indent: 20px;
}
/* Dump link */
#menu .logout a {
margin:0; padding:2px 4px;
position:absolute; left:25%; top:110px;
border-radius:3px;
background-color:#053AC0; color:#fff; margin-left:120px; text-transform: uppercase; font-size:11px; text-decoration: none;
}
/* SQL command link */
body #menu .logout a[href$="sql="] {
margin-left: 20px;
background-color:green;
}
/*
@end
*/
/*
@group Content: details
*/
#content p > a {
margin-right:1ex;
color: #333;
}
#content p > a[href$="&database="],
#content p > a[href*="&edit="] {
color:green !important;
}
/*
@group Messages
*/
.message {
background-color:#D0EE76;
color:#000;
}
.error {
background-color:#fbb;
color: #000;
}
.message a,
.error a {
margin-left:1em;
color:#000; opacity:0.5; font-size:smaller;
}
/*
@end
*/
#menu p {
padding:20px; /* wtf? */
}
#menu form + form p:before {
content:'DB:'; font-size:11px;
}
/*
@group Tables
*/
table {
border:1px solid #ccc;
}
table thead tr > * {
padding:5px;
border-color:#ccc;
border-bottom:2px solid #ccc;
background-color:#f2f2f2;
text-align: left; font-weight:bold;
}
thead a {
color:#333; text-decoration: none;
}
body thead tr:hover > * {
background-color:#f2f2f2;
}
body tbody tr:hover > * {
background-color:#f2f7ff;
}
/*
@end
*/
/*
@group Pagination
*/
#content .pages {
margin:1em 0 2em;
}
#content .pages a {
padding:3px 5px; margin:0 1px;
border:1px solid #eee;
text-decoration:none; color: #000;
}
#content .pages a:hover {
background-color:#eee;
border-color: #fff;
}
/*
@end
*/
/*
@end
*/

126
designs/konya/adminer.css Normal file
View File

@@ -0,0 +1,126 @@
/* 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:#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;}
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;}
html/*\*/>/*/*/body select[name="db"] option {padding-left:18px;}
html/*\*/>/*/*/body #menu p a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll left bottom; clear:left; display:block; float:left; height:16px; margin-right:8px; padding-top:1px; overflow:hidden; padding-left:16px; width:0; text-decoration:none;}
html/*\*/>/*/*/body #menu p a[href*="&table="], html/*\*/>/*/*/body #menu p 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==")}
html/*\*/>/*/*/body input[name="logout"]{ width:45px; height:16px; 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;}
body {margin: 0; line-height: 1.25em; font-size: 13px; background: #F9F9F9;}
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;}
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;}
tr:first-child td, tr:first-child th {border-top-width: 0;}
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 tr:hover td, thead tr:hover th {background-color: #DDD !important;}
tr:nth-child(2n) td, tr:nth-child(2n) th, .odd td, .odd th, tr.odd {background-color: #F1F1F1;}
tr:hover td, tr:hover th {background-color: #BCD;}
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, x:-moz-any-link {padding-top: 4px;}
fieldset {%padding-top: 14px;}
legend {font-weight: 900; color: #000; 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;}
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]:hover, input[type=submit]:hover {color: #000; border-color: #666;}
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;}
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;}
.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;}
#content {margin: 2px 0 0 300px; padding: 10px 20px 20px 0;}
#lang {height: 23px; width: 250px; display: block; padding: 1px 0; 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;}
#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 {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 .references {position: absolute;}
.js .hidden {display: inline;}
.js td.hidden, .js input.hidden {display: none;}
legend a {color: #333; 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;}

View File

@@ -0,0 +1,286 @@
/**
* Alternative style for Adminer. Zrobeno 7.4.2011
* @author Vlasta Neubauer [@paranoiq]
*/
/* -- fonts ----------------------------------------------------------------- */
body {
font-size: 11pt; }
body, select, option, optgroup, button {
font-family: Calibri, Arial, Helvetica, sans-serif; } /* IE6 */
input[type='submit'], input[type='reset'], input[type='button'], input[type='file'],
input[name$='[comment]'], input[name='Comment'] {
font-family: Calibri, Arial, Helvetica, sans-serif; }
input, textarea, pre, code, samp, kbd, var {
font-family: Consolas, "Courier New", monospace;
font-size: 10pt; } /* FF3 */
/* -- links ----------------------------------------------------------------- */
a {
color: #007; }
a:visited {
color: #707; }
a:hover, input[name='logout']:hover {
color: #700;
text-decoration: none; }
h1 a:visited {
color: #007; }
input[name='logout'] {
position: absolute;
bottom: 10px;
left: 33%; }
input[name='logout'] { /* IEx */
%position: static;
%background: transparent;
%text-decoration: underline;
%font-weight: bold;
%cursor: pointer;
%border: none;
%margin: 0;
%padding: 0;
%color: #007;
}
/* -- tables ---------------------------------------------------------------- */
table {
margin: 12px 12px 12px 0;
border: 1px #DDD solid;
border-collapse: collapse; }
td, th {
background-color: #FFF;
padding: 1px 2px;
border-left: 1px #DDD dotted;
border-width: 1px 0px 0px 1px; }
th {
text-align: left !important; }
tr:first-child td, tr:first-child th {
border-top-width: 0; }
td:first-child, th:first-child {
border-left-width: 0; }
thead td, thead th {
background-color: #EEE;
border: none;
border-bottom: 1px #DDD solid; }
.nowrap tr:nth-child(2n) td, .nowrap tr:nth-child(2n) th {
background-color: #DEF; }
.odd td, .odd th {
background-color: #DEF; } /* IEx */
tr.selected td, tr.selected th {
background-color: #ABC !important; }
tr:hover td, tr:hover th {
background-color: #BCD !important; } /* WTF? */
thead tr:hover td, thead tr:hover th {
background-color: #EEE !important; }
/* -- forms ----------------------------------------------------------------- */
fieldset {
background-color: #DEF;
border: none;
%padding-left: 8px;
%border: 1px #DDD solid; /* IEx */
%background-repeat: repeat-x; /* IE8 */
%background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAIAAAC0tAIdAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAACJJREFUKFNj/P//PwPxAKiaeMBAvFKQK0ZVY4TAaJhgJgoAj5t2py3lrtoAAAAASUVORK5CYII='); }
legend {
color: #000;
background-color: #FFF;
%background-color: transparent; /* IEx */
padding: 0px 4px; }
legend a:visited {
color: #000; } /* IE6+7 */
input[name='limit'], input[name*='length'] {
width: 3em; }
input[name='text_length'] {
width: 5em; } /* ~FF3 */
select + input, select + select {
margin-left: 2px; }
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; }
textarea[name='definition'] {
height: 480px; }
input[name$='[comment]'] {
width: 24em; }
input[type='text'], textarea {
border: 1px #DDD solid; }
input[type='submit'], input[type='reset'], input[type='submit'], button, input[type='checkbox'], label, select, option {
cursor: pointer; }
.minifieldset {
display: inline-block;
padding: 2px 4px;
background-color: #DEF;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px; }
.minifieldset * {
margin: 0; }
/* -- other ----------------------------------------------------------------- */
.error {
padding: 8px; }
.message {
padding: 8px;
color: #000;
background: #DDD; }
.jush-sql {
padding: 2px 4px;
margin-right: 4px;
outline: 1px #BBB dashed;
font-size: 9pt; }
code {
background: transparent; }
.nowrap td i {
color: #AAA; }
/* -- structure ------------------------------------------------------------- */
#content {
margin: 28px 0 0 192px;
padding: 10px 20px 20px 0; }
h3 {
margin: 20px 0; }
#lang {
height: 23px;
width: 180px;
display: block;
padding: 1px 0px;
text-align: center;
background-color: #EEE;
line-height: 1.25em; }
#lang select {
font-size: 8pt; }
#breadcrumb {
margin: 0;
height: 21px;
display: block;
left: 192px;
background-color: #DDD;
padding: 2px 12px;
line-height: 1.25em; }
#menu {
margin: 0;
padding-bottom: 50px;
top: 38px;
width: 180px;
background-color: #DEF; }
#menu p {
padding-left: 8px;
font-size: 10pt;
border-bottom: none; }
h1 {
margin-top: 8px;
color: #000;
padding: 5px;
text-align: center;
font-size: 14pt;
border-bottom: none;
background: transparent;
font-style: italic;
text-shadow: #FFF 2px 2px 0px; }
h1 #h1 {
color: #000;
font-weight: bold; }
h1 #h1:hover {
text-decoration: underline; }
h1 #h1:visited {
color: #000; }
h2 {
margin: 0;
margin-bottom: 12px;
padding: 6px 18px;
background-color: #CDE;
border-bottom: none;
color: #000;
text-shadow: #FFF 0px 0px 4px; }
#schema {
margin: 1.5em 0 0 220px; }
#schema .table {
border: 1px solid #DDD;
background-color: #DEF;
padding: 0 2px; }
/* -- GUI adjustments ------------------------------------------------------- */
.js .hidden {
display: inline; }
.js td.hidden, .js input.hidden {
display: none; }
legend a {
color: #000;
text-decoration: none;
cursor: default; }
legend a:hover {
color: black; }
select[name^="columns"] optgroup:last-child option:nth-child(3)::before {
content: "count "; }
select[name$="[collation]"] {
max-width: 120px; }
.logout a:first-child, p a {
margin-right: 8px; }
#tables a, #breadcrumb a, p.pages a, p code + a {
margin-right: 0; }
.logout a::before, p a::before {
content: '» '; }
#tables a::before, #breadcrumb a::before, p.pages a::before, p code + a::before {
content: ''; }
#form + p a:first-child::before {
content: ''; }
/* -- eye candy ------------------------------------------------------------- */
fieldset, legend, h2, .error, .message {
-moz-border-radius: 5px;
border-radius: 5px; }
#breadcrumb, #lang, #menu {
-moz-border-radius-bottomright: 5px;
border-bottom-right-radius: 5px; }
#breadcrumb {
-moz-border-radius-bottomleft: 5px;
border-bottom-left-radius: 5px; }
#menu {
-moz-border-radius-topright: 5px;
border-top-right-radius: 5px; }
fieldset, h2, .error, #breadcrumb, #lang, #menu, #breadcrumb, #menu {
x-moz-box-shadow: 1px 1px 3px #DDD;
xbox-shadow: 1px 1px 3px #DDD; }
fieldset table {
x-moz-box-shadow: none;
xbox-shadow: none; }
/* -- printing -------------------------------------------------------------- */
@media print {
#lang, #menu {
display: none; }
#content {
margin-left: 1em; }
#breadcrumb {
left: 1em;
background: none;
border-bottom: 1px silver dashed;
box-shadow: none; }
h2 {
background: none;
box-shadow: none; }
p.tabs {
display: none; }
}

116
designs/pilot/adminer.css Normal file
View File

@@ -0,0 +1,116 @@
#menu {
margin: 0;
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 270px;
padding: 0;
border-right: 1px #ccc solid;
}
#menu p {
margin: 0;
padding: 4px 10px;
}
#menu p select {
width: 100%;
}
#menu h1 {
height: 25px;
padding: 0 10px;
margin: 0;
line-height: 20px;
display: block;
}
#menu h1 a {
font-size: 13px;
}
#menu h1 .version {
font-size: 9px;
}
#menu * {
margin: 0;
padding: 0;
}
p#tables {
margin: 0;
position: absolute;
top: 108px;
bottom: 0;
left: 0;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
width: 270px;
}
p#tables a {
display: block;
margin: 0;
padding: 0;
text-decoration: none;
margin-top: 5px;
}
p#tables a[href*="select"] {
position: absolute;
left: 10px;
width: 50px;
}
p#tables a[href*="table"] {
position: absolute;
left: 65px;
width: 200px;
}
#lang {
top: -1px;
right: 2px;
left: auto;
margin: 0;
padding: 0;
z-index: 10;
}
#content {
margin: 0;
padding: 0 10px 10px 10px;
position: absolute;
left: 270px;
right: 0;
top: 82px;
bottom: 0;
overflow: auto;
}
#content h2 {
display: block;
margin: 0;
padding: 0;
height: 55px;
position: fixed;
left: 270px;
right: 0;
top: 26px;
line-height: 55px;
padding-left: 10px;
border-bottom: 1px solid #ccc;
}
#breadcrumb {
position: fixed;
left: 270px;
right: 0;
top: 0;
height: 25px;
margin: 0;
border-bottom: 1px solid #999;
}

1
designs/readme.txt Normal file
View File

@@ -0,0 +1 @@
Copy adminer.css alongside Adminer PHP script to use an alternative design.

View File

@@ -13,7 +13,7 @@ if ($adminer->homepage()) {
$name = $adminer->tableName($row); $name = $adminer->tableName($row);
if (isset($row["Engine"]) && $name != "") { if (isset($row["Engine"]) && $name != "") {
echo '<tr' . odd() . '><td>' . checkbox("tables[]", $table, in_array($table, (array) $_POST["tables"], true), "", "formUncheck('check-all');"); echo '<tr' . odd() . '><td>' . checkbox("tables[]", $table, in_array($table, (array) $_POST["tables"], true), "", "formUncheck('check-all');");
echo '<th><a href="' . h(ME) . 'select=' . urlencode($table) . '">' . h($name) . '</a>'; echo "<th><a href='" . h(ME) . 'select=' . urlencode($table) . "'>$name</a>";
$val = number_format($row["Rows"], 0, '.', lang(',')); $val = number_format($row["Rows"], 0, '.', lang(','));
echo "<td align='right'><a href='" . h(ME . "edit=") . urlencode($table) . "'>" . ($row["Engine"] == "InnoDB" && $val ? "~ $val" : $val) . "</a>"; echo "<td align='right'><a href='" . h(ME . "edit=") . urlencode($table) . "'>" . ($row["Engine"] == "InnoDB" && $val ? "~ $val" : $val) . "</a>";
} }

View File

@@ -32,8 +32,16 @@ function adminer_object() {
if ($order && ereg('_(md5|sha1)$', $field["field"])) { if ($order && ereg('_(md5|sha1)$', $field["field"])) {
return ""; // hide hashes in select return ""; // hide hashes in select
} }
// only columns with comments will be displayed and only the first five in select // display only column with comments, first five of them plus searched columns
return ($order <= 5 ? h($field["comment"]) : ""); if ($order < 5) {
return h($field["comment"]);
}
foreach ((array) $_GET["where"] as $key => $where) {
if ($where["col"] == $field["field"] && ($key >= 0 || $where["val"] != "")) {
return h($field["comment"]);
}
}
return "";
} }
} }

View File

@@ -4,7 +4,7 @@ class Adminer {
var $_values = array(); var $_values = array();
function name() { function name() {
return lang('Editor'); return "<a href='http://www.adminer.org/editor/' id='h1'>" . lang('Editor') . "</a>";
} }
//! driver, ns //! driver, ns
@@ -27,8 +27,7 @@ class Adminer {
} }
function headers() { function headers() {
header("X-Frame-Options: deny"); return true;
header("X-XSS-Protection: 0");
} }
function head() { function head() {
@@ -123,7 +122,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
function rowDescription($table) { function rowDescription($table) {
// first varchar column // first varchar column
foreach (fields($table) as $field) { foreach (fields($table) as $field) {
if ($field["type"] == "varchar") { if (ereg("varchar|character varying", $field["type"])) {
return idf_escape($field["field"]); return idf_escape($field["field"]);
} }
} }
@@ -133,28 +132,21 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
function rowDescriptions($rows, $foreignKeys) { function rowDescriptions($rows, $foreignKeys) {
$return = $rows; $return = $rows;
foreach ($rows[0] as $key => $val) { foreach ($rows[0] as $key => $val) {
foreach ((array) $foreignKeys[$key] as $foreignKey) { if (list($table, $id, $name) = $this->_foreignColumn($foreignKeys, $key)) {
if (count($foreignKey["source"]) == 1) { // find all used ids
$id = idf_escape($foreignKey["target"][0]); $ids = array();
$name = $this->rowDescription($foreignKey["table"]); foreach ($rows as $row) {
if ($name != "") { $ids[$row[$key]] = exact_value($row[$key]);
// find all used ids }
$ids = array(); // uses constant number of queries to get the descriptions, join would be complex, multiple queries would be slow
foreach ($rows as $row) { $descriptions = $this->_values[$table];
$ids[$row[$key]] = exact_value($row[$key]); if (!$descriptions) {
} $descriptions = get_key_vals("SELECT $id, $name FROM " . table($table) . " WHERE $id IN (" . implode(", ", $ids) . ")");
// uses constant number of queries to get the descriptions, join would be complex, multiple queries would be slow }
$descriptions = $this->_values[$foreignKey["table"]]; // use the descriptions
if (!$descriptions) { foreach ($rows as $n => $row) {
$descriptions = get_key_vals("SELECT $id, $name FROM " . table($foreignKey["table"]) . " WHERE $id IN (" . implode(", ", $ids) . ")"); if (isset($row[$key])) {
} $return[$n][$key] = (string) $descriptions[$row[$key]];
// use the descriptions
foreach ($rows as $n => $row) {
if (isset($row[$key])) {
$return[$n][$key] = (string) $descriptions[$row[$key]];
}
}
break;
} }
} }
} }
@@ -166,17 +158,17 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
$return = ($val == "<i>NULL</i>" ? "&nbsp;" : $val); $return = ($val == "<i>NULL</i>" ? "&nbsp;" : $val);
if (ereg('blob|bytea', $field["type"]) && !is_utf8($val)) { if (ereg('blob|bytea', $field["type"]) && !is_utf8($val)) {
$return = lang('%d byte(s)', strlen($val)); $return = lang('%d byte(s)', strlen($val));
if (ereg("^(GIF|\xFF\xD8\xFF|\x89\x50\x4E\x47\x0D\x0A\x1A\x0A)", $val)) { // GIF|JPG|PNG, getimagetype() works with filename if (ereg("^(GIF|\xFF\xD8\xFF|\x89PNG\x0D\x0A\x1A\x0A)", $val)) { // GIF|JPG|PNG, getimagetype() works with filename
$return = "<img src='$link' alt='$return'>"; $return = "<img src='$link' alt='$return'>";
} }
} }
if (ereg("(tinyint|bit)\\(1\\)", $field["full_type"]) && $return != "&nbsp;") { // bool if (like_bool($field) && $return != "&nbsp;") { // bool
$return = '<img src="' . ($val ? "../adminer/static/plus.gif" : "../adminer/static/cross.gif") . '" alt="' . h($val) . '">'; $return = '<img src="' . ($val ? "../adminer/static/plus.gif" : "../adminer/static/cross.gif") . '" alt="' . h($val) . '">';
} }
if ($link) { if ($link) {
$return = "<a href='$link'>$return</a>"; $return = "<a href='$link'>$return</a>";
} }
if (!$link && !ereg("(tinyint|bit)\\(1\\)", $field["full_type"]) && ereg('int|float|double|decimal', $field["type"])) { if (!$link && !like_bool($field) && ereg('int|float|double|decimal', $field["type"])) {
$return = "<div class='number'>$return</div>"; // Firefox doesn't support <colgroup> $return = "<div class='number'>$return</div>"; // Firefox doesn't support <colgroup>
} elseif (ereg('date', $field["type"])) { } elseif (ereg('date', $field["type"])) {
$return = "<div class='datetime'>$return</div>"; $return = "<div class='datetime'>$return</div>";
@@ -205,8 +197,8 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
$i = 0; $i = 0;
$fields = fields($_GET["select"]); $fields = fields($_GET["select"]);
foreach ($fields as $name => $field) { foreach ($fields as $name => $field) {
if (ereg("enum", $field["type"])) { //! set - uses 1 << $i and FIND_IN_SET() $desc = $columns[$name];
$desc = $columns[$name]; if (ereg("enum", $field["type"]) && $desc != "") { //! set - uses 1 << $i and FIND_IN_SET()
$key = $keys[$name]; $key = $keys[$name];
$i--; $i--;
echo "<div>" . h($desc) . "<input type='hidden' name='where[$i][col]' value='" . h($name) . "'>:"; echo "<div>" . h($desc) . "<input type='hidden' name='where[$i][col]' value='" . h($name) . "'>:";
@@ -217,7 +209,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
} }
foreach ($columns as $name => $desc) { foreach ($columns as $name => $desc) {
$options = $this->_foreignKeyOptions($_GET["select"], $name); $options = $this->_foreignKeyOptions($_GET["select"], $name);
if ($options) { if (is_array($options)) {
if ($fields[$name]["null"]) { if ($fields[$name]["null"]) {
$options[0] = '(' . lang('empty') . ')'; $options[0] = '(' . lang('empty') . ')';
} }
@@ -282,16 +274,26 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
echo "</div></fieldset>\n"; echo "</div></fieldset>\n";
} }
function selectCommandPrint() {
return true;
}
function selectImportPrint() {
return true;
}
function selectEmailPrint($emailFields, $columns) { function selectEmailPrint($emailFields, $columns) {
if ($emailFields) { if ($emailFields) {
print_fieldset("email", lang('E-mail'), $_POST["email_append"]); print_fieldset("email", lang('E-mail'), $_POST["email_append"]);
echo "<div onkeydown=\"eventStop(event); return bodyKeydown(event, 'email');\">\n";
echo "<p>" . lang('From') . ": <input name='email_from' value='" . h($_POST ? $_POST["email_from"] : $_COOKIE["adminer_email"]) . "'>\n"; echo "<p>" . lang('From') . ": <input name='email_from' value='" . h($_POST ? $_POST["email_from"] : $_COOKIE["adminer_email"]) . "'>\n";
echo lang('Subject') . ": <input name='email_subject' value='" . h($_POST["email_subject"]) . "'>\n"; echo lang('Subject') . ": <input name='email_subject' value='" . h($_POST["email_subject"]) . "'>\n";
echo "<p><textarea name='email_message' rows='15' cols='75'>" . h($_POST["email_message"] . ($_POST["email_append"] ? '{$' . "$_POST[email_addition]}" : "")) . "</textarea><br>\n"; //! Ctrl+Enter for this.form.email echo "<p><textarea name='email_message' rows='15' cols='75'>" . h($_POST["email_message"] . ($_POST["email_append"] ? '{$' . "$_POST[email_addition]}" : "")) . "</textarea>\n"; //! Ctrl+Enter for this.form.email
echo html_select("email_addition", $columns, $_POST["email_addition"]) . "<input type='submit' name='email_append' value='" . lang('Insert') . "'>\n"; //! JavaScript echo "<p onkeydown=\"eventStop(event); return bodyKeydown(event, 'email_append');\">" . html_select("email_addition", $columns, $_POST["email_addition"]) . "<input type='submit' name='email_append' value='" . lang('Insert') . "'>\n"; //! JavaScript
echo "<p>" . lang('Attachments') . ": <input type='file' name='email_files[]' onchange=\"this.onchange = function () { }; var el = this.cloneNode(true); el.value = ''; this.parentNode.appendChild(el);\">"; echo "<p>" . lang('Attachments') . ": <input type='file' name='email_files[]' onchange=\"this.onchange = function () { }; var el = this.cloneNode(true); el.value = ''; this.parentNode.appendChild(el);\">";
echo "<p>" . (count($emailFields) == 1 ? '<input type="hidden" name="email_field" value="' . h(key($emailFields)) . '">' : html_select("email_field", $emailFields)); echo "<p>" . (count($emailFields) == 1 ? '<input type="hidden" name="email_field" value="' . h(key($emailFields)) . '">' : html_select("email_field", $emailFields));
echo "<input type='submit' name='email' value='" . lang('Send') . "' onclick=\"return this.form['delete'].onclick();\">\n"; echo "<input type='submit' name='email' value='" . lang('Send') . "' onclick=\"return this.form['delete'].onclick();\">\n";
echo "</div>\n";
echo "</div></fieldset>\n"; echo "</div></fieldset>\n";
} }
} }
@@ -411,7 +413,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
if ($field["null"] && ereg('blob', $field["type"])) { if ($field["null"] && ereg('blob', $field["type"])) {
$return["NULL"] = lang('empty'); $return["NULL"] = lang('empty');
} }
$return[""] = ($field["null"] || $field["auto_increment"] || ereg("(tinyint|bit)\\(1\\)", $field["full_type"]) ? "" : "*"); $return[""] = ($field["null"] || $field["auto_increment"] || like_bool($field) ? "" : "*");
//! respect driver //! respect driver
if (ereg('date|time', $field["type"])) { if (ereg('date|time', $field["type"])) {
$return["now"] = lang('now'); $return["now"] = lang('now');
@@ -428,11 +430,14 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
. enum_input("radio", $attrs, $field, ($value || isset($_GET["select"]) ? $value : 0), ($field["null"] ? "" : null)) . enum_input("radio", $attrs, $field, ($value || isset($_GET["select"]) ? $value : 0), ($field["null"] ? "" : null))
; ;
} }
$options = $this->_foreignKeyOptions($table, $field["field"]); $options = $this->_foreignKeyOptions($table, $field["field"], $value);
if ($options) { if (isset($options)) {
return "<select$attrs>" . optionlist($options, $value, true) . "</select>"; return (is_array($options)
? "<select$attrs>" . optionlist($options, $value, true) . "</select>"
: "<input value='" . h($value) . "'$attrs class='hidden'><input value='" . h($options) . "' class='jsonly' onkeyup=\"whisper('" . h(ME . "script=complete&source=" . urlencode($table) . "&field=" . urlencode($field["field"])) . "&value=', this);\"><div onclick='return whisperClick(event, this.previousSibling);'></div>"
);
} }
if (ereg("(tinyint|bit)\\(1\\)", $field["full_type"])) { // bool if (like_bool($field)) {
return '<input type="checkbox" value="' . h($value ? $value : 1) . '"' . ($value ? ' checked' : '') . "$attrs>"; return '<input type="checkbox" value="' . h($value ? $value : 1) . '"' . ($value ? ' checked' : '') . "$attrs>";
} }
$hint = ""; $hint = "";
@@ -460,7 +465,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
$return = ($match["p1"] != "" ? $match["p1"] : ($match["p2"] != "" ? ($match["p2"] < 70 ? 20 : 19) . $match["p2"] : gmdate("Y"))) . "-$match[p3]$match[p4]-$match[p5]$match[p6]" . end($match); $return = ($match["p1"] != "" ? $match["p1"] : ($match["p2"] != "" ? ($match["p2"] < 70 ? 20 : 19) . $match["p2"] : gmdate("Y"))) . "-$match[p3]$match[p4]-$match[p5]$match[p6]" . end($match);
} }
$return = ($field["type"] == "bit" && ereg('^[0-9]+$', $value) ? $return : q($return)); $return = ($field["type"] == "bit" && ereg('^[0-9]+$', $value) ? $return : q($return));
if (!ereg('char|text', $field["type"]) && !ereg("(tinyint|bit)\\(1\\)", $field["full_type"]) && $value == "") { if ($value == "" && ($field["null"] || !ereg('char|text', $field["type"])) && !like_bool($field)) {
$return = "NULL"; $return = "NULL";
} elseif (ereg('^(md5|sha1)$', $function)) { } elseif (ereg('^(md5|sha1)$', $function)) {
$return = "$function($return)"; $return = "$function($return)";
@@ -511,8 +516,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
global $VERSION, $token; global $VERSION, $token;
?> ?>
<h1> <h1>
<a href="http://www.adminer.org/" id="h1"><?php echo $this->name(); ?></a> <?php echo $this->name(); ?> <span class="version"><?php echo $VERSION; ?></span>
<span class="version"><?php echo $VERSION; ?></span>
<a href="http://www.adminer.org/editor/#download" id="version"><?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?></a> <a href="http://www.adminer.org/editor/#download" id="version"><?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?></a>
</h1> </h1>
<?php <?php
@@ -557,23 +561,32 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
} }
} }
function _foreignKeyOptions($table, $column) { function _foreignColumn($foreignKeys, $column) {
$foreignKeys = column_foreign_keys($table);
foreach ((array) $foreignKeys[$column] as $foreignKey) { foreach ((array) $foreignKeys[$column] as $foreignKey) {
if (count($foreignKey["source"]) == 1) { if (count($foreignKey["source"]) == 1) {
$id = idf_escape($foreignKey["target"][0]);
$name = $this->rowDescription($foreignKey["table"]); $name = $this->rowDescription($foreignKey["table"]);
if ($name != "") { if ($name != "") {
$return = &$this->_values[$foreignKey["table"]]; $id = idf_escape($foreignKey["target"][0]);
if (!isset($return)) { return array($foreignKey["table"], $id, $name);
$table_status = table_status($foreignKey["table"]);
$return = ($table_status["Rows"] > 1000 ? array() : array("" => "") + get_key_vals("SELECT $id, $name FROM " . table($foreignKey["table"]) . " ORDER BY 2"));
}
return $return;
} }
} }
} }
} }
function _foreignKeyOptions($table, $column, $value = null) {
global $connection;
if (list($target, $id, $name) = $this->_foreignColumn(column_foreign_keys($table), $column)) {
$return = &$this->_values[$target];
if (!isset($return)) {
$table_status = table_status($target);
$return = ($table_status["Rows"] > 1000 ? "" : array("" => "") + get_key_vals("SELECT $id, $name FROM " . table($target) . " ORDER BY 2"));
}
if (!$return && isset($value)) {
return $connection->result("SELECT $name FROM " . table($target) . " WHERE $id = " . q($value));
}
return $return;
}
}
} }

View File

@@ -16,12 +16,12 @@ function email_header($header) {
* @param array * @param array
* @return bool * @return bool
*/ */
function send_mail($email, $subject, $message, $from = "", $files = array("error" => array())) { function send_mail($email, $subject, $message, $from = "", $files = array()) {
$eol = (strncasecmp(PHP_OS, "win", 3) ? "\n" : "\r\n"); // PHP_EOL available since PHP 4.3.10 and 5.0.2 $eol = (strncasecmp(PHP_OS, "win", 3) ? "\n" : "\r\n"); // PHP_EOL available since PHP 4.3.10 and 5.0.2
$message = str_replace("\n", $eol, wordwrap(str_replace("\r", "", "$message\n"))); $message = str_replace("\n", $eol, wordwrap(str_replace("\r", "", "$message\n")));
$boundary = uniqid("boundary"); $boundary = uniqid("boundary");
$attachments = ""; $attachments = "";
foreach ($files["error"] as $key => $val) { foreach ((array) $files["error"] as $key => $val) {
if (!$val) { if (!$val) {
$attachments .= "--$boundary$eol" $attachments .= "--$boundary$eol"
. "Content-Type: " . str_replace("\n", "", $files["type"][$key]) . $eol . "Content-Type: " . str_replace("\n", "", $files["type"][$key]) . $eol
@@ -43,3 +43,11 @@ function send_mail($email, $subject, $message, $from = "", $files = array("error
; ;
return mail($email, email_header($subject), $beginning . $message . $attachments, $headers); return mail($email, email_header($subject), $beginning . $message . $attachments, $headers);
} }
/** Check whether the column looks like boolean
* @param array single field returned from fields()
* @return bool
*/
function like_bool($field) {
return ereg("bool|(tinyint|bit)\\(1\\)", $field["full_type"]);
}

View File

@@ -19,6 +19,8 @@ if (isset($_GET["download"])) {
include "../adminer/edit.inc.php"; include "../adminer/edit.inc.php";
} elseif (isset($_GET["select"])) { } elseif (isset($_GET["select"])) {
include "../adminer/select.inc.php"; include "../adminer/select.inc.php";
} elseif (isset($_GET["script"])) {
include "./script.inc.php";
} else { } else {
include "./db.inc.php"; include "./db.inc.php";
} }

12
editor/script.inc.php Normal file
View File

@@ -0,0 +1,12 @@
<?php
if (list($table, $id, $name) = $adminer->_foreignColumn(column_foreign_keys($_GET["source"]), $_GET["field"])) {
$result = $connection->query("SELECT $id, $name FROM " . table($table) . " WHERE " . (ereg('^[0-9]+$', $_GET["value"]) ? "$id = $_GET[value] OR " : "") . "$name LIKE " . q("$_GET[value]%") . " ORDER BY 2 LIMIT 11");
for ($i=0; $i < 10 && ($row = $result->fetch_row()); $i++) {
echo "<a href='" . h(ME . "edit=" . urlencode($table) . "&where" . urlencode("[" . bracket_escape(idf_unescape($id)) . "]") . "=" . urlencode($row[0])) . "'>" . h($row[1]) . "</a><br>\n";
}
if ($i == 10) {
echo "...\n";
}
}
exit; // don't print footer

View File

@@ -1,5 +1,36 @@
// Editor specific functions // Editor specific functions
function bodyLoad(version) { function bodyLoad(version) {
onpopstate(history); if (history.state !== undefined) {
onpopstate(history);
}
}
function whisperClick(event, field) {
var el = event.target || event.srcElement;
if (/^a$/i.test(el.tagName) && !(event.button || event.ctrlKey || event.shiftKey || event.altKey || event.metaKey)) {
field.value = el.firstChild.data;
field.previousSibling.value = decodeURIComponent(el.href.replace(/.*=/, ''));
field.nextSibling.style.display = 'none';
eventStop(event);
return false;
}
}
function whisper(url, field) {
if (field.orig != field.value) { // ignore arrows, Shift, ...
field.orig = field.value;
field.previousSibling.value = field.value; // accept number, reject string
return ajax(url + encodeURIComponent(field.value), function (xmlhttp) {
if (xmlhttp.status && field.orig == field.value) { // ignore old responses
field.nextSibling.innerHTML = xmlhttp.responseText;
field.nextSibling.style.display = '';
var a = field.nextSibling.firstChild;
if (a && a.firstChild.data == field.value) {
field.previousSibling.value = decodeURIComponent(a.href.replace(/.*=/, ''));
a.className = 'active';
}
}
});
}
} }

2
externals/jush vendored

View File

@@ -7,6 +7,7 @@
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/ */
class AdminerDumpZip { class AdminerDumpZip {
/** @var string @access protected */
var $filename; var $filename;
function dumpOutput() { function dumpOutput() {

View File

@@ -8,35 +8,35 @@
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/ */
class AdminerEditCalendar { class AdminerEditCalendar {
/** @var string @access protected */
var $prepend, $langPath; var $prepend, $langPath;
/** /**
* @param string text to append before first calendar usage * @param string text to append before first calendar usage
* @param string path to language file, %s stands for language code * @param string path to language file, %s stands for language code
*/ */
function AdminerEditCalendar($prepend = "<script type='text/javascript' src='jquery-ui/jquery.js'></script>\n<script type='text/javascript' src='jquery-ui/jquery-ui.js'></script>\n<script type='text/javascript' src='jquery-ui/jquery-ui-timepicker-addon.js'></script>\n<link rel='stylesheet' type='text/css' href='jquery-ui/jquery-ui.css'>\n", $langPath = "jquery-ui/i18n/jquery.ui.datepicker-%s.js") { //! insert <link> by JavaScript to achieve HTML validity function AdminerEditCalendar($prepend = "<script type='text/javascript' src='jquery-ui/jquery.js'></script>\n<script type='text/javascript' src='jquery-ui/jquery-ui.js'></script>\n<script type='text/javascript' src='jquery-ui/jquery-ui-timepicker-addon.js'></script>\n<link rel='stylesheet' type='text/css' href='jquery-ui/jquery-ui.css'>\n", $langPath = "jquery-ui/i18n/jquery.ui.datepicker-%s.js") {
$this->prepend = $prepend; $this->prepend = $prepend;
$this->langPath = $langPath; $this->langPath = $langPath;
} }
function editInput($table, $field, $attrs, $value) { function head() {
static $calendar = false; echo $this->prepend;
if (ereg("date|time", $field["type"])) { if ($this->langPath && function_exists('get_lang')) { // since Adminer 3.2.0
if (!$calendar) { $lang = get_lang();
$calendar = true; $lang = ($lang == "zh" ? "zh-CN" : ($lang == "zh-tw" ? "zh-TW" : $lang));
echo $this->prepend; if ($lang != "en" && file_exists(sprintf($this->langPath, $lang))) {
if ($this->langPath && function_exists('get_lang')) { // since Adminer 3.2.0 printf("<script type='text/javascript' src='$this->langPath'></script>\n", $lang);
$lang = get_lang(); echo "<script type='text/javascript'>jQuery(function () { jQuery.timepicker.setDefaults(jQuery.datepicker.regional['$lang']); });</script>\n";
$lang = ($lang == "zh" ? "zh-CN" : ($lang == "zh-tw" ? "zh-TW" : $lang));
if ($lang != "en" && file_exists(sprintf($this->langPath, $lang))) {
printf("<script type='text/javascript' src='$this->langPath'></script>\n", $lang);
echo "<script type='text/javascript'>jQuery(function () { jQuery.timepicker.setDefaults(jQuery.datepicker.regional['$lang']); });</script>\n";
}
}
} }
}
}
function editInput($table, $field, $attrs, $value) {
if (ereg("date|time", $field["type"])) {
$dateFormat = "changeYear: true, dateFormat: 'yy-mm-dd'"; //! yy-mm-dd regional $dateFormat = "changeYear: true, dateFormat: 'yy-mm-dd'"; //! yy-mm-dd regional
$timeFormat = "showSecond: true, timeFormat: 'hh:mm:ss'"; $timeFormat = "showSecond: true, timeFormat: 'hh:mm:ss'";
return "<input id='fields-" . h($field["field"]) . "' value='" . h($value) . "'" . ($maxlength ? " maxlength='$maxlength'" : "") . "$attrs><script type='text/javascript'>jQuery(function () { jQuery('#fields-" . js_escape($field["field"]) . "')." return "<input id='fields-" . h($field["field"]) . "' value='" . h($value) . "'" . (+$field["length"] ? " maxlength='" . (+$field["length"]) . "'" : "") . "$attrs><script type='text/javascript'>jQuery(function () { jQuery('#fields-" . js_escape($field["field"]) . "')."
. ($field["type"] == "time" ? "timepicker({ $timeFormat })" . ($field["type"] == "time" ? "timepicker({ $timeFormat })"
: (ereg("time", $field["type"]) ? "datetimepicker({ $dateFormat, $timeFormat })" : (ereg("time", $field["type"]) ? "datetimepicker({ $dateFormat, $timeFormat })"
: "datepicker({ $dateFormat })" : "datepicker({ $dateFormat })"

30
plugins/edit-foreign.php Normal file
View File

@@ -0,0 +1,30 @@
<?php
/** Select foreign key in edit form
* @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/
class AdminerEditForeign {
function editInput($table, $field, $attrs, $value) {
static $foreignTables = array();
static $values = array();
$foreignKeys = &$foreignTables[$table];
if (!isset($foreignKeys)) {
$foreignKeys = column_foreign_keys($table);
}
foreach ((array) $foreignKeys[$field["field"]] as $foreignKey) {
if (count($foreignKey["source"]) == 1) {
$target = $foreignKey["table"];
$id = $foreignKey["target"][0];
$options = &$values[$target][$id];
if (!$options) {
$options = array("" => "") + get_vals("SELECT " . idf_escape($id) . " FROM " . table($target) . " ORDER BY 1");
}
return "<select$attrs>" . optionlist($options, $value) . "</select>";
}
}
}
}

52
plugins/email-table.php Normal file
View File

@@ -0,0 +1,52 @@
<?php
/** Get e-mail subject and message from database (Adminer Editor)
* @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/
class AdminerEmailTable {
/** @var string @access protected */
var $table, $id, $title, $subject, $message;
/**
* @param string quoted table name
* @param string quoted column name
* @param string quoted column name
* @param string quoted column name
* @param string quoted column name
*/
function AdminerEmailTable($table = "email", $id = "id", $title = "subject", $subject = "subject", $message = "message") {
$this->table = $table;
$this->id = $id;
$this->title = $title;
$this->subject = $subject;
$this->message = $message;
}
function selectEmailPrint($emailFields, $columns) {
if ($emailFields) {
print_fieldset("email", ('E-mail'));
echo "<div onkeydown=\"eventStop(event); return bodyKeydown(event, 'email');\">\n";
echo "<p>" . ('From') . ": <input name='email_from' value='" . h($_POST ? $_POST["email_from"] : $_COOKIE["adminer_email"]) . "'>\n";
echo ('Subject') . ": <select name='email_id'><option>" . optionlist(get_key_vals("SELECT $this->id, $this->title FROM $this->table ORDER BY $this->title"), $_POST["email_id"], true) . "</select>\n";
echo "<p>" . ('Attachments') . ": <input type='file' name='email_files[]' onchange=\"this.onchange = function () { }; var el = this.cloneNode(true); el.value = ''; this.parentNode.appendChild(el);\">";
echo "<p>" . (count($emailFields) == 1 ? '<input type="hidden" name="email_field" value="' . h(key($emailFields)) . '">' : html_select("email_field", $emailFields));
echo "<input type='submit' name='email' value='" . ('Send') . "' onclick=\"return this.form['delete'].onclick();\">\n";
echo "</div>\n";
echo "</div></fieldset>\n";
return true;
}
}
function selectEmailProcess($where, $foreignKeys) {
$connection = connection();
if ($_POST["email_id"]) {
$result = $connection->query("SELECT $this->subject, $this->message FROM $this->table WHERE $this->id = " . q($_POST["email_id"]));
$row = $result->fetch_row();
$_POST["email_subject"] = $row[0];
$_POST["email_message"] = $row[1];
}
}
}

View File

@@ -6,6 +6,7 @@
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/ */
class AdminerFileUpload { class AdminerFileUpload {
/** @var string @access protected */
var $uploadPath, $displayPath; var $uploadPath, $displayPath;
/** /**

View File

@@ -6,6 +6,7 @@
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/ */
class AdminerFrames { class AdminerFrames {
/** @var bool @access protected */
var $sameOrigin; var $sameOrigin;
/** /**

View File

@@ -6,13 +6,19 @@
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/ */
class AdminerLoginServers { class AdminerLoginServers {
/** @var array @access protected */
var $servers; var $servers;
/** @var string @access protected */
var $driver;
/** Set supported servers /** Set supported servers
* @param array array($domain) or array($domain => $description) or array($category => array()) * @param array array($domain) or array($domain => $description) or array($category => array())
* @param string
*/ */
function AdminerLoginServers($servers) { function AdminerLoginServers($servers, $driver = "server") {
$this->servers = $servers; $this->servers = $servers;
$this->driver = $driver;
} }
function login($login, $password) { function login($login, $password) {
@@ -34,7 +40,7 @@ class AdminerLoginServers {
function loginForm() { function loginForm() {
?> ?>
<table cellspacing="0"> <table cellspacing="0">
<tr><th><?php echo lang('Server'); ?><td><input type="hidden" name="driver" value="server"><select name="server"><?php echo optionlist($this->servers, SERVER); ?></select> <tr><th><?php echo lang('Server'); ?><td><input type="hidden" name="driver" value="<?php echo $this->driver; ?>"><select name="server"><?php echo optionlist($this->servers, SERVER); ?></select>
<tr><th><?php echo lang('Username'); ?><td><input id="username" name="username" value="<?php echo h($_GET["username"]); ?>"> <tr><th><?php echo lang('Username'); ?><td><input id="username" name="username" value="<?php echo h($_GET["username"]); ?>">
<tr><th><?php echo lang('Password'); ?><td><input type="password" name="password"> <tr><th><?php echo lang('Password'); ?><td><input type="password" name="password">
</table> </table>

View File

@@ -15,6 +15,7 @@ CREATE TABLE login (
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/ */
class AdminerLoginTable { class AdminerLoginTable {
/** @var string @access protected */
var $database; var $database;
/** Set database of login table /** Set database of login table

View File

@@ -6,16 +6,43 @@
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/ */
class AdminerPlugin extends Adminer { class AdminerPlugin extends Adminer {
/** @var array @access protected */
var $plugins; var $plugins;
/** function _findRootClass($class) { // is_subclass_of(string, string) is available since PHP 5.0.3
* @param array do {
$return = $class;
} while ($class = get_parent_class($class));
return $return;
}
/** Register plugins
* @param array object instances or null to register all classes starting by 'Adminer'
*/ */
function AdminerPlugin($plugins) { function AdminerPlugin($plugins) {
if (!isset($plugins)) {
$plugins = array();
foreach (get_declared_classes() as $class) {
if (preg_match('~^Adminer.~i', $class) && strcasecmp($this->_findRootClass($class), 'Adminer')) { // can use interface since PHP 5
$plugins[$class] = new $class;
}
}
}
$this->plugins = $plugins; $this->plugins = $plugins;
// it is possible to use ReflectionObject in PHP 5 to find out which plugins defines which methods at once // it is possible to use ReflectionObject in PHP 5 to find out which plugins defines which methods at once
} }
function _callParent($function, $args) {
switch (count($args)) { // call_user_func_array(array('parent', $function), $args) works since PHP 5
case 0: return parent::$function();
case 1: return parent::$function($args[0]);
case 2: return parent::$function($args[0], $args[1]);
case 3: return parent::$function($args[0], $args[1], $args[2]);
case 4: return parent::$function($args[0], $args[1], $args[2], $args[3]);
default: trigger_error('Too many parameters.', E_USER_WARNING);
}
}
function _applyPlugin($function, $args) { function _applyPlugin($function, $args) {
foreach ($this->plugins as $plugin) { foreach ($this->plugins as $plugin) {
if (method_exists($plugin, $function)) { if (method_exists($plugin, $function)) {
@@ -32,11 +59,11 @@ class AdminerPlugin extends Adminer {
} }
} }
} }
return call_user_func_array(array($this, "parent::$function"), $args); return $this->_callParent($function, $args);
} }
function _appendPlugin($function, $args) { function _appendPlugin($function, $args) {
$return = call_user_func_array(array($this, "parent::$function"), $args); $return = $this->_callParent($function, $args);
foreach ($this->plugins as $plugin) { foreach ($this->plugins as $plugin) {
if (method_exists($plugin, $function)) { if (method_exists($plugin, $function)) {
$return += call_user_func_array(array($plugin, $function), $args); $return += call_user_func_array(array($plugin, $function), $args);
@@ -189,6 +216,16 @@ class AdminerPlugin extends Adminer {
return $this->_applyPlugin(__FUNCTION__, $args); return $this->_applyPlugin(__FUNCTION__, $args);
} }
function selectCommandPrint() {
$args = func_get_args();
return $this->_applyPlugin(__FUNCTION__, $args);
}
function selectImportPrint() {
$args = func_get_args();
return $this->_applyPlugin(__FUNCTION__, $args);
}
function selectEmailPrint() { function selectEmailPrint() {
$args = func_get_args(); $args = func_get_args();
return $this->_applyPlugin(__FUNCTION__, $args); return $this->_applyPlugin(__FUNCTION__, $args);

View File

@@ -6,6 +6,7 @@
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/ */
class AdminerSlugify { class AdminerSlugify {
/** @var string @access protected */
var $from, $to; var $from, $to;
/** /**
@@ -23,7 +24,7 @@ class AdminerSlugify {
if (!isset($slugify)) { if (!isset($slugify)) {
$slugify = array(); $slugify = array();
$prev = null; $prev = null;
foreach (fields($table) as $name => $field) { foreach (fields($table) as $name => $val) {
if ($prev && ereg('(^|_)slug(_|$)', $name)) { if ($prev && ereg('(^|_)slug(_|$)', $name)) {
$slugify[$prev] = $name; $slugify[$prev] = $name;
} }

33
plugins/tables-filter.php Normal file
View File

@@ -0,0 +1,33 @@
<?php
/** Use filter in tables list
* @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/
class AdminerTablesFilter {
function tablesPrint($tables) {
?>
<script type="text/javascript">
function tablesFilter(value) {
var tables = document.getElementById('tables').getElementsByTagName('span');
for (var i = tables.length; i--; ) {
var a = tables[i].children[1];
var text = a.innerText || a.textContent;
tables[i].className = (text.indexOf(value) == -1 ? 'hidden' : '');
a.innerHTML = text.replace(value, '<b>' + value + '</b>');
}
}
</script>
<p class="jsonly"><input onkeyup="tablesFilter(this.value);">
<?php
echo "<p id='tables'>\n";
foreach ($tables as $table => $type) {
echo '<span><a href="' . h(ME) . 'select=' . urlencode($table) . '"' . bold($_GET["select"] == $table) . ">" . lang('select') . "</a> ";
echo '<a href="' . h(ME) . 'table=' . urlencode($table) . '"' . bold($_GET["table"] == $table) . ">" . h($table) . "</a><br></span>\n";
}
return true;
}
}

View File

@@ -7,6 +7,7 @@
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/ */
class AdminerTinymce { class AdminerTinymce {
/** @var string @access protected */
var $path; var $path;
/** /**
@@ -16,26 +17,16 @@ class AdminerTinymce {
$this->path = $path; $this->path = $path;
} }
function selectVal(&$val, $link, $field) { function head() {
if (ereg("_html", $field["field"]) && $val != '&nbsp;') { $lang = "en";
$val = preg_replace('~<[^>]*$~', '', html_entity_decode($val, ENT_QUOTES)); //! close all opened tags (text can be shortened) if (function_exists('get_lang')) { // since Adminer 3.2.0
} $lang = get_lang();
} $lang = ($lang == "zh" ? "zh-cn" : ($lang == "zh-tw" ? "zh" : $lang));
if (!file_exists(dirname($this->path) . "/langs/$lang.js")) {
function editInput($table, $field, $attrs, $value) {
static $tiny_mce = false;
if (ereg("text", $field["type"]) && ereg("_html", $field["field"])) {
if (!$tiny_mce) {
$tiny_mce = true;
$lang = "en"; $lang = "en";
if (function_exists('get_lang')) { // since Adminer 3.2.0 }
$lang = get_lang(); }
$lang = ($lang == "zh" ? "zh-cn" : ($lang == "zh-tw" ? "zh" : $lang)); ?>
if (!file_exists(dirname($this->path) . "/langs/$lang.js")) {
$lang = "en";
}
}
?>
<script type="text/javascript" src="<?php echo h($this->path); ?>"></script> <script type="text/javascript" src="<?php echo h($this->path); ?>"></script>
<script type="text/javascript"> <script type="text/javascript">
tinyMCE.init({ tinyMCE.init({
@@ -52,8 +43,39 @@ tinyMCE.init({
}); });
</script> </script>
<?php <?php
}
function selectVal(&$val, $link, $field) {
if (ereg("_html", $field["field"]) && $val != '&nbsp;') {
$shortened = (substr($val, -10) == "<i>...</i>");
if ($shortened) {
$val = substr($val, 0, -10);
} }
return "<textarea$attrs id='fields-" . h($field["field"]) . "' rows='12' cols='50'>" . h($value) . "</textarea><script type='text/javascript'>tinyMCE.execCommand('mceAddControl', true, 'fields-" . js_escape($field["field"]) . "');</script>"; //! 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>";
}
if (class_exists('DOMDocument')) { // close all opened tags
$dom = new DOMDocument;
if (@$dom->loadHTML("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'></head>$val")) { // @ - $val can contain errors
$val = preg_replace('~.*<body[^>]*>(.*)</body>.*~is', '\\1', $dom->saveHTML());
}
}
}
}
function editInput($table, $field, $attrs, $value) {
if (ereg("text", $field["type"]) && ereg("_html", $field["field"])) {
return "<textarea$attrs id='fields-" . h($field["field"]) . "' rows='12' cols='50'>" . h($value) . "</textarea><script type='text/javascript'>
tinyMCE.remove(tinyMCE.get('fields-" . js_escape($field["field"]) . "') || { });
tinyMCE.execCommand('mceAddControl', true, 'fields-" . js_escape($field["field"]) . "');
document.getElementById('form').onsubmit = function () {
tinyMCE.each(tinyMCE.editors, function (ed) {
ed.remove();
});
};
</script>";
} }
} }

68
plugins/wymeditor.php Normal file
View File

@@ -0,0 +1,68 @@
<?php
/** Edit all fields containing "_html" by HTML editor WYMeditor and display the HTML in select
* @uses WYMeditor, http://www.wymeditor.org/
* @author Jakub Vrana, http://www.vrana.cz/
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/
class AdminerWymeditor {
/** @var array @access protected */
var $scripts;
/** @var string @access protected */
var $options;
/**
* @param array
* @param string in format "skin: 'custom', preInit: function () { }"
*/
function AdminerWymeditor($scripts = array("jquery/jquery.js", "wymeditor/jquery.wymeditor.min.js"), $options = "") {
$this->scripts = $scripts;
$this->options = $options;
}
function head() {
foreach ($this->scripts as $script) {
echo "<script type='text/javascript' src='" . h($script) . "'></script>\n";
}
}
function selectVal(&$val, $link, $field) {
// copied from tinymce.php
if (ereg("_html", $field["field"]) && $val != '&nbsp;') {
$shortened = (substr($val, -10) == "<i>...</i>");
if ($shortened) {
$val = substr($val, 0, -10);
}
//! 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>";
}
if (class_exists('DOMDocument')) { // close all opened tags
$dom = new DOMDocument;
if (@$dom->loadHTML("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'></head>$val")) { // @ - $val can contain errors
$val = preg_replace('~.*<body[^>]*>(.*)</body>.*~is', '\\1', $dom->saveHTML());
}
}
}
}
function editInput($table, $field, $attrs, $value) {
static $lang = "";
if (!$lang && ereg("text", $field["type"]) && ereg("_html", $field["field"])) {
$lang = "en";
if (function_exists('get_lang')) { // since Adminer 3.2.0
$lang = get_lang();
$lang = ($lang == "zh" || $lang == "zh-tw" ? "zh_cn" : $lang);
}
return "<textarea$attrs id='fields-" . h($field["field"]) . "' rows='12' cols='50'>" . h($value) . "</textarea><script type='text/javascript'>
jQuery(function () {
jQuery('textarea[name*=\"_html\"]').wymeditor({ updateSelector: '#form [type=\"submit\"]', lang: '$lang'" . ($this->options ? ", $this->options" : "") . " });
});
</script>";
}
}
}

View File

@@ -1,6 +1,6 @@
Transactions in export Transactions in export
Create view and routine options Create view and routine options
Variables editation, especially timezone, or set by PHP date("0") Variables editation
Highlight SQL textarea - may use external CodeMirror Highlight SQL textarea - may use external CodeMirror
Blob download and image display in edit form (important for Editor with hidden fields in select and SQL command) Blob download and image display in edit form (important for Editor with hidden fields in select and SQL command)
Add title to Logout, edit (in select) and select (in menu) for style "hever" Add title to Logout, edit (in select) and select (in menu) for style "hever"
@@ -9,18 +9,20 @@ Export by GET parameters
Only first part of big BZ2 export is readable, files are missing in TAR Only first part of big BZ2 export is readable, files are missing in TAR
Double click in select - Esc to abort editation Double click in select - Esc to abort editation
Draggable columns in alter table (thanks to Michal Manak) Draggable columns in alter table (thanks to Michal Manak)
<option class> for system databases and schemas - information_schema and driver-specific (thanks to Vaclav Novotny)
Define indexes and foreign keys name - http://forum.zdrojak.root.cz/index.php?topic=185.msg1255#msg1255
Skinnable plus.gif and other images - http://typo3.org/extensions/repository/view/t3adminer/current/
Selectable <option>(on update)<option>CURRENT_TIMESTAMP for timestamp - https://sourceforge.net/projects/adminer/forums/forum/960418/topic/4568650
? Filter by value in row under <thead> in select ? Filter by value in row under <thead> in select
? Column and table names auto-completition in SQL textarea - http://blog.quplo.com/2010/06/css-code-completion-in-your-browser/ ? Column and table names auto-completition in SQL textarea - http://blog.quplo.com/2010/06/css-code-completion-in-your-browser/
? Aliasing of built-in functions can save 7 KB, function minification can save 7 KB, substitution of repetitive $a["a"] can save 4 KB, substitution of $_GET and friends can save 2 KB, aliasing of $connection->query can save 24 B, JS Closure compiler can save 2 KB, not enclosing HTML attribute values can save 1.2 KB, replacing \\n by \n can save .3 KB ? Aliasing of built-in functions can save 7 KB, function minification can save 7 KB, substitution of repetitive $a["a"] can save 4 KB, substitution of $_GET and friends can save 2 KB, aliasing of $connection->query can save 24 B, JS Closure compiler can save 2 KB, not enclosing HTML attribute values can save 1.2 KB, replacing \\n by \n can save .3 KB
? Branch binary_compile: LZW compression of translations can save 30 KB, LZW compression of all texts can save 11 KB, remove of base64_decode() + using chars 127-255 in minification can save 1 KB ? Branch binary_compile: LZW compression of translations can save 30 KB, LZW compression of all texts can save 11 KB, remove of base64_decode() + using chars 127-255 in minification can save 1 KB
Editor: Editor:
Checkbox for boolean searches Three-state checkbox for boolean searches
JavaScript data validation - columns containing word email, url, ... JavaScript data validation - columns containing word email, url, ...
Joining tables - PRIMARY KEY (table, joining) Joining tables - PRIMARY KEY (table, joining)
Rank, Tree structure Rank, Tree structure
Add whisperer to fields with foreign key to big table
JS calendar for date fields
MySQL: MySQL:
Data longer than max_allowed_packet can be sent by mysqli_stmt_send_long_data() Data longer than max_allowed_packet can be sent by mysqli_stmt_send_long_data()
@@ -33,12 +35,12 @@ Delimiter in export and SQL command
Backward keys in Editor Backward keys in Editor
PostgreSQL: PostgreSQL:
Array data types
Display number of schemas in databases overview Display number of schemas in databases overview
Users - SELECT * FROM pg_user Users - SELECT * FROM pg_user
ORDER BY COUNT(*) ORDER BY COUNT(*)
Export - http://www.postgresql.org/docs/8.4/static/functions-info.html Export - http://www.postgresql.org/docs/8.4/static/functions-info.html
Column rights - http://www.postgresql.org/docs/8.4/static/functions-info.html Column rights - http://www.postgresql.org/docs/8.4/static/functions-info.html
bool in Editor
MS SQL: MS SQL:
Display default value Display default value