mirror of
https://github.com/vrana/adminer.git
synced 2025-08-31 10:01:50 +02:00
Compare commits
172 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
b51d4ab105 | ||
|
fabfb8a0bc | ||
|
5a4d1b3704 | ||
|
982974fe27 | ||
|
3ed0ce926c | ||
|
65fae98558 | ||
|
af30f59737 | ||
|
2f996ba014 | ||
|
b7e0f1d81c | ||
|
20915b1764 | ||
|
516416e72b | ||
|
c38655418b | ||
|
046da00eb6 | ||
|
22f0a5ded8 | ||
|
6a41240c42 | ||
|
a09916737e | ||
|
e99463b295 | ||
|
b7021c9c7f | ||
|
94a0cc8de8 | ||
|
9c78b3bb34 | ||
|
0e6003e833 | ||
|
601cdd43c1 | ||
|
17a8495c2e | ||
|
40c61f6cfc | ||
|
63c400f95d | ||
|
34adf46293 | ||
|
1ecdde0500 | ||
|
7f05141b89 | ||
|
d513de4d71 | ||
|
18d51c6b6e | ||
|
5eda7e547f | ||
|
f7e671448c | ||
|
d97ae22fb4 | ||
|
49c1484722 | ||
|
7541ceb1ca | ||
|
2afd915f00 | ||
|
5a0be7e7fe | ||
|
de2c3968d4 | ||
|
e24d1fcb02 | ||
|
3cae3e2f7f | ||
|
fd5e6ef343 | ||
|
8ae8507972 | ||
|
b0b4cb1576 | ||
|
ada8917e43 | ||
|
e287642e26 | ||
|
4858f332c8 | ||
|
91dbaca3c4 | ||
|
741cd5b4b6 | ||
|
0f47ae8e0f | ||
|
01a2722c94 | ||
|
3bc5c17d03 | ||
|
a199998f54 | ||
|
c4040f03d9 | ||
|
db7d05b3ec | ||
|
3d07d8bbd8 | ||
|
bcd1e059f5 | ||
|
0eadfc2b3f | ||
|
c270a06fb1 | ||
|
2b58ebe327 | ||
|
a72347f3c7 | ||
|
6f58f5af44 | ||
|
6bdfec0a1a | ||
|
93f581175f | ||
|
971c51783f | ||
|
ba5e7a1b53 | ||
|
46a7e7eea0 | ||
|
7af362554a | ||
|
a8947b62b8 | ||
|
37adf537c9 | ||
|
e8e95e5fd7 | ||
|
285afc202a | ||
|
8cce005b70 | ||
|
433357f824 | ||
|
d97300dd5a | ||
|
99221f3265 | ||
|
fee31e73c1 | ||
|
2c626c7fc7 | ||
|
3093f58157 | ||
|
1a1b800b40 | ||
|
e4d5835dab | ||
|
aba9d23ba2 | ||
|
190812456f | ||
|
58a8df7c86 | ||
|
cb57afd0e5 | ||
|
b14a2a5330 | ||
|
0cd85c1ce9 | ||
|
c69d9fcfdf | ||
|
5739e03e97 | ||
|
79b61855e5 | ||
|
7769cab32c | ||
|
f3920f381d | ||
|
f697486884 | ||
|
5d68a29b3e | ||
|
e531d6ef41 | ||
|
a38ea926f2 | ||
|
5b36472a45 | ||
|
e139f94561 | ||
|
50528be5cb | ||
|
2323f433c4 | ||
|
f43ef7b083 | ||
|
e1545065f0 | ||
|
9a4b30a646 | ||
|
2b2d6987ef | ||
|
356cadf2b2 | ||
|
8caa889635 | ||
|
dd9167a101 | ||
|
34633a4e60 | ||
|
3d2b869f2e | ||
|
737c2bdc0e | ||
|
1e310977b6 | ||
|
79fd0238b5 | ||
|
f86cb5f837 | ||
|
de0d3aca84 | ||
|
51b7104342 | ||
|
15e83e9396 | ||
|
0448bd118c | ||
|
632cc7c014 | ||
|
7a62838510 | ||
|
da2a0190a4 | ||
|
8eaad7475c | ||
|
f6e1c589f9 | ||
|
61dc40a512 | ||
|
35b6491a3c | ||
|
0cd81fddb0 | ||
|
a9262d8752 | ||
|
588cb7c0c3 | ||
|
b5ad37ff2b | ||
|
8bf02f2ce1 | ||
|
00b9e2c010 | ||
|
cdec2c9292 | ||
|
ce83605174 | ||
|
0069d9f13e | ||
|
ab20c18c2e | ||
|
0ac5a666b4 | ||
|
ed71d4a1f5 | ||
|
2703eb960a | ||
|
8c91fd5966 | ||
|
f7f553a947 | ||
|
2fb1ebc7f1 | ||
|
ef723fb348 | ||
|
ebdecd288b | ||
|
998ef45b08 | ||
|
d5d8a6c8bc | ||
|
ee8ffa575f | ||
|
d2ee9d85b1 | ||
|
a5548ce823 | ||
|
697034f329 | ||
|
cb1d7d459b | ||
|
fa4026bdbd | ||
|
0408c21d07 | ||
|
7015fd9706 | ||
|
7865695a86 | ||
|
dad8996c01 | ||
|
0614260544 | ||
|
da08af5eb9 | ||
|
75c430a986 | ||
|
7ce485bc78 | ||
|
8ec3e5fcda | ||
|
6705fb2993 | ||
|
29e65523d3 | ||
|
b684569f7c | ||
|
996bfc396b | ||
|
f3c59bb3a5 | ||
|
906345ad81 | ||
|
4024f34d79 | ||
|
2264e09021 | ||
|
9a30f14797 | ||
|
189895ad0f | ||
|
86b0fbf529 | ||
|
a89ab34a8e | ||
|
534f4ee5cc | ||
|
55c757a59a |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
/adminer/adminer.css
|
||||
/adminer*.php
|
||||
/editor*.php
|
||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -16,6 +16,3 @@
|
||||
[submodule "JsShrink"]
|
||||
path = externals/JsShrink
|
||||
url = git://github.com/vrana/JsShrink.git
|
||||
[submodule "CodeMirror2"]
|
||||
path = externals/CodeMirror2
|
||||
url = git://github.com/marijnh/CodeMirror2.git
|
||||
|
@@ -28,8 +28,10 @@ if (!$error && $_POST) {
|
||||
}
|
||||
$call[] = (isset($out[$key]) ? "@" . idf_escape($field["field"]) : $val);
|
||||
}
|
||||
|
||||
$query = (isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . idf_escape($PROCEDURE) . "(" . implode(", ", $call) . ")";
|
||||
echo "<p><code class='jush-$jush'>" . h($query) . "</code> <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a>\n";
|
||||
|
||||
if (!$connection->multi_query($query)) {
|
||||
echo "<p class='error'>" . error() . "\n";
|
||||
} else {
|
||||
@@ -37,6 +39,7 @@ if (!$error && $_POST) {
|
||||
if (is_object($connection2)) {
|
||||
$connection2->select_db(DB);
|
||||
}
|
||||
|
||||
do {
|
||||
$result = $connection->store_result();
|
||||
if (is_object($result)) {
|
||||
@@ -45,6 +48,7 @@ if (!$error && $_POST) {
|
||||
echo "<p class='message'>" . lang('Routine has been called, %d row(s) affected.', $connection->affected_rows) . "\n";
|
||||
}
|
||||
} while ($connection->next_result());
|
||||
|
||||
if ($out) {
|
||||
select($connection->query("SELECT " . implode(", ", $out)));
|
||||
}
|
||||
|
@@ -14,11 +14,14 @@ if ($TABLE != "") {
|
||||
$orig_fields = fields($TABLE);
|
||||
$orig_status = table_status($TABLE);
|
||||
}
|
||||
if ($_POST && !$_POST["fields"]) {
|
||||
$_POST["fields"] = array();
|
||||
|
||||
$row = $_POST;
|
||||
$row["fields"] = (array) $row["fields"];
|
||||
if ($row["auto_increment_col"]) {
|
||||
$row["fields"][$row["auto_increment_col"]]["auto_increment"] = true;
|
||||
}
|
||||
|
||||
if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"] && !$_POST["down"]) {
|
||||
if ($_POST && !process_fields($row["fields"]) && !$error) {
|
||||
if ($_POST["drop"]) {
|
||||
query_redirect("DROP TABLE " . table($TABLE), substr(ME, 0, -1), lang('Table has been dropped.'));
|
||||
} else {
|
||||
@@ -26,22 +29,18 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"]
|
||||
$all_fields = array();
|
||||
$use_all_fields = false;
|
||||
$foreign = array();
|
||||
ksort($_POST["fields"]);
|
||||
ksort($row["fields"]);
|
||||
$orig_field = reset($orig_fields);
|
||||
$after = " FIRST";
|
||||
foreach ($_POST["fields"] as $key => $field) {
|
||||
|
||||
foreach ($row["fields"] as $key => $field) {
|
||||
$foreign_key = $foreign_keys[$field["type"]];
|
||||
$type_field = ($foreign_key !== null ? $referencable_primary[$foreign_key] : $field); //! can collide with user defined type
|
||||
if ($field["field"] != "") {
|
||||
if (!$field["has_default"]) {
|
||||
$field["default"] = null;
|
||||
}
|
||||
$default = eregi_replace(" *on update CURRENT_TIMESTAMP", "", $field["default"]);
|
||||
if ($default != $field["default"]) { // preg_replace $count is available since PHP 5.1.0
|
||||
$field["on_update"] = "CURRENT_TIMESTAMP";
|
||||
$field["default"] = $default;
|
||||
}
|
||||
if ($key == $_POST["auto_increment_col"]) {
|
||||
if ($key == $row["auto_increment_col"]) {
|
||||
$field["auto_increment"] = true;
|
||||
}
|
||||
$process_field = process_field($field, $type_field);
|
||||
@@ -67,37 +66,40 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$partitioning = "";
|
||||
if (in_array($_POST["partition_by"], $partition_by)) {
|
||||
if (in_array($row["partition_by"], $partition_by)) {
|
||||
$partitions = array();
|
||||
if ($_POST["partition_by"] == 'RANGE' || $_POST["partition_by"] == 'LIST') {
|
||||
foreach (array_filter($_POST["partition_names"]) as $key => $val) {
|
||||
$value = $_POST["partition_values"][$key];
|
||||
$partitions[] = "\nPARTITION " . idf_escape($val) . " VALUES " . ($_POST["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection
|
||||
if ($row["partition_by"] == 'RANGE' || $row["partition_by"] == 'LIST') {
|
||||
foreach (array_filter($row["partition_names"]) as $key => $val) {
|
||||
$value = $row["partition_values"][$key];
|
||||
$partitions[] = "\n PARTITION " . idf_escape($val) . " VALUES " . ($row["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection
|
||||
}
|
||||
}
|
||||
$partitioning .= "\nPARTITION BY $_POST[partition_by]($_POST[partition])" . ($partitions // $_POST["partition"] can be expression, not only column
|
||||
$partitioning .= "\nPARTITION BY $row[partition_by]($row[partition])" . ($partitions // $row["partition"] can be expression, not only column
|
||||
? " (" . implode(",", $partitions) . "\n)"
|
||||
: ($_POST["partitions"] ? " PARTITIONS " . (+$_POST["partitions"]) : "")
|
||||
: ($row["partitions"] ? " PARTITIONS " . (+$row["partitions"]) : "")
|
||||
);
|
||||
} elseif (support("partitioning") && ereg("partitioned", $orig_status["Create_options"])) {
|
||||
$partitioning .= "\nREMOVE PARTITIONING";
|
||||
}
|
||||
|
||||
$message = lang('Table has been altered.');
|
||||
if ($TABLE == "") {
|
||||
cookie("adminer_engine", $_POST["Engine"]);
|
||||
cookie("adminer_engine", $row["Engine"]);
|
||||
$message = lang('Table has been created.');
|
||||
}
|
||||
$name = trim($_POST["name"]);
|
||||
$name = trim($row["name"]);
|
||||
|
||||
queries_redirect(ME . "table=" . urlencode($name), $message, alter_table(
|
||||
$TABLE,
|
||||
$name,
|
||||
($jush == "sqlite" && ($use_all_fields || $foreign) ? $all_fields : $fields),
|
||||
$foreign,
|
||||
$_POST["Comment"],
|
||||
($_POST["Engine"] && $_POST["Engine"] != $orig_status["Engine"] ? $_POST["Engine"] : ""),
|
||||
($_POST["Collation"] && $_POST["Collation"] != $orig_status["Collation"] ? $_POST["Collation"] : ""),
|
||||
($_POST["Auto_increment"] != "" ? +$_POST["Auto_increment"] : ""),
|
||||
$row["Comment"],
|
||||
($row["Engine"] && $row["Engine"] != $orig_status["Engine"] ? $row["Engine"] : ""),
|
||||
($row["Collation"] && $row["Collation"] != $orig_status["Collation"] ? $row["Collation"] : ""),
|
||||
($row["Auto_increment"] != "" ? +$row["Auto_increment"] : ""),
|
||||
$partitioning
|
||||
));
|
||||
}
|
||||
@@ -105,51 +107,38 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"]
|
||||
|
||||
page_header(($TABLE != "" ? lang('Alter table') : lang('Create table')), $error, array("table" => $TABLE), $TABLE);
|
||||
|
||||
$row = array(
|
||||
"Engine" => $_COOKIE["adminer_engine"],
|
||||
"fields" => array(array("field" => "", "type" => (isset($types["int"]) ? "int" : (isset($types["integer"]) ? "integer" : "")))),
|
||||
"partition_names" => array(""),
|
||||
);
|
||||
if ($_POST) {
|
||||
$row = $_POST;
|
||||
if ($row["auto_increment_col"]) {
|
||||
$row["fields"][$row["auto_increment_col"]]["auto_increment"] = true;
|
||||
}
|
||||
process_fields($row["fields"]);
|
||||
} elseif ($TABLE != "") {
|
||||
$row = $orig_status;
|
||||
$row["name"] = $TABLE;
|
||||
$row["fields"] = array();
|
||||
if (!$_GET["auto_increment"]) { // don't prefill by original Auto_increment for the sake of performance and not reusing deleted ids
|
||||
$row["Auto_increment"] = "";
|
||||
}
|
||||
foreach ($orig_fields as $field) {
|
||||
$field["has_default"] = isset($field["default"]);
|
||||
if ($field["on_update"]) {
|
||||
$field["default"] .= " ON UPDATE $field[on_update]"; // CURRENT_TIMESTAMP
|
||||
if (!$_POST) {
|
||||
$row = array(
|
||||
"Engine" => $_COOKIE["adminer_engine"],
|
||||
"fields" => array(array("field" => "", "type" => (isset($types["int"]) ? "int" : (isset($types["integer"]) ? "integer" : "")))),
|
||||
"partition_names" => array(""),
|
||||
);
|
||||
|
||||
if ($TABLE != "") {
|
||||
$row = $orig_status;
|
||||
$row["name"] = $TABLE;
|
||||
$row["fields"] = array();
|
||||
if (!$_GET["auto_increment"]) { // don't prefill by original Auto_increment for the sake of performance and not reusing deleted ids
|
||||
$row["Auto_increment"] = "";
|
||||
}
|
||||
$row["fields"][] = $field;
|
||||
}
|
||||
if (support("partitioning")) {
|
||||
$from = "FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = " . q(DB) . " AND TABLE_NAME = " . q($TABLE);
|
||||
$result = $connection->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $from ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");
|
||||
list($row["partition_by"], $row["partitions"], $row["partition"]) = $result->fetch_row();
|
||||
$row["partition_names"] = array();
|
||||
$row["partition_values"] = array();
|
||||
foreach (get_rows("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $from AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION") as $row1) {
|
||||
$row["partition_names"][] = $row1["PARTITION_NAME"];
|
||||
$row["partition_values"][] = $row1["PARTITION_DESCRIPTION"];
|
||||
foreach ($orig_fields as $field) {
|
||||
$field["has_default"] = isset($field["default"]);
|
||||
$row["fields"][] = $field;
|
||||
}
|
||||
|
||||
if (support("partitioning")) {
|
||||
$from = "FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = " . q(DB) . " AND TABLE_NAME = " . q($TABLE);
|
||||
$result = $connection->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $from ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");
|
||||
list($row["partition_by"], $row["partitions"], $row["partition"]) = $result->fetch_row();
|
||||
$partitions = get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $from AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");
|
||||
$partitions[""] = "";
|
||||
$row["partition_names"] = array_keys($partitions);
|
||||
$row["partition_values"] = array_values($partitions);
|
||||
}
|
||||
$row["partition_names"][] = "";
|
||||
}
|
||||
}
|
||||
|
||||
$collations = collations();
|
||||
|
||||
$suhosin = floor(extension_loaded("suhosin") ? (min(ini_get("suhosin.request.max_vars"), ini_get("suhosin.post.max_vars")) - 13) / 10 : 0); // 10 - number of fields per row, 13 - number of other fields
|
||||
if ($suhosin && count($row["fields"]) > $suhosin) {
|
||||
echo "<p class='error'>" . h(lang('Maximum number of allowed fields exceeded. Please increase %s and %s.', 'suhosin.post.max_vars', 'suhosin.request.max_vars')) . "\n";
|
||||
}
|
||||
|
||||
$engines = engines();
|
||||
// case of engine may differ
|
||||
foreach ($engines as $engine) {
|
||||
@@ -162,8 +151,8 @@ foreach ($engines as $engine) {
|
||||
|
||||
<form action="" method="post" id="form">
|
||||
<p>
|
||||
<?php echo lang('Table name'); ?>: <input name="name" maxlength="64" value="<?php echo h($row["name"]); ?>">
|
||||
<?php if ($TABLE == "" && !$_POST) { ?><script type='text/javascript'>document.getElementById('form')['name'].focus();</script><?php } ?>
|
||||
<?php echo lang('Table name'); ?>: <input name="name" maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
|
||||
<?php if ($TABLE == "" && !$_POST) { ?><script type='text/javascript'>focus(document.getElementById('form')['name']);</script><?php } ?>
|
||||
<?php echo ($engines ? html_select("Engine", array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) : ""); ?>
|
||||
<?php echo ($collations && !ereg("sqlite|mssql", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
@@ -178,17 +167,17 @@ if (!$_POST && !$comments) {
|
||||
}
|
||||
}
|
||||
}
|
||||
edit_fields($row["fields"], $collations, "TABLE", $suhosin, $foreign_keys, $comments);
|
||||
edit_fields($row["fields"], $collations, "TABLE", $foreign_keys, $comments);
|
||||
?>
|
||||
</table>
|
||||
<p>
|
||||
<?php echo lang('Auto Increment'); ?>: <input name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
|
||||
<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", 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"') . '>' : ''); ?>
|
||||
<?php echo lang('Auto Increment'); ?>: <input type="number" name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
|
||||
<label class="jsonly"><input type="checkbox" id="defaults" name="defaults" value="1" checked onclick="columnShow(this.checked, 5);"><?php echo lang('Default values'); ?></label>
|
||||
<?php if (!$_POST["defaults"]) { ?><script type="text/javascript">editingHideDefaults()</script><?php } ?>
|
||||
<?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 name="Comment" id="Comment" value="' . h($row["Comment"]) . '" maxlength="' . ($connection->server_info >= 5.5 ? 2048 : 60) . '"' . ($comments ? '' : ' class="hidden"') . '>' : ''); ?>
|
||||
<p>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?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; ?>">
|
||||
<?php
|
||||
if (support("partitioning")) {
|
||||
$partition_table = ereg('RANGE|LIST', $row["partition_by"]);
|
||||
@@ -197,13 +186,13 @@ if (support("partitioning")) {
|
||||
<p>
|
||||
<?php echo html_select("partition_by", array(-1 => "") + $partition_by, $row["partition_by"], "partitionByChange(this);"); ?>
|
||||
(<input name="partition" value="<?php echo h($row["partition"]); ?>">)
|
||||
<?php echo lang('Partitions'); ?>: <input name="partitions" size="2" value="<?php echo h($row["partitions"]); ?>"<?php echo ($partition_table || !$row["partition_by"] ? " class='hidden'" : ""); ?>>
|
||||
<?php echo lang('Partitions'); ?>: <input type="number" name="partitions" class="size" value="<?php echo h($row["partitions"]); ?>"<?php echo ($partition_table || !$row["partition_by"] ? " class='hidden'" : ""); ?>>
|
||||
<table cellspacing="0" id="partition-table"<?php echo ($partition_table ? "" : " class='hidden'"); ?>>
|
||||
<thead><tr><th><?php echo lang('Partition name'); ?><th><?php echo lang('Values'); ?></thead>
|
||||
<?php
|
||||
foreach ($row["partition_names"] as $key => $val) {
|
||||
echo '<tr>';
|
||||
echo '<td><input name="partition_names[]" value="' . h($val) . '"' . ($key == count($row["partition_names"]) - 1 ? ' onchange="partitionNameChange(this);"' : '') . '>';
|
||||
echo '<td><input name="partition_names[]" value="' . h($val) . '"' . ($key == count($row["partition_names"]) - 1 ? ' onchange="partitionNameChange(this);"' : '') . ' autocapitalize="off">';
|
||||
echo '<td><input name="partition_values[]" value="' . h($row["partition_values"][$key]) . '">';
|
||||
}
|
||||
?>
|
||||
@@ -212,4 +201,5 @@ foreach ($row["partition_names"] as $key => $val) {
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
|
@@ -1,7 +1,9 @@
|
||||
<?php
|
||||
$row = $_POST;
|
||||
|
||||
if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP changes add.x to add_x
|
||||
restart_session();
|
||||
$name = trim($_POST["name"]);
|
||||
$name = trim($row["name"]);
|
||||
if ($_POST["drop"]) {
|
||||
$_GET["db"] = ""; // to save in global history
|
||||
queries_redirect(remove_from_uri("db|database"), lang('Database has been dropped.'), drop_databases(array(DB)));
|
||||
@@ -9,14 +11,14 @@ if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP c
|
||||
// create or rename database
|
||||
if (DB != "") {
|
||||
$_GET["db"] = $name;
|
||||
queries_redirect(preg_replace('~db=[^&]*&~', '', ME) . "db=" . urlencode($name), lang('Database has been renamed.'), rename_database($name, $_POST["collation"]));
|
||||
queries_redirect(preg_replace('~db=[^&]*&~', '', ME) . "db=" . urlencode($name), lang('Database has been renamed.'), rename_database($name, $row["collation"]));
|
||||
} else {
|
||||
$databases = explode("\n", str_replace("\r", "", $name));
|
||||
$success = true;
|
||||
$last = "";
|
||||
foreach ($databases as $db) {
|
||||
if (count($databases) == 1 || $db != "") { // ignore empty lines but always try to create single database
|
||||
if (!create_database($db, $_POST["collation"])) {
|
||||
if (!create_database($db, $row["collation"])) {
|
||||
$success = false;
|
||||
}
|
||||
$last = $db;
|
||||
@@ -26,10 +28,10 @@ if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP c
|
||||
}
|
||||
} else {
|
||||
// alter database
|
||||
if (!$_POST["collation"]) {
|
||||
if (!$row["collation"]) {
|
||||
redirect(substr(ME, 0, -1));
|
||||
}
|
||||
query_redirect("ALTER DATABASE " . idf_escape($name) . (eregi('^[a-z0-9_]+$', $_POST["collation"]) ? " COLLATE $_POST[collation]" : ""), substr(ME, 0, -1), lang('Database has been altered.'));
|
||||
query_redirect("ALTER DATABASE " . idf_escape($name) . (eregi('^[a-z0-9_]+$', $row["collation"]) ? " COLLATE $row[collation]" : ""), substr(ME, 0, -1), lang('Database has been altered.'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,12 +39,10 @@ page_header(DB != "" ? lang('Alter database') : lang('Create database'), $error,
|
||||
|
||||
$collations = collations();
|
||||
$name = DB;
|
||||
$collate = null;
|
||||
if ($_POST) {
|
||||
$name = $_POST["name"];
|
||||
$collate = $_POST["collation"];
|
||||
$name = $row["name"];
|
||||
} elseif (DB != "") {
|
||||
$collate = db_collation(DB, $collations);
|
||||
$row["collation"] = db_collation(DB, $collations);
|
||||
} elseif ($jush == "sql") {
|
||||
// propose database name with limited privileges
|
||||
foreach (get_vals("SHOW GRANTS") as $grant) {
|
||||
@@ -59,10 +59,10 @@ if ($_POST) {
|
||||
<?php
|
||||
echo ($_POST["add_x"] || strpos($name, "\n")
|
||||
? '<textarea id="name" name="name" rows="10" cols="40">' . h($name) . '</textarea><br>'
|
||||
: '<input id="name" name="name" value="' . h($name) . '" maxlength="64">'
|
||||
) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $collate) : "");
|
||||
: '<input name="name" id="name" value="' . h($name) . '" maxlength="64" autocapitalize="off">'
|
||||
) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $row["collation"]) : "");
|
||||
?>
|
||||
<script type='text/javascript'>document.getElementById('name').focus();</script>
|
||||
<script type='text/javascript'>focus(document.getElementById('name'));</script>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php
|
||||
if (DB != "") {
|
||||
|
@@ -7,6 +7,7 @@ if ($tables_views && !$error && !$_POST["search"]) {
|
||||
if ($jush == "sql" && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"] || $_POST["copy"])) {
|
||||
queries("SET foreign_key_checks = 0"); // allows to truncate or drop several tables at once
|
||||
}
|
||||
|
||||
if ($_POST["truncate"]) {
|
||||
if ($_POST["tables"]) {
|
||||
$result = truncate_tables($_POST["tables"]);
|
||||
@@ -32,11 +33,14 @@ if ($tables_views && !$error && !$_POST["search"]) {
|
||||
: apply_queries("VACUUM" . ($_POST["optimize"] ? "" : " ANALYZE"), $_POST["tables"])
|
||||
);
|
||||
$message = lang('Tables have been optimized.');
|
||||
} elseif ($_POST["tables"] && ($result = queries(($_POST["optimize"] ? "OPTIMIZE" : ($_POST["check"] ? "CHECK" : ($_POST["repair"] ? "REPAIR" : "ANALYZE"))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"]))))) {
|
||||
} elseif (!$_POST["tables"]) {
|
||||
$message = lang('No tables.');
|
||||
} elseif ($result = queries(($_POST["optimize"] ? "OPTIMIZE" : ($_POST["check"] ? "CHECK" : ($_POST["repair"] ? "REPAIR" : "ANALYZE"))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"])))) {
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
$message .= "<b>" . h($row["Table"]) . "</b>: " . h($row["Msg_text"]) . "<br>";
|
||||
}
|
||||
}
|
||||
|
||||
queries_redirect(substr(ME, 0, -1), $message, $result);
|
||||
}
|
||||
|
||||
@@ -44,17 +48,18 @@ page_header(($_GET["ns"] == "" ? lang('Database') . ": " . h(DB) : lang('Schema'
|
||||
|
||||
if ($adminer->homepage()) {
|
||||
if ($_GET["ns"] !== "") {
|
||||
echo "<h3>" . lang('Tables and views') . "</h3>\n";
|
||||
echo "<h3 id='tables-views'>" . lang('Tables and views') . "</h3>\n";
|
||||
$tables_list = tables_list();
|
||||
if (!$tables_list) {
|
||||
echo "<p class='message'>" . lang('No tables.') . "\n";
|
||||
} else {
|
||||
echo "<form action='' method='post'>\n";
|
||||
echo "<p>" . lang('Search data in tables') . ": <input name='query' value='" . h($_POST["query"]) . "'> <input type='submit' name='search' value='" . lang('Search') . "'>\n";
|
||||
echo "<p>" . lang('Search data in tables') . ": <input type='search' name='query' value='" . h($_POST["query"]) . "'> <input type='submit' name='search' value='" . lang('Search') . "'>\n";
|
||||
if ($_POST["search"] && $_POST["query"] != "") {
|
||||
search_tables();
|
||||
}
|
||||
echo "<table cellspacing='0' class='nowrap checkable' onclick='tableClick(event);'>\n";
|
||||
echo "<table cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
|
||||
|
||||
echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);">';
|
||||
echo '<th>' . lang('Table');
|
||||
echo '<td>' . lang('Engine');
|
||||
@@ -66,6 +71,7 @@ if ($adminer->homepage()) {
|
||||
echo '<td>' . lang('Rows');
|
||||
echo (support("comment") ? '<td>' . lang('Comment') : '');
|
||||
echo "</thead>\n";
|
||||
|
||||
foreach ($tables_list as $name => $type) {
|
||||
$view = ($type !== null && !eregi("table", $type));
|
||||
echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');");
|
||||
@@ -88,12 +94,14 @@ if ($adminer->homepage()) {
|
||||
}
|
||||
echo (support("comment") ? "<td id='Comment-" . h($name) . "'> " : "");
|
||||
}
|
||||
|
||||
echo "<tr><td> <th>" . lang('%d in total', count($tables_list));
|
||||
echo "<td>" . nbsp($jush == "sql" ? $connection->result("SELECT @@storage_engine") : "");
|
||||
echo "<td>" . nbsp(db_collation(DB, collations()));
|
||||
foreach (array("Data_length", "Index_length", "Data_free") as $key) {
|
||||
echo "<td align='right' id='sum-$key'> ";
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
echo "<script type='text/javascript'>tableCheck();</script>\n";
|
||||
if (!information_schema(DB)) {
|
||||
@@ -105,7 +113,7 @@ if ($adminer->homepage()) {
|
||||
if (count($databases) != 1 && $jush != "sqlite") {
|
||||
$db = (isset($_POST["target"]) ? $_POST["target"] : (support("scheme") ? $_GET["ns"] : DB));
|
||||
echo "<p>" . lang('Move to other database') . ": ";
|
||||
echo ($databases ? html_select("target", $databases, $db) : '<input name="target" value="' . h($db) . '">');
|
||||
echo ($databases ? html_select("target", $databases, $db) : '<input name="target" value="' . h($db) . '" autocapitalize="off">');
|
||||
echo " <input type='submit' name='move' value='" . lang('Move') . "'>";
|
||||
echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'>" : "");
|
||||
echo "\n";
|
||||
@@ -121,7 +129,7 @@ if ($adminer->homepage()) {
|
||||
}
|
||||
|
||||
if (support("routine")) {
|
||||
echo "<h3>" . lang('Routines') . "</h3>\n";
|
||||
echo "<h3 id='routines'>" . lang('Routines') . "</h3>\n";
|
||||
$routines = routines();
|
||||
if ($routines) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
@@ -140,7 +148,7 @@ if ($adminer->homepage()) {
|
||||
}
|
||||
|
||||
if (support("sequence")) {
|
||||
echo "<h3>" . lang('Sequences') . "</h3>\n";
|
||||
echo "<h3 id='sequences'>" . lang('Sequences') . "</h3>\n";
|
||||
$sequences = get_vals("SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = current_schema()");
|
||||
if ($sequences) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
@@ -155,13 +163,13 @@ if ($adminer->homepage()) {
|
||||
}
|
||||
|
||||
if (support("type")) {
|
||||
echo "<h3>" . lang('User types') . "</h3>\n";
|
||||
$types = types();
|
||||
if ($types) {
|
||||
echo "<h3 id='user-types'>" . lang('User types') . "</h3>\n";
|
||||
$user_types = types();
|
||||
if ($user_types) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
|
||||
odd('');
|
||||
foreach ($types as $val) {
|
||||
foreach ($user_types as $val) {
|
||||
echo "<tr" . odd() . "><th><a href='" . h(ME) . "type=" . urlencode($val) . "'>" . h($val) . "</a>\n";
|
||||
}
|
||||
echo "</table>\n";
|
||||
@@ -170,16 +178,17 @@ if ($adminer->homepage()) {
|
||||
}
|
||||
|
||||
if (support("event")) {
|
||||
echo "<h3>" . lang('Events') . "</h3>\n";
|
||||
echo "<h3 id='events'>" . lang('Events') . "</h3>\n";
|
||||
$rows = get_rows("SHOW EVENTS");
|
||||
if ($rows) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<thead><tr><th>" . lang('Name') . "<td>" . lang('Schedule') . "<td>" . lang('Start') . "<td>" . lang('End') . "</thead>\n";
|
||||
echo "<thead><tr><th>" . lang('Name') . "<td>" . lang('Schedule') . "<td>" . lang('Start') . "<td>" . lang('End') . "<td></thead>\n";
|
||||
foreach ($rows as $row) {
|
||||
echo "<tr>";
|
||||
echo '<th><a href="' . h(ME) . 'event=' . urlencode($row["Name"]) . '">' . h($row["Name"]) . "</a>";
|
||||
echo "<th>" . h($row["Name"]);
|
||||
echo "<td>" . ($row["Execute at"] ? lang('At given time') . "<td>" . $row["Execute at"] : lang('Every') . " " . $row["Interval value"] . " " . $row["Interval field"] . "<td>$row[Starts]");
|
||||
echo "<td>$row[Ends]";
|
||||
echo '<td><a href="' . h(ME) . 'event=' . urlencode($row["Name"]) . '">' . lang('Alter') . '</a>';
|
||||
}
|
||||
echo "</table>\n";
|
||||
$event_scheduler = $connection->result("SELECT @@event_scheduler");
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$TABLE = $_GET["download"];
|
||||
$fields = fields($TABLE);
|
||||
header("Content-Type: application/octet-stream");
|
||||
header("Content-Disposition: attachment; filename=" . friendly_url("$TABLE-" . implode("_", $_GET["where"])) . "." . friendly_url($_GET["field"]));
|
||||
echo $connection->result("SELECT" . limit(idf_escape($_GET["field"]) . " FROM " . table($TABLE), " WHERE " . where($_GET), 1));
|
||||
echo $connection->result("SELECT" . limit(idf_escape($_GET["field"]) . " FROM " . table($TABLE), " WHERE " . where($_GET, $fields), 1));
|
||||
exit; // don't output footer
|
||||
|
@@ -12,11 +12,12 @@ if (isset($_GET["mssql"])) {
|
||||
define("DRIVER", "mssql");
|
||||
if (extension_loaded("sqlsrv")) {
|
||||
class Min_DB {
|
||||
var $extension = "sqlsrv", $_link, $_result, $server_info, $affected_rows, $error;
|
||||
var $extension = "sqlsrv", $_link, $_result, $server_info, $affected_rows, $errno, $error;
|
||||
|
||||
function _get_error() {
|
||||
$this->error = "";
|
||||
foreach (sqlsrv_errors() as $error) {
|
||||
$this->errno = $error["code"];
|
||||
$this->error .= "$error[message]\n";
|
||||
}
|
||||
$this->error = rtrim($this->error);
|
||||
@@ -38,7 +39,7 @@ if (isset($_GET["mssql"])) {
|
||||
}
|
||||
|
||||
function select_db($database) {
|
||||
return $this->query("USE $database");
|
||||
return $this->query("USE " . idf_escape($database));
|
||||
}
|
||||
|
||||
function query($query, $unbuffered = false) {
|
||||
|
@@ -54,6 +54,7 @@ if (!defined("DRIVER")) {
|
||||
$extension = "MySQL", ///< @var string extension name
|
||||
$server_info, ///< @var string server version
|
||||
$affected_rows, ///< @var int number of affected rows
|
||||
$errno, ///< @var int last error code
|
||||
$error, ///< @var string last error message
|
||||
$_link, $_result ///< @access private
|
||||
;
|
||||
@@ -110,6 +111,7 @@ if (!defined("DRIVER")) {
|
||||
$result = @($unbuffered ? mysql_unbuffered_query($query, $this->_link) : mysql_query($query, $this->_link)); // @ - mute mysql.trace_mode
|
||||
$this->error = "";
|
||||
if (!$result) {
|
||||
$this->errno = mysql_errno($this->_link);
|
||||
$this->error = mysql_error($this->_link);
|
||||
return false;
|
||||
}
|
||||
@@ -296,6 +298,7 @@ if (!defined("DRIVER")) {
|
||||
|
||||
/** Formulate SQL modification query with limit 1
|
||||
* @param string everything after UPDATE or DELETE
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function limit1($query, $where) {
|
||||
@@ -363,16 +366,21 @@ if (!defined("DRIVER")) {
|
||||
|
||||
/** Get table status
|
||||
* @param string
|
||||
* @param bool return only "Name", "Engine" and "Comment" fields
|
||||
* @return array array($name => array("Name" => , "Engine" => , "Comment" => , "Oid" => , "Rows" => , "Collation" => , "Auto_increment" => , "Data_length" => , "Index_length" => , "Data_free" => )) or only inner array with $name
|
||||
*/
|
||||
function table_status($name = "") {
|
||||
function table_status($name = "", $fast = false) {
|
||||
global $connection;
|
||||
$return = array();
|
||||
foreach (get_rows("SHOW TABLE STATUS" . ($name != "" ? " LIKE " . q(addcslashes($name, "%_")) : "")) as $row) {
|
||||
foreach (get_rows($fast && $connection->server_info >= 5
|
||||
? "SELECT TABLE_NAME AS Name, Engine, TABLE_COMMENT AS Comment FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()" . ($name != "" ? " AND TABLE_NAME = " . q($name) : "")
|
||||
: "SHOW TABLE STATUS" . ($name != "" ? " LIKE " . q(addcslashes($name, "%_\\")) : "")
|
||||
) as $row) {
|
||||
if ($row["Engine"] == "InnoDB") {
|
||||
// ignore internal comment, unnecessary since MySQL 5.1.21
|
||||
$row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]);
|
||||
}
|
||||
if (!isset($row["Rows"])) {
|
||||
if (!isset($row["Engine"])) {
|
||||
$row["Comment"] = "";
|
||||
}
|
||||
if ($name != "") {
|
||||
@@ -388,7 +396,7 @@ if (!defined("DRIVER")) {
|
||||
* @return bool
|
||||
*/
|
||||
function is_view($table_status) {
|
||||
return !isset($table_status["Rows"]);
|
||||
return !isset($table_status["Engine"]);
|
||||
}
|
||||
|
||||
/** Check if table supports foreign keys
|
||||
@@ -413,7 +421,7 @@ if (!defined("DRIVER")) {
|
||||
"type" => $match[1],
|
||||
"length" => $match[2],
|
||||
"unsigned" => ltrim($match[3] . $match[4]),
|
||||
"default" => ($row["Default"] != "" || ereg("char", $match[1]) ? $row["Default"] : null),
|
||||
"default" => ($row["Default"] != "" || ereg("char|set", $match[1]) ? $row["Default"] : null),
|
||||
"null" => ($row["Null"] == "YES"),
|
||||
"auto_increment" => ($row["Extra"] == "auto_increment"),
|
||||
"on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23
|
||||
@@ -534,6 +542,7 @@ if (!defined("DRIVER")) {
|
||||
|
||||
/** Create database
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function create_database($db, $collation) {
|
||||
@@ -546,13 +555,14 @@ if (!defined("DRIVER")) {
|
||||
* @return bool
|
||||
*/
|
||||
function drop_databases($databases) {
|
||||
restart_session();
|
||||
set_session("dbs", null);
|
||||
return apply_queries("DROP DATABASE", $databases, 'idf_escape');
|
||||
}
|
||||
|
||||
/** Rename database from DB
|
||||
* @param string new name
|
||||
* @return string
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function rename_database($name, $collation) {
|
||||
@@ -728,7 +738,7 @@ if (!defined("DRIVER")) {
|
||||
*/
|
||||
function triggers($table) {
|
||||
$return = array();
|
||||
foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_"))) as $row) {
|
||||
foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_\\"))) as $row) {
|
||||
$return[$row["Trigger"]] = array($row["Timing"], $row["Event"]);
|
||||
}
|
||||
return $return;
|
||||
@@ -766,6 +776,7 @@ if (!defined("DRIVER")) {
|
||||
"type" => strtolower($param[5]),
|
||||
"length" => preg_replace_callback("~$enum_length~s", 'normalize_enum', $param[6]),
|
||||
"unsigned" => strtolower(preg_replace('~\\s+~', ' ', trim("$param[8] $param[7]"))),
|
||||
"null" => 1,
|
||||
"full_type" => $param[4],
|
||||
"inout" => strtoupper($param[1]),
|
||||
"collation" => strtolower($param[9]),
|
||||
@@ -786,7 +797,7 @@ if (!defined("DRIVER")) {
|
||||
* @return array ("ROUTINE_TYPE" => , "ROUTINE_NAME" => , "DTD_IDENTIFIER" => )
|
||||
*/
|
||||
function routines() {
|
||||
return get_rows("SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = " . q(DB));
|
||||
return get_rows("SELECT ROUTINE_NAME, ROUTINE_TYPE, DTD_IDENTIFIER FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = " . q(DB));
|
||||
}
|
||||
|
||||
/** Get list of available routine languages
|
||||
@@ -840,7 +851,7 @@ if (!defined("DRIVER")) {
|
||||
* @return Min_Result
|
||||
*/
|
||||
function explain($connection, $query) {
|
||||
return $connection->query("EXPLAIN $query");
|
||||
return $connection->query("EXPLAIN " . ($connection->server_info >= 5.1 ? "PARTITIONS " : "") . $query);
|
||||
}
|
||||
|
||||
/** Get approximate number of rows
|
||||
@@ -918,7 +929,7 @@ if (!defined("DRIVER")) {
|
||||
*/
|
||||
function trigger_sql($table, $style) {
|
||||
$return = "";
|
||||
foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_")), null, "-- ") as $row) {
|
||||
foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_\\")), null, "-- ") as $row) {
|
||||
$return .= "\n" . ($style == 'CREATE+ALTER' ? "DROP TRIGGER IF EXISTS " . idf_escape($row["Trigger"]) . ";;\n" : "")
|
||||
. "CREATE TRIGGER " . idf_escape($row["Trigger"]) . " $row[Timing] $row[Event] ON " . table($row["Table"]) . " FOR EACH ROW\n$row[Statement];;\n";
|
||||
}
|
||||
@@ -954,6 +965,9 @@ if (!defined("DRIVER")) {
|
||||
if (ereg("binary", $field["type"])) {
|
||||
return "HEX(" . idf_escape($field["field"]) . ")";
|
||||
}
|
||||
if ($field["type"] == "bit") {
|
||||
return "BIN(" . idf_escape($field["field"]) . " + 0)"; // + 0 is required outside MySQLnd
|
||||
}
|
||||
if (ereg("geometry|point|linestring|polygon", $field["type"])) {
|
||||
return "AsWKT(" . idf_escape($field["field"]) . ")";
|
||||
}
|
||||
@@ -966,7 +980,10 @@ if (!defined("DRIVER")) {
|
||||
*/
|
||||
function unconvert_field($field, $return) {
|
||||
if (ereg("binary", $field["type"])) {
|
||||
$return = "unhex($return)";
|
||||
$return = "UNHEX($return)";
|
||||
}
|
||||
if ($field["type"] == "bit") {
|
||||
return "CONV($return, 2, 10) + 0";
|
||||
}
|
||||
if (ereg("geometry|point|linestring|polygon", $field["type"])) {
|
||||
$return = "GeomFromText($return)";
|
||||
@@ -998,7 +1015,7 @@ if (!defined("DRIVER")) {
|
||||
$structured_types[$key] = array_keys($val);
|
||||
}
|
||||
$unsigned = array("unsigned", "zerofill", "unsigned zerofill"); ///< @var array number variants
|
||||
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", ""); ///< @var array operators used in select
|
||||
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL"); ///< @var array operators used in select
|
||||
$functions = array("char_length", "date", "from_unixtime", "lower", "round", "sec_to_time", "time_to_sec", "upper"); ///< @var array functions used in select
|
||||
$grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"); ///< @var array grouping functions used in select
|
||||
$edit_functions = array( ///< @var array of array("$type|$type2" => "$function/$function2") functions used in editing, [0] - edit and insert, [1] - edit only
|
||||
|
@@ -6,7 +6,7 @@ if (isset($_GET["oracle"])) {
|
||||
define("DRIVER", "oracle");
|
||||
if (extension_loaded("oci8")) {
|
||||
class Min_DB {
|
||||
var $extension = "oci8", $_link, $_result, $server_info, $affected_rows, $error;
|
||||
var $extension = "oci8", $_link, $_result, $server_info, $affected_rows, $errno, $error;
|
||||
|
||||
function _error($errno, $error) {
|
||||
if (ini_bool("html_errors")) {
|
||||
@@ -40,6 +40,7 @@ if (isset($_GET["oracle"])) {
|
||||
$this->error = "";
|
||||
if (!$result) {
|
||||
$error = oci_error($this->_link);
|
||||
$this->errno = $error["code"];
|
||||
$this->error = $error["message"];
|
||||
return false;
|
||||
}
|
||||
@@ -385,7 +386,7 @@ ORDER BY PROCESS
|
||||
$structured_types[$key] = array_keys($val);
|
||||
}
|
||||
$unsigned = array();
|
||||
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "");
|
||||
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL");
|
||||
$functions = array("length", "lower", "round", "upper");
|
||||
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||
$edit_functions = array(
|
||||
|
@@ -227,7 +227,7 @@ AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema(
|
||||
|
||||
function fields($table) {
|
||||
$return = array();
|
||||
foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, d.adsrc AS default, a.attnotnull, col_description(c.oid, a.attnum) AS comment
|
||||
foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, d.adsrc AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment
|
||||
FROM pg_class c
|
||||
JOIN pg_namespace n ON c.relnamespace = n.oid
|
||||
JOIN pg_attribute a ON c.oid = a.attrelid
|
||||
@@ -242,7 +242,7 @@ ORDER BY a.attnum"
|
||||
ereg('(.*)(\\((.*)\\))?', $row["full_type"], $match);
|
||||
list(, $row["type"], , $row["length"]) = $match;
|
||||
$row["full_type"] = $row["type"] . ($row["length"] ? "($row[length])" : "");
|
||||
$row["null"] = ($row["attnotnull"] == "f");
|
||||
$row["null"] = !$row["attnotnull"];
|
||||
$row["auto_increment"] = eregi("^nextval\\(", $row["default"]);
|
||||
$row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
|
||||
if (preg_match('~^(.*)::.+$~', $row["default"], $match)) {
|
||||
@@ -261,8 +261,8 @@ ORDER BY a.attnum"
|
||||
$return = array();
|
||||
$table_oid = $connection2->result("SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) AND relname = " . q($table));
|
||||
$columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = $table_oid AND attnum > 0", $connection2);
|
||||
foreach (get_rows("SELECT relname, indisunique, indisprimary, indkey FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid", $connection2) as $row) {
|
||||
$return[$row["relname"]]["type"] = ($row["indisprimary"] == "t" ? "PRIMARY" : ($row["indisunique"] == "t" ? "UNIQUE" : "INDEX"));
|
||||
foreach (get_rows("SELECT relname, indisunique::int, indisprimary::int, indkey FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid", $connection2) as $row) {
|
||||
$return[$row["relname"]]["type"] = ($row["indisprimary"] ? "PRIMARY" : ($row["indisunique"] ? "UNIQUE" : "INDEX"));
|
||||
$return[$row["relname"]]["columns"] = array();
|
||||
foreach (explode(" ", $row["indkey"]) as $indkey) {
|
||||
$return[$row["relname"]]["columns"][] = $columns[$indkey];
|
||||
@@ -574,7 +574,8 @@ AND typelem = 0"
|
||||
}
|
||||
|
||||
function process_list() {
|
||||
return get_rows("SELECT * FROM pg_stat_activity ORDER BY procpid");
|
||||
global $connection;
|
||||
return get_rows("SELECT * FROM pg_stat_activity ORDER BY " . ($connection->server_info < 9.2 ? "procpid" : "pid"));
|
||||
}
|
||||
|
||||
function show_status() {
|
||||
@@ -596,7 +597,7 @@ AND typelem = 0"
|
||||
$structured_types = array();
|
||||
foreach (array( //! arrays
|
||||
lang('Numbers') => array("smallint" => 5, "integer" => 10, "bigint" => 19, "boolean" => 1, "numeric" => 0, "real" => 7, "double precision" => 16, "money" => 20),
|
||||
lang('Date and time') => array("date" => 13, "time" => 17, "timestamp" => 20, "interval" => 0),
|
||||
lang('Date and time') => array("date" => 13, "time" => 17, "timestamp" => 20, "timestamptz" => 21, "interval" => 0),
|
||||
lang('Strings') => array("character" => 0, "character varying" => 0, "text" => 0, "tsquery" => 0, "tsvector" => 0, "uuid" => 0, "xml" => 0),
|
||||
lang('Binary') => array("bit" => 0, "bit varying" => 0, "bytea" => 0),
|
||||
lang('Network') => array("cidr" => 43, "inet" => 43, "macaddr" => 17, "txid_snapshot" => 0),
|
||||
@@ -606,7 +607,7 @@ AND typelem = 0"
|
||||
$structured_types[$key] = array_keys($val);
|
||||
}
|
||||
$unsigned = array();
|
||||
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "" to avoid SQL injection
|
||||
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "SQL" to avoid SQL injection
|
||||
$functions = array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper");
|
||||
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||
$edit_functions = array(
|
||||
|
@@ -5,11 +5,11 @@ $drivers["sqlite2"] = "SQLite 2";
|
||||
if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
$possible_drivers = array((isset($_GET["sqlite"]) ? "SQLite3" : "SQLite"), "PDO_SQLite");
|
||||
define("DRIVER", (isset($_GET["sqlite"]) ? "sqlite" : "sqlite2"));
|
||||
if (extension_loaded(isset($_GET["sqlite"]) ? "sqlite3" : "sqlite")) {
|
||||
if (class_exists(isset($_GET["sqlite"]) ? "SQLite3" : "SQLiteDatabase")) {
|
||||
if (isset($_GET["sqlite"])) {
|
||||
|
||||
class Min_SQLite {
|
||||
var $extension = "SQLite3", $server_info, $affected_rows, $error, $_link;
|
||||
var $extension = "SQLite3", $server_info, $affected_rows, $errno, $error, $_link;
|
||||
|
||||
function Min_SQLite($filename) {
|
||||
$this->_link = new SQLite3($filename);
|
||||
@@ -21,6 +21,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
$result = @$this->_link->query($query);
|
||||
$this->error = "";
|
||||
if (!$result) {
|
||||
$this->errno = $this->_link->lastErrorCode();
|
||||
$this->error = $this->_link->lastErrorMsg();
|
||||
return false;
|
||||
} elseif ($result->numColumns()) {
|
||||
@@ -504,11 +505,19 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
function index_sql($table, $type, $name, $columns) {
|
||||
return "CREATE $type " . ($type != "INDEX" ? "INDEX " : "")
|
||||
. idf_escape($name != "" ? $name : uniqid($table . "_"))
|
||||
. " ON " . table($table)
|
||||
. " $columns"
|
||||
;
|
||||
}
|
||||
|
||||
function alter_indexes($table, $alter) {
|
||||
foreach ($alter as $val) {
|
||||
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]"
|
||||
: index_sql($table, $val[0], $val[1], $val[2])
|
||||
)) {
|
||||
return false;
|
||||
}
|
||||
@@ -611,7 +620,14 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
|
||||
function create_sql($table, $auto_increment) {
|
||||
global $connection;
|
||||
return $connection->result("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table));
|
||||
$return = $connection->result("SELECT sql FROM sqlite_master WHERE type IN ('table', 'view') AND name = " . q($table));
|
||||
foreach (indexes($table) as $name => $index) {
|
||||
if ($name == '') {
|
||||
continue;
|
||||
}
|
||||
$return .= ";\n\n" . index_sql($table, $index['type'], $name, "(" . implode(", ", array_map('idf_escape', $index['columns'])) . ")");
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
function truncate_sql($table) {
|
||||
@@ -658,7 +674,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||
$types = array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0);
|
||||
$structured_types = array_keys($types);
|
||||
$unsigned = array();
|
||||
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", ""); // REGEXP can be user defined function
|
||||
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"); // REGEXP can be user defined function
|
||||
$functions = array("hex", "length", "lower", "round", "unixepoch", "upper");
|
||||
$grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum");
|
||||
$edit_functions = array(
|
||||
|
@@ -1,20 +1,24 @@
|
||||
<?php
|
||||
$TABLE = $_GET["dump"];
|
||||
|
||||
if ($_POST) {
|
||||
if ($_POST && !$error) {
|
||||
$cookie = "";
|
||||
foreach (array("output", "format", "db_style", "routines", "events", "table_style", "auto_increment", "triggers", "data_style") as $key) {
|
||||
$cookie .= "&$key=" . urlencode($_POST[$key]);
|
||||
}
|
||||
cookie("adminer_export", substr($cookie, 1));
|
||||
$ext = dump_headers(($TABLE != "" ? $TABLE : DB), (DB == "" || count((array) $_POST["tables"] + (array) $_POST["data"]) > 1));
|
||||
$is_sql = ($_POST["format"] == "sql");
|
||||
$tables = array_flip((array) $_POST["tables"]) + array_flip((array) $_POST["data"]);
|
||||
$ext = dump_headers(
|
||||
(count($tables) == 1 ? key($tables) : DB),
|
||||
(DB == "" || count($tables) > 1));
|
||||
$is_sql = ereg('sql', $_POST["format"]);
|
||||
|
||||
if ($is_sql) {
|
||||
echo "-- Adminer $VERSION " . $drivers[DRIVER] . " dump
|
||||
|
||||
" . ($jush != "sql" ? "" : "SET NAMES utf8;
|
||||
" . ($_POST["data_style"] ? "SET foreign_key_checks = 0;
|
||||
SET time_zone = " . q($connection->result("SELECT @@time_zone")) . ";
|
||||
SET time_zone = " . q(substr(preg_replace('~^[^-]~', '+\0', $connection->result("SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)")), 0, 6)) . ";
|
||||
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
|
||||
" : "") . "
|
||||
");
|
||||
@@ -28,22 +32,22 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
|
||||
$databases = explode("\n", rtrim(str_replace("\r", "", $databases), "\n"));
|
||||
}
|
||||
}
|
||||
|
||||
foreach ((array) $databases as $db) {
|
||||
$adminer->dumpDatabase($db);
|
||||
if ($connection->select_db($db)) {
|
||||
if ($is_sql && ereg('CREATE', $style) && ($create = $connection->result("SHOW CREATE DATABASE " . idf_escape($db), 1))) {
|
||||
if ($style == "DROP+CREATE") {
|
||||
echo "DROP DATABASE IF EXISTS " . idf_escape($db) . ";\n";
|
||||
}
|
||||
echo ($style == "CREATE+ALTER" ? preg_replace('~^CREATE DATABASE ~', '\\0IF NOT EXISTS ', $create) : $create) . ";\n";
|
||||
echo "$create;\n";
|
||||
}
|
||||
if ($is_sql) {
|
||||
if ($style) {
|
||||
echo use_sql($db) . ";\n\n";
|
||||
}
|
||||
if (in_array("CREATE+ALTER", array($style, $_POST["table_style"]))) {
|
||||
echo "SET @adminer_alter = '';\n\n";
|
||||
}
|
||||
$out = "";
|
||||
|
||||
if ($_POST["routines"]) {
|
||||
foreach (array("FUNCTION", "PROCEDURE") as $routine) {
|
||||
foreach (get_rows("SHOW $routine STATUS WHERE Db = " . q($db), null, "-- ") as $row) {
|
||||
@@ -52,12 +56,14 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($_POST["events"]) {
|
||||
foreach (get_rows("SHOW EVENTS", null, "-- ") as $row) {
|
||||
$out .= ($style != 'DROP+CREATE' ? "DROP EVENT IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "")
|
||||
. remove_definer($connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3)) . ";;\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
if ($out) {
|
||||
echo "DELIMITER ;;\n\n$out" . "DELIMITER ;\n\n";
|
||||
}
|
||||
@@ -65,87 +71,53 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
|
||||
|
||||
if ($_POST["table_style"] || $_POST["data_style"]) {
|
||||
$views = array();
|
||||
foreach (table_status() as $table_status) {
|
||||
$table = (DB == "" || in_array($table_status["Name"], (array) $_POST["tables"]));
|
||||
$data = (DB == "" || in_array($table_status["Name"], (array) $_POST["data"]));
|
||||
foreach (table_status('', true) as $name => $table_status) {
|
||||
$table = (DB == "" || in_array($name, (array) $_POST["tables"]));
|
||||
$data = (DB == "" || in_array($name, (array) $_POST["data"]));
|
||||
if ($table || $data) {
|
||||
if (!is_view($table_status)) {
|
||||
if ($ext == "tar") {
|
||||
ob_start();
|
||||
}
|
||||
$adminer->dumpTable($table_status["Name"], ($table ? $_POST["table_style"] : ""));
|
||||
if ($data) {
|
||||
$adminer->dumpData($table_status["Name"], $_POST["data_style"], "SELECT * FROM " . table($table_status["Name"]));
|
||||
}
|
||||
if ($is_sql && $_POST["triggers"] && $table && ($triggers = trigger_sql($table_status["Name"], $_POST["table_style"]))) {
|
||||
echo "\nDELIMITER ;;\n$triggers\nDELIMITER ;\n";
|
||||
}
|
||||
if ($ext == "tar") {
|
||||
echo tar_file((DB != "" ? "" : "$db/") . "$table_status[Name].csv", ob_get_clean());
|
||||
} elseif ($is_sql) {
|
||||
echo "\n";
|
||||
}
|
||||
if ($ext == "tar") {
|
||||
$tmp_file = new TmpFile;
|
||||
ob_start(array($tmp_file, 'write'), 1e5);
|
||||
}
|
||||
|
||||
$adminer->dumpTable($name, ($table ? $_POST["table_style"] : ""), (is_view($table_status) ? 2 : 0));
|
||||
if (is_view($table_status)) {
|
||||
$views[] = $name;
|
||||
} elseif ($data) {
|
||||
$fields = fields($name);
|
||||
$adminer->dumpData($name, $_POST["data_style"], "SELECT *" . convert_fields($fields, $fields) . " FROM " . table($name));
|
||||
}
|
||||
if ($is_sql && $_POST["triggers"] && $table && ($triggers = trigger_sql($name, $_POST["table_style"]))) {
|
||||
echo "\nDELIMITER ;;\n$triggers\nDELIMITER ;\n";
|
||||
}
|
||||
|
||||
if ($ext == "tar") {
|
||||
ob_end_flush();
|
||||
tar_file((DB != "" ? "" : "$db/") . "$name.csv", $tmp_file);
|
||||
} elseif ($is_sql) {
|
||||
$views[] = $table_status["Name"];
|
||||
echo "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($views as $view) {
|
||||
$adminer->dumpTable($view, $_POST["table_style"], true);
|
||||
$adminer->dumpTable($view, $_POST["table_style"], 1);
|
||||
}
|
||||
|
||||
if ($ext == "tar") {
|
||||
echo pack("x512");
|
||||
}
|
||||
}
|
||||
|
||||
if ($style == "CREATE+ALTER" && $is_sql) {
|
||||
// drop old tables
|
||||
$query = "SELECT TABLE_NAME, ENGINE, TABLE_COLLATION, TABLE_COMMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()";
|
||||
echo "DELIMITER ;;
|
||||
CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN
|
||||
DECLARE _table_name, _engine, _table_collation varchar(64);
|
||||
DECLARE _table_comment varchar(64);
|
||||
DECLARE done bool DEFAULT 0;
|
||||
DECLARE tables CURSOR FOR $query;
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
|
||||
OPEN tables;
|
||||
REPEAT
|
||||
FETCH tables INTO _table_name, _engine, _table_collation, _table_comment;
|
||||
IF NOT done THEN
|
||||
CASE _table_name";
|
||||
foreach (get_rows($query) as $row) {
|
||||
$comment = q($row["ENGINE"] == "InnoDB" ? preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["TABLE_COMMENT"]) : $row["TABLE_COMMENT"]);
|
||||
echo "
|
||||
WHEN " . q($row["TABLE_NAME"]) . " THEN
|
||||
" . (isset($row["ENGINE"]) ? "IF _engine != '$row[ENGINE]' OR _table_collation != '$row[TABLE_COLLATION]' OR _table_comment != $comment THEN
|
||||
ALTER TABLE " . idf_escape($row["TABLE_NAME"]) . " ENGINE=$row[ENGINE] COLLATE=$row[TABLE_COLLATION] COMMENT=$comment;
|
||||
END IF" : "BEGIN END") . ";";
|
||||
}
|
||||
echo "
|
||||
ELSE
|
||||
SET alter_command = CONCAT(alter_command, 'DROP TABLE `', REPLACE(_table_name, '`', '``'), '`;\\n');
|
||||
END CASE;
|
||||
END IF;
|
||||
UNTIL done END REPEAT;
|
||||
CLOSE tables;
|
||||
END;;
|
||||
DELIMITER ;
|
||||
CALL adminer_alter(@adminer_alter);
|
||||
DROP PROCEDURE adminer_alter;
|
||||
";
|
||||
}
|
||||
if (in_array("CREATE+ALTER", array($style, $_POST["table_style"])) && $is_sql) {
|
||||
echo "SELECT @adminer_alter;\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($is_sql) {
|
||||
echo "-- " . $connection->result("SELECT NOW()") . "\n";
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
page_header(lang('Export'), "", ($_GET["export"] != "" ? array("table" => $_GET["export"]) : array()), DB);
|
||||
page_header(lang('Export'), $error, ($_GET["export"] != "" ? array("table" => $_GET["export"]) : array()), DB);
|
||||
?>
|
||||
|
||||
<form action="" method="post">
|
||||
@@ -154,9 +126,7 @@ page_header(lang('Export'), "", ($_GET["export"] != "" ? array("table" => $_GET[
|
||||
$db_style = array('', 'USE', 'DROP+CREATE', 'CREATE');
|
||||
$table_style = array('', 'DROP+CREATE', 'CREATE');
|
||||
$data_style = array('', 'TRUNCATE+INSERT', 'INSERT');
|
||||
if ($jush == "sql") {
|
||||
$db_style[] = 'CREATE+ALTER';
|
||||
$table_style[] = 'CREATE+ALTER';
|
||||
if ($jush == "sql") { //! use insert_update() in all drivers
|
||||
$data_style[] = 'INSERT+UPDATE';
|
||||
}
|
||||
parse_str($_COOKIE["adminer_export"], $row);
|
||||
@@ -167,20 +137,26 @@ if (!isset($row["events"])) { // backwards compatibility
|
||||
$row["routines"] = $row["events"] = ($_GET["dump"] == "");
|
||||
$row["triggers"] = $row["table_style"];
|
||||
}
|
||||
|
||||
echo "<tr><th>" . lang('Output') . "<td>" . html_select("output", $adminer->dumpOutput(), $row["output"], 0) . "\n"; // 0 - radio
|
||||
|
||||
echo "<tr><th>" . lang('Format') . "<td>" . html_select("format", $adminer->dumpFormat(), $row["format"], 0) . "\n"; // 0 - radio
|
||||
|
||||
echo ($jush == "sqlite" ? "" : "<tr><th>" . lang('Database') . "<td>" . html_select('db_style', $db_style, $row["db_style"])
|
||||
. (support("routine") ? checkbox("routines", 1, $row["routines"], lang('Routines')) : "")
|
||||
. (support("event") ? checkbox("events", 1, $row["events"], lang('Events')) : "")
|
||||
);
|
||||
|
||||
echo "<tr><th>" . lang('Tables') . "<td>" . html_select('table_style', $table_style, $row["table_style"])
|
||||
. checkbox("auto_increment", 1, $row["auto_increment"], lang('Auto Increment'))
|
||||
. (support("trigger") ? checkbox("triggers", 1, $row["triggers"], lang('Triggers')) : "")
|
||||
;
|
||||
|
||||
echo "<tr><th>" . lang('Data') . "<td>" . html_select('data_style', $data_style, $row["data_style"]);
|
||||
?>
|
||||
</table>
|
||||
<p><input type="submit" value="<?php echo lang('Export'); ?>">
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
|
||||
<table cellspacing="0">
|
||||
<?php
|
||||
@@ -191,21 +167,26 @@ if (DB != "") {
|
||||
echo "<th style='text-align: left;'><label><input type='checkbox' id='check-tables'$checked onclick='formCheck(this, /^tables\\[/);'>" . lang('Tables') . "</label>";
|
||||
echo "<th style='text-align: right;'><label>" . lang('Data') . "<input type='checkbox' id='check-data'$checked onclick='formCheck(this, /^data\\[/);'></label>";
|
||||
echo "</thead>\n";
|
||||
|
||||
$views = "";
|
||||
//! defer number of rows to JavaScript
|
||||
foreach (table_status() as $table_status) {
|
||||
$name = $table_status["Name"];
|
||||
$tables_list = tables_list();
|
||||
foreach ($tables_list as $name => $type) {
|
||||
$prefix = ereg_replace("_.*", "", $name);
|
||||
$checked = ($TABLE == "" || $TABLE == (substr($TABLE, -1) == "%" ? "$prefix%" : $name)); //! % may be part of table name
|
||||
$print = "<tr><td>" . checkbox("tables[]", $name, $checked, $name, "checkboxClick(event, this); formUncheck('check-tables');");
|
||||
if (is_view($table_status)) {
|
||||
if ($type !== null && !eregi("table", $type)) {
|
||||
$views .= "$print\n";
|
||||
} else {
|
||||
echo "$print<td align='right'><label>" . ($table_status["Engine"] == "InnoDB" && $table_status["Rows"] ? "~ " : "") . $table_status["Rows"] . checkbox("data[]", $name, $checked, "", "checkboxClick(event, this); formUncheck('check-data');") . "</label>\n";
|
||||
echo "$print<td align='right'><label><span id='Rows-" . h($name) . "'></span>" . checkbox("data[]", $name, $checked, "", "checkboxClick(event, this); formUncheck('check-data');") . "</label>\n";
|
||||
}
|
||||
$prefixes[$prefix]++;
|
||||
}
|
||||
echo $views;
|
||||
|
||||
if ($tables_list) {
|
||||
echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=db');</script>\n";
|
||||
}
|
||||
|
||||
} else {
|
||||
echo "<thead><tr><th style='text-align: left;'><label><input type='checkbox' id='check-databases'" . ($TABLE == "" ? " checked" : "") . " onclick='formCheck(this, /^databases\\[/);'>" . lang('Database') . "</label></thead>\n";
|
||||
$databases = $adminer->databases();
|
||||
|
@@ -1,13 +1,14 @@
|
||||
<?php
|
||||
$TABLE = $_GET["edit"];
|
||||
$where = (isset($_GET["select"]) ? (count($_POST["check"]) == 1 ? where_check($_POST["check"][0]) : "") : where($_GET));
|
||||
$update = (isset($_GET["select"]) ? $_POST["edit"] : $where);
|
||||
$fields = fields($TABLE);
|
||||
$where = (isset($_GET["select"]) ? (count($_POST["check"]) == 1 ? where_check($_POST["check"][0], $fields) : "") : where($_GET, $fields));
|
||||
$update = (isset($_GET["select"]) ? $_POST["edit"] : $where);
|
||||
foreach ($fields as $name => $field) {
|
||||
if (!isset($field["privileges"][$update ? "update" : "insert"]) || $adminer->fieldName($field) == "") {
|
||||
unset($fields[$name]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($_POST && !$error && !isset($_GET["select"])) {
|
||||
$location = $_POST["referer"];
|
||||
if ($_POST["insert"]) { // continue edit or insert
|
||||
@@ -15,8 +16,18 @@ if ($_POST && !$error && !isset($_GET["select"])) {
|
||||
} elseif (!ereg('^.+&select=.+$', $location)) {
|
||||
$location = ME . "select=" . urlencode($TABLE);
|
||||
}
|
||||
|
||||
$indexes = indexes($TABLE);
|
||||
$unique_array = unique_array($_GET["where"], $indexes);
|
||||
$query_where = "\nWHERE $where";
|
||||
|
||||
if (isset($_POST["delete"])) {
|
||||
query_redirect("DELETE" . limit1("FROM " . table($TABLE), " WHERE $where"), $location, lang('Item has been deleted.'));
|
||||
$query = "FROM " . table($TABLE);
|
||||
query_redirect(
|
||||
"DELETE" . ($unique_array ? " $query$query_where" : limit1($query, $query_where)),
|
||||
$location,
|
||||
lang('Item has been deleted.')
|
||||
);
|
||||
} else {
|
||||
$set = array();
|
||||
foreach ($fields as $name => $field) {
|
||||
@@ -25,11 +36,17 @@ if ($_POST && !$error && !isset($_GET["select"])) {
|
||||
$set[idf_escape($name)] = ($update ? "\n" . idf_escape($name) . " = $val" : $val);
|
||||
}
|
||||
}
|
||||
|
||||
if ($update) {
|
||||
if (!$set) {
|
||||
redirect($location);
|
||||
}
|
||||
query_redirect("UPDATE" . limit1(table($TABLE) . " SET" . implode(",", $set), "\nWHERE $where"), $location, lang('Item has been updated.'));
|
||||
$query = table($TABLE) . " SET" . implode(",", $set);
|
||||
query_redirect(
|
||||
"UPDATE" . ($unique_array ? " $query$query_where" : limit1($query, $query_where)),
|
||||
$location,
|
||||
lang('Item has been updated.')
|
||||
);
|
||||
} else {
|
||||
$result = insert_into($TABLE, $set);
|
||||
$last_id = ($result ? last_id() : 0);
|
||||
@@ -38,7 +55,7 @@ if ($_POST && !$error && !isset($_GET["select"])) {
|
||||
}
|
||||
}
|
||||
|
||||
$table_name = $adminer->tableName(table_status($TABLE));
|
||||
$table_name = $adminer->tableName(table_status($TABLE, true));
|
||||
page_header(
|
||||
($update ? lang('Edit') : lang('Insert')),
|
||||
$error,
|
||||
@@ -77,26 +94,36 @@ if ($row === false) {
|
||||
|
||||
<form action="" method="post" enctype="multipart/form-data" id="form">
|
||||
<?php
|
||||
if ($fields) {
|
||||
if (!$fields) {
|
||||
echo "<p class='error'>" . lang('You have no privileges to update this table.') . "\n";
|
||||
} else {
|
||||
echo "<table cellspacing='0' onkeydown='return editingKeydown(event);'>\n";
|
||||
|
||||
foreach ($fields as $name => $field) {
|
||||
echo "<tr><th>" . $adminer->fieldName($field);
|
||||
$default = $_GET["set"][bracket_escape($name)];
|
||||
if ($default === null) {
|
||||
$default = $field["default"];
|
||||
if ($field["type"] == "bit" && ereg("^b'([01]*)'\$", $default, $regs)) {
|
||||
$default = $regs[1];
|
||||
}
|
||||
}
|
||||
$value = ($row !== null
|
||||
? ($row[$name] != "" && $jush == "sql" && 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 : ($default !== null ? $default : $field["default"])))
|
||||
: (!$update && $field["auto_increment"] ? "" : (isset($_GET["select"]) ? false : $default))
|
||||
);
|
||||
if (!$_POST["save"] && is_string($value)) {
|
||||
$value = $adminer->editVal($value, $field);
|
||||
}
|
||||
$function = ($_POST["save"] ? (string) $_POST["function"][$name] : ($update && $field["on_update"] == "CURRENT_TIMESTAMP" ? "now" : ($value === false ? null : ($value !== null ? '' : 'NULL'))));
|
||||
if ($field["type"] == "timestamp" && $value == "CURRENT_TIMESTAMP") {
|
||||
if (ereg("time", $field["type"]) && $value == "CURRENT_TIMESTAMP") {
|
||||
$value = "";
|
||||
$function = "now";
|
||||
}
|
||||
input($field, $value, $function);
|
||||
echo "\n";
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
}
|
||||
?>
|
||||
@@ -109,7 +136,7 @@ if ($fields) {
|
||||
}
|
||||
}
|
||||
echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "' onclick=\"return confirm('" . lang('Are you sure?') . "');\">\n"
|
||||
: ($_POST || !$fields ? "" : "<script type='text/javascript'>document.getElementById('form').getElementsByTagName('td')[1].firstChild.focus();</script>\n")
|
||||
: ($_POST || !$fields ? "" : "<script type='text/javascript'>focus(document.getElementById('form').getElementsByTagName('td')[1].firstChild);</script>\n")
|
||||
);
|
||||
if (isset($_GET["select"])) {
|
||||
hidden_fields(array("check" => (array) $_POST["check"], "clone" => $_POST["clone"], "all" => $_POST["all"]));
|
||||
|
@@ -2,31 +2,32 @@
|
||||
$EVENT = $_GET["event"];
|
||||
$intervals = array("YEAR", "QUARTER", "MONTH", "DAY", "HOUR", "MINUTE", "WEEK", "SECOND", "YEAR_MONTH", "DAY_HOUR", "DAY_MINUTE", "DAY_SECOND", "HOUR_MINUTE", "HOUR_SECOND", "MINUTE_SECOND");
|
||||
$statuses = array("ENABLED" => "ENABLE", "DISABLED" => "DISABLE", "SLAVESIDE_DISABLED" => "DISABLE ON SLAVE");
|
||||
$row = $_POST;
|
||||
|
||||
if ($_POST && !$error) {
|
||||
if ($_POST["drop"]) {
|
||||
query_redirect("DROP EVENT " . idf_escape($EVENT), substr(ME, 0, -1), lang('Event has been dropped.'));
|
||||
} elseif (in_array($_POST["INTERVAL_FIELD"], $intervals) && isset($statuses[$_POST["STATUS"]])) {
|
||||
$schedule = "\nON SCHEDULE " . ($_POST["INTERVAL_VALUE"]
|
||||
? "EVERY " . q($_POST["INTERVAL_VALUE"]) . " $_POST[INTERVAL_FIELD]"
|
||||
. ($_POST["STARTS"] ? " STARTS " . q($_POST["STARTS"]) : "")
|
||||
. ($_POST["ENDS"] ? " ENDS " . q($_POST["ENDS"]) : "") //! ALTER EVENT doesn't drop ENDS - MySQL bug #39173
|
||||
: "AT " . q($_POST["STARTS"])
|
||||
) . " ON COMPLETION" . ($_POST["ON_COMPLETION"] ? "" : " NOT") . " PRESERVE"
|
||||
} elseif (in_array($row["INTERVAL_FIELD"], $intervals) && isset($statuses[$row["STATUS"]])) {
|
||||
$schedule = "\nON SCHEDULE " . ($row["INTERVAL_VALUE"]
|
||||
? "EVERY " . q($row["INTERVAL_VALUE"]) . " $row[INTERVAL_FIELD]"
|
||||
. ($row["STARTS"] ? " STARTS " . q($row["STARTS"]) : "")
|
||||
. ($row["ENDS"] ? " ENDS " . q($row["ENDS"]) : "") //! ALTER EVENT doesn't drop ENDS - MySQL bug #39173
|
||||
: "AT " . q($row["STARTS"])
|
||||
) . " ON COMPLETION" . ($row["ON_COMPLETION"] ? "" : " NOT") . " PRESERVE"
|
||||
;
|
||||
|
||||
queries_redirect(substr(ME, 0, -1), ($EVENT != "" ? lang('Event has been altered.') : lang('Event has been created.')), queries(($EVENT != ""
|
||||
? "ALTER EVENT " . idf_escape($EVENT) . $schedule
|
||||
. ($EVENT != $_POST["EVENT_NAME"] ? "\nRENAME TO " . idf_escape($_POST["EVENT_NAME"]) : "")
|
||||
: "CREATE EVENT " . idf_escape($_POST["EVENT_NAME"]) . $schedule
|
||||
) . "\n" . $statuses[$_POST["STATUS"]] . " COMMENT " . q($_POST["EVENT_COMMENT"])
|
||||
. rtrim(" DO\n$_POST[EVENT_DEFINITION]", ";") . ";"
|
||||
. ($EVENT != $row["EVENT_NAME"] ? "\nRENAME TO " . idf_escape($row["EVENT_NAME"]) : "")
|
||||
: "CREATE EVENT " . idf_escape($row["EVENT_NAME"]) . $schedule
|
||||
) . "\n" . $statuses[$row["STATUS"]] . " COMMENT " . q($row["EVENT_COMMENT"])
|
||||
. rtrim(" DO\n$row[EVENT_DEFINITION]", ";") . ";"
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
page_header(($EVENT != "" ? lang('Alter event') . ": " . h($EVENT) : lang('Create event')), $error);
|
||||
|
||||
$row = $_POST;
|
||||
if (!$row && $EVENT != "") {
|
||||
$rows = get_rows("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = " . q(DB) . " AND EVENT_NAME = " . q($EVENT));
|
||||
$row = reset($rows);
|
||||
@@ -35,10 +36,10 @@ if (!$row && $EVENT != "") {
|
||||
|
||||
<form action="" method="post">
|
||||
<table cellspacing="0">
|
||||
<tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" maxlength="64">
|
||||
<tr><th><?php echo lang('Start'); ?><td><input name="STARTS" value="<?php echo h("$row[EXECUTE_AT]$row[STARTS]"); ?>">
|
||||
<tr><th><?php echo lang('End'); ?><td><input name="ENDS" value="<?php echo h($row["ENDS"]); ?>">
|
||||
<tr><th><?php echo lang('Every'); ?><td><input name="INTERVAL_VALUE" value="<?php echo h($row["INTERVAL_VALUE"]); ?>" size="6"> <?php echo html_select("INTERVAL_FIELD", $intervals, $row["INTERVAL_FIELD"]); ?>
|
||||
<tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" maxlength="64" autocapitalize="off">
|
||||
<tr><th title="datetime"><?php echo lang('Start'); ?><td><input name="STARTS" value="<?php echo h("$row[EXECUTE_AT]$row[STARTS]"); ?>">
|
||||
<tr><th title="datetime"><?php echo lang('End'); ?><td><input name="ENDS" value="<?php echo h($row["ENDS"]); ?>">
|
||||
<tr><th><?php echo lang('Every'); ?><td><input type="number" name="INTERVAL_VALUE" value="<?php echo h($row["INTERVAL_VALUE"]); ?>" class="size"> <?php echo html_select("INTERVAL_FIELD", $intervals, $row["INTERVAL_FIELD"]); ?>
|
||||
<tr><th><?php echo lang('Status'); ?><td><?php echo html_select("STATUS", $statuses, $row["STATUS"]); ?>
|
||||
<tr><th><?php echo lang('Comment'); ?><td><input name="EVENT_COMMENT" value="<?php echo h($row["EVENT_COMMENT"]); ?>" maxlength="64">
|
||||
<tr><th> <td><?php echo checkbox("ON_COMPLETION", "PRESERVE", $row["ON_COMPLETION"] == "PRESERVE", lang('On completion preserve')); ?>
|
||||
|
@@ -9,7 +9,7 @@ header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
|
||||
|
||||
if ($_GET["file"] == "favicon.ico") {
|
||||
header("Content-Type: image/x-icon");
|
||||
echo compile_file('../adminer/static/favicon.ico');
|
||||
echo lzw_decompress(compile_file('../adminer/static/favicon.ico', 'lzw_compress'));
|
||||
} elseif ($_GET["file"] == "default.css") {
|
||||
header("Content-Type: text/css; charset=utf-8");
|
||||
echo lzw_decompress(compile_file('../adminer/static/default.css', 'minify_css'));
|
||||
|
@@ -1,50 +1,50 @@
|
||||
<?php
|
||||
$TABLE = $_GET["foreign"];
|
||||
$name = $_GET["name"];
|
||||
$row = $_POST;
|
||||
|
||||
if ($_POST && !$error && !$_POST["add"] && !$_POST["change"] && !$_POST["change-js"]) {
|
||||
if ($_POST["drop"]) {
|
||||
query_redirect("ALTER TABLE " . table($TABLE) . "\nDROP " . ($jush == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($_GET["name"]), ME . "table=" . urlencode($TABLE), lang('Foreign key has been dropped.'));
|
||||
query_redirect("ALTER TABLE " . table($TABLE) . "\nDROP " . ($jush == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($name), ME . "table=" . urlencode($TABLE), lang('Foreign key has been dropped.'));
|
||||
} else {
|
||||
$source = array_filter($_POST["source"], 'strlen');
|
||||
$source = array_filter($row["source"], 'strlen');
|
||||
ksort($source); // enforce input order
|
||||
$target = array();
|
||||
foreach ($source as $key => $val) {
|
||||
$target[$key] = $_POST["target"][$key];
|
||||
$target[$key] = $row["target"][$key];
|
||||
}
|
||||
|
||||
query_redirect("ALTER TABLE " . table($TABLE)
|
||||
. ($_GET["name"] != "" ? "\nDROP " . ($jush == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($_GET["name"]) . "," : "")
|
||||
. "\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
|
||||
. (ereg("^($on_actions)\$", $_POST["on_delete"]) ? " ON DELETE $_POST[on_delete]" : "")
|
||||
. (ereg("^($on_actions)\$", $_POST["on_update"]) ? " ON UPDATE $_POST[on_update]" : "")
|
||||
, ME . "table=" . urlencode($TABLE), ($_GET["name"] != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.')));
|
||||
. ($name != "" ? "\nDROP " . ($jush == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($name) . "," : "")
|
||||
. "\nADD FOREIGN KEY (" . implode(", ", array_map('idf_escape', $source)) . ") REFERENCES " . table($row["table"]) . " (" . implode(", ", array_map('idf_escape', $target)) . ")" //! reuse $name - check in older MySQL versions
|
||||
. (ereg("^($on_actions)\$", $row["on_delete"]) ? " ON DELETE $row[on_delete]" : "")
|
||||
. (ereg("^($on_actions)\$", $row["on_update"]) ? " ON UPDATE $row[on_update]" : "")
|
||||
, ME . "table=" . urlencode($TABLE), ($name != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.')));
|
||||
$error = lang('Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.') . "<br>$error"; //! no partitioning
|
||||
}
|
||||
}
|
||||
|
||||
page_header(lang('Foreign key'), $error, array("table" => $TABLE), $TABLE);
|
||||
|
||||
$row = array("table" => $TABLE, "source" => array(""));
|
||||
if ($_POST) {
|
||||
$row = $_POST;
|
||||
ksort($row["source"]);
|
||||
if ($_POST["add"]) {
|
||||
$row["source"][] = "";
|
||||
} elseif ($_POST["change"] || $_POST["change-js"]) {
|
||||
$row["target"] = array();
|
||||
}
|
||||
} elseif ($_GET["name"] != "") {
|
||||
} elseif ($name != "") {
|
||||
$foreign_keys = foreign_keys($TABLE);
|
||||
$row = $foreign_keys[$_GET["name"]];
|
||||
$row = $foreign_keys[$name];
|
||||
$row["source"][] = "";
|
||||
} else {
|
||||
$row["table"] = $TABLE;
|
||||
$row["source"] = array("");
|
||||
}
|
||||
|
||||
$source = array_keys(fields($TABLE)); //! no text and blob
|
||||
$target = ($TABLE === $row["table"] ? $source : array_keys(fields($row["table"])));
|
||||
$referencable = array();
|
||||
foreach (table_status() as $name => $table_status) {
|
||||
if (fk_support($table_status)) {
|
||||
$referencable[] = $name;
|
||||
}
|
||||
}
|
||||
$referencable = array_keys(array_filter(table_status('', true), 'fk_support'));
|
||||
?>
|
||||
|
||||
<form action="" method="post">
|
||||
@@ -73,6 +73,6 @@ foreach ($row["source"] as $key => $val) {
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<noscript><p><input type="submit" name="add" value="<?php echo lang('Add column'); ?>"></noscript>
|
||||
<?php } ?>
|
||||
<?php if ($_GET["name"] != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<?php if ($name != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
|
@@ -71,14 +71,14 @@ class Adminer {
|
||||
?>
|
||||
<table cellspacing="0">
|
||||
<tr><th><?php echo lang('System'); ?><td><?php echo html_select("auth[driver]", $drivers, DRIVER, "loginDriver(this);"); ?>
|
||||
<tr><th><?php echo lang('Server'); ?><td><input name="auth[server]" value="<?php echo h(SERVER); ?>" title="hostname[:port]">
|
||||
<tr><th><?php echo lang('Username'); ?><td><input id="username" name="auth[username]" value="<?php echo h($_GET["username"]); ?>">
|
||||
<tr><th><?php echo lang('Server'); ?><td><input name="auth[server]" value="<?php echo h(SERVER); ?>" title="hostname[:port]" placeholder="localhost" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Username'); ?><td><input name="auth[username]" id="username" value="<?php echo h($_GET["username"]); ?>" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
|
||||
<tr><th><?php echo lang('Database'); ?><td><input name="auth[db]" value="<?php echo h($_GET["db"]); ?>">
|
||||
<tr><th><?php echo lang('Database'); ?><td><input name="auth[db]" value="<?php echo h($_GET["db"]); ?>" autocapitalize="off">
|
||||
</table>
|
||||
<script type="text/javascript">
|
||||
var username = document.getElementById('username');
|
||||
username.focus();
|
||||
focus(username);
|
||||
username.form['auth[driver]'].onchange();
|
||||
</script>
|
||||
<?php
|
||||
@@ -164,8 +164,11 @@ username.form['auth[driver]'].onchange();
|
||||
* @return string
|
||||
*/
|
||||
function selectQuery($query) {
|
||||
global $jush;
|
||||
return "<p><a href='" . h(remove_from_uri("page")) . "&page=last' title='" . lang('Last page') . "'>>></a> <code class='jush-$jush'>" . h(str_replace("\n", " ", $query)) . "</code> <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a></p>\n"; // </p> - required for IE9 inline edit
|
||||
global $jush, $token;
|
||||
return "<form action='" . h(ME) . "sql=' method='post'><p><span onclick=\"return !selectEditSql(event, this, '" . lang('Execute') . "');\">"
|
||||
. "<code class='jush-$jush'>" . h(str_replace("\n", " ", $query)) . "</code>"
|
||||
. " <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a>"
|
||||
. "</span><input type='hidden' name='token' value='$token'></p></form>\n"; // </p> - required for IE9 inline edit
|
||||
}
|
||||
|
||||
/** Description of a row in a table
|
||||
@@ -185,6 +188,14 @@ username.form['auth[driver]'].onchange();
|
||||
return $rows;
|
||||
}
|
||||
|
||||
/** Get a link to use in select table
|
||||
* @param string raw value of the field
|
||||
* @param array single field returned from fields()
|
||||
* @return string or null to create the default link
|
||||
*/
|
||||
function selectLink($val, $field) {
|
||||
}
|
||||
|
||||
/** Value printed in select table
|
||||
* @param string HTML-escaped value to print
|
||||
* @param string link to foreign key
|
||||
@@ -194,9 +205,9 @@ username.form['auth[driver]'].onchange();
|
||||
function selectVal($val, $link, $field) {
|
||||
$return = ($val === null ? "<i>NULL</i>" : (ereg("char|binary", $field["type"]) && !ereg("var", $field["type"]) ? "<code>$val</code>" : $val));
|
||||
if (ereg('blob|bytea|raw|file', $field["type"]) && !is_utf8($val)) {
|
||||
$return = lang('%d byte(s)', strlen($val));
|
||||
$return = lang('%d byte(s)', strlen(html_entity_decode($val, ENT_QUOTES)));
|
||||
}
|
||||
return ($link ? "<a href='$link'>$return</a>" : $return);
|
||||
return ($link ? "<a href='" . h($link) . "'>$return</a>" : $return);
|
||||
}
|
||||
|
||||
/** Value conversion used in select and edit
|
||||
@@ -240,7 +251,7 @@ username.form['auth[driver]'].onchange();
|
||||
foreach ($indexes as $i => $index) {
|
||||
if ($index["type"] == "FULLTEXT") {
|
||||
echo "(<i>" . implode("</i>, <i>", array_map('h', $index["columns"])) . "</i>) AGAINST";
|
||||
echo " <input name='fulltext[$i]' value='" . h($_GET["fulltext"][$i]) . "' onchange='selectFieldChange(this.form);'>";
|
||||
echo " <input type='search' name='fulltext[$i]' value='" . h($_GET["fulltext"][$i]) . "' onchange='selectFieldChange(this.form);'>";
|
||||
echo checkbox("boolean[$i]", 1, isset($_GET["boolean"][$i]), "BOOL");
|
||||
echo "<br>\n";
|
||||
}
|
||||
@@ -253,7 +264,7 @@ username.form['auth[driver]'].onchange();
|
||||
if (!$val || ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators))) {
|
||||
echo "<div><select name='where[$i][col]' onchange='$change_next'><option value=''>(" . lang('anywhere') . ")" . optionlist($columns, $val["col"], true) . "</select>";
|
||||
echo html_select("where[$i][op]", $this->operators, $val["op"], $change_next);
|
||||
echo "<input name='where[$i][val]' value='" . h($val["val"]) . "' onchange='" . ($val ? "selectFieldChange(this.form)" : "selectAddRow(this)") . ";'></div>\n";
|
||||
echo "<input type='search' name='where[$i][val]' value='" . h($val["val"]) . "' onchange='" . ($val ? "selectFieldChange(this.form)" : "selectAddRow(this)") . ";' onsearch='selectSearchSearch(this);'></div>\n";
|
||||
}
|
||||
}
|
||||
echo "</div></fieldset>\n";
|
||||
@@ -286,7 +297,7 @@ username.form['auth[driver]'].onchange();
|
||||
*/
|
||||
function selectLimitPrint($limit) {
|
||||
echo "<fieldset><legend>" . lang('Limit') . "</legend><div>"; // <div> for easy styling
|
||||
echo "<input name='limit' size='3' value='" . h($limit) . "' onchange='selectFieldChange(this.form);'>";
|
||||
echo "<input type='number' name='limit' class='size' value='" . h($limit) . "' onchange='selectFieldChange(this.form);'>";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
|
||||
@@ -297,7 +308,7 @@ username.form['auth[driver]'].onchange();
|
||||
function selectLengthPrint($text_length) {
|
||||
if ($text_length !== null) {
|
||||
echo "<fieldset><legend>" . lang('Text length') . "</legend><div>";
|
||||
echo '<input name="text_length" size="3" value="' . h($text_length) . '">';
|
||||
echo "<input type='number' name='text_length' class='size' value='" . h($text_length) . "'>";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
}
|
||||
@@ -389,8 +400,8 @@ username.form['auth[driver]'].onchange();
|
||||
if (ereg('IN$', $val["op"])) {
|
||||
$in = process_length($val["val"]);
|
||||
$cond .= " (" . ($in != "" ? $in : "NULL") . ")";
|
||||
} elseif (!$val["op"]) {
|
||||
$cond .= $val["val"]; // SQL injection
|
||||
} elseif ($val["op"] == "SQL") {
|
||||
$cond = " $val[val]"; // SQL injection
|
||||
} elseif ($val["op"] == "LIKE %%") {
|
||||
$cond = " LIKE " . $this->processInput($fields[$val["col"]], "%$val[val]%");
|
||||
} elseif (!ereg('NULL$', $val["op"])) {
|
||||
@@ -403,7 +414,7 @@ username.form['auth[driver]'].onchange();
|
||||
$cols = array();
|
||||
foreach ($fields as $name => $field) {
|
||||
$is_text = ereg('char|text|enum|set', $field["type"]);
|
||||
if ((is_numeric($val["val"]) || !ereg('int|float|double|decimal|bit', $field["type"]))
|
||||
if ((is_numeric($val["val"]) || !ereg('(^|[^o])int|float|double|decimal|bit', $field["type"]))
|
||||
&& (!ereg("[\x80-\xFF]", $val["val"]) || $is_text)
|
||||
) {
|
||||
$name = idf_escape($name);
|
||||
@@ -436,7 +447,7 @@ username.form['auth[driver]'].onchange();
|
||||
* @return string expression to use in LIMIT, will be escaped
|
||||
*/
|
||||
function selectLimitProcess() {
|
||||
return (isset($_GET["limit"]) ? $_GET["limit"] : "30");
|
||||
return (isset($_GET["limit"]) ? $_GET["limit"] : "50");
|
||||
}
|
||||
|
||||
/** Process length box in select
|
||||
@@ -474,10 +485,9 @@ username.form['auth[driver]'].onchange();
|
||||
*/
|
||||
function messageQuery($query) {
|
||||
global $jush;
|
||||
static $count = 0;
|
||||
restart_session();
|
||||
$id = "sql-" . ($count++);
|
||||
$history = &get_session("queries");
|
||||
$id = "sql-" . count($history[$_GET["db"]]);
|
||||
if (strlen($query) > 1e6) {
|
||||
$query = ereg_replace('[\x80-\xFF]+$', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
|
||||
}
|
||||
@@ -500,7 +510,7 @@ username.form['auth[driver]'].onchange();
|
||||
}
|
||||
}
|
||||
if ($key && !ereg('set|blob|bytea|raw|file', $field["type"])) {
|
||||
$return .= "/=";
|
||||
$return .= "/SQL";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -531,11 +541,11 @@ username.form['auth[driver]'].onchange();
|
||||
* @return string expression to use in a query
|
||||
*/
|
||||
function processInput($field, $value, $function = "") {
|
||||
if ($function == "=") {
|
||||
if ($function == "SQL") {
|
||||
return $value; // SQL injection
|
||||
}
|
||||
$name = $field["field"];
|
||||
$return = ($field["type"] == "bit" && ereg("^([0-9]+|b'[0-1]+')\$", $value) ? $value : q($value));
|
||||
$return = q($value);
|
||||
if (ereg('^(now|getdate|uuid)$', $function)) {
|
||||
$return = "$function()";
|
||||
} elseif (ereg('^current_(date|timestamp)$', $function)) {
|
||||
@@ -560,10 +570,6 @@ username.form['auth[driver]'].onchange();
|
||||
if (function_exists('gzencode')) {
|
||||
$return['gz'] = 'gzip';
|
||||
}
|
||||
if (function_exists('bzcompress')) {
|
||||
$return['bz2'] = 'bzip2';
|
||||
}
|
||||
// ZipArchive requires temporary file, ZIP can be created by gzcompress - see PEAR File_Archive
|
||||
return $return;
|
||||
}
|
||||
|
||||
@@ -574,99 +580,43 @@ username.form['auth[driver]'].onchange();
|
||||
return array('sql' => 'SQL', 'csv' => 'CSV,', 'csv;' => 'CSV;', 'tsv' => 'TSV');
|
||||
}
|
||||
|
||||
/** Export database structure
|
||||
* @param string
|
||||
* @return null prints data
|
||||
*/
|
||||
function dumpDatabase($db) {
|
||||
}
|
||||
|
||||
/** Export table structure
|
||||
* @param string
|
||||
* @param string
|
||||
* @param bool
|
||||
* @param int 0 table, 1 view, 2 temporary view table
|
||||
* @return null prints data
|
||||
*/
|
||||
function dumpTable($table, $style, $is_view = false) {
|
||||
function dumpTable($table, $style, $is_view = 0) {
|
||||
if ($_POST["format"] != "sql") {
|
||||
echo "\xef\xbb\xbf"; // UTF-8 byte order mark
|
||||
if ($style) {
|
||||
dump_csv(array_keys(fields($table)));
|
||||
}
|
||||
} elseif ($style) {
|
||||
$create = create_sql($table, $_POST["auto_increment"]);
|
||||
if ($create) {
|
||||
if ($style == "DROP+CREATE") {
|
||||
echo "DROP " . ($is_view ? "VIEW" : "TABLE") . " IF EXISTS " . table($table) . ";\n";
|
||||
if ($is_view == 2) {
|
||||
$fields = array();
|
||||
foreach (fields($table) as $name => $field) {
|
||||
$fields[] = idf_escape($name) . " $field[full_type]";
|
||||
}
|
||||
if ($is_view) {
|
||||
$create = "CREATE TABLE " . table($table) . " (" . implode(", ", $fields) . ")";
|
||||
} else {
|
||||
$create = create_sql($table, $_POST["auto_increment"]);
|
||||
}
|
||||
if ($create) {
|
||||
if ($style == "DROP+CREATE" || $is_view == 1) {
|
||||
echo "DROP " . ($is_view == 2 ? "VIEW" : "TABLE") . " IF EXISTS " . table($table) . ";\n";
|
||||
}
|
||||
if ($is_view == 1) {
|
||||
$create = remove_definer($create);
|
||||
}
|
||||
echo ($style != "CREATE+ALTER" ? $create : ($is_view ? substr_replace($create, " OR REPLACE", 6, 0) : substr_replace($create, " IF NOT EXISTS", 12, 0))) . ";\n\n";
|
||||
}
|
||||
if ($style == "CREATE+ALTER" && !$is_view) {
|
||||
// create procedure which iterates over original columns and adds new and removes old
|
||||
$query = "SELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, COLLATION_NAME, COLUMN_TYPE, EXTRA, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = " . q($table) . " ORDER BY ORDINAL_POSITION";
|
||||
echo "DELIMITER ;;
|
||||
CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN
|
||||
DECLARE _column_name, _collation_name, after varchar(64) DEFAULT '';
|
||||
DECLARE _column_type, _column_default text;
|
||||
DECLARE _is_nullable char(3);
|
||||
DECLARE _extra varchar(30);
|
||||
DECLARE _column_comment varchar(255);
|
||||
DECLARE done, set_after bool DEFAULT 0;
|
||||
DECLARE add_columns text DEFAULT '";
|
||||
$fields = array();
|
||||
$after = "";
|
||||
foreach (get_rows($query) as $row) {
|
||||
$default = $row["COLUMN_DEFAULT"];
|
||||
$row["default"] = ($default !== null ? q($default) : "NULL");
|
||||
$row["after"] = q($after); //! rgt AFTER lft, lft AFTER id doesn't work
|
||||
$row["alter"] = escape_string(idf_escape($row["COLUMN_NAME"])
|
||||
. " $row[COLUMN_TYPE]"
|
||||
. ($row["COLLATION_NAME"] ? " COLLATE $row[COLLATION_NAME]" : "")
|
||||
. ($default !== null ? " DEFAULT " . ($default == "CURRENT_TIMESTAMP" ? $default : $row["default"]) : "")
|
||||
. ($row["IS_NULLABLE"] == "YES" ? "" : " NOT NULL")
|
||||
. ($row["EXTRA"] ? " $row[EXTRA]" : "")
|
||||
. ($row["COLUMN_COMMENT"] ? " COMMENT " . q($row["COLUMN_COMMENT"]) : "")
|
||||
. ($after ? " AFTER " . idf_escape($after) : " FIRST")
|
||||
);
|
||||
echo ", ADD $row[alter]";
|
||||
$fields[] = $row;
|
||||
$after = $row["COLUMN_NAME"];
|
||||
}
|
||||
echo "';
|
||||
DECLARE columns CURSOR FOR $query;
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
|
||||
SET @alter_table = '';
|
||||
OPEN columns;
|
||||
REPEAT
|
||||
FETCH columns INTO _column_name, _column_default, _is_nullable, _collation_name, _column_type, _extra, _column_comment;
|
||||
IF NOT done THEN
|
||||
SET set_after = 1;
|
||||
CASE _column_name";
|
||||
foreach ($fields as $row) {
|
||||
echo "
|
||||
WHEN " . q($row["COLUMN_NAME"]) . " THEN
|
||||
SET add_columns = REPLACE(add_columns, ', ADD $row[alter]', IF(
|
||||
_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]
|
||||
, '', ', MODIFY $row[alter]'));"
|
||||
; //! don't replace in comment
|
||||
}
|
||||
echo "
|
||||
ELSE
|
||||
SET @alter_table = CONCAT(@alter_table, ', DROP ', _column_name);
|
||||
SET set_after = 0;
|
||||
END CASE;
|
||||
IF set_after THEN
|
||||
SET after = _column_name;
|
||||
END IF;
|
||||
END IF;
|
||||
UNTIL done END REPEAT;
|
||||
CLOSE columns;
|
||||
IF @alter_table != '' OR add_columns != '' THEN
|
||||
SET alter_command = CONCAT(alter_command, 'ALTER TABLE " . table($table) . "', SUBSTR(CONCAT(add_columns, @alter_table), 2), ';\\n');
|
||||
END IF;
|
||||
END;;
|
||||
DELIMITER ;
|
||||
CALL adminer_alter(@adminer_alter);
|
||||
DROP PROCEDURE adminer_alter;
|
||||
|
||||
";
|
||||
//! indexes
|
||||
echo "$create;\n\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -681,10 +631,10 @@ DROP PROCEDURE adminer_alter;
|
||||
global $connection, $jush;
|
||||
$max_packet = ($jush == "sqlite" ? 0 : 1048576); // default, minimum is 1024
|
||||
if ($style) {
|
||||
if ($_POST["format"] == "sql" && $style == "TRUNCATE+INSERT") {
|
||||
echo truncate_sql($table) . ";\n";
|
||||
}
|
||||
if ($_POST["format"] == "sql") {
|
||||
if ($style == "TRUNCATE+INSERT") {
|
||||
echo truncate_sql($table) . ";\n";
|
||||
}
|
||||
$fields = fields($table);
|
||||
}
|
||||
$result = $connection->query($query, 1); // 1 - MYSQLI_USE_RESULT //! enum and set as numbers
|
||||
@@ -693,7 +643,8 @@ DROP PROCEDURE adminer_alter;
|
||||
$buffer = "";
|
||||
$keys = array();
|
||||
$suffix = "";
|
||||
while ($row = $result->fetch_row()) {
|
||||
$fetch_function = ($table != '' ? 'fetch_assoc' : 'fetch_row');
|
||||
while ($row = $result->$fetch_function()) {
|
||||
if (!$keys) {
|
||||
$values = array();
|
||||
foreach ($row as $val) {
|
||||
@@ -715,7 +666,11 @@ DROP PROCEDURE adminer_alter;
|
||||
$insert = "INSERT INTO " . table($table) . " (" . implode(", ", array_map('idf_escape', $keys)) . ") VALUES";
|
||||
}
|
||||
foreach ($row as $key => $val) {
|
||||
$row[$key] = ($val !== null ? (ereg('int|float|double|decimal|bit', $fields[$keys[$key]]["type"]) ? $val : q($val)) : "NULL"); //! columns looking like functions
|
||||
$field = $fields[$key];
|
||||
$row[$key] = ($val !== null
|
||||
? unconvert_field($field, ereg('(^|[^o])int|float|double|decimal', $field["type"]) && $val != '' ? $val : q($val))
|
||||
: "NULL"
|
||||
);
|
||||
}
|
||||
$s = ($max_packet ? "\n" : " ") . "(" . implode(",\t", $row) . ")";
|
||||
if (!$buffer) {
|
||||
@@ -752,16 +707,12 @@ DROP PROCEDURE adminer_alter;
|
||||
*/
|
||||
function dumpHeaders($identifier, $multi_table = false) {
|
||||
$output = $_POST["output"];
|
||||
$ext = ($_POST["format"] == "sql" ? "sql" : ($multi_table ? "tar" : "csv")); // multiple CSV packed to TAR
|
||||
$ext = (ereg('sql', $_POST["format"]) ? "sql" : ($multi_table ? "tar" : "csv")); // multiple CSV packed to TAR
|
||||
header("Content-Type: " .
|
||||
($output == "bz2" ? "application/x-bzip" :
|
||||
($output == "gz" ? "application/x-gzip" :
|
||||
($ext == "tar" ? "application/x-tar" :
|
||||
($ext == "sql" || $output != "file" ? "text/plain" : "text/csv") . "; charset=utf-8"
|
||||
))));
|
||||
if ($output == "bz2") {
|
||||
ob_start('bzcompress', 1e6);
|
||||
}
|
||||
)));
|
||||
if ($output == "gz") {
|
||||
ob_start('gzencode', 1e6);
|
||||
}
|
||||
@@ -829,7 +780,7 @@ DROP PROCEDURE adminer_alter;
|
||||
$this->databasesPrint($missing);
|
||||
if ($_GET["ns"] !== "" && !$missing && DB != "") {
|
||||
echo '<p><a href="' . h(ME) . 'create="' . bold($_GET["create"] === "") . ">" . lang('Create new table') . "</a>\n";
|
||||
$tables = tables_list();
|
||||
$tables = table_status('', true);
|
||||
if (!$tables) {
|
||||
echo "<p class='message'>" . lang('No tables.') . "\n";
|
||||
} else {
|
||||
@@ -859,8 +810,13 @@ DROP PROCEDURE adminer_alter;
|
||||
?>
|
||||
<form action="">
|
||||
<p id="dbs">
|
||||
<?php hidden_fields_get(); ?>
|
||||
<?php echo ($databases ? html_select("db", array("" => "(" . lang('database') . ")") + $databases, DB, "this.form.submit();") : '<input name="db" value="' . h(DB) . '">'); ?>
|
||||
<?php
|
||||
hidden_fields_get();
|
||||
echo ($databases
|
||||
? '<select name="db" onmousedown="dbMouseDown(event, this);" onchange="dbChange(this);">' . optionlist(array("" => "(" . lang('database') . ")") + $databases, DB) . '</select>'
|
||||
: '<input name="db" value="' . h(DB) . '" autocapitalize="off">'
|
||||
);
|
||||
?>
|
||||
<input type="submit" value="<?php echo lang('Use'); ?>"<?php echo ($databases ? " class='hidden'" : ""); ?>>
|
||||
<?php
|
||||
if ($missing != "db" && DB != "" && $connection->select_db(DB)) {
|
||||
@@ -879,14 +835,14 @@ DROP PROCEDURE adminer_alter;
|
||||
}
|
||||
|
||||
/** Prints table list in menu
|
||||
* @param array
|
||||
* @param array result of table_status('', true)
|
||||
* @return null
|
||||
*/
|
||||
function tablesPrint($tables) {
|
||||
echo "<p id='tables' onmouseover='menuOver(this, event);' onmouseout='menuOut(this);'>\n";
|
||||
foreach ($tables as $table => $type) {
|
||||
foreach ($tables as $table => $status) {
|
||||
echo '<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) . " title='" . lang('Show structure') . "'>" . $this->tableName(array("Name" => $table)) . "</a><br>\n"; //! Adminer::tableName may work with full table status
|
||||
echo '<a href="' . h(ME) . 'table=' . urlencode($table) . '"' . bold($_GET["table"] == $table) . " title='" . lang('Show structure') . "'>" . $this->tableName($status) . "</a><br>\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -33,6 +33,7 @@ if ($auth) {
|
||||
) {
|
||||
redirect(auth_url($auth["driver"], $auth["server"], $auth["username"], $auth["db"]));
|
||||
}
|
||||
|
||||
} elseif ($_POST["logout"]) {
|
||||
if ($token && $_POST["token"] != $token) {
|
||||
page_header(lang('Logout'), lang('Invalid CSRF token. Send the form again.'));
|
||||
@@ -45,6 +46,7 @@ if ($auth) {
|
||||
unset_permanent();
|
||||
redirect(substr(preg_replace('~(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.'));
|
||||
}
|
||||
|
||||
} elseif ($permanent && !$_SESSION["pwds"]) {
|
||||
session_regenerate_id();
|
||||
$private = $adminer->permanentLogin(); // try to decode even if not set
|
||||
@@ -59,8 +61,8 @@ if ($auth) {
|
||||
function unset_permanent() {
|
||||
global $permanent;
|
||||
foreach ($permanent as $key => $val) {
|
||||
list($driver, $server, $username) = array_map('base64_decode', explode("-", $key));
|
||||
if ($driver == DRIVER && $server == SERVER && $db == $_GET["username"]) {
|
||||
list($driver, $server, $username, $db) = array_map('base64_decode', explode("-", $key));
|
||||
if ($driver == DRIVER && $server == SERVER && $username == $_GET["username"] && $db == DB) {
|
||||
unset($permanent[$key]);
|
||||
}
|
||||
}
|
||||
@@ -105,6 +107,7 @@ if (isset($_GET["username"])) {
|
||||
}
|
||||
$connection = connect();
|
||||
}
|
||||
|
||||
if (is_string($connection) || !$adminer->login($_GET["username"], get_session("pwds"))) {
|
||||
auth_error();
|
||||
exit;
|
||||
@@ -114,7 +117,28 @@ $token = $_SESSION["token"]; ///< @var string CSRF protection
|
||||
if ($auth && $_POST["token"]) {
|
||||
$_POST["token"] = $token; // reset token after explicit login
|
||||
}
|
||||
$error = ($_POST ///< @var string
|
||||
? ($_POST["token"] == $token ? "" : lang('Invalid CSRF token. Send the form again.'))
|
||||
: ($_SERVER["REQUEST_METHOD"] != "POST" ? "" : lang('Too big POST data. Reduce the data or increase the %s configuration directive.', '"post_max_size"')) // posted form with no data means that post_max_size exceeded because Adminer always sends token at least
|
||||
);
|
||||
|
||||
$error = ''; ///< @var string
|
||||
if ($_POST) {
|
||||
if ($_POST["token"] != $token) {
|
||||
$ini = "max_input_vars";
|
||||
$max_vars = ini_get($ini);
|
||||
if (extension_loaded("suhosin")) {
|
||||
foreach (array("suhosin.request.max_vars", "suhosin.post.max_vars") as $key) {
|
||||
$val = ini_get($key);
|
||||
if ($val && (!$max_vars || $val < $max_vars)) {
|
||||
$ini = $key;
|
||||
$max_vars = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
$error = (!$_POST["token"] && $max_vars
|
||||
? lang('Maximum number of allowed fields exceeded. Please increase %s.', "'$ini'")
|
||||
: lang('Invalid CSRF token. Send the form again.')
|
||||
);
|
||||
}
|
||||
|
||||
} elseif ($_SERVER["REQUEST_METHOD"] == "POST") {
|
||||
// posted form with no data means that post_max_size exceeded because Adminer always sends token at least
|
||||
$error = lang('Too big POST data. Reduce the data or increase the %s configuration directive.', "'post_max_size'");
|
||||
}
|
||||
|
@@ -14,6 +14,10 @@ if ($filter || ini_get("filter.default_flags")) {
|
||||
}
|
||||
}
|
||||
|
||||
if (function_exists("mb_internal_encoding")) {
|
||||
mb_internal_encoding("8bit");
|
||||
}
|
||||
|
||||
// used only in compiled file
|
||||
if (isset($_GET["file"])) {
|
||||
include "../adminer/file.inc.php";
|
||||
@@ -24,7 +28,7 @@ include "../adminer/include/functions.inc.php";
|
||||
global $adminer, $connection, $drivers, $edit_functions, $enum_length, $error, $functions, $grouping, $HTTPS, $inout, $jush, $LANG, $langs, $on_actions, $permanent, $structured_types, $token, $translations, $types, $unsigned, $VERSION; // allows including Adminer inside a function
|
||||
|
||||
if (!$_SERVER["REQUEST_URI"]) { // IIS 5 compatibility
|
||||
$_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"];
|
||||
$_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"];
|
||||
}
|
||||
if (!strpos($_SERVER["REQUEST_URI"], '?') && $_SERVER["QUERY_STRING"] != "") { // IIS 7 compatibility
|
||||
$_SERVER["REQUEST_URI"] .= "?$_SERVER[QUERY_STRING]";
|
||||
|
@@ -29,8 +29,9 @@ function connect_error() {
|
||||
$scheme = support("scheme");
|
||||
$collations = collations();
|
||||
echo "<form action='' method='post'>\n";
|
||||
echo "<table cellspacing='0' class='checkable' onclick='tableClick(event);'>\n";
|
||||
echo "<table cellspacing='0' class='checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
|
||||
echo "<thead><tr><td> <th>" . lang('Database') . "<td>" . lang('Collation') . "<td>" . lang('Tables') . "</thead>\n";
|
||||
|
||||
foreach ($databases as $db) {
|
||||
$root = h(ME) . "db=" . urlencode($db);
|
||||
echo "<tr" . odd() . "><td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"]));
|
||||
@@ -39,6 +40,7 @@ function connect_error() {
|
||||
echo "<td align='right'><a href='$root&schema=' id='tables-" . h($db) . "' title='" . lang('Database schema') . "'>?</a>";
|
||||
echo "\n";
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
echo "<script type='text/javascript'>tableCheck();</script>\n";
|
||||
echo "<p><input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm("formChecked(this, /db/)") . ">\n";
|
||||
@@ -49,6 +51,7 @@ function connect_error() {
|
||||
echo "<p>$refresh";
|
||||
}
|
||||
}
|
||||
|
||||
page_footer("db");
|
||||
if ($databases) {
|
||||
echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=connect');</script>\n";
|
||||
|
@@ -16,7 +16,7 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
|
||||
$title_all = $title . ($title2 != "" ? ": " . h($title2) : "");
|
||||
$title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name());
|
||||
?>
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
|
||||
<!DOCTYPE html>
|
||||
<html lang="<?php echo $LANG; ?>" dir="<?php echo lang('ltr'); ?>">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta http-equiv="Content-Script-Type" content="text/javascript">
|
||||
@@ -26,7 +26,8 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
|
||||
<script type="text/javascript" src="../adminer/static/functions.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">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="../adminer/static/favicon.ico">
|
||||
<link rel="apple-touch-icon" href="../adminer/static/favicon.ico">
|
||||
<?php if (file_exists("adminer.css")) { ?>
|
||||
<link rel="stylesheet" type="text/css" href="adminer.css">
|
||||
<?php } ?>
|
||||
@@ -97,5 +98,6 @@ function page_footer($missing = "") {
|
||||
<div id="menu">
|
||||
<?php $adminer->navigation($missing); ?>
|
||||
</div>
|
||||
<script type="text/javascript">setupSubmitHighlight(document);</script>
|
||||
<?php
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@
|
||||
* @param Min_Result
|
||||
* @param Min_DB connection to examine indexes
|
||||
* @param string base link for <th> fields
|
||||
* @param array
|
||||
* @param array
|
||||
* @return null
|
||||
*/
|
||||
function select($result, $connection2 = null, $href = "", $orgtables = array()) {
|
||||
@@ -49,7 +49,9 @@ function select($result, $connection2 = null, $href = "", $orgtables = array())
|
||||
}
|
||||
$types[$j] = $field->type;
|
||||
$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' class='help'>$name</a>" : $name)
|
||||
;
|
||||
}
|
||||
echo "</thead>\n";
|
||||
}
|
||||
@@ -92,7 +94,7 @@ function select($result, $connection2 = null, $href = "", $orgtables = array())
|
||||
*/
|
||||
function referencable_primary($self) {
|
||||
$return = array(); // table_name => field
|
||||
foreach (table_status() as $table_name => $table) {
|
||||
foreach (table_status('', true) as $table_name => $table) {
|
||||
if ($table_name != $self && fk_support($table)) {
|
||||
foreach (fields($table_name) as $field) {
|
||||
if ($field["primary"]) {
|
||||
@@ -127,15 +129,6 @@ function textarea($name, $value, $rows = 10, $cols = 80) {
|
||||
echo "</textarea>";
|
||||
}
|
||||
|
||||
/** Format time difference
|
||||
* @param string output of microtime()
|
||||
* @param string output of microtime()
|
||||
* @return string HTML code
|
||||
*/
|
||||
function format_time($start, $end) {
|
||||
return " <span class='time'>(" . lang('%.3f s', max(0, array_sum(explode(" ", $end)) - array_sum(explode(" ", $start)))) . ")</span>";
|
||||
}
|
||||
|
||||
/** Print table columns for type edit
|
||||
* @param string
|
||||
* @param array
|
||||
@@ -147,9 +140,10 @@ function edit_type($key, $field, $collations, $foreign_keys = array()) {
|
||||
global $structured_types, $types, $unsigned, $on_actions;
|
||||
?>
|
||||
<td><select name="<?php echo $key; ?>[type]" class="type" onfocus="lastType = selectValue(this);" onchange="editingTypeChange(this);"><?php echo optionlist((!$field["type"] || isset($types[$field["type"]]) ? array() : array($field["type"])) + $structured_types + ($foreign_keys ? array(lang('Foreign keys') => $foreign_keys) : array()), $field["type"]); ?></select>
|
||||
<td><input name="<?php echo $key; ?>[length]" value="<?php echo h($field["length"]); ?>" size="3" onfocus="editingLengthFocus(this);"><td class="options"><?php
|
||||
<td><input name="<?php echo $key; ?>[length]" value="<?php echo h($field["length"]); ?>" size="3" onfocus="editingLengthFocus(this);"><td class="options"><?php //! type="number" with enabled JavaScript
|
||||
echo "<select name='$key" . "[collation]'" . (ereg('(char|text|enum|set)$', $field["type"]) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
|
||||
echo ($unsigned ? "<select name='$key" . "[unsigned]'" . (!$field["type"] || ereg('(int|float|double|decimal)$', $field["type"]) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
|
||||
echo ($unsigned ? "<select name='$key" . "[unsigned]'" . (!$field["type"] || ereg('((^|[^o])int|float|double|decimal)$', $field["type"]) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
|
||||
echo (isset($field['on_update']) ? "<select name='$key" . "[on_update]'" . ($field["type"] == "timestamp" ? "" : " class='hidden'") . '>' . optionlist(array("" => "(" . lang('ON UPDATE') . ")", "CURRENT_TIMESTAMP"), $field["on_update"]) . '</select>' : '');
|
||||
echo ($foreign_keys ? "<select name='$key" . "[on_delete]'" . (ereg("`", $field["type"]) ? "" : " class='hidden'") . "><option value=''>(" . lang('ON DELETE') . ")" . optionlist(explode("|", $on_actions), $field["on_delete"]) . "</select> " : " "); // space for IE
|
||||
}
|
||||
|
||||
@@ -171,7 +165,7 @@ function process_type($field, $collate = "COLLATE") {
|
||||
global $unsigned;
|
||||
return " $field[type]"
|
||||
. ($field["length"] != "" ? "(" . process_length($field["length"]) . ")" : "")
|
||||
. (ereg('int|float|double|decimal', $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "")
|
||||
. (ereg('(^|[^o])int|float|double|decimal', $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "")
|
||||
. (ereg('char|text|enum|set', $field["type"]) && $field["collation"] ? " $collate " . q($field["collation"]) : "")
|
||||
;
|
||||
}
|
||||
@@ -186,8 +180,8 @@ function process_field($field, $type_field) {
|
||||
idf_escape(trim($field["field"])),
|
||||
process_type($type_field),
|
||||
($field["null"] ? " NULL" : " NOT NULL"), // NULL for timestamp
|
||||
(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]" : ""),
|
||||
(isset($field["default"]) ? " DEFAULT " . ((ereg("time", $field["type"]) && eregi('^CURRENT_TIMESTAMP$', $field["default"])) || ($field["type"] == "bit" && ereg("^([0-9]+|b'[0-1]+')\$", $field["default"])) ? $field["default"] : q($field["default"])) : ""),
|
||||
($field["type"] == "timestamp" && $field["on_update"] ? " ON UPDATE $field[on_update]" : ""),
|
||||
(support("comment") && $field["comment"] != "" ? " COMMENT " . q($field["comment"]) : ""),
|
||||
($field["auto_increment"] ? auto_increment() : null),
|
||||
);
|
||||
@@ -214,13 +208,12 @@ function type_class($type) {
|
||||
* @param array
|
||||
* @param array
|
||||
* @param string TABLE or PROCEDURE
|
||||
* @param int number of fields allowed by Suhosin
|
||||
* @param array returned by referencable_primary()
|
||||
* @param bool display comments column
|
||||
* @return null
|
||||
*/
|
||||
function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array(), $comments = false) {
|
||||
global $inout;
|
||||
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array(), $comments = false) {
|
||||
global $connection, $inout;
|
||||
?>
|
||||
<thead><tr class="wrap">
|
||||
<?php if ($type == "PROCEDURE") { ?><td> <?php } ?>
|
||||
@@ -231,7 +224,7 @@ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $forei
|
||||
<?php if ($type == "TABLE") { ?>
|
||||
<td>NULL
|
||||
<td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">AI</acronym>
|
||||
<td<?php echo ($_POST["defaults"] ? "" : " class='hidden'"); ?>><?php echo lang('Default values'); ?>
|
||||
<td><?php echo lang('Default values'); ?>
|
||||
<?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
|
||||
<?php } ?>
|
||||
<td><?php echo "<input type='image' class='icon' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?><script type="text/javascript">row_count = <?php echo count($fields); ?>;</script>
|
||||
@@ -245,18 +238,18 @@ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $forei
|
||||
?>
|
||||
<tr<?php echo ($display ? "" : " style='display: none;'"); ?>>
|
||||
<?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", explode("|", $inout), $field["inout"]) : ""); ?>
|
||||
<th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" 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); "); ?>editingNameChange(this);" maxlength="64" autocapitalize="off"><?php } ?><input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($orig); ?>">
|
||||
<?php edit_type("fields[$i]", $field, $collations, $foreign_keys); ?>
|
||||
<?php if ($type == "TABLE") { ?>
|
||||
<td><?php echo checkbox("fields[$i][null]", 1, $field["null"]); ?>
|
||||
<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<?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'>" : ""); ?>
|
||||
<td><?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='" . ($connection->server_info >= 5.5 ? 1024 : 255) . "'>" : ""); ?>
|
||||
<?php } ?>
|
||||
<?php
|
||||
echo "<td>";
|
||||
echo (support("move_col") ?
|
||||
"<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, $allowed, 1);'> "
|
||||
"<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, 1);'> "
|
||||
. "<input type='image' class='icon' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "'> "
|
||||
. "<input type='image' class='icon' name='down[$i]' src='../adminer/static/down.gif' alt='v' title='" . lang('Move down') . "'> "
|
||||
: "");
|
||||
@@ -267,7 +260,7 @@ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $forei
|
||||
|
||||
/** Move fields up and down or add field
|
||||
* @param array
|
||||
* @return null
|
||||
* @return bool
|
||||
*/
|
||||
function process_fields(&$fields) {
|
||||
ksort($fields);
|
||||
@@ -285,8 +278,7 @@ function process_fields(&$fields) {
|
||||
}
|
||||
$offset++;
|
||||
}
|
||||
}
|
||||
if ($_POST["down"]) {
|
||||
} elseif ($_POST["down"]) {
|
||||
$found = false;
|
||||
foreach ($fields as $key => $field) {
|
||||
if (isset($field["field"]) && $found) {
|
||||
@@ -299,11 +291,13 @@ function process_fields(&$fields) {
|
||||
}
|
||||
$offset++;
|
||||
}
|
||||
}
|
||||
$fields = array_values($fields);
|
||||
if ($_POST["add"]) {
|
||||
} elseif ($_POST["add"]) {
|
||||
$fields = array_values($fields);
|
||||
array_splice($fields, key($_POST["add"]), 0, array(array()));
|
||||
} elseif (!$_POST["drop_col"]) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Callback used in routine()
|
||||
@@ -336,25 +330,78 @@ function grant($grant, $privileges, $columns, $on) {
|
||||
}
|
||||
|
||||
/** Drop old object and create a new one
|
||||
* @param string drop query
|
||||
* @param string create query
|
||||
* @param string drop old object query
|
||||
* @param string create new object query
|
||||
* @param string drop new object query
|
||||
* @param string create test object query
|
||||
* @param string drop test object query
|
||||
* @param string
|
||||
* @param string
|
||||
* @param string
|
||||
* @param string
|
||||
* @param string
|
||||
* @return bool dropped
|
||||
* @param string
|
||||
* @return null redirect in success
|
||||
*/
|
||||
function drop_create($drop, $create, $location, $message_drop, $message_alter, $message_create, $name) {
|
||||
function drop_create($drop, $create, $drop_created, $test, $drop_test, $location, $message_drop, $message_alter, $message_create, $old_name, $new_name) {
|
||||
if ($_POST["drop"]) {
|
||||
return query_redirect($drop, $location, $message_drop, true, !$_POST["dropped"]);
|
||||
query_redirect($drop, $location, $message_drop);
|
||||
} elseif ($old_name == "") {
|
||||
query_redirect($create, $location, $message_create);
|
||||
} elseif ($old_name != $new_name) {
|
||||
$created = queries($create);
|
||||
queries_redirect($location, $message_alter, $created && queries($drop));
|
||||
if ($created) {
|
||||
queries($drop_created);
|
||||
}
|
||||
} else {
|
||||
queries_redirect(
|
||||
$location,
|
||||
$message_alter,
|
||||
queries($test) && queries($drop_test) && queries($drop) && queries($create)
|
||||
);
|
||||
}
|
||||
$dropped = $name != "" && ($_POST["dropped"] || queries($drop));
|
||||
$created = queries($create);
|
||||
if (!queries_redirect($location, ($name != "" ? $message_alter : $message_create), $created) && $dropped) {
|
||||
redirect(null, $message_drop);
|
||||
}
|
||||
|
||||
/** Generate SQL query for creating trigger
|
||||
* @param string
|
||||
* @param array result of trigger()
|
||||
* @return string
|
||||
*/
|
||||
function create_trigger($on, $row) {
|
||||
global $jush;
|
||||
$timing_event = " $row[Timing] $row[Event]";
|
||||
return "CREATE TRIGGER "
|
||||
. idf_escape($row["Trigger"])
|
||||
. ($jush == "mssql" ? $on . $timing_event : $timing_event . $on)
|
||||
. rtrim(" $row[Type]\n$row[Statement]", ";")
|
||||
. ";"
|
||||
;
|
||||
}
|
||||
|
||||
/** Generate SQL query for creating routine
|
||||
* @param string "PROCEDURE" or "FUNCTION"
|
||||
* @param array result of routine()
|
||||
* @return string
|
||||
*/
|
||||
function create_routine($routine, $row) {
|
||||
global $inout;
|
||||
$set = array();
|
||||
$fields = (array) $row["fields"];
|
||||
ksort($fields); // enforce fields order
|
||||
foreach ($fields as $field) {
|
||||
if ($field["field"] != "") {
|
||||
$set[] = (ereg("^($inout)\$", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET");
|
||||
}
|
||||
}
|
||||
return $dropped;
|
||||
return "CREATE $routine "
|
||||
. idf_escape(trim($row["name"]))
|
||||
. " (" . implode(", ", $set) . ")"
|
||||
. (isset($_GET["function"]) ? " RETURNS" . process_type($row["returns"], "CHARACTER SET") : "")
|
||||
. ($row["language"] ? " LANGUAGE $row[language]" : "")
|
||||
. rtrim("\n$row[definition]", ";")
|
||||
. ";"
|
||||
;
|
||||
}
|
||||
|
||||
/** Remove current user definer from SQL command
|
||||
@@ -365,19 +412,22 @@ function remove_definer($query) {
|
||||
return preg_replace('~^([A-Z =]+) DEFINER=`' . preg_replace('~@(.*)~', '`@`(%|\\1)', logged_user()) . '`~', '\\1', $query); //! proper escaping of user
|
||||
}
|
||||
|
||||
/** Get string to add a file in TAR
|
||||
/** Add a file to TAR
|
||||
* @param string
|
||||
* @param string
|
||||
* @return string
|
||||
* @param TmpFile
|
||||
* @return null prints the output
|
||||
*/
|
||||
function tar_file($filename, $contents) {
|
||||
$return = pack("a100a8a8a8a12a12", $filename, 644, 0, 0, decoct(strlen($contents)), decoct(time()));
|
||||
function tar_file($filename, $tmp_file) {
|
||||
$return = pack("a100a8a8a8a12a12", $filename, 644, 0, 0, decoct($tmp_file->size), decoct(time()));
|
||||
$checksum = 8*32; // space for checksum itself
|
||||
for ($i=0; $i < strlen($return); $i++) {
|
||||
$checksum += ord($return[$i]);
|
||||
}
|
||||
$return .= sprintf("%06o", $checksum) . "\0 ";
|
||||
return $return . str_repeat("\0", 512 - strlen($return)) . $contents . str_repeat("\0", 511 - (strlen($contents) + 511) % 512);
|
||||
echo $return;
|
||||
echo str_repeat("\0", 512 - strlen($return));
|
||||
$tmp_file->send();
|
||||
echo str_repeat("\0", 511 - ($tmp_file->size + 511) % 512);
|
||||
}
|
||||
|
||||
/** Get INI bytes value
|
||||
|
@@ -303,7 +303,7 @@ function get_rows($query, $connection2 = null, $error = "<p class='error'>") {
|
||||
/** Find unique identifier of a row
|
||||
* @param array
|
||||
* @param array result of indexes()
|
||||
* @return array
|
||||
* @return array or null if there is no unique identifier
|
||||
*/
|
||||
function unique_array($row, $indexes) {
|
||||
foreach ($indexes as $index) {
|
||||
@@ -318,25 +318,21 @@ function unique_array($row, $indexes) {
|
||||
return $return;
|
||||
}
|
||||
}
|
||||
$return = array();
|
||||
foreach ($row as $key => $val) {
|
||||
if (!preg_match('~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~', $key)) { //! columns looking like functions
|
||||
$return[$key] = $val;
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/** Create SQL condition from parsed query string
|
||||
* @param array parsed query string
|
||||
* @param array
|
||||
* @return string
|
||||
*/
|
||||
function where($where) {
|
||||
function where($where, $fields = array()) {
|
||||
global $jush;
|
||||
$return = array();
|
||||
$function_pattern = '(^[\w\(]+' . str_replace("_", ".*", preg_quote(idf_escape("_"))) . '\)+$)'; //! columns looking like functions
|
||||
foreach ((array) $where["where"] as $key => $val) {
|
||||
$return[] = idf_escape(bracket_escape($key, 1)) // 1 - back
|
||||
. (($jush == "sql" && 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
|
||||
$key = bracket_escape($key, 1); // 1 - back
|
||||
$return[] = (preg_match($function_pattern, $key) ? $key : idf_escape($key)) //! SQL injection
|
||||
. (($jush == "sql" && ereg('\\.', $val)) || $jush == "mssql" ? " LIKE " . exact_value(addcslashes($val, "%_\\")) : " = " . unconvert_field($fields[$key], exact_value($val))) // LIKE because of floats, but slow with ints, in MS SQL because of text
|
||||
; //! enum and set
|
||||
}
|
||||
foreach ((array) $where["null"] as $key) {
|
||||
@@ -347,25 +343,46 @@ function where($where) {
|
||||
|
||||
/** Create SQL condition from query string
|
||||
* @param string
|
||||
* @param array
|
||||
* @return string
|
||||
*/
|
||||
function where_check($val) {
|
||||
function where_check($val, $fields = array()) {
|
||||
parse_str($val, $check);
|
||||
remove_slashes(array(&$check));
|
||||
return where($check);
|
||||
return where($check, $fields);
|
||||
}
|
||||
|
||||
/** Create query string where condition from value
|
||||
* @param int condition order
|
||||
* @param string column identifier
|
||||
* @param string
|
||||
* @return string
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function where_link($i, $column, $value, $operator = "=") {
|
||||
return "&where%5B$i%5D%5Bcol%5D=" . urlencode($column) . "&where%5B$i%5D%5Bop%5D=" . urlencode(($value !== null ? $operator : "IS NULL")) . "&where%5B$i%5D%5Bval%5D=" . urlencode($value);
|
||||
}
|
||||
|
||||
/** Get select clause for convertible fields
|
||||
* @param array
|
||||
* @param array
|
||||
* @param array
|
||||
* @return string
|
||||
*/
|
||||
function convert_fields($columns, $fields, $select = array()) {
|
||||
$return = "";
|
||||
foreach ($columns as $key => $val) {
|
||||
if ($select && !in_array(idf_escape($key), $select)) {
|
||||
continue;
|
||||
}
|
||||
$as = convert_field($fields[$key]);
|
||||
if ($as) {
|
||||
$return .= ", $as AS " . idf_escape($key);
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/** Set cookie valid for 1 month
|
||||
* @param string
|
||||
* @param string
|
||||
@@ -478,12 +495,15 @@ function redirect($location, $message = null) {
|
||||
*/
|
||||
function query_redirect($query, $location, $message, $redirect = true, $execute = true, $failed = false) {
|
||||
global $connection, $error, $adminer;
|
||||
$time = "";
|
||||
if ($execute) {
|
||||
$start = microtime();
|
||||
$failed = !$connection->query($query);
|
||||
$time = "; -- " . format_time($start, microtime());
|
||||
}
|
||||
$sql = "";
|
||||
if ($query) {
|
||||
$sql = $adminer->messageQuery("$query;");
|
||||
$sql = $adminer->messageQuery($query . $time);
|
||||
}
|
||||
if ($failed) {
|
||||
$error = error() . $sql;
|
||||
@@ -504,10 +524,13 @@ function queries($query = null) {
|
||||
static $queries = array();
|
||||
if ($query === null) {
|
||||
// return executed queries without parameter
|
||||
return implode(";\n", $queries);
|
||||
return implode("\n", $queries);
|
||||
}
|
||||
$queries[] = (ereg(';$', $query) ? "DELIMITER ;;\n$query;\nDELIMITER " : $query);
|
||||
return $connection->query($query);
|
||||
$start = microtime();
|
||||
$return = $connection->query($query);
|
||||
$queries[] = (ereg(';$', $query) ? "DELIMITER ;;\n$query;\nDELIMITER " : $query)
|
||||
. "; -- " . format_time($start, microtime());
|
||||
return $return;
|
||||
}
|
||||
|
||||
/** Apply command to all array items
|
||||
@@ -535,6 +558,15 @@ function queries_redirect($location, $message, $redirect) {
|
||||
return query_redirect(queries(), $location, $message, $redirect, false, !$redirect);
|
||||
}
|
||||
|
||||
/** Format time difference
|
||||
* @param string output of microtime()
|
||||
* @param string output of microtime()
|
||||
* @return string HTML code
|
||||
*/
|
||||
function format_time($start, $end) {
|
||||
return lang('%.3f s', max(0, array_sum(explode(" ", $end)) - array_sum(explode(" ", $start))));
|
||||
}
|
||||
|
||||
/** Remove parameter from query string
|
||||
* @param string
|
||||
* @return string
|
||||
@@ -545,6 +577,7 @@ function remove_from_uri($param = "") {
|
||||
|
||||
/** Generate page number for pagination
|
||||
* @param int
|
||||
* @param int
|
||||
* @return string
|
||||
*/
|
||||
function pagination($page, $current) {
|
||||
@@ -558,21 +591,34 @@ function pagination($page, $current) {
|
||||
*/
|
||||
function get_file($key, $decompress = false) {
|
||||
$file = $_FILES[$key];
|
||||
if (!$file || $file["error"]) {
|
||||
return $file["error"];
|
||||
if (!$file) {
|
||||
return null;
|
||||
}
|
||||
$return = file_get_contents($decompress && ereg('\\.gz$', $file["name"]) ? "compress.zlib://$file[tmp_name]"
|
||||
: ($decompress && ereg('\\.bz2$', $file["name"]) ? "compress.bzip2://$file[tmp_name]"
|
||||
: $file["tmp_name"]
|
||||
)); //! may not be reachable because of open_basedir
|
||||
if ($decompress) {
|
||||
$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);
|
||||
} elseif ($start == "\xEF\xBB\xBF") { // UTF-8 BOM
|
||||
$return = substr($return, 3);
|
||||
foreach ($file as $key => $val) {
|
||||
$file[$key] = (array) $val;
|
||||
}
|
||||
$return = '';
|
||||
foreach ($file["error"] as $key => $error) {
|
||||
if ($error) {
|
||||
return $error;
|
||||
}
|
||||
$name = $file["name"][$key];
|
||||
$tmp_name = $file["tmp_name"][$key];
|
||||
$content = file_get_contents($decompress && ereg('\\.gz$', $name)
|
||||
? "compress.zlib://$tmp_name"
|
||||
: $tmp_name
|
||||
); //! may not be reachable because of open_basedir
|
||||
if ($decompress) {
|
||||
$start = substr($content, 0, 3);
|
||||
if (function_exists("iconv") && ereg("^\xFE\xFF|^\xFF\xFE", $start, $regs)) { // not ternary operator to save memory
|
||||
$content = iconv("utf-16", "utf-8", $content);
|
||||
} elseif ($start == "\xEF\xBB\xBF") { // UTF-8 BOM
|
||||
$content = substr($content, 3);
|
||||
}
|
||||
}
|
||||
$return .= $content . "\n\n";
|
||||
}
|
||||
//! support SQL files not ending with semicolon
|
||||
return $return;
|
||||
}
|
||||
|
||||
@@ -694,7 +740,7 @@ function enum_input($type, $attrs, $field, $value, $empty = null) {
|
||||
* @return null
|
||||
*/
|
||||
function input($field, $value, $function) {
|
||||
global $types, $adminer, $jush;
|
||||
global $connection, $types, $adminer, $jush;
|
||||
$name = h(bracket_escape($field["field"]));
|
||||
echo "<td class='function'>";
|
||||
$reset = ($jush == "mssql" && $field["auto_increment"]);
|
||||
@@ -739,7 +785,11 @@ function input($field, $value, $function) {
|
||||
} else {
|
||||
// int(3) is only a display hint
|
||||
$maxlength = (!ereg('int', $field["type"]) && preg_match('~^(\\d+)(,(\\d+))?$~', $field["length"], $match) ? ((ereg("binary", $field["type"]) ? 2 : 1) * $match[1] + ($match[3] ? 1 : 0) + ($match[2] && !$field["unsigned"] ? 1 : 0)) : ($types[$field["type"]] ? $types[$field["type"]] + ($field["unsigned"] ? 0 : 1) : 0));
|
||||
echo "<input value='" . h($value) . "'" . ($maxlength ? " maxlength='$maxlength'" : "") . (ereg('char|binary', $field["type"]) && $maxlength > 20 ? " size='40'" : "") . "$attrs>";
|
||||
if ($connection->server_info >= 5.6 && ereg('time', $field["type"])) {
|
||||
$maxlength += 7; // microtime
|
||||
}
|
||||
// type='date' and type='time' display localized value which may be confusing, type='datetime' uses 'T' as date and time separator
|
||||
echo "<input" . (ereg('int', $field["type"]) ? " type='number'" : "") . " value='" . h($value) . "'" . ($maxlength ? " maxlength='$maxlength'" : "") . (ereg('char|binary', $field["type"]) && $maxlength > 20 ? " size='40'" : "") . "$attrs>";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -794,7 +844,7 @@ function search_tables() {
|
||||
$_GET["where"][0]["op"] = "LIKE %%";
|
||||
$_GET["where"][0]["val"] = $_POST["query"];
|
||||
$found = false;
|
||||
foreach (table_status() as $table => $table_status) {
|
||||
foreach (table_status('', true) as $table => $table_status) {
|
||||
$name = $adminer->tableName($table_status);
|
||||
if (isset($table_status["Engine"]) && $name != "" && (!$_POST["tables"] || in_array($table, $_POST["tables"]))) {
|
||||
$result = $connection->query("SELECT" . limit("1 FROM " . table($table), " WHERE " . implode(" AND ", $adminer->selectSearchProcess(fields($table), array())), 1));
|
||||
@@ -825,6 +875,8 @@ function dump_headers($identifier, $multi_table = false) {
|
||||
header("Content-Disposition: attachment; filename=" . $adminer->dumpFilename($identifier) . ".$return" . ($output != "file" && !ereg('[^0-9a-z]', $output) ? ".$output" : ""));
|
||||
}
|
||||
session_write_close();
|
||||
ob_flush();
|
||||
flush();
|
||||
return $return;
|
||||
}
|
||||
|
||||
@@ -901,6 +953,14 @@ function is_url($string) {
|
||||
return (preg_match("~^(https?)://($domain?\\.)+$domain(:\\d+)?(/.*)?(\\?.*)?(#.*)?\$~i", $string, $match) ? strtolower($match[1]) : ""); //! restrict path, query and fragment characters
|
||||
}
|
||||
|
||||
/** Check if field should be shortened
|
||||
* @param array
|
||||
* @return bool
|
||||
*/
|
||||
function is_shortable($field) {
|
||||
return ereg('char|text|lob|geometry|point|linestring|polygon', $field["type"]);
|
||||
}
|
||||
|
||||
/** Run query which can be killed by AJAX call after timing out
|
||||
* @param string
|
||||
* @return Min_Result
|
||||
|
@@ -70,11 +70,11 @@ function lang($idf, $number = null) {
|
||||
}
|
||||
|
||||
function switch_lang() {
|
||||
global $LANG, $langs, $token;
|
||||
global $LANG, $langs;
|
||||
echo "<form action='' method='post'>\n<div id='lang'>";
|
||||
echo lang('Language') . ": " . html_select("lang", $langs, $LANG, "this.form.submit();");
|
||||
echo " <input type='submit' value='" . lang('Use') . "' class='hidden'>\n";
|
||||
echo "<input type='hidden' name='token' value='$token'>\n";
|
||||
echo "<input type='hidden' name='token' value='$_SESSION[token]'>\n"; // $token may be empty in auth.inc.php
|
||||
echo "</div>\n</form>\n";
|
||||
}
|
||||
|
||||
|
@@ -2,11 +2,11 @@
|
||||
// PDO can be used in several database drivers
|
||||
if (extension_loaded('pdo')) {
|
||||
/*abstract*/ class Min_PDO extends PDO {
|
||||
var $_result, $server_info, $affected_rows, $error;
|
||||
var $_result, $server_info, $affected_rows, $errno, $error;
|
||||
|
||||
function __construct() {
|
||||
global $adminer;
|
||||
$pos = array_search("", $adminer->operators);
|
||||
$pos = array_search("SQL", $adminer->operators);
|
||||
if ($pos !== false) {
|
||||
unset($adminer->operators[$pos]);
|
||||
}
|
||||
@@ -26,8 +26,7 @@ if (extension_loaded('pdo')) {
|
||||
$result = parent::query($query);
|
||||
$this->error = "";
|
||||
if (!$result) {
|
||||
$errorInfo = $this->errorInfo();
|
||||
$this->error = $errorInfo[2];
|
||||
list(, $this->errno, $this->error) = $this->errorInfo();
|
||||
return false;
|
||||
}
|
||||
$this->store_result($result);
|
||||
@@ -41,6 +40,9 @@ if (extension_loaded('pdo')) {
|
||||
function store_result($result = null) {
|
||||
if (!$result) {
|
||||
$result = $this->_result;
|
||||
if (!$result) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if ($result->columnCount()) {
|
||||
$result->num_rows = $result->rowCount(); // is not guaranteed to work with all drivers
|
||||
@@ -51,6 +53,9 @@ if (extension_loaded('pdo')) {
|
||||
}
|
||||
|
||||
function next_result() {
|
||||
if (!$this->_result) {
|
||||
return false;
|
||||
}
|
||||
$this->_result->_offset = 0;
|
||||
return @$this->_result->nextRowset(); // @ - PDO_PgSQL doesn't support it
|
||||
}
|
||||
|
22
adminer/include/tmpfile.inc.php
Normal file
22
adminer/include/tmpfile.inc.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
class TmpFile {
|
||||
var $handler;
|
||||
var $size;
|
||||
|
||||
function TmpFile() {
|
||||
$this->handler = tmpfile();
|
||||
}
|
||||
|
||||
function write($contents) {
|
||||
$this->size += strlen($contents);
|
||||
fwrite($this->handler, $contents);
|
||||
}
|
||||
|
||||
function send() {
|
||||
fseek($this->handler, 0);
|
||||
fpassthru($this->handler);
|
||||
fclose($this->handler);
|
||||
}
|
||||
|
||||
}
|
@@ -1,2 +1,2 @@
|
||||
<?php
|
||||
$VERSION = "3.6.0";
|
||||
$VERSION = "3.7.0";
|
||||
|
@@ -8,6 +8,7 @@
|
||||
*/
|
||||
|
||||
include "./include/bootstrap.inc.php";
|
||||
include "./include/tmpfile.inc.php";
|
||||
|
||||
$enum_length = "'(?:''|[^'\\\\]|\\\\.)*+'";
|
||||
$inout = "IN|OUT|INOUT";
|
||||
@@ -21,6 +22,7 @@ if (isset($_GET["callf"])) {
|
||||
if (isset($_GET["function"])) {
|
||||
$_GET["procedure"] = $_GET["function"];
|
||||
}
|
||||
|
||||
if (isset($_GET["download"])) {
|
||||
include "./download.inc.php";
|
||||
} elseif (isset($_GET["table"])) {
|
||||
|
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
$TABLE = $_GET["indexes"];
|
||||
$index_types = array("PRIMARY", "UNIQUE", "INDEX");
|
||||
$table_status = table_status($TABLE);
|
||||
if (eregi("MyISAM|M?aria", $table_status["Engine"])) {
|
||||
$table_status = table_status($TABLE, true);
|
||||
if (eregi("MyISAM|M?aria" . ($connection->server_info >= 5.6 ? "|InnoDB" : ""), $table_status["Engine"])) {
|
||||
$index_types[] = "FULLTEXT";
|
||||
}
|
||||
$indexes = indexes($TABLE);
|
||||
@@ -10,9 +10,11 @@ if ($jush == "sqlite") { // doesn't support primary key
|
||||
unset($index_types[0]);
|
||||
unset($indexes[""]);
|
||||
}
|
||||
$row = $_POST;
|
||||
|
||||
if ($_POST && !$error && !$_POST["add"]) {
|
||||
$alter = array();
|
||||
foreach ($_POST["indexes"] as $index) {
|
||||
foreach ($row["indexes"] as $index) {
|
||||
$name = $index["name"];
|
||||
if (in_array($index["type"], $index_types)) {
|
||||
$columns = array();
|
||||
@@ -27,6 +29,7 @@ if ($_POST && !$error && !$_POST["add"]) {
|
||||
$lengths[] = ($length ? $length : null);
|
||||
}
|
||||
}
|
||||
|
||||
if ($columns) {
|
||||
$existing = $indexes[$name];
|
||||
if ($existing) {
|
||||
@@ -42,6 +45,7 @@ if ($_POST && !$error && !$_POST["add"]) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// drop removed indexes
|
||||
foreach ($indexes as $name => $existing) {
|
||||
$alter[] = array($existing["type"], $name, "DROP");
|
||||
@@ -55,26 +59,24 @@ if ($_POST && !$error && !$_POST["add"]) {
|
||||
page_header(lang('Indexes'), $error, array("table" => $TABLE), $TABLE);
|
||||
|
||||
$fields = array_keys(fields($TABLE));
|
||||
$row = array("indexes" => $indexes);
|
||||
if ($_POST) {
|
||||
$row = $_POST;
|
||||
if ($_POST["add"]) {
|
||||
foreach ($row["indexes"] as $key => $index) {
|
||||
if ($index["columns"][count($index["columns"])] != "") {
|
||||
$row["indexes"][$key]["columns"][] = "";
|
||||
}
|
||||
}
|
||||
$index = end($row["indexes"]);
|
||||
if ($index["type"] || array_filter($index["columns"], 'strlen') || array_filter($index["lengths"], 'strlen')) {
|
||||
$row["indexes"][] = array("columns" => array(1 => ""));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($_POST["add"]) {
|
||||
foreach ($row["indexes"] as $key => $index) {
|
||||
$row["indexes"][$key]["name"] = $key;
|
||||
$row["indexes"][$key]["columns"][] = "";
|
||||
if ($index["columns"][count($index["columns"])] != "") {
|
||||
$row["indexes"][$key]["columns"][] = "";
|
||||
}
|
||||
}
|
||||
$row["indexes"][] = array("columns" => array(1 => ""));
|
||||
$index = end($row["indexes"]);
|
||||
if ($index["type"] || array_filter($index["columns"], 'strlen') || array_filter($index["lengths"], 'strlen')) {
|
||||
$row["indexes"][] = array("columns" => array(1 => ""));
|
||||
}
|
||||
}
|
||||
if (!$row) {
|
||||
foreach ($indexes as $key => $index) {
|
||||
$indexes[$key]["name"] = $key;
|
||||
$indexes[$key]["columns"][] = "";
|
||||
}
|
||||
$indexes[] = array("columns" => array(1 => ""));
|
||||
$row["indexes"] = $indexes;
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -86,13 +88,15 @@ $j = 1;
|
||||
foreach ($row["indexes"] as $index) {
|
||||
echo "<tr><td>" . html_select("indexes[$j][type]", array(-1 => "") + $index_types, $index["type"], ($j == count($row["indexes"]) ? "indexesAddRow(this);" : 1)) . "<td>";
|
||||
ksort($index["columns"]);
|
||||
|
||||
$i = 1;
|
||||
foreach ($index["columns"] as $key => $column) {
|
||||
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 type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "'> </span>"; //! hide for non-MySQL drivers, add ASC|DESC
|
||||
$i++;
|
||||
}
|
||||
echo "<td><input name='indexes[$j][name]' value='" . h($index["name"]) . "'>\n";
|
||||
|
||||
echo "<td><input name='indexes[$j][name]' value='" . h($index["name"]) . "' autocapitalize='off'>\n";
|
||||
$j++;
|
||||
}
|
||||
?>
|
||||
|
@@ -188,7 +188,7 @@ $translations = array(
|
||||
'%d item(s) have been affected.' => 'عدد العناصر المعدلة هو %d.',
|
||||
'whole result' => 'نتيجة كاملة',
|
||||
'Clone' => 'نسخ',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'لقد تجاوزت العدد الأقصى للحقول. يرجى الرفع من %s و %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'لقد تجاوزت العدد الأقصى للحقول. يرجى الرفع من %s.',
|
||||
'Partition by' => 'مقسم بواسطة',
|
||||
'Partitions' => 'التقسيمات',
|
||||
'Partition name' => 'إسم التقسيم',
|
||||
@@ -243,7 +243,6 @@ $translations = array(
|
||||
'Alter type' => 'تعديل نوع',
|
||||
'Type has been dropped.' => 'تم حذف النوع.',
|
||||
'Type has been created.' => 'تم إنشاء النوع.',
|
||||
'Double click on a value to modify it.' => 'أنقر نقرا مزدوجا على قيمة لتعديلها.',
|
||||
'Use edit link to modify this value.' => 'إستعمل الرابط "تعديل" لتعديل هذه القيمة.',
|
||||
'last' => 'الأخيرة',
|
||||
'From server' => 'من الخادم',
|
||||
@@ -259,7 +258,6 @@ $translations = array(
|
||||
'now' => 'الآن',
|
||||
'%d query(s) executed OK.' => array('تم تنفيذ الإستعلام %d بنجاح.', 'تم تنفيذ الإستعلامات %d بنجاح.'),
|
||||
'Show only errors' => 'إعرض الأخطاء فقط',
|
||||
'Last page' => 'الصفحة السابقة',
|
||||
'Refresh' => 'تحديث',
|
||||
'Invalid schema.' => 'مخطط خاطئ.',
|
||||
'Please use one of the extensions %s.' => 'من فضلك إستعمل إحدى الإمتدادات: %s.',
|
||||
|
@@ -190,7 +190,7 @@ $translations = array(
|
||||
'%d item(s) have been affected.' => '%d টি বিষয়বস্তু প্রভাবিত হয়েছে',
|
||||
'whole result' => 'সম্পূর্ণ ফলাফল',
|
||||
'Clone' => 'ক্লোন',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'অনুমোদিত ফিল্ড এর সর্বাধিক সংখ্যা অতিক্রম করে গেছে। অনুগ্রহপূর্বক %s এবং %s বৃদ্ধি করুন।',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'অনুমোদিত ফিল্ড এর সর্বাধিক সংখ্যা অতিক্রম করে গেছে। অনুগ্রহপূর্বক %s বৃদ্ধি করুন।',
|
||||
'Partition by' => 'পার্টিশন যার মাধ্যমে',
|
||||
'Partitions' => 'পার্টিশন',
|
||||
'Partition name' => 'পার্টিশনের নাম',
|
||||
@@ -244,7 +244,6 @@ $translations = array(
|
||||
'Alter type' => 'টাইপ পরিবর্তন করো',
|
||||
'Type has been dropped.' => 'টাইপ মুছে ফেলা হয়েছে।',
|
||||
'Type has been created.' => 'টাইপ তৈরি করা হয়েছে।',
|
||||
'Double click on a value to modify it.' => 'কোন মানকে পরিবর্তন করতে এতে ডবল ক্লিক করো।',
|
||||
'Use edit link to modify this value.' => 'এই মান পরিবর্তনের জন্য সম্পাদনা লিঙ্ক ব্যবহার করো।',
|
||||
'last' => 'সর্বশেষ',
|
||||
'From server' => 'সার্ভার থেকে',
|
||||
@@ -258,7 +257,6 @@ $translations = array(
|
||||
'Attachments' => 'সংযুক্তি',
|
||||
'%d query(s) executed OK.' => array('SQL-কোয়্যারী সফলভাবে সম্পন্ন হয়েছে', '%d SQL-কোয়্যারীসমূহ সফলভাবে সম্পন্ন হয়েছে'),
|
||||
'Show only errors' => 'শুধুমাত্র ত্রুটি দেখাও',
|
||||
'Last page' => 'শেষ পাতা',
|
||||
'Refresh' => 'রিফ্রেশ',
|
||||
'Invalid schema.' => 'অবৈধ স্কিমা।',
|
||||
'Please use one of the extensions %s.' => 'কোন একটা এক্সটেনশন %s ব্যবহার করো।',
|
||||
|
@@ -199,7 +199,7 @@ $translations = array(
|
||||
'Show structure' => 'Mostra l\'estructura',
|
||||
'Select data' => 'Selecciona dades',
|
||||
'Stop on error' => 'Atura en trobar un error',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'S\'ha assolit el nombre màxim de camps. Incrementa %s i %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'S\'ha assolit el nombre màxim de camps. Incrementa %s.',
|
||||
'anywhere' => 'a qualsevol lloc',
|
||||
'%.3f s' => '%.3f s',
|
||||
'$1-$3-$5' => '$5/$3/$1',
|
||||
@@ -233,7 +233,7 @@ $translations = array(
|
||||
'Geometry' => 'Geometria',
|
||||
'Databases have been dropped.' => 'S\'han suprimit les bases de dades.',
|
||||
'File exists.' => 'El fitxer ja existeix.',
|
||||
'Double click on a value to modify it.' => 'Fes un doble clic a un valor per modificar-lo.',
|
||||
'Ctrl+click on a value to modify it.' => 'Fes un Ctrl+clic a un valor per modificar-lo.',
|
||||
'Use edit link to modify this value.' => 'Utilitza l\'enllaç d\'edició per modificar aquest valor.',
|
||||
'Alter schema' => 'Modifica l\'esquema',
|
||||
'Create schema' => 'Crea un esquema',
|
||||
@@ -259,7 +259,6 @@ $translations = array(
|
||||
'now' => 'ara',
|
||||
'%d query(s) executed OK.' => array('%d consulta executada correctament.', '%d consultes executades correctament.'),
|
||||
'Show only errors' => 'Mostra només els errors',
|
||||
'Last page' => 'Darrera plana',
|
||||
'Refresh' => 'Refresca',
|
||||
'Invalid schema.' => 'Esquema invàlid.',
|
||||
'Please use one of the extensions %s.' => 'Si us plau, utilitza una de les extensions %s.',
|
||||
|
@@ -166,7 +166,7 @@ $translations = array(
|
||||
'Move up' => 'Přesunout nahoru',
|
||||
'Move down' => 'Přesunout dolů',
|
||||
'Remove' => 'Odebrat',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Byl překročen maximální povolený počet polí. Zvyšte prosím %s a %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Byl překročen maximální povolený počet polí. Zvyšte prosím %s.',
|
||||
|
||||
'Partition by' => 'Rozdělit podle',
|
||||
'Partitions' => 'Oddíly',
|
||||
@@ -233,7 +233,6 @@ $translations = array(
|
||||
'%d row(s)' => array('%d řádek', '%d řádky', '%d řádků'),
|
||||
'Page' => 'Stránka',
|
||||
'last' => 'poslední',
|
||||
'Last page' => 'Poslední stránka',
|
||||
'Load more data' => 'Nahrát další data',
|
||||
'Loading' => 'Nahrává se',
|
||||
'whole result' => 'celý výsledek',
|
||||
@@ -243,7 +242,7 @@ $translations = array(
|
||||
'%d row(s) have been imported.' => array('Byl importován %d záznam.', 'Byly importovány %d záznamy.', 'Bylo importováno %d záznamů.'),
|
||||
|
||||
// in-place editing in select
|
||||
'Double click on a value to modify it.' => 'Dvojklikněte na políčko, které chcete změnit.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+klikněte na políčko, které chcete změnit.',
|
||||
'Use edit link to modify this value.' => 'Ke změně této hodnoty použijte odkaz upravit.',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
@@ -263,6 +262,7 @@ $translations = array(
|
||||
'Save and insert next' => 'Uložit a vložit další',
|
||||
'Clone' => 'Klonovat',
|
||||
'Delete' => 'Smazat',
|
||||
'You have no privileges to update this table.' => 'Nemáte oprávnění editovat tuto tabulku.',
|
||||
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Odesílatel',
|
||||
|
@@ -190,7 +190,7 @@ $translations = array(
|
||||
'%d item(s) have been affected.' => '%d Artikel betroffen.',
|
||||
'whole result' => 'Gesamtergebnis',
|
||||
'Clone' => 'Klonen',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Die maximal erlaubte Anzahl der Felder ist überschritten. Bitte %s und %s erhöhen.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Die maximal erlaubte Anzahl der Felder ist überschritten. Bitte %s erhöhen.',
|
||||
'Partition by' => 'Partitionieren um',
|
||||
'Partitions' => 'Partitionen',
|
||||
'Partition name' => 'Name der Partition',
|
||||
@@ -244,7 +244,7 @@ $translations = array(
|
||||
'Alter type' => 'Typ ändern',
|
||||
'Type has been dropped.' => 'Typ gelöscht.',
|
||||
'Type has been created.' => 'Typ erstellt.',
|
||||
'Double click on a value to modify it.' => 'Doppelklick zum Bearbeiten des Wertes.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+klick zum Bearbeiten des Wertes.',
|
||||
'Use edit link to modify this value.' => 'Benutzen Sie den Link zum editieren dieses Wertes.',
|
||||
'last' => 'letzte',
|
||||
'From server' => 'Im Server',
|
||||
@@ -258,7 +258,6 @@ $translations = array(
|
||||
'Attachments' => 'Anhänge',
|
||||
'%d query(s) executed OK.' => array('SQL-Query erfolgreich ausgeführt.', '%d SQL-Queries erfolgreich ausgeführt.'),
|
||||
'Show only errors' => 'Nur Fehler anzeigen',
|
||||
'Last page' => 'Letzte Seite',
|
||||
'Refresh' => 'Aktualisieren',
|
||||
'Invalid schema.' => 'Schema nicht gültig.',
|
||||
'Please use one of the extensions %s.' => 'Bitte einen der Dateitypen %s benutzen.',
|
||||
|
@@ -190,7 +190,7 @@ $translations = array(
|
||||
'%d item(s) have been affected.' => array('%d ítem afectado.', '%d itemes afectados.'),
|
||||
'whole result' => 'resultado completo',
|
||||
'Clone' => 'Clonar',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Cantida máxima de campos permitidos excedidos. Por favor aumente %s y %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Cantida máxima de campos permitidos excedidos. Por favor aumente %s.',
|
||||
'Partition by' => 'Particionar por',
|
||||
'Partitions' => 'Particiones',
|
||||
'Partition name' => 'Nombre de Partición',
|
||||
@@ -244,7 +244,7 @@ $translations = array(
|
||||
'Alter type' => 'Modificar tipo',
|
||||
'Type has been dropped.' => 'Tipo eliminado.',
|
||||
'Type has been created.' => 'Tipo creado.',
|
||||
'Double click on a value to modify it.' => 'Doble-clic sobre el valor para editarlo.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+clic sobre el valor para editarlo.',
|
||||
'Use edit link to modify this value.' => 'Utilice el enlace de modificar para realizar los cambios.',
|
||||
'last' => 'último',
|
||||
'From server' => 'Desde servidor',
|
||||
@@ -258,7 +258,6 @@ $translations = array(
|
||||
'Attachments' => 'Adjuntos',
|
||||
'%d query(s) executed OK.' => array('%d sentencia sql ejecutada correctamente.', '%d sentencias sql ejecutadas correctamente.'),
|
||||
'Show only errors' => 'Mostrar solamente errores',
|
||||
'Last page' => 'Ultima página',
|
||||
'Refresh' => 'Refrescar',
|
||||
'Invalid schema.' => 'Esquema inválido.',
|
||||
'Please use one of the extensions %s.' => 'Por favor use una de las extensiones %s.',
|
||||
|
@@ -190,7 +190,7 @@ $translations = array(
|
||||
'%d item(s) have been affected.' => 'Mõjutatud kirjeid: %d.',
|
||||
'whole result' => 'Täielikud tulemused',
|
||||
'Clone' => 'Kloon',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Maksimaalne väljade arv ületatud. Palun suurendage %s ja %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maksimaalne väljade arv ületatud. Palun suurendage %s.',
|
||||
'Partition by' => 'Partitsiooni',
|
||||
'Partitions' => 'Partitsioonid',
|
||||
'Partition name' => 'Partitsiooni nimi',
|
||||
@@ -244,7 +244,7 @@ $translations = array(
|
||||
'Alter type' => 'Muuda tüüpi',
|
||||
'Type has been dropped.' => 'Tüüp on edukalt kustutatud.',
|
||||
'Type has been created.' => 'Tüüp on edukalt loodud.',
|
||||
'Double click on a value to modify it.' => 'Väärtuse muutmiseks topelt-kliki sellel.',
|
||||
'Ctrl+click on a value to modify it.' => 'Väärtuse muutmiseks Ctrl+kliki sellel.',
|
||||
'Use edit link to modify this value.' => 'Väärtuse muutmiseks kasuta muutmislinki.',
|
||||
'last' => 'viimane',
|
||||
'From server' => 'Serverist',
|
||||
@@ -258,7 +258,6 @@ $translations = array(
|
||||
'Attachments' => 'Manused',
|
||||
'%d query(s) executed OK.' => array('%d päring edukalt käivitatud.', '%d päringut edukalt käivitatud.'),
|
||||
'Show only errors' => 'Kuva vaid veateateid',
|
||||
'Last page' => 'Viimane lehekülg',
|
||||
'Refresh' => 'Uuenda',
|
||||
'Invalid schema.' => 'Sobimatu skeema.',
|
||||
'Please use one of the extensions %s.' => 'Palun kasuta üht laiendustest %s.',
|
||||
|
@@ -165,7 +165,7 @@ $translations = array(
|
||||
'Move up' => 'انتقال به بالا',
|
||||
'Move down' => 'انتقال به پایین',
|
||||
'Remove' => 'حذف',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'حداکثر مجاز فیلدهای مجاز اشباع شد. لطفا %s و %s را کاهش دهید',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'حداکثر مجاز فیلدهای مجاز اشباع شد. لطفا %s را کاهش دهید',
|
||||
|
||||
'Partition by' => 'بخشبندی توسط',
|
||||
'Partitions' => 'بخشبندیها',
|
||||
@@ -231,7 +231,6 @@ $translations = array(
|
||||
'%d row(s)' => array('%d سطر', '%d سطر'),
|
||||
'Page' => 'صفحه',
|
||||
'last' => 'آخری',
|
||||
'Last page' => 'صفحه آخر',
|
||||
'whole result' => 'همه نتایج',
|
||||
'%d byte(s)' => array('%d بایت', '%d بایت'),
|
||||
|
||||
@@ -239,7 +238,6 @@ $translations = array(
|
||||
'%d row(s) have been imported.' => array('%d سطر وارد شد', '%d سطر وارد شد'),
|
||||
|
||||
// in-place editing in select
|
||||
'Double click on a value to modify it.' => 'روی مقدار دوبار کلیک کنید تا آنرا ویرایش کنید',
|
||||
'Use edit link to modify this value.' => 'از لینک ویرایش برای ویرایش این مقدار استفاده کنید',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
|
@@ -22,7 +22,7 @@ $translations = array(
|
||||
'Length' => 'Longueur',
|
||||
'Auto Increment' => 'Auto increment',
|
||||
'Options' => 'Options',
|
||||
'Save' => 'Sauvegarder',
|
||||
'Save' => 'Enregistrer',
|
||||
'Drop' => 'Supprimer',
|
||||
'Database has been created.' => 'La base de données a été créée.',
|
||||
'Database has been renamed.' => 'La base de données a été renommée.',
|
||||
@@ -41,7 +41,7 @@ $translations = array(
|
||||
'Item has been updated.' => 'L\'élément a été modifié.',
|
||||
'Edit' => 'Modifier',
|
||||
'Insert' => 'Insérer',
|
||||
'Save and insert next' => 'Sauvegarder et insérer le prochain',
|
||||
'Save and insert next' => 'Enr. et insérer prochain',
|
||||
'Delete' => 'Effacer',
|
||||
'Database' => 'Base de données',
|
||||
'Routines' => 'Routines',
|
||||
@@ -148,7 +148,7 @@ $translations = array(
|
||||
'Data' => 'Données',
|
||||
'Output' => 'Sortie',
|
||||
'open' => 'ouvrir',
|
||||
'save' => 'sauvegarder',
|
||||
'save' => 'enregistrer',
|
||||
'Format' => 'Format',
|
||||
'Functions' => 'Fonctions',
|
||||
'Aggregation' => 'Agrégation',
|
||||
@@ -165,7 +165,7 @@ $translations = array(
|
||||
'Events' => 'Évènements',
|
||||
'Schedule' => 'Horaire',
|
||||
'At given time' => 'À un moment précis',
|
||||
'Save and continue edit' => 'Sauvegarder et continuer l\'édition',
|
||||
'Save and continue edit' => 'Enr. et continuer édition',
|
||||
'original' => 'original',
|
||||
'Tables have been truncated.' => 'Les tables ont été tronquées.',
|
||||
'Tables have been moved.' => 'Les tables ont été déplacées.',
|
||||
@@ -188,7 +188,7 @@ $translations = array(
|
||||
'%d item(s) have been affected.' => array('%d élément a été modifié.', '%d éléments ont été modifiés.'),
|
||||
'whole result' => 'résultat entier',
|
||||
'Clone' => 'Cloner',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Le nombre maximum de champs est dépassé. Veuillez augmenter %s et %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Le nombre maximum de champs est dépassé. Veuillez augmenter %s.',
|
||||
'Partition by' => 'Partitionner par',
|
||||
'Partitions' => 'Partitions',
|
||||
'Partition name' => 'Nom de la partition',
|
||||
@@ -243,7 +243,7 @@ $translations = array(
|
||||
'Alter type' => 'Modifier le type',
|
||||
'Type has been dropped.' => 'Le type a été supprimé.',
|
||||
'Type has been created.' => 'Le type a été créé.',
|
||||
'Double click on a value to modify it.' => 'Double-cliquez sur une valeur pour la modifier.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+cliquez sur une valeur pour la modifier.',
|
||||
'Use edit link to modify this value.' => 'Utilisez le lien "modifier" pour modifier cette valeur.',
|
||||
'last' => 'dernière',
|
||||
'From server' => 'Depuis le serveur',
|
||||
@@ -259,7 +259,6 @@ $translations = array(
|
||||
'now' => 'maintenant',
|
||||
'%d query(s) executed OK.' => array('%d requête exécutée avec succès.', '%d requêtes exécutées avec succès.'),
|
||||
'Show only errors' => 'Montrer seulement les erreurs',
|
||||
'Last page' => 'Dernière page',
|
||||
'Refresh' => 'Rafraîchir',
|
||||
'Invalid schema.' => 'Schéma invalide.',
|
||||
'Please use one of the extensions %s.' => 'Veuillez utiliser l\'une des extensions %s.',
|
||||
|
@@ -199,7 +199,7 @@ $translations = array(
|
||||
'Show structure' => 'Struktúra',
|
||||
'Select data' => 'Tartalom',
|
||||
'Stop on error' => 'Hiba esetén megáll',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'A maximális mezőszámot elérted. Növeld meg ezeket: %s, %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'A maximális mezőszámot elérted. Növeld meg ezeket: %s.',
|
||||
'anywhere' => 'bárhol',
|
||||
'%.3f s' => '%.3f másodperc',
|
||||
'$1-$3-$5' => '$6.$4.$1',
|
||||
@@ -233,7 +233,6 @@ $translations = array(
|
||||
'Geometry' => 'Geometria',
|
||||
'Databases have been dropped.' => 'Adatbázis eldobva.',
|
||||
'File exists.' => 'A fájl létezik.',
|
||||
'Double click on a value to modify it.' => 'Kattints kétszer az értékre a szerkesztéshez.',
|
||||
'Use edit link to modify this value.' => 'Használd a szerkesztés hivatkozást ezen érték módosításához.',
|
||||
'Alter schema' => 'Séma módosítása',
|
||||
'Create schema' => 'Séma létrehozása',
|
||||
@@ -259,7 +258,6 @@ $translations = array(
|
||||
'now' => 'most',
|
||||
'%d query(s) executed OK.' => '%d sikeres lekérdezés.',
|
||||
'Show only errors' => 'Csak a hibák mutatása',
|
||||
'Last page' => 'Utolsó oldal',
|
||||
'Refresh' => 'Frissítés',
|
||||
'Invalid schema.' => 'Érvénytelen séma.',
|
||||
'Please use one of the extensions %s.' => 'Használja a(z) %s kiterjesztést.',
|
||||
|
@@ -166,7 +166,7 @@ $translations = array(
|
||||
'Move up' => 'Naik',
|
||||
'Move down' => 'Turun',
|
||||
'Remove' => 'Hapus',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Jumlah ruas maksimum yang diizinkan dilewati. Harap naikkan %s dan %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Jumlah ruas maksimum yang diizinkan dilewati. Harap naikkan %s.',
|
||||
|
||||
'Partition by' => 'Partisi menurut',
|
||||
'Partitions' => 'Partisi',
|
||||
@@ -233,7 +233,6 @@ $translations = array(
|
||||
'%d row(s)' => '%d baris',
|
||||
'Page' => 'Halaman',
|
||||
'last' => 'terakhir',
|
||||
'Last page' => 'Halaman terakhir',
|
||||
'whole result' => 'Seluruh hasil',
|
||||
'%d byte(s)' => '%d bita',
|
||||
|
||||
@@ -241,7 +240,6 @@ $translations = array(
|
||||
'%d row(s) have been imported.' => '%d baris berhasil diimpor.',
|
||||
|
||||
// in-place editing in select
|
||||
'Double click on a value to modify it.' => 'Klik ganda suatu nilai untuk mengubahnya.',
|
||||
'Use edit link to modify this value.' => 'Gunakan tautan edit untuk mengubah nilai ini.',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
|
@@ -190,7 +190,7 @@ $translations = array(
|
||||
'%d item(s) have been affected.' => array('Il risultato consiste in %d elemento.', 'Il risultato consiste in %d elementi.'),
|
||||
'whole result' => 'intero risultato',
|
||||
'Clone' => 'Clona',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Troppi campi. Per favore aumentare %s e %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Troppi campi. Per favore aumentare %s.',
|
||||
'Partition by' => 'Partiziona per',
|
||||
'Partitions' => 'Partizioni',
|
||||
'Partition name' => 'Nome partizione',
|
||||
@@ -244,7 +244,7 @@ $translations = array(
|
||||
'Alter type' => 'Modifica tipo definito dall\'utente',
|
||||
'Type has been dropped.' => 'Tipo definito dall\'utente eliminato.',
|
||||
'Type has been created.' => 'Tipo definito dall\'utente creato.',
|
||||
'Double click on a value to modify it.' => 'Fai doppio click su un valore per modificarlo.',
|
||||
'Ctrl+click on a value to modify it.' => 'Fai Ctrl+click su un valore per modificarlo.',
|
||||
'Use edit link to modify this value.' => 'Usa il link modifica per modificare questo valore.',
|
||||
'last' => 'ultima',
|
||||
'From server' => 'Dal server',
|
||||
@@ -258,7 +258,6 @@ $translations = array(
|
||||
'Attachments' => 'Allegati',
|
||||
'%d query(s) executed OK.' => array('%d query eseguita con successo.', '%d query eseguite con successo.'),
|
||||
'Show only errors' => 'Mostra solo gli errori',
|
||||
'Last page' => 'Ultima pagina',
|
||||
'Refresh' => 'Aggiorna',
|
||||
'Invalid schema.' => 'Schema non valido.',
|
||||
'Please use one of the extensions %s.' => 'Usa una delle estensioni %s.',
|
||||
|
@@ -189,7 +189,7 @@ $translations = array(
|
||||
'whole result' => '全結果',
|
||||
'Tables have been dropped.' => 'テーブルを削除しました',
|
||||
'Clone' => 'クローン',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => '定義可能な最大フィールド数を越えました。%s と %s を増やしてください。',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => '定義可能な最大フィールド数を越えました。%s を増やしてください。',
|
||||
'Partition by' => 'パーティション',
|
||||
'Partitions' => 'パーティション',
|
||||
'Partition name' => 'パーティション名',
|
||||
@@ -245,7 +245,6 @@ $translations = array(
|
||||
'Alter type' => 'ユーザー定義型変更',
|
||||
'Type has been dropped.' => 'ユーザー定義型を削除しました',
|
||||
'Type has been created.' => 'ユーザー定義型を追加しました',
|
||||
'Double click on a value to modify it.' => 'ダブルクリックして編集',
|
||||
'Use edit link to modify this value.' => 'リンクを編集する',
|
||||
'last' => '最終',
|
||||
'From server' => 'サーバーから実行',
|
||||
@@ -259,7 +258,6 @@ $translations = array(
|
||||
'now' => '現在の日時',
|
||||
'%d query(s) executed OK.' => '%d クエリーを実行しました',
|
||||
'Show only errors' => 'エラーのみ表示',
|
||||
'Last page' => '最後のページ',
|
||||
'Refresh' => 'リフレッシュ',
|
||||
'Invalid schema.' => '無効なスキーマ',
|
||||
'Please use one of the extensions %s.' => 'いずれかの拡張機能を使ってください %s',
|
||||
|
@@ -165,7 +165,7 @@ $translations = array(
|
||||
'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.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Viršytas maksimalus leidžiamų stulpelių kiekis. Padidinkite %s.',
|
||||
|
||||
'Partition by' => 'Skirstyti pagal',
|
||||
'Partitions' => 'Skirsniai',
|
||||
@@ -231,7 +231,6 @@ $translations = array(
|
||||
'%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ų'),
|
||||
|
||||
@@ -239,7 +238,6 @@ $translations = array(
|
||||
'%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
|
||||
|
@@ -191,7 +191,7 @@ $translations = array(
|
||||
'%d item(s) have been affected.' => array('%d item aangepast.', '%d items aangepast.'),
|
||||
'whole result' => 'volledig resultaat',
|
||||
'Clone' => 'Dupliceer',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Maximum aantal velden bereikt. Verhoog %s en %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maximum aantal velden bereikt. Verhoog %s.',
|
||||
'Partition by' => 'Partitioneren op',
|
||||
'Partitions' => 'Partities',
|
||||
'Partition name' => 'Partitie naam',
|
||||
@@ -244,7 +244,7 @@ $translations = array(
|
||||
'Alter type' => 'Type wijzigen',
|
||||
'Type has been dropped.' => 'Type verwijderd.',
|
||||
'Type has been created.' => 'Type aangemaakt.',
|
||||
'Double click on a value to modify it.' => 'Dubbelklik op een waarde om deze te bewerken.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+klik op een waarde om deze te bewerken.',
|
||||
'Use edit link to modify this value.' => 'Gebruik de link "bewerk" om deze waarde te wijzigen.',
|
||||
'last' => 'laatste',
|
||||
'From server' => 'Van server',
|
||||
@@ -258,7 +258,6 @@ $translations = array(
|
||||
'Attachments' => 'Bijlagen',
|
||||
'%d query(s) executed OK.' => array('%d query succesvol uitgevoerd.', '%d querys succesvol uitgevoerd'),
|
||||
'Show only errors' => 'Enkel fouten tonen',
|
||||
'Last page' => 'Laatste pagina',
|
||||
'Refresh' => 'Vernieuwen',
|
||||
'Invalid schema.' => 'Ongeldig schema.',
|
||||
'Please use one of the extensions %s.' => 'Gebruik 1 van volgende extensies: %s.',
|
||||
|
@@ -166,7 +166,7 @@ $translations = array(
|
||||
'Move up' => 'Przesuń w górę',
|
||||
'Move down' => 'Przesuń w dół',
|
||||
'Remove' => 'Usuń',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Przekroczono maksymalną liczbę pól. Zwiększ %s i %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Przekroczono maksymalną liczbę pól. Zwiększ %s.',
|
||||
|
||||
'Partition by' => 'Partycjonowanie',
|
||||
'Partitions' => 'Partycje',
|
||||
@@ -227,12 +227,14 @@ $translations = array(
|
||||
'Limit' => 'Limit',
|
||||
'Text length' => 'Długość tekstu',
|
||||
'Action' => 'Czynność',
|
||||
'Full table scan' => 'Wymaga pełnego przeskanowania tabeli',
|
||||
'Unable to select the table' => 'Nie udało się pobrać danych z tabeli',
|
||||
'No rows.' => 'Brak rekordów.',
|
||||
'%d row(s)' => array('%d rekord', '%d rekordy', '%d rekordów'),
|
||||
'Page' => 'Strona',
|
||||
'last' => 'ostatni',
|
||||
'Last page' => 'Ostatnia strona',
|
||||
'Load more data' => 'Wczytaj więcej danych',
|
||||
'Loading' => 'Wczytywanie',
|
||||
'whole result' => 'wybierz wszystkie',
|
||||
'%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtów'),
|
||||
|
||||
@@ -240,7 +242,7 @@ $translations = array(
|
||||
'%d row(s) have been imported.' => array('%d rekord został zaimportowany.', '%d rekordy zostały zaimportowane.', '%d rekordów zostało zaimportowanych.'),
|
||||
|
||||
// in-place editing in select
|
||||
'Double click on a value to modify it.' => 'Kliknij podwójnie wartość, aby ją edytować.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+kliknij wartość, aby ją edytować.',
|
||||
'Use edit link to modify this value.' => 'Użyj linku edycji aby zmienić tę wartość.',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
@@ -260,6 +262,7 @@ $translations = array(
|
||||
'Save and insert next' => 'Zapisz i dodaj następny',
|
||||
'Clone' => 'Duplikuj',
|
||||
'Delete' => 'Usuń',
|
||||
'You have no privileges to update this table.' => 'Brak uprawnień do edycji tej tabeli',
|
||||
|
||||
'E-mail' => 'E-mail',
|
||||
'From' => 'Nadawca',
|
||||
|
@@ -190,7 +190,7 @@ $translations = array(
|
||||
'%d item(s) have been affected.' => array('%d item afetado.', '%d itens afetados.'),
|
||||
'whole result' => 'resultado completo',
|
||||
'Clone' => 'Clonar',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s e %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s.',
|
||||
'Partition by' => 'Particionar por',
|
||||
'Partitions' => 'Partições',
|
||||
'Partition name' => 'Nome da Partição',
|
||||
@@ -244,7 +244,7 @@ $translations = array(
|
||||
'Alter type' => 'Modificar tipo',
|
||||
'Type has been dropped.' => 'Tipo eliminado.',
|
||||
'Type has been created.' => 'Tipo criado.',
|
||||
'Double click on a value to modify it.' => 'Clique duas vezes sobre o valor para edita-lo.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+clique vezes sobre o valor para edita-lo.',
|
||||
'Use edit link to modify this value.' => 'Utilize o link modificar para alterar.',
|
||||
'last' => 'último',
|
||||
'From server' => 'Desde servidor',
|
||||
@@ -258,7 +258,6 @@ $translations = array(
|
||||
'Attachments' => 'Anexos',
|
||||
'%d query(s) executed OK.' => array('%d consulta sql executada corretamente.', '%d consultas sql executadas corretamente.'),
|
||||
'Show only errors' => 'Mostrar somente erros',
|
||||
'Last page' => 'Última página',
|
||||
'Refresh' => 'Atualizar',
|
||||
'Invalid schema.' => 'Esquema inválido.',
|
||||
'Please use one of the extensions %s.' => 'Por favor use uma das extensões %s.',
|
||||
|
@@ -197,7 +197,7 @@ $translations = array(
|
||||
'%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.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Numărul maxim de înscrieri disponibile a fost atins. Majorați %s.',
|
||||
'anywhere' => 'oriunde',
|
||||
'%.3f s' => '%.3f s',
|
||||
'$1-$3-$5' => '$5.$3.$1',
|
||||
@@ -244,7 +244,7 @@ $translations = array(
|
||||
'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.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+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',
|
||||
@@ -258,7 +258,6 @@ $translations = array(
|
||||
'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.',
|
||||
|
@@ -197,7 +197,7 @@ $translations = array(
|
||||
'%d row(s) have been imported.' => array('Импортирована %d строка.', 'Импортировано %d строки.', 'Импортировано %d строк.'),
|
||||
'Import' => 'Импорт',
|
||||
'Stop on error' => 'Остановить при ошибке',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Достигнуто максимальное значение количества доступных полей. Увеличьте %s и %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Достигнуто максимальное значение количества доступных полей. Увеличьте %s.',
|
||||
'anywhere' => 'в любом месте',
|
||||
'%.3f s' => '%.3f s',
|
||||
'$1-$3-$5' => '$5.$3.$1',
|
||||
@@ -244,7 +244,7 @@ $translations = array(
|
||||
'Alter type' => 'Изменить тип',
|
||||
'Type has been dropped.' => 'Тип удален.',
|
||||
'Type has been created.' => 'Создан новый тип.',
|
||||
'Double click on a value to modify it.' => 'Кликни два раза по значению, чтобы его изменить.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+кликни по значению, чтобы его изменить.',
|
||||
'Use edit link to modify this value.' => 'Изменить это значение можно с помощью ссылки «изменить».',
|
||||
'last' => 'последняя',
|
||||
'From server' => 'С сервера',
|
||||
@@ -258,7 +258,6 @@ $translations = array(
|
||||
'Attachments' => 'Прикрепленные файлы',
|
||||
'%d query(s) executed OK.' => array('%d запрос выполнен успешно.', '%d запроса выполнено успешно.', '%d запросов выполнено успешно.'),
|
||||
'Show only errors' => 'Только ошибки',
|
||||
'Last page' => 'Последняя страница',
|
||||
'Refresh' => 'Обновить',
|
||||
'Invalid schema.' => 'Неправильная схема.',
|
||||
'Please use one of the extensions %s.' => 'Используйте одно из этих расширений %s.',
|
||||
|
@@ -198,7 +198,7 @@ $translations = array(
|
||||
'%d row(s) have been imported.' => array('Bol importovaný %d záznam.', 'Boli importované %d záznamy.', 'Bolo importovaných %d záznamov.'),
|
||||
'Import' => 'Import',
|
||||
'Stop on error' => 'Zastaviť pri chybe',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Bol prekročený maximálny počet povolených polí. Zvýšte prosím %s a %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Bol prekročený maximálny počet povolených polí. Zvýšte prosím %s.',
|
||||
'anywhere' => 'kdekoľvek',
|
||||
'%.3f s' => '%.3f s',
|
||||
'$1-$3-$5' => '$6.$4.$1',
|
||||
@@ -244,7 +244,7 @@ $translations = array(
|
||||
'Type has been dropped.' => 'Typ bol odstránený.',
|
||||
'Type has been created.' => 'Typ bol vytvorený.',
|
||||
'Alter type' => 'Pozmeniť typ',
|
||||
'Double click on a value to modify it.' => 'Dvojkliknite na políčko, ktoré chcete zmeniť.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+kliknite na políčko, ktoré chcete zmeniť.',
|
||||
'Use edit link to modify this value.' => 'Pre zmenu tejto hodnoty použite odkaz upraviť.',
|
||||
'last' => 'posledný',
|
||||
'From server' => 'Zo serveru',
|
||||
@@ -258,7 +258,6 @@ $translations = array(
|
||||
'Attachments' => 'Prílohy',
|
||||
'%d query(s) executed OK.' => array('Bol vykonaný %d dotaz.', 'Boli vykonané %d dotazy.', 'Bolo vykonaných %d dotazov.'),
|
||||
'Show only errors' => 'Zobraziť iba chyby',
|
||||
'Last page' => 'Posledná stránka',
|
||||
'Refresh' => 'Obnoviť',
|
||||
'Invalid schema.' => 'Neplatné schéma.',
|
||||
'Please use one of the extensions %s.' => 'Prosím vyberte jednu z koncoviek %s.',
|
||||
|
@@ -161,7 +161,7 @@ $translations = array(
|
||||
'Move up' => 'Premakni gor',
|
||||
'Move down' => 'Premakni dol',
|
||||
'Remove' => 'Odstrani',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Največje število dovoljenih polje je preseženo. Prosimo, povečajte %s in %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Največje število dovoljenih polje je preseženo. Prosimo, povečajte %s.',
|
||||
|
||||
'Partition by' => 'Porazdeli po',
|
||||
'Partitions' => 'Porazdelitve',
|
||||
@@ -227,7 +227,6 @@ $translations = array(
|
||||
'%d row(s)' => array('%d vrstica', '%d vrstici', '%d vrstice', '%d vrstic'),
|
||||
'Page' => 'Stran',
|
||||
'last' => 'Zadnja',
|
||||
'Last page' => 'Zadnja stran',
|
||||
'whole result' => 'cel razultat',
|
||||
'%d byte(s)' => array('%d bajt', '%d bajta', '%d bajti', '%d bajtov'),
|
||||
|
||||
@@ -235,7 +234,7 @@ $translations = array(
|
||||
'%d row(s) have been imported.' => array('Uvožena je %d vrstica.', 'Uvoženi sta %d vrstici.', 'Uvožene so %d vrstice.', 'Uvoženih je %d vrstic.'),
|
||||
|
||||
// in-place editing in select
|
||||
'Double click on a value to modify it.' => 'Dvojni klik na vrednost za urejanje.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+klik na vrednost za urejanje.',
|
||||
'Use edit link to modify this value.' => 'Uporabite urejanje povezave za spreminjanje te vrednosti.',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
|
@@ -166,7 +166,7 @@ $translations = array(
|
||||
'Move up' => 'Помери на горе',
|
||||
'Move down' => 'Помери на доле',
|
||||
'Remove' => 'Уклони',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Премашен је максимални број дозвољених поља. Молим увећајте %s и %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Премашен је максимални број дозвољених поља. Молим увећајте %s.',
|
||||
|
||||
'Partition by' => 'Подели по',
|
||||
'Partitions' => 'Поделе',
|
||||
@@ -233,7 +233,6 @@ $translations = array(
|
||||
'%d row(s)' => array('%d ред', '%d реда', '%d редова'),
|
||||
'Page' => 'Страна',
|
||||
'last' => 'последња',
|
||||
'Last page' => 'Последња страна',
|
||||
'Loading' => 'Учитавам',
|
||||
'Load more data' => 'Учитавам још података',
|
||||
'whole result' => 'цео резултат',
|
||||
@@ -243,7 +242,7 @@ $translations = array(
|
||||
'%d row(s) have been imported.' => array('%d ред је увежен.', '%d реда су увежена.', '%d редова је увежено.'),
|
||||
|
||||
// in-place editing in select
|
||||
'Double click on a value to modify it.' => 'Дупли клик на вредност за измену.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+клик на вредност за измену.',
|
||||
'Use edit link to modify this value.' => 'Користи везу за измену ове вредности.',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
|
@@ -187,7 +187,7 @@ $translations = array(
|
||||
'%d item(s) have been affected.' => array('%d உருப்படி மாற்றமடைந்தது.', '%d உருப்படிகள் மாற்றமடைந்தன.'),
|
||||
'whole result' => 'முழுமையான முடிவு',
|
||||
'Clone' => 'நகலி (Clone)',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'அனுமதிக்கப்பட்ட அதிகபட்ச கோப்புகளின் எண்ணிக்கை மீறப்பட்டது. தயவு செய்து %s மற்றும் %s யை அதிகரிக்கவும்.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'அனுமதிக்கப்பட்ட அதிகபட்ச கோப்புகளின் எண்ணிக்கை மீறப்பட்டது. தயவு செய்து %s மற்றும் %s யை அதிகரிக்கவும்.',
|
||||
'Partition by' => 'பிரித்தது',
|
||||
'Partitions' => 'பிரிவுகள்',
|
||||
'Partition name' => 'பிரிவின் பெயர்',
|
||||
@@ -234,7 +234,6 @@ $translations = array(
|
||||
'Schema has been dropped.' => 'அமைப்புமுறை நீக்கப்பட்டது.',
|
||||
'Schema has been created.' => 'அமைப்புமுறை உருவாக்கப்பட்டது.',
|
||||
'Schema has been altered.' => 'அமைப்புமுறை மாற்றப்பட்டது.',
|
||||
'Double click on a value to modify it.' => 'மதிப்பினை மாற்ற அதன் மீது இருமுறை சொடுக்கவும் (Double click).',
|
||||
'Use edit link to modify this value.' => 'இந்த மதிப்பினை மாற்ற, தொகுப்பு இணைப்பினை உபயோகிக்கவும்.',
|
||||
'last' => 'கடைசி',
|
||||
'Sequence has been dropped.' => 'வரிசைமுறை நீக்கப்பட்டது.',
|
||||
@@ -259,7 +258,6 @@ $translations = array(
|
||||
'now' => 'இப்பொழுது',
|
||||
'%d query(s) executed OK.' => array('%d வினவல் செயல்படுத்தப்பட்டது.', '%d வினவல்கள் செயல்படுத்தப்பட்டன.'),
|
||||
'Show only errors' => 'பிழைகளை மட்டும் காண்பிக்கவும்',
|
||||
'Last page' => 'கடைசி பக்கம்',
|
||||
'Refresh' => 'புதுப்பி (Refresh)',
|
||||
'Invalid schema.' => 'அமைப்புமுறை சரியானதல்ல (Invalid Schema).',
|
||||
'Please use one of the extensions %s.' => 'தயவு செய்து ஒரு விரிவினை %s (extension) உபயோகிக்கவும்.',
|
||||
|
@@ -5,146 +5,151 @@ $translations = array(
|
||||
'Server' => 'Sunucu',
|
||||
'Username' => 'Kullanıcı',
|
||||
'Password' => 'Parola',
|
||||
'Permanent login' => 'Kalıcı giriş',
|
||||
'Permanent login' => 'Beni hatırla',
|
||||
'Login' => 'Giriş',
|
||||
'Logout' => 'Çıkış',
|
||||
'Logged as: %s' => '%s olarak giriş yapıldı.',
|
||||
'Logout successful.' => 'Başarıyla çıkıldı.',
|
||||
'Logout successful.' => 'Başarıyla çıkış yapıldı.',
|
||||
'Invalid credentials.' => 'Geçersiz kimlik.',
|
||||
'Language' => 'Dil',
|
||||
'Invalid CSRF token. Send the form again.' => 'Geçersiz Cross-site request forgery (CSRF) jetonu. Forumu tekrar yolla.',
|
||||
'Invalid CSRF token. Send the form again.' => 'Geçersiz (CSRF) jetonu. Formu tekrar yolla.',
|
||||
'No extension' => 'Uzantı yok',
|
||||
'None of the supported PHP extensions (%s) are available.' => 'Desteklenen PHP uzantılarından (%s) hiçbiri mevcut değil.',
|
||||
'None of the supported PHP extensions (%s) are available.' => 'Desteklenen PHP eklentilerinden (%s) hiçbiri mevcut değil.',
|
||||
'Session support must be enabled.' => 'Oturum desteği etkin olmalıdır.',
|
||||
'Session expired, please login again.' => 'Oturum süresi doldu, lütfen tekrar giriş yapın.',
|
||||
'%s version: %s through PHP extension %s' => '%s sürüm: %s PHP uzantısı ile %s',
|
||||
'%s version: %s through PHP extension %s' => '%s sürüm: %s, %s PHP eklentisi ile',
|
||||
'Refresh' => 'Tazele',
|
||||
|
||||
|
||||
// text direction
|
||||
'ltr' => 'ltr',
|
||||
|
||||
|
||||
'Privileges' => 'İzinler',
|
||||
'Create user' => 'Kullanıcı yarat',
|
||||
'User has been dropped.' => 'Kullanıcı düşürüldü.',
|
||||
'Create user' => 'Kullanıcı oluştur',
|
||||
'User has been dropped.' => 'Kullanıcı silindi.',
|
||||
'User has been altered.' => 'Kullanıcı değiştirildi.',
|
||||
'User has been created.' => 'Kullanıcı yaratıldı.',
|
||||
'Hashed' => 'Harmanlandı.',
|
||||
'User has been created.' => 'Kullanıcı oluşturuldu.',
|
||||
'Hashed' => 'Harmanlandı',
|
||||
'Column' => 'Kolon',
|
||||
'Routine' => 'Yordam',
|
||||
'Grant' => 'İmtiyaz',
|
||||
'Revoke' => 'Geri al',
|
||||
|
||||
'Grant' => 'Yetki Ver',
|
||||
'Revoke' => 'Yetki Kaldır',
|
||||
|
||||
'Process list' => 'İşlem listesi',
|
||||
'%d process(es) have been killed.' => array('%d süreç öldürüldü.', '%d adet süreç öldürüldü.'),
|
||||
'Kill' => 'Öldür',
|
||||
|
||||
'%d process(es) have been killed.' => array('%d işlem sonlandırıldı.', '%d adet işlem sonlandırıldı.'),
|
||||
'Kill' => 'Sonlandır',
|
||||
|
||||
'Variables' => 'Değişkenler',
|
||||
'Status' => 'Durum',
|
||||
|
||||
|
||||
'SQL command' => 'SQL komutu',
|
||||
'%d query(s) executed OK.' => array('%d sorgunun işletilmesi tamamlandı.', '%d kadar sorgunun işletilmesi tamamlandı.'),
|
||||
'Query executed OK, %d row(s) affected.' => array('Sorgu işletilmesi tamamlandı. %d sıra(row) etkilendi.', 'Sorgu işletilmesi tamamlandı. Bundan %d kadar sıra etkilendi.'),
|
||||
'No commands to execute.' => 'İşletilmek için komut yok.',
|
||||
'%d query(s) executed OK.' => array('%d sorgu başarıyla çalıştırıldı.', '%d adet sorgu başarıyla çalıştırıldı.'),
|
||||
'Query executed OK, %d row(s) affected.' => array('Sorgu başarıyla çalıştırıldı, %d adet kayıt etkilendi.', 'Sorgu başarıyla çalıştırıldı, %d adet kayıt etkilendi.'),
|
||||
'No commands to execute.' => 'Çalıştırılacak komut yok.',
|
||||
'Error in query' => 'Sorguda hata',
|
||||
'Execute' => 'İşlet',
|
||||
'Stop on error' => 'Dur hata',
|
||||
'Execute' => 'Çalıştır',
|
||||
'Stop on error' => 'Hata oluşursa dur',
|
||||
'Show only errors' => 'Sadece hataları göster.',
|
||||
// sprintf() format for time of the command
|
||||
'%.3f s' => '%.3f s',
|
||||
'History' => 'Tarih',
|
||||
'Clear' => 'Boşluk',
|
||||
|
||||
'History' => 'Geçmiş',
|
||||
'Clear' => 'Temizle',
|
||||
'Edit all' => 'Tümünü düzenle',
|
||||
|
||||
'File upload' => 'Dosya gönder',
|
||||
'From server' => 'Sunucudan',
|
||||
'Webserver file %s' => '%s web sunucusu dosyası',
|
||||
'Run file' => 'Dosya çalıştır',
|
||||
'Run file' => 'Dosyayı çalıştır',
|
||||
'File does not exist.' => 'Dosya mevcut değil.',
|
||||
'File uploads are disabled.' => 'Dosya gönderimi etkin değil.',
|
||||
'Unable to upload a file.' => 'Dosya gönderilemiyor.',
|
||||
'Maximum allowed file size is %sB.' => 'Bir dosya için izin verilen dosya sınırı %sB.',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Çok büyük POST verisi, veriyi azaltın ya da ayar yönergesini uygun olarak yapılandırın.',
|
||||
|
||||
'Export' => 'İhraç',
|
||||
'Maximum allowed file size is %sB.' => 'İzin verilen dosya boyutu sınırı %sB.',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Çok büyük POST verisi, veriyi azaltın ya da %s ayar yönergesini uygun olarak yapılandırın.',
|
||||
|
||||
'Export' => 'Dışarı Aktar',
|
||||
'Dump' => 'Döküm',
|
||||
'Output' => 'Çıktı',
|
||||
'open' => 'aç',
|
||||
'save' => 'kaydet',
|
||||
'Format' => 'Biçim',
|
||||
'Data' => 'Veri',
|
||||
|
||||
'Database' => 'Veritabanı',
|
||||
'database' => 'veritabanı',
|
||||
|
||||
'Database' => 'Veri Tabanı',
|
||||
'database' => 'veri tabanı',
|
||||
'Use' => 'Kullan',
|
||||
'Select database' => 'Veritabanı seç',
|
||||
'Invalid database.' => 'Geçersiz veritabanı.',
|
||||
'Create new database' => 'Yeni veritabanı yarat',
|
||||
'Database has been dropped.' => 'Veritabanı düşürüldü.',
|
||||
'Databases have been dropped.' => 'Veritabanları düşüüldü.',
|
||||
'Database has been created.' => 'Veritabanı yaratıldı.',
|
||||
'Database has been renamed.' => 'Veritabanının ismi değiştirildi.',
|
||||
'Database has been altered.' => 'Veritabanı değiştirildi.',
|
||||
'Alter database' => 'Veritabanı değiştir',
|
||||
'Create database' => 'Veritabanı yarat',
|
||||
'Database schema' => 'Veritabanı şeması',
|
||||
|
||||
'Select database' => 'Veri tabanı seç',
|
||||
'Invalid database.' => 'Geçersiz veri tabanı.',
|
||||
'Create new database' => 'Yeni veri tabanı oluştur',
|
||||
'Database has been dropped.' => 'Veri tabanı silindi.',
|
||||
'Databases have been dropped.' => 'Veritabanları silindi.',
|
||||
'Database has been created.' => 'Veri tabanı oluşturuldu.',
|
||||
'Database has been renamed.' => 'Veri tabanının ismi değiştirildi.',
|
||||
'Database has been altered.' => 'Veri tabanı değiştirildi.',
|
||||
'Alter database' => 'Veri tabanını değiştir',
|
||||
'Create database' => 'Veri tabanı oluştur',
|
||||
'Database schema' => 'Veri tabanı şeması',
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => 'Kalıcı bağlantı',
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ' ',
|
||||
'Engine' => 'Motor',
|
||||
'Collation' => 'Karşılaştırma',
|
||||
'Data Length' => 'Veri uzunluğu',
|
||||
'Index Length' => 'Dizin uzunluğu',
|
||||
'Data Free' => 'Serbest veri',
|
||||
'Rows' => 'Sıralar (Rows)',
|
||||
'%d in total' => '%d toplamda',
|
||||
'Analyze' => 'Çözümleme',
|
||||
'Optimize' => 'En uygun hale getirme',
|
||||
'Check' => 'Denetleme',
|
||||
'Repair' => 'Tamir',
|
||||
'Truncate' => 'Buda',
|
||||
'Tables have been truncated.' => 'Tablolar budandı.',
|
||||
'Move to other database' => 'Diğer veritabanına taşı',
|
||||
'Data Length' => 'Veri Uzunluğu',
|
||||
'Index Length' => 'Dizin Uzunluğu',
|
||||
'Data Free' => 'Boş Veri',
|
||||
'Rows' => 'Kayıtlar',
|
||||
'%d in total' => 'toplam %d',
|
||||
'Analyze' => 'Çözümle',
|
||||
'Optimize' => 'En uygun hale getir',
|
||||
'Check' => 'Denetle',
|
||||
'Repair' => 'Tamir Et',
|
||||
'Truncate' => 'Boşalt',
|
||||
'Tables have been truncated.' => 'Tablolar boşaltıldı.',
|
||||
'Move to other database' => 'Başka veri tabanına taşı',
|
||||
'Move' => 'Taşı',
|
||||
'Tables have been moved.' => 'Tablolar taşındı.',
|
||||
'Copy' => 'Kopyala',
|
||||
'Tables have been copied.' => 'Tablolar kopyalandı.',
|
||||
|
||||
|
||||
'Routines' => 'Yordamlar',
|
||||
'Routine has been called, %d row(s) affected.' => array('Yordam çağrıldı, %d sıra(row) etkilendi.', 'Yordam çağrıldı, %d sıralar(rows) etkilendi.'),
|
||||
'Call' => 'Çağrı',
|
||||
'Routine has been called, %d row(s) affected.' => array('Yordam çağrıldı, %d adet kayıt etkilendi.', 'Yordam çağrıldı, %d kayıt etkilendi.'),
|
||||
'Call' => 'Çağır',
|
||||
'Parameter name' => 'Parametre adı',
|
||||
'Create procedure' => 'Yöntem yarat',
|
||||
'Create function' => 'Fonksiyon yarat',
|
||||
'Routine has been dropped.' => 'Yordam düşürüldü.',
|
||||
'Create procedure' => 'Yöntem oluştur',
|
||||
'Create function' => 'Fonksiyon oluştur',
|
||||
'Routine has been dropped.' => 'Yordam silindi.',
|
||||
'Routine has been altered.' => 'Yordam değiştirildi.',
|
||||
'Routine has been created.' => 'Yordam yaratıldı.',
|
||||
'Alter function' => 'Değiştirme fonksyionu',
|
||||
'Alter procedure' => 'Değiştirme yöntemi',
|
||||
'Routine has been created.' => 'Yordam oluşturuldu.',
|
||||
'Alter function' => 'Fonksyionu değiştir',
|
||||
'Alter procedure' => 'Yöntemi değiştir',
|
||||
'Return type' => 'Geri dönüş türü',
|
||||
|
||||
|
||||
'Events' => 'Olaylar',
|
||||
'Event has been dropped.' => 'Olay düşüdüldü.',
|
||||
'Event has been dropped.' => 'Olay silindi.',
|
||||
'Event has been altered.' => 'Olay değiştirildi.',
|
||||
'Event has been created.' => 'Olay yaratıldı.',
|
||||
'Alter event' => 'Değiştirme olayı',
|
||||
'Create event' => 'Yaratma olayı',
|
||||
'At given time' => 'Bir anda',
|
||||
'Every' => 'Herzaman',
|
||||
'Event has been created.' => 'Olay oluşturuldu.',
|
||||
'Alter event' => 'Olayı değiştir',
|
||||
'Create event' => 'Olay oluştur',
|
||||
'At given time' => 'Verilen zamanda',
|
||||
'Every' => 'Her zaman',
|
||||
'Schedule' => 'Takvimli',
|
||||
'Start' => 'Başla',
|
||||
'End' => 'Son',
|
||||
'On completion preserve' => 'Tamamlama koruması AÇIK',
|
||||
|
||||
'On completion preserve' => 'Tamamlama koruması',
|
||||
|
||||
'Tables' => 'Tablolar',
|
||||
'Tables and views' => 'Tablolar ve görünümler',
|
||||
'Table' => 'Tablo',
|
||||
'No tables.' => 'Tablo yok.',
|
||||
'Alter table' => 'Tablo değiştir',
|
||||
'Create table' => 'Tablo yarat',
|
||||
'Create new table' => 'Yeni tablo yarat',
|
||||
'Table has been dropped.' => 'Tablo düşürüldü.',
|
||||
'Tables have been dropped.' => 'Tablolar düşürüldü.',
|
||||
'Alter table' => 'Tabloyu değiştir',
|
||||
'Create table' => 'Tablo oluştur',
|
||||
'Create new table' => 'Yeni tablo oluştur',
|
||||
'Table has been dropped.' => 'Tablo silindi.',
|
||||
'Tables have been dropped.' => 'Tablolar silindi.',
|
||||
'Tables have been optimized.' => 'Tablolar en uygun hale getirildi.',
|
||||
'Table has been altered.' => 'Tablo değiştirildi.',
|
||||
'Table has been created.' => 'Tablo yaratıldı.',
|
||||
'Table has been created.' => 'Tablo oluşturuldu.',
|
||||
'Table name' => 'Tablo adı',
|
||||
'Show structure' => 'Yapıyı göster',
|
||||
'engine' => 'motor',
|
||||
@@ -152,160 +157,166 @@ $translations = array(
|
||||
'Column name' => 'Kolon adı',
|
||||
'Type' => 'Tür',
|
||||
'Length' => 'Uzunluk',
|
||||
'Auto Increment' => 'Otomatik yükselt',
|
||||
'Auto Increment' => 'Otomatik Artır',
|
||||
'Options' => 'Seçenekler',
|
||||
'Comment' => 'Yorum',
|
||||
'Default values' => 'Varsayılan değerler',
|
||||
'Drop' => 'Düşür',
|
||||
'Are you sure?' => 'Emin misin?',
|
||||
'Drop' => 'Sil',
|
||||
'Are you sure?' => 'Emin misiniz?',
|
||||
'Move up' => 'Yukarı taşı',
|
||||
'Move down' => 'AŞağı taş',
|
||||
'Remove' => 'Kaldır',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'kabul edilebilir alan sayısı aşıldı. Lütfen %s ve %s düşürün.',
|
||||
|
||||
'Partition by' => 'Bölümü tarafından',
|
||||
'Move down' => 'Aşağı taşı',
|
||||
'Remove' => 'Sil',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'İzin verilen en fazla alan sayısı aşıldı. Lütfen %s değerlerini artırın.',
|
||||
|
||||
'Partition by' => 'Bununla bölümle',
|
||||
'Partitions' => 'Bölümler',
|
||||
'Partition name' => 'BÖlüm adı',
|
||||
'Partition name' => 'Bölüm adı',
|
||||
'Values' => 'Değerler',
|
||||
|
||||
|
||||
'View' => 'Görünüm',
|
||||
'View has been dropped.' => 'Görünüm düşürüldü.',
|
||||
'View has been dropped.' => 'Görünüm silindi.',
|
||||
'View has been altered.' => 'Görünüm değiştirildi.',
|
||||
'View has been created.' => 'Görünüm yaratıldı.',
|
||||
'Alter view' => 'Değişim görünüm',
|
||||
'Create view' => 'Görünüm yarat',
|
||||
|
||||
'View has been created.' => 'Görünüm oluşturuldu.',
|
||||
'Alter view' => 'Görünümü değiştir',
|
||||
'Create view' => 'Görünüm oluştur',
|
||||
|
||||
'Indexes' => 'Dizinler',
|
||||
'Indexes have been altered.' => 'Dizinler değiştirilidi.',
|
||||
'Indexes have been altered.' => 'Dizinler değiştirildi.',
|
||||
'Alter indexes' => 'Dizinleri değiştir',
|
||||
'Add next' => 'Sonraya ekle',
|
||||
'Add next' => 'Bundan sonra ekle',
|
||||
'Index Type' => 'Dizin Türü',
|
||||
'Column (length)' => 'Kolon (uzunluğu)',
|
||||
|
||||
|
||||
'Foreign keys' => 'Dış anahtarlar',
|
||||
'Foreign key' => 'Dış anahtar',
|
||||
'Foreign key has been dropped.' => 'Dış anahtar düşürüldü.',
|
||||
'Foreign key has been altered.' => 'Dış anahtar değiştir.',
|
||||
'Foreign key has been created.' => 'Dış anahtar yarat.',
|
||||
'Foreign key has been dropped.' => 'Dış anahtar silindi.',
|
||||
'Foreign key has been altered.' => 'Dış anahtar değiştirildi.',
|
||||
'Foreign key has been created.' => 'Dış anahtar oluşturuldu.',
|
||||
'Target table' => 'Hedef tablo',
|
||||
'Change' => 'Değiş',
|
||||
'Change' => 'Değiştir',
|
||||
'Source' => 'Kaynak',
|
||||
'Target' => 'Hedef',
|
||||
'Add column' => 'Kolon eklde',
|
||||
'Add column' => 'Kolon ekle',
|
||||
'Alter' => 'Değiştir',
|
||||
'Add foreign key' => 'Dış anahtar ekle',
|
||||
'ON DELETE' => 'Silinmek üzere',
|
||||
'ON UPDATE' => 'Yükseltilmek üzere',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kaynak ve hedef kolonlar aynı veri türü olmak zorunda, hedef kolonda bir dizin ve başvurulan veri bulunmalı.',
|
||||
|
||||
'ON DELETE' => 'ON DELETE (Hedefteki Kayıt Silinirse)',
|
||||
'ON UPDATE' => 'ON UPDATE (Hedefteki Kayıt Değiştirilirse)',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kaynak ve hedef kolonlar aynı veri türünde olmalı, hedef kolonlarda dizin bulunmalı ve başvurulan veri mevcut olmalı.',
|
||||
|
||||
'Triggers' => 'Tetikler',
|
||||
'Add trigger' => 'Tetik ekle',
|
||||
'Trigger has been dropped.' => 'Tetik düşürüldü.',
|
||||
'Trigger has been dropped.' => 'Tetik silindi.',
|
||||
'Trigger has been altered.' => 'Tetik değiştirildi.',
|
||||
'Trigger has been created.' => 'Tetik yaratıldı.',
|
||||
'Alter trigger' => 'Tetik değiştir.',
|
||||
'Create trigger' => 'Tetik yarat',
|
||||
'Trigger has been created.' => 'Tetik oluşturuldu.',
|
||||
'Alter trigger' => 'Tetiği değiştir.',
|
||||
'Create trigger' => 'Tetik oluştur',
|
||||
'Time' => 'Zaman',
|
||||
'Event' => 'Olay',
|
||||
'Name' => 'Ad',
|
||||
|
||||
|
||||
'select' => 'seç',
|
||||
'Select' => 'Seç',
|
||||
'Select data' => 'Veri seç',
|
||||
'Functions' => 'Fonksiyonlar',
|
||||
'Aggregation' => 'Kümeleme',
|
||||
'Search' => 'Arama',
|
||||
'anywhere' => 'herhangi bir yer',
|
||||
'Search data in tables' => 'Tablolarda veri ara.',
|
||||
'Search' => 'Ara',
|
||||
'anywhere' => 'hiçbir yerde',
|
||||
'Search data in tables' => 'Tablolarda veri ara',
|
||||
'Sort' => 'Sırala',
|
||||
'descending' => 'azalan',
|
||||
'Limit' => 'sınır',
|
||||
'Text length' => 'Yazı uzunluğu',
|
||||
'Action' => 'Eylem',
|
||||
'Full table scan' => 'Tam tablo tarama',
|
||||
'Unable to select the table' => 'Tablo seçilemedi',
|
||||
'No rows.' => 'Sıra yok.',
|
||||
'%d row(s)' => array('%d sıra)', '%d kadar sıra'),
|
||||
'No rows.' => 'Kayıt yok.',
|
||||
'%d row(s)' => array('%d kayıt', '%d adet kayıt'),
|
||||
'Page' => 'Sayfa',
|
||||
'last' => 'son',
|
||||
'Last page' => 'Son sayfa',
|
||||
'Load more data' => 'Daha fazla veri yükle',
|
||||
'Loading' => 'Yükleniyor',
|
||||
'whole result' => 'tüm sonuç',
|
||||
'%d byte(s)' => array('%d bayt', '%d kadar bayt'),
|
||||
|
||||
'Import' => 'İthal',
|
||||
'%d row(s) have been imported.' => array('%d sıra ithal edildi.', '%d kadar sıra ithal edildi.'),
|
||||
|
||||
'%d byte(s)' => array('%d bayt', '%d bayt'),
|
||||
|
||||
'Import' => 'İçeri Aktar',
|
||||
'%d row(s) have been imported.' => array('%d kayıt içeri aktarıldı.', '%d adet kayıt içeri aktarıldı.'),
|
||||
|
||||
// in-place editing in select
|
||||
'Double click on a value to modify it.' => 'Değerin üzerine çift tıklayın ve değiştirin.',
|
||||
'Ctrl+click on a value to modify it.' => 'Bir değeri değiştirmek için üzerine Ctrl+tıklayın.',
|
||||
'Use edit link to modify this value.' => 'Değeri değiştirmek için düzenleme bağlantısını kullanın.',
|
||||
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => 'Öğeler eklendi.',
|
||||
'Item has been deleted.' => 'Öğe silindi.',
|
||||
'Item has been updated.' => 'Öğe güncellendi.',
|
||||
'%d item(s) have been affected.' => array('%d öğe etkilendi.', '%d kadar öğe etkilendi.'),
|
||||
'New item' => 'Yeni öğe',
|
||||
'Item%s has been inserted.' => 'Kayıt%s eklendi.',
|
||||
'Item has been deleted.' => 'Kayıt silindi.',
|
||||
'Item has been updated.' => 'Kayıt güncellendi.',
|
||||
'%d item(s) have been affected.' => array('%d kayıt etkilendi.', '%d adet kayıt etkilendi.'),
|
||||
'New item' => 'Yeni kayıt',
|
||||
'original' => 'orijinal',
|
||||
// label for value '' in enum data type
|
||||
'empty' => 'boş',
|
||||
'edit' => 'düzen',
|
||||
'Edit' => 'Düzen',
|
||||
'edit' => 'düzenle',
|
||||
'Edit' => 'Düzenle',
|
||||
'Insert' => 'Ekle',
|
||||
'Save' => 'Kaydet',
|
||||
'Save and continue edit' => 'Kaydet ve düzenlemeye devam et',
|
||||
'Save and insert next' => 'Kaydet ve sonrakin ekle',
|
||||
'Clone' => 'Klonla',
|
||||
'Save and insert next' => 'Kaydet ve sonrakini ekle',
|
||||
'Clone' => 'Kopyala',
|
||||
'Delete' => 'Sil',
|
||||
|
||||
|
||||
'E-mail' => 'E-posta',
|
||||
'From' => 'Gönderen',
|
||||
'Subject' => 'Konu',
|
||||
'Attachments' => 'Ekler',
|
||||
'Send' => 'Gönder',
|
||||
'%d e-mail(s) have been sent.' => array('%d e-posta dönderildi.', '%d kadar e-posta gönderildi.'),
|
||||
|
||||
'%d e-mail(s) have been sent.' => array('%d e-posta gönderildi.', '%d adet e-posta gönderildi.'),
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => 'Sayılar',
|
||||
'Date and time' => 'Tarih ve zaman',
|
||||
'Strings' => 'Sözcükler',
|
||||
'Strings' => 'Dizge',
|
||||
'Binary' => 'İkili',
|
||||
'Lists' => 'Listeler',
|
||||
'Network' => 'Ağ',
|
||||
'Geometry' => 'Geometri',
|
||||
'Relations' => 'İlişkiler',
|
||||
|
||||
|
||||
'Editor' => 'Düzenleyici',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$6.$4.$1',
|
||||
// hint for date format - use language equivalents for day, month and year shortcuts
|
||||
'[yyyy]-mm-dd' => 'd.m.[rrrr]',
|
||||
'[yyyy]-mm-dd' => '[yyyy]-aa-gg',
|
||||
// hint for time format - use language equivalents for hour, minute and second shortcuts
|
||||
'HH:MM:SS' => 'SS:DD:ss',
|
||||
'now' => 'şimdi',
|
||||
|
||||
'yes' => 'evet',
|
||||
'no' => 'hayır',
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => 'Dosya mevcut.',
|
||||
'File exists.' => 'Dosya zaten mevcut.',
|
||||
'Please use one of the extensions %s.' => '%s uzantılarından birini kullanın.',
|
||||
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => 'Değişim şeması',
|
||||
'Create schema' => 'Yaratım şeması',
|
||||
'Schema has been dropped.' => 'Şema düşürüldü.',
|
||||
'Schema has been created.' => 'Şema yaratıldı.',
|
||||
'Alter schema' => 'Şemayı değiştir',
|
||||
'Create schema' => 'Şema oluştur',
|
||||
'Schema has been dropped.' => 'Şema silindi.',
|
||||
'Schema has been created.' => 'Şema oluşturuldu.',
|
||||
'Schema has been altered.' => 'Şema değiştirildi.',
|
||||
'schema' => 'şema',
|
||||
'Schema' => 'Şema',
|
||||
'Invalid schema.' => 'Geçersiz şema.',
|
||||
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => 'Diziler',
|
||||
'Create sequence' => 'Dizi yarat',
|
||||
'Sequence has been dropped.' => 'Dizi düşürüldü.',
|
||||
'Sequence has been created.' => 'Dizi yaratıldı.',
|
||||
'Create sequence' => 'Dizi oluştur',
|
||||
'Sequence has been dropped.' => 'Dizi silindi.',
|
||||
'Sequence has been created.' => 'Dizi oluşturuldu.',
|
||||
'Sequence has been altered.' => 'Dizi değiştirildi.',
|
||||
'Alter sequence' => 'Dizi değiştir',
|
||||
|
||||
'Alter sequence' => 'Diziyi değiştir',
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => 'Kullanıcı türleri',
|
||||
'Create type' => 'Tür yarat',
|
||||
'Type has been dropped.' => 'Tür düşürüldü.',
|
||||
'Type has been created.' => 'Tür yaratıldı.',
|
||||
'Alter type' => 'Tür değiştir',
|
||||
'Create type' => 'Tür oluştur',
|
||||
'Type has been dropped.' => 'Tür silindi.',
|
||||
'Type has been created.' => 'Tür oluşturuldu.',
|
||||
'Alter type' => 'Türü değiştir',
|
||||
);
|
||||
|
@@ -166,7 +166,7 @@ $translations = array(
|
||||
'Move up' => 'Пересунути вгору',
|
||||
'Move down' => 'Пересунути вниз',
|
||||
'Remove' => 'Видалити',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Досягнута максимальна кількість доступних полів. Будь ласка, збільшіть %s і %s.',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Досягнута максимальна кількість доступних полів. Будь ласка, збільшіть %s.',
|
||||
|
||||
'Partition by' => 'Розділити по',
|
||||
'Partitions' => 'Розділи',
|
||||
@@ -232,7 +232,6 @@ $translations = array(
|
||||
'%d row(s)' => array('%d рядок', '%d рядки', '%d рядків'),
|
||||
'Page' => 'Сторінка',
|
||||
'last' => 'остання',
|
||||
'Last page' => 'Остання сторінка',
|
||||
'whole result' => 'весь результат',
|
||||
'%d byte(s)' => array('%d байт', '%d байта', '%d байтів'),
|
||||
|
||||
@@ -240,7 +239,7 @@ $translations = array(
|
||||
'%d row(s) have been imported.' => array('%d рядок було імпортовано.', '%d рядки було імпортовано.', '%d рядків було імпортовано.'),
|
||||
|
||||
// in-place editing in select
|
||||
'Double click on a value to modify it.' => 'Двічі клікніть на значенні щоб змінити його.',
|
||||
'Ctrl+click on a value to modify it.' => 'Ctrl+клікніть на значенні щоб змінити його.',
|
||||
'Use edit link to modify this value.' => 'Використовуйте посилання щоб змінити це значення.',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
|
@@ -166,7 +166,7 @@ $translations = array(
|
||||
'Move up' => 'xx',
|
||||
'Move down' => 'xx',
|
||||
'Remove' => 'xx',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'xx',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => 'xx',
|
||||
|
||||
'Partition by' => 'xx',
|
||||
'Partitions' => 'xx',
|
||||
@@ -233,7 +233,8 @@ $translations = array(
|
||||
'%d row(s)' => array('xx', 'xx'),
|
||||
'Page' => 'xx',
|
||||
'last' => 'xx',
|
||||
'Last page' => 'xx',
|
||||
'Load more data' => 'xx',
|
||||
'Loading' => 'xx',
|
||||
'whole result' => 'xx',
|
||||
'%d byte(s)' => array('xx', 'xx'),
|
||||
|
||||
@@ -241,7 +242,7 @@ $translations = array(
|
||||
'%d row(s) have been imported.' => array('xx', 'xx'),
|
||||
|
||||
// in-place editing in select
|
||||
'Double click on a value to modify it.' => 'xx',
|
||||
'Ctrl+click on a value to modify it.' => 'xx',
|
||||
'Use edit link to modify this value.' => 'xx',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
@@ -261,6 +262,7 @@ $translations = array(
|
||||
'Save and insert next' => 'xx',
|
||||
'Clone' => 'xx',
|
||||
'Delete' => 'xx',
|
||||
'You have no privileges to update this table.' => 'xx',
|
||||
|
||||
'E-mail' => 'xx',
|
||||
'From' => 'xx',
|
||||
|
@@ -188,7 +188,7 @@ $translations = array(
|
||||
'whole result' => '所有結果',
|
||||
'Tables have been dropped.' => '已丟棄表。',
|
||||
'Clone' => '複製',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => '超過最多允許的字段數量。請增加%s和%s 。',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => '超過最多允許的字段數量。請增加%s。',
|
||||
'Partition by' => '分區類型',
|
||||
'Partitions' => '分區',
|
||||
'Partition name' => '分區名',
|
||||
@@ -244,7 +244,6 @@ $translations = array(
|
||||
'Alter type' => '更改類型',
|
||||
'Type has been dropped.' => '已刪除類型。',
|
||||
'Type has been created.' => '已建立類型。',
|
||||
'Double click on a value to modify it.' => '雙擊以進行修改。',
|
||||
'Use edit link to modify this value.' => '使用編輯連結來修改。',
|
||||
'last' => '最後一頁',
|
||||
'From server' => '從伺服器',
|
||||
@@ -258,7 +257,6 @@ $translations = array(
|
||||
'Attachments' => '附件',
|
||||
'%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
|
||||
'Show only errors' => '僅顯示錯誤訊息',
|
||||
'Last page' => '最後一頁',
|
||||
'Refresh' => '重新載入',
|
||||
'Invalid schema.' => '無效的資料表結構。',
|
||||
'Please use one of the extensions %s.' => '請使用下列其中一個 extension %s。',
|
||||
|
@@ -190,7 +190,7 @@ $translations = array(
|
||||
'whole result' => '所有结果',
|
||||
'Tables have been dropped.' => '已丢弃表。',
|
||||
'Clone' => '克隆',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => '超过最多允许的字段数量。请增加 %s 和 %s 。',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => '超过最多允许的字段数量。请增加 %s。',
|
||||
'Partition by' => '分区类型',
|
||||
'Partitions' => '分区',
|
||||
'Partition name' => '分区名',
|
||||
@@ -244,7 +244,6 @@ $translations = array(
|
||||
'Alter type' => '更改类型',
|
||||
'Type has been dropped.' => '已丢弃类型。',
|
||||
'Type has been created.' => '已创建类型。',
|
||||
'Double click on a value to modify it.' => '在值上双击类修改它。',
|
||||
'Use edit link to modify this value.' => '使用编辑链接来修改该值。',
|
||||
'last' => '最后',
|
||||
'From server' => '来自服务器',
|
||||
@@ -258,7 +257,6 @@ $translations = array(
|
||||
'Attachments' => '附件',
|
||||
'%d query(s) executed OK.' => '%d 条查询已成功执行。',
|
||||
'Show only errors' => '仅显示错误',
|
||||
'Last page' => '末页',
|
||||
'Refresh' => '刷新',
|
||||
'Invalid schema.' => '非法模式。',
|
||||
'Please use one of the extensions %s.' => '请使用这些扩展中的一个:%s。',
|
||||
|
@@ -11,13 +11,16 @@ function adminer_object() {
|
||||
$plugins = array(
|
||||
// specify enabled plugins here
|
||||
new AdminerDatabaseHide(array('information_schema')),
|
||||
new AdminerDumpJson,
|
||||
new AdminerDumpZip,
|
||||
new AdminerDumpXml,
|
||||
new AdminerDumpAlter,
|
||||
//~ new AdminerSqlLog("past-" . rtrim(`git describe --tags --abbrev=0`) . ".sql"),
|
||||
//~ 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 AdminerJsonColumn,
|
||||
new AdminerSlugify,
|
||||
new AdminerTranslation,
|
||||
new AdminerForeignSystem,
|
||||
|
@@ -7,18 +7,22 @@ if (!$result) {
|
||||
// list logged user, information_schema.USER_PRIVILEGES lists just the current user too
|
||||
$result = $connection->query("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1) AS User, SUBSTRING_INDEX(CURRENT_USER, '@', -1) AS Host");
|
||||
}
|
||||
|
||||
echo "<form action=''><p>\n";
|
||||
hidden_fields_get();
|
||||
echo "<input type='hidden' name='db' value='" . h(DB) . "'>\n";
|
||||
echo ($grant ? "" : "<input type='hidden' name='grant' value=''>\n");
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<thead><tr><th>" . lang('Username') . "<th>" . lang('Server') . "<th> </thead>\n";
|
||||
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
echo '<tr' . odd() . '><td>' . h($row["User"]) . "<td>" . h($row["Host"]) . '<td><a href="' . h(ME . 'user=' . urlencode($row["User"]) . '&host=' . urlencode($row["Host"])) . '">' . lang('Edit') . "</a>\n";
|
||||
}
|
||||
|
||||
if (!$grant || DB != "") {
|
||||
echo "<tr" . odd() . "><td><input name='user'><td><input name='host' value='localhost'><td><input type='submit' value='" . lang('Edit') . "'>\n";
|
||||
echo "<tr" . odd() . "><td><input name='user' autocapitalize='off'><td><input name='host' value='localhost' autocapitalize='off'><td><input type='submit' value='" . lang('Edit') . "'>\n";
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
echo "</form>\n";
|
||||
|
||||
|
@@ -1,46 +1,40 @@
|
||||
<?php
|
||||
$PROCEDURE = $_GET["procedure"];
|
||||
$routine = (isset($_GET["function"]) ? "FUNCTION" : "PROCEDURE");
|
||||
$routine_languages = routine_languages();
|
||||
$row = $_POST;
|
||||
$row["fields"] = (array) $row["fields"];
|
||||
|
||||
$dropped = false;
|
||||
if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"] && !$_POST["down"]) {
|
||||
$set = array();
|
||||
$fields = (array) $_POST["fields"];
|
||||
ksort($fields); // enforce fields order
|
||||
foreach ($fields as $field) {
|
||||
if ($field["field"] != "") {
|
||||
$set[] = (ereg("^($inout)\$", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET");
|
||||
}
|
||||
}
|
||||
$dropped = drop_create(
|
||||
if ($_POST && !process_fields($row["fields"]) && !$error) {
|
||||
$temp_name = "$row[name]_adminer_" . uniqid();
|
||||
drop_create(
|
||||
"DROP $routine " . idf_escape($PROCEDURE),
|
||||
"CREATE $routine " . idf_escape(trim($_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]", ";") . ";",
|
||||
create_routine($routine, $row),
|
||||
"DROP $routine " . idf_escape($row["name"]),
|
||||
create_routine($routine, array("name" => $temp_name) + $row),
|
||||
"DROP $routine " . idf_escape($temp_name),
|
||||
substr(ME, 0, -1),
|
||||
lang('Routine has been dropped.'),
|
||||
lang('Routine has been altered.'),
|
||||
lang('Routine has been created.'),
|
||||
$PROCEDURE
|
||||
$PROCEDURE,
|
||||
$row["name"]
|
||||
);
|
||||
}
|
||||
|
||||
page_header(($PROCEDURE != "" ? (isset($_GET["function"]) ? lang('Alter function') : lang('Alter procedure')) . ": " . h($PROCEDURE) : (isset($_GET["function"]) ? lang('Create function') : lang('Create procedure'))), $error);
|
||||
|
||||
$collations = get_vals("SHOW CHARACTER SET");
|
||||
sort($collations);
|
||||
$row = array("fields" => array());
|
||||
if ($_POST) {
|
||||
$row = $_POST;
|
||||
$row["fields"] = (array) $row["fields"];
|
||||
process_fields($row["fields"]);
|
||||
} elseif ($PROCEDURE != "") {
|
||||
if (!$_POST && $PROCEDURE != "") {
|
||||
$row = routine($PROCEDURE, $routine);
|
||||
$row["name"] = $PROCEDURE;
|
||||
}
|
||||
|
||||
$collations = get_vals("SHOW CHARACTER SET");
|
||||
sort($collations);
|
||||
$routine_languages = routine_languages();
|
||||
?>
|
||||
|
||||
<form action="" method="post" id="form">
|
||||
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64">
|
||||
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64" autocapitalize="off">
|
||||
<?php echo ($routine_languages ? lang('Language') . ": " . html_select("language", $routine_languages, $row["language"]) : ""); ?>
|
||||
<table cellspacing="0" class="nowrap">
|
||||
<?php
|
||||
@@ -55,6 +49,5 @@ if (isset($_GET["function"])) {
|
||||
<p>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php if ($PROCEDURE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<?php if ($dropped) { ?><input type="hidden" name="dropped" value="1"><?php } ?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
|
@@ -13,21 +13,30 @@ page_header(lang('Process list'), $error);
|
||||
?>
|
||||
|
||||
<form action="" method="post">
|
||||
<table cellspacing="0" onclick="tableClick(event);" class="nowrap checkable">
|
||||
<table cellspacing="0" onclick="tableClick(event);" ondblclick="tableClick(event, true);" class="nowrap checkable">
|
||||
<?php
|
||||
// HTML valid because there is always at least one process
|
||||
$i = -1;
|
||||
foreach (process_list() as $i => $row) {
|
||||
|
||||
if (!$i) {
|
||||
echo "<thead><tr lang='en'>" . (support("kill") ? "<th> " : "") . "<th>" . implode("<th>", array_keys($row)) . "</thead>\n";
|
||||
echo "<thead><tr lang='en'>" . (support("kill") ? "<th> " : "");
|
||||
foreach ($row as $key => $val) {
|
||||
echo "<th>" . ($jush == "sql"
|
||||
? "<a href='http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/show-processlist.html#processlist_" . strtolower($key) . "' target='_blank' rel='noreferrer' class='help'>$key</a>"
|
||||
: $key
|
||||
);
|
||||
}
|
||||
echo "</thead>\n";
|
||||
}
|
||||
|
||||
echo "<tr" . odd() . ">" . (support("kill") ? "<td>" . checkbox("kill[]", $row["Id"], 0) : "");
|
||||
foreach ($row as $key => $val) {
|
||||
echo "<td>" . (
|
||||
($jush == "sql" && $key == "Info" && ereg("Query|Killed", $row["Command"]) && $val != "") ||
|
||||
($jush == "pgsql" && $key == "current_query" && $val != "<IDLE>") ||
|
||||
($jush == "oracle" && $key == "sql_text" && $val != "")
|
||||
? "<code class='jush-$jush'>" . shorten_utf8($val, 100, "</code>") . ' <a href="' . h(ME . ($row["db"] != "" ? "db=" . urlencode($row["db"]) . "&" : "") . "sql=" . urlencode($val)) . '">' . lang('Edit') . '</a>'
|
||||
? "<code class='jush-$jush'>" . shorten_utf8($val, 100, "</code>") . ' <a href="' . h(ME . ($row["db"] != "" ? "db=" . urlencode($row["db"]) . "&" : "") . "sql=" . urlencode($val)) . '">' . lang('Clone') . '</a>'
|
||||
: nbsp($val)
|
||||
);
|
||||
}
|
||||
|
@@ -16,23 +16,23 @@ $base_left = -1;
|
||||
$schema = array(); // table => array("fields" => array(name => field), "pos" => array(top, left), "references" => array(table => array(left => array(source, target))))
|
||||
$referenced = array(); // target_table => array(table => array(left => target_column))
|
||||
$lefts = array(); // float => bool
|
||||
foreach (table_status() as $table_status) {
|
||||
if (!isset($table_status["Engine"])) { // view
|
||||
foreach (table_status('', true) as $table => $table_status) {
|
||||
if (is_view($table_status)) {
|
||||
continue;
|
||||
}
|
||||
$pos = 0;
|
||||
$schema[$table_status["Name"]]["fields"] = array();
|
||||
foreach (fields($table_status["Name"]) as $name => $field) {
|
||||
$schema[$table]["fields"] = array();
|
||||
foreach (fields($table) as $name => $field) {
|
||||
$pos += 1.25;
|
||||
$field["pos"] = $pos;
|
||||
$schema[$table_status["Name"]]["fields"][$name] = $field;
|
||||
$schema[$table]["fields"][$name] = $field;
|
||||
}
|
||||
$schema[$table_status["Name"]]["pos"] = ($table_pos[$table_status["Name"]] ? $table_pos[$table_status["Name"]] : array($top, 0));
|
||||
foreach ($adminer->foreignKeys($table_status["Name"]) as $val) {
|
||||
$schema[$table]["pos"] = ($table_pos[$table] ? $table_pos[$table] : array($top, 0));
|
||||
foreach ($adminer->foreignKeys($table) as $val) {
|
||||
if (!$val["db"]) {
|
||||
$left = $base_left;
|
||||
if ($table_pos[$table_status["Name"]][1] || $table_pos[$val["table"]][1]) {
|
||||
$left = min(floatval($table_pos[$table_status["Name"]][1]), floatval($table_pos[$val["table"]][1])) - 1;
|
||||
if ($table_pos[$table][1] || $table_pos[$val["table"]][1]) {
|
||||
$left = min(floatval($table_pos[$table][1]), floatval($table_pos[$val["table"]][1])) - 1;
|
||||
} else {
|
||||
$base_left -= .1;
|
||||
}
|
||||
@@ -40,12 +40,12 @@ foreach (table_status() as $table_status) {
|
||||
// find free $left
|
||||
$left -= .0001;
|
||||
}
|
||||
$schema[$table_status["Name"]]["references"][$val["table"]][(string) $left] = array($val["source"], $val["target"]);
|
||||
$referenced[$val["table"]][$table_status["Name"]][(string) $left] = $val["target"];
|
||||
$schema[$table]["references"][$val["table"]][(string) $left] = array($val["source"], $val["target"]);
|
||||
$referenced[$val["table"]][$table][(string) $left] = $val["target"];
|
||||
$lefts[(string) $left] = true;
|
||||
}
|
||||
}
|
||||
$top = max($top, $schema[$table_status["Name"]]["pos"][0] + 2.5 + $pos);
|
||||
$top = max($top, $schema[$table]["pos"][0] + 2.5 + $pos);
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -62,10 +62,12 @@ document.onmouseup = function (ev) {
|
||||
foreach ($schema as $name => $table) {
|
||||
echo "<div class='table' style='top: " . $table["pos"][0] . "em; left: " . $table["pos"][1] . "em;' onmousedown='schemaMousedown(this, event);'>";
|
||||
echo '<a href="' . h(ME) . 'table=' . urlencode($name) . '"><b>' . h($name) . "</b></a>";
|
||||
|
||||
foreach ($table["fields"] as $field) {
|
||||
$val = '<span' . type_class($field["type"]) . ' title="' . h($field["full_type"] . ($field["null"] ? " NULL" : '')) . '">' . h($field["field"]) . '</span>';
|
||||
echo "<br>" . ($field["primary"] ? "<i>$val</i>" : $val);
|
||||
}
|
||||
|
||||
foreach ((array) $table["references"] as $target_name => $refs) {
|
||||
foreach ($refs as $left => $ref) {
|
||||
$left1 = $left - $table_pos[$name][1];
|
||||
@@ -75,6 +77,7 @@ foreach ($schema as $name => $table) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ((array) $referenced[$name] as $target_name => $refs) {
|
||||
foreach ($refs as $left => $columns) {
|
||||
$left1 = $left - $table_pos[$name][1];
|
||||
@@ -84,8 +87,10 @@ foreach ($schema as $name => $table) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo "\n</div>\n";
|
||||
}
|
||||
|
||||
foreach ($schema as $name => $table) {
|
||||
foreach ((array) $table["references"] as $target_name => $refs) {
|
||||
foreach ($refs as $left => $ref) {
|
||||
|
@@ -1,10 +1,12 @@
|
||||
<?php
|
||||
$row = $_POST;
|
||||
|
||||
if ($_POST && !$error) {
|
||||
$link = preg_replace('~ns=[^&]*&~', '', ME) . "ns=";
|
||||
if ($_POST["drop"]) {
|
||||
query_redirect("DROP SCHEMA " . idf_escape($_GET["ns"]), $link, lang('Schema has been dropped.'));
|
||||
} else {
|
||||
$name = trim($_POST["name"]);
|
||||
$name = trim($row["name"]);
|
||||
$link .= urlencode($name);
|
||||
if ($_GET["ns"] == "") {
|
||||
query_redirect("CREATE SCHEMA " . idf_escape($name), $link, lang('Schema has been created.'));
|
||||
@@ -18,15 +20,14 @@ if ($_POST && !$error) {
|
||||
|
||||
page_header($_GET["ns"] != "" ? lang('Alter schema') : lang('Create schema'), $error);
|
||||
|
||||
$row = $_POST;
|
||||
if (!$row) {
|
||||
$row = array("name" => $_GET["ns"]);
|
||||
$row["name"] = $_GET["ns"];
|
||||
}
|
||||
?>
|
||||
|
||||
<form action="" method="post">
|
||||
<p><input id="name" name="name" value="<?php echo h($row["name"]); ?>">
|
||||
<script type='text/javascript'>document.getElementById('name').focus();</script>
|
||||
<p><input name="name" id="name" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
|
||||
<script type='text/javascript'>focus(document.getElementById('name'));</script>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php
|
||||
if ($_GET["ns"] != "") {
|
||||
|
@@ -3,8 +3,8 @@ header("Content-Type: text/javascript; charset=utf-8");
|
||||
|
||||
if ($_GET["script"] == "db") {
|
||||
$sums = array("Data_length" => 0, "Index_length" => 0, "Data_free" => 0);
|
||||
foreach (table_status() as $table_status) {
|
||||
$id = js_escape($table_status["Name"]);
|
||||
foreach (table_status() as $name => $table_status) {
|
||||
$id = js_escape($name);
|
||||
json_row("Comment-$id", nbsp($table_status["Comment"]));
|
||||
if (!is_view($table_status)) {
|
||||
foreach (array("Engine", "Collation") as $key) {
|
||||
|
@@ -17,8 +17,8 @@ $text_length = null;
|
||||
foreach ($fields as $key => $field) {
|
||||
$name = $adminer->fieldName($field);
|
||||
if (isset($field["privileges"]["select"]) && $name != "") {
|
||||
$columns[$key] = html_entity_decode(strip_tags($name));
|
||||
if (ereg('text|lob|geometry|point|linestring|polygon', $field["type"])) {
|
||||
$columns[$key] = html_entity_decode(strip_tags($name), ENT_QUOTES);
|
||||
if (is_shortable($field)) {
|
||||
$text_length = $adminer->selectLengthProcess();
|
||||
}
|
||||
}
|
||||
@@ -30,29 +30,26 @@ $is_group = count($group) < count($select);
|
||||
$where = $adminer->selectSearchProcess($fields, $indexes);
|
||||
$order = $adminer->selectOrderProcess($fields, $indexes);
|
||||
$limit = $adminer->selectLimitProcess();
|
||||
$from = ($select ? implode(", ", $select) : "*" . ($oid ? ", $oid" : ""));
|
||||
if ($jush == "sql") {
|
||||
foreach ($columns as $key => $val) {
|
||||
$as = convert_field($fields[$key]);
|
||||
if ($as) {
|
||||
$from .= ", $as AS " . idf_escape($key);
|
||||
}
|
||||
}
|
||||
}
|
||||
$from .= "\nFROM " . table($TABLE);
|
||||
$from = ($select ? implode(", ", $select) : "*" . ($oid ? ", $oid" : ""))
|
||||
. convert_fields($columns, $fields, $select)
|
||||
. "\nFROM " . table($TABLE);
|
||||
$group_by = ($group && $is_group ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : "");
|
||||
|
||||
if ($_GET["val"] && is_ajax()) {
|
||||
header("Content-Type: text/plain; charset=utf-8");
|
||||
foreach ($_GET["val"] as $unique_idf => $row) {
|
||||
$as = convert_field($fields[key($row)]);
|
||||
echo $connection->result("SELECT" . limit(($as ? $as : idf_escape(key($row))) . " FROM " . table($TABLE), " WHERE " . where_check($unique_idf) . ($where ? " AND " . implode(" AND ", $where) : "") . ($order ? " ORDER BY " . implode(", ", $order) : ""), 1));
|
||||
echo $connection->result("SELECT" . limit($as ? $as : idf_escape(key($row)) . " FROM " . table($TABLE), " WHERE " . where_check($unique_idf, $fields) . ($where ? " AND " . implode(" AND ", $where) : "") . ($order ? " ORDER BY " . implode(", ", $order) : ""), 1));
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($_POST && !$error) {
|
||||
$where_check = "(" . implode(") OR (", array_map('where_check', (array) $_POST["check"])) . ")";
|
||||
$where_check = $where;
|
||||
if (is_array($_POST["check"])) {
|
||||
$where_check[] = "((" . implode(") OR (", array_map('where_check', $_POST["check"])) . "))";
|
||||
}
|
||||
$where_check = ($where_check ? "\nWHERE " . implode(" AND ", $where_check) : "");
|
||||
$primary = $unselected = null;
|
||||
foreach ($indexes as $index) {
|
||||
if ($index["type"] == "PRIMARY") {
|
||||
@@ -66,27 +63,25 @@ if ($_POST && !$error) {
|
||||
unset($unselected[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($_POST["export"]) {
|
||||
cookie("adminer_import", "output=" . urlencode($_POST["output"]) . "&format=" . urlencode($_POST["format"]));
|
||||
dump_headers($TABLE);
|
||||
$adminer->dumpTable($TABLE, "");
|
||||
if (!is_array($_POST["check"]) || $unselected === array()) {
|
||||
$where2 = $where;
|
||||
if (is_array($_POST["check"])) {
|
||||
$where2[] = "($where_check)";
|
||||
}
|
||||
$query = "SELECT $from" . ($where2 ? "\nWHERE " . implode(" AND ", $where2) : "") . $group_by;
|
||||
$query = "SELECT $from$where_check$group_by";
|
||||
} else {
|
||||
$union = array();
|
||||
foreach ($_POST["check"] as $val) {
|
||||
// where is not unique so OR can't be used
|
||||
$union[] = "(SELECT" . limit($from, "\nWHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($val) . $group_by, 1) . ")";
|
||||
$union[] = "(SELECT" . limit($from, "\nWHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($val, $fields) . $group_by, 1) . ")";
|
||||
}
|
||||
$query = implode(" UNION ALL ", $union);
|
||||
}
|
||||
$adminer->dumpData($TABLE, "table", $query);
|
||||
exit;
|
||||
}
|
||||
|
||||
if (!$adminer->selectEmailProcess($where, $foreign_keys)) {
|
||||
if ($_POST["save"] || $_POST["delete"]) { // edit
|
||||
$result = true;
|
||||
@@ -117,12 +112,12 @@ if ($_POST && !$error) {
|
||||
$query = "INTO $query";
|
||||
}
|
||||
if ($_POST["all"] || ($unselected === array() && $_POST["check"]) || $is_group) {
|
||||
$result = queries("$command $query" . ($_POST["all"] ? ($where ? "\nWHERE " . implode(" AND ", $where) : "") : "\nWHERE $where_check"));
|
||||
$result = queries("$command $query$where_check");
|
||||
$affected = $connection->affected_rows;
|
||||
} else {
|
||||
foreach ((array) $_POST["check"] as $val) {
|
||||
// where is not unique so OR can't be used
|
||||
$result = queries($command . limit1($query, "\nWHERE " . where_check($val)));
|
||||
$result = queries($command . limit1($query, "\nWHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($val, $fields)));
|
||||
if (!$result) {
|
||||
break;
|
||||
}
|
||||
@@ -137,11 +132,12 @@ if ($_POST && !$error) {
|
||||
$message = lang('Item%s has been inserted.', " $last_id");
|
||||
}
|
||||
}
|
||||
queries_redirect(remove_from_uri("page"), $message, $result);
|
||||
queries_redirect(remove_from_uri($_POST["all"] && $_POST["delete"] ? "page" : ""), $message, $result);
|
||||
//! display edit page in case of an error
|
||||
|
||||
} elseif (!$_POST["import"]) { // modify
|
||||
if (!$_POST["val"]) {
|
||||
$error = lang('Double click on a value to modify it.');
|
||||
$error = lang('Ctrl+click on a value to modify it.');
|
||||
} else {
|
||||
$result = true;
|
||||
$affected = 0;
|
||||
@@ -152,7 +148,7 @@ if ($_POST && !$error) {
|
||||
$set[] = idf_escape($key) . " = " . (ereg('char|text', $fields[$key]["type"]) || $val != "" ? $adminer->processInput($fields[$key], $val) : "NULL");
|
||||
}
|
||||
$query = table($TABLE) . " SET " . implode(", ", $set);
|
||||
$where2 = " WHERE " . where_check($unique_idf) . ($where ? " AND " . implode(" AND ", $where) : "");
|
||||
$where2 = " WHERE " . where_check($unique_idf, $fields) . ($where ? " AND " . implode(" AND ", $where) : "");
|
||||
$result = queries("UPDATE" . ($is_group ? " $query$where2" : limit1($query, $where2))); // can change row on a different page without unique key
|
||||
if (!$result) {
|
||||
break;
|
||||
@@ -161,6 +157,7 @@ if ($_POST && !$error) {
|
||||
}
|
||||
queries_redirect(remove_from_uri(), lang('%d item(s) have been affected.', $affected), $result);
|
||||
}
|
||||
|
||||
} elseif (is_string($file = get_file("csv_file", true))) {
|
||||
//! character set
|
||||
cookie("adminer_import", "output=" . urlencode($adminer_import["output"]) . "&format=" . urlencode($_POST["separator"]));
|
||||
@@ -171,7 +168,7 @@ if ($_POST && !$error) {
|
||||
begin();
|
||||
$separator = ($_POST["separator"] == "csv" ? "," : ($_POST["separator"] == "tsv" ? "\t" : ";"));
|
||||
foreach ($matches[0] as $key => $val) {
|
||||
preg_match_all("~((\"[^\"]*\")+|[^$separator]*)$separator~", $val . $separator, $matches2);
|
||||
preg_match_all("~((?>\"[^\"]*\")+|[^$separator]*)$separator~", $val . $separator, $matches2);
|
||||
if (!$key && !array_diff($matches2[1], $cols)) { //! doesn't work with column names containing ",\n
|
||||
// first row corresponds to column names - use it for table structure
|
||||
$cols = $matches2[1];
|
||||
@@ -192,6 +189,7 @@ if ($_POST && !$error) {
|
||||
}
|
||||
queries_redirect(remove_from_uri("page"), lang('%d row(s) have been imported.', $affected), $result);
|
||||
queries("ROLLBACK"); // after queries_redirect() to not overwrite error
|
||||
|
||||
} else {
|
||||
$error = upload_error($file);
|
||||
}
|
||||
@@ -257,7 +255,7 @@ if (!$columns) {
|
||||
if (!$result) {
|
||||
echo "<p class='error'>" . error() . "\n";
|
||||
} else {
|
||||
if ($jush == "mssql") {
|
||||
if ($jush == "mssql" && $page) {
|
||||
$result->seek($limit * $page);
|
||||
}
|
||||
$email_fields = array();
|
||||
@@ -282,7 +280,7 @@ if (!$columns) {
|
||||
} else {
|
||||
$backward_keys = $adminer->backwardKeys($TABLE, $table_name);
|
||||
|
||||
echo "<table id='table' cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' onkeydown='return editingKeydown(event);'>\n";
|
||||
echo "<table id='table' cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);' onkeydown='return editingKeydown(event);'>\n";
|
||||
echo "<thead><tr>" . (!$group && $select ? "" : "<td><input type='checkbox' id='all-page' onclick='formCheck(this, /check/);'> <a href='" . h($_GET["modify"] ? remove_from_uri("modify") : $_SERVER["REQUEST_URI"] . "&modify=1") . "'>" . lang('edit') . "</a>");
|
||||
$names = array();
|
||||
$functions = array();
|
||||
@@ -313,6 +311,7 @@ if (!$columns) {
|
||||
next($select);
|
||||
}
|
||||
}
|
||||
|
||||
$lengths = array();
|
||||
if ($_GET["modify"]) {
|
||||
foreach ($rows as $row) {
|
||||
@@ -321,40 +320,55 @@ if (!$columns) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo ($backward_keys ? "<th>" . lang('Relations') : "") . "</thead>\n";
|
||||
|
||||
if (is_ajax()) {
|
||||
if ($limit % 2 == 1 && $page % 2 == 1) {
|
||||
odd();
|
||||
}
|
||||
ob_end_clean();
|
||||
}
|
||||
|
||||
foreach ($adminer->rowDescriptions($rows, $foreign_keys) as $n => $row) {
|
||||
$unique_array = unique_array($rows[$n], $indexes);
|
||||
if (!$unique_array) {
|
||||
$unique_array = array();
|
||||
foreach ($rows[$n] as $key => $val) {
|
||||
if (!preg_match('~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~', $key)) { //! columns looking like functions
|
||||
$unique_array[$key] = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
$unique_idf = "";
|
||||
foreach ($unique_array as $key => $val) {
|
||||
if (strlen($val) > 64) {
|
||||
$key = "MD5(" . (strpos($key, '(') ? $key : idf_escape($key)) . ")"; //! columns looking like functions
|
||||
$val = md5($val);
|
||||
}
|
||||
$unique_idf .= "&" . ($val !== null ? urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($val) : "null%5B%5D=" . urlencode($key));
|
||||
}
|
||||
echo "<tr" . odd() . ">" . (!$group && $select ? "" : "<td>" . checkbox("check[]", substr($unique_idf, 1), in_array(substr($unique_idf, 1), (array) $_POST["check"]), "", "this.form['all'].checked = false; formUncheck('all-page');") . ($is_group || information_schema(DB) ? "" : " <a href='" . h(ME . "edit=" . urlencode($TABLE) . $unique_idf) . "'>" . lang('edit') . "</a>"));
|
||||
|
||||
foreach ($row as $key => $val) {
|
||||
if (isset($names[$key])) {
|
||||
$field = $fields[$key];
|
||||
if ($val != "" && (!isset($email_fields[$key]) || $email_fields[$key] != "")) {
|
||||
$email_fields[$key] = (is_mail($val) ? $names[$key] : ""); //! filled e-mails can be contained on other pages
|
||||
}
|
||||
|
||||
$link = "";
|
||||
$val = $adminer->editVal($val, $field);
|
||||
if ($val !== null) {
|
||||
if (ereg('blob|bytea|raw|file', $field["type"]) && $val != "") {
|
||||
$link = h(ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf);
|
||||
$link = ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf;
|
||||
}
|
||||
if ($val === "") { // === - may be int
|
||||
$val = " ";
|
||||
} elseif (is_utf8($val)) {
|
||||
if ($text_length != "" && ereg('text|lob|geometry|point|linestring|polygon', $field["type"])) {
|
||||
$val = shorten_utf8($val, max(0, +$text_length)); // usage of LEFT() would reduce traffic but complicate query - expected average speedup: .001 s VS .01 s on local network
|
||||
} else {
|
||||
$val = h($val);
|
||||
}
|
||||
} elseif ($text_length != "" && is_shortable($field)) {
|
||||
$val = shorten_utf8($val, max(0, +$text_length)); // usage of LEFT() would reduce traffic but complicate query - expected average speedup: .001 s VS .01 s on local network
|
||||
} else {
|
||||
$val = h($val);
|
||||
}
|
||||
|
||||
if (!$link) { // link related items
|
||||
@@ -364,29 +378,32 @@ if (!$columns) {
|
||||
foreach ($foreign_key["source"] as $i => $source) {
|
||||
$link .= where_link($i, $foreign_key["target"][$i], $rows[$n][$source]);
|
||||
}
|
||||
$link = h(($foreign_key["db"] != "" ? preg_replace('~([?&]db=)[^&]+~', '\\1' . urlencode($foreign_key["db"]), ME) : ME) . 'select=' . urlencode($foreign_key["table"]) . $link); // InnoDB supports non-UNIQUE keys
|
||||
$link = ($foreign_key["db"] != "" ? preg_replace('~([?&]db=)[^&]+~', '\\1' . urlencode($foreign_key["db"]), ME) : ME) . 'select=' . urlencode($foreign_key["table"]) . $link; // InnoDB supports non-UNIQUE keys
|
||||
if (count($foreign_key["source"]) == 1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($key == "COUNT(*)") { //! columns looking like functions
|
||||
$link = h(ME . "select=" . urlencode($TABLE));
|
||||
$link = ME . "select=" . urlencode($TABLE);
|
||||
$i = 0;
|
||||
foreach ((array) $_GET["where"] as $v) {
|
||||
if (!array_key_exists($v["col"], $unique_array)) {
|
||||
$link .= h(where_link($i++, $v["col"], $v["val"], $v["op"]));
|
||||
$link .= where_link($i++, $v["col"], $v["val"], $v["op"]);
|
||||
}
|
||||
}
|
||||
foreach ($unique_array as $k => $v) {
|
||||
$link .= h(where_link($i++, $k, $v));
|
||||
$link .= where_link($i++, $k, $v);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (!$link) {
|
||||
if (is_mail($val)) {
|
||||
$link = "mailto:$val";
|
||||
|
||||
if (!$link && ($link = $adminer->selectLink($row[$key], $field)) === null) {
|
||||
if (is_mail($row[$key])) {
|
||||
$link = "mailto:$row[$key]";
|
||||
}
|
||||
if ($protocol = is_url($row[$key])) {
|
||||
$link = ($protocol == "http" && $HTTPS
|
||||
@@ -395,6 +412,7 @@ if (!$columns) {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$id = h("val[$unique_idf][" . bracket_escape($key) . "]");
|
||||
$value = $_POST["val"][$unique_idf][bracket_escape($key)];
|
||||
$h_value = h($value !== null ? $value : $row[$key]);
|
||||
@@ -403,16 +421,18 @@ if (!$columns) {
|
||||
$text = ereg('text|lob', $field["type"]);
|
||||
echo (($_GET["modify"] && $editable) || $value !== null
|
||||
? "<td>" . ($text ? "<textarea name='$id' cols='30' rows='" . (substr_count($row[$key], "\n") + 1) . "'>$h_value</textarea>" : "<input name='$id' value='$h_value' size='$lengths[$key]'>")
|
||||
: "<td id='$id' ondblclick=\"" . ($editable ? "selectDblClick(this, event" . ($long ? ", 2" : ($text ? ", 1" : "")) . ")" : "alert('" . h(lang('Use edit link to modify this value.')) . "')") . ";\">" . $adminer->selectVal($val, $link, $field)
|
||||
: "<td id='$id' onclick=\"selectClick(this, event, " . ($long ? 2 : ($text ? 1 : 0)) . ($editable ? "" : ", '" . h(lang('Use edit link to modify this value.')) . "'") . ");\">" . $adminer->selectVal($val, $link, $field)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if ($backward_keys) {
|
||||
echo "<td>";
|
||||
}
|
||||
$adminer->backwardKeysPrint($backward_keys, $rows[$n]);
|
||||
echo "</tr>\n"; // close to allow white-space: pre
|
||||
}
|
||||
|
||||
if (is_ajax()) {
|
||||
exit;
|
||||
}
|
||||
@@ -431,8 +451,9 @@ if (!$columns) {
|
||||
$exact_count = false;
|
||||
}
|
||||
}
|
||||
echo "<p class='pages'>";
|
||||
if (+$limit && ($found_rows === false || $found_rows > $limit)) {
|
||||
|
||||
if (+$limit && ($found_rows === false || $found_rows > $limit || $page)) {
|
||||
echo "<p class='pages'>";
|
||||
// display first, previous 4, next 4 and last page
|
||||
$max_page = ($found_rows === false
|
||||
? $page + (count($rows) >= $limit ? 2 : 1)
|
||||
@@ -443,23 +464,38 @@ if (!$columns) {
|
||||
for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
|
||||
echo pagination($i, $page);
|
||||
}
|
||||
echo ($page + 5 < $max_page ? " ..." : "") . ($exact_count && $found_rows !== false ? pagination($max_page, $page) : ' <a href="' . h(remove_from_uri("page") . "&page=last") . '">' . lang('last') . "</a>");
|
||||
if ($max_page > 0) {
|
||||
echo ($page + 5 < $max_page ? " ..." : "");
|
||||
echo ($exact_count && $found_rows !== false
|
||||
? pagination($max_page, $page)
|
||||
: " <a href='" . h(remove_from_uri("page") . "&page=last") . "' title='~$max_page'>" . lang('last') . "</a>"
|
||||
);
|
||||
}
|
||||
echo (($found_rows === false ? count($rows) + 1 : $found_rows - $page * $limit) > $limit ? ' <a href="' . h(remove_from_uri("page") . "&page=" . ($page + 1)) . '" onclick="return !selectLoadMore(this, ' . (+$limit) . ', \'' . lang('Loading') . '\');">' . lang('Load more data') . '</a>' : '');
|
||||
}
|
||||
echo ($found_rows !== false ? " (" . ($exact_count ? "" : "~ ") . lang('%d row(s)', $found_rows) . ")" : "");
|
||||
echo (+$limit && ($found_rows === false ? count($rows) + 1 : $found_rows - $page * $limit) > $limit ? ' <a href="' . h(remove_from_uri("page") . "&page=" . ($page + 1)) . '" onclick="return !selectLoadMore(this, ' . (+$limit) . ', \'' . lang('Loading') . '\');">' . lang('Load more data') . '</a>' : '');
|
||||
echo " " . checkbox("all", 1, 0, lang('whole result')) . "\n";
|
||||
|
||||
echo "<p>\n";
|
||||
echo ($found_rows !== false ? "(" . ($exact_count ? "" : "~ ") . lang('%d row(s)', $found_rows) . ") " : "");
|
||||
echo checkbox("all", 1, 0, lang('whole result')) . "\n";
|
||||
|
||||
if ($adminer->selectCommandPrint()) {
|
||||
?>
|
||||
<fieldset><legend><?php echo lang('Edit'); ?></legend><div>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>"<?php echo ($_GET["modify"] ? '' : ' title="' . lang('Double click on a value to modify it.') . '" class="jsonly"'); ?>>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>"<?php echo ($_GET["modify"] ? '' : ' title="' . lang('Ctrl+click on a value to modify it.') . '" class="jsonly"'); ?>>
|
||||
<input type="submit" name="edit" value="<?php echo lang('Edit'); ?>">
|
||||
<input type="submit" name="clone" value="<?php echo lang('Clone'); ?>">
|
||||
<input type="submit" name="delete" value="<?php echo lang('Delete'); ?>" onclick="return confirm('<?php echo lang('Are you sure?'); ?> (' + (this.form['all'].checked ? <?php echo $found_rows; ?> : formChecked(this, /check/)) + ')');">
|
||||
</div></fieldset>
|
||||
<?php
|
||||
}
|
||||
|
||||
$format = $adminer->dumpFormat();
|
||||
foreach ((array) $_GET["columns"] as $column) {
|
||||
if ($column["fun"]) {
|
||||
unset($format['sql']);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($format) {
|
||||
print_fieldset("export", lang('Export'));
|
||||
$output = $adminer->dumpOutput();
|
||||
@@ -469,17 +505,18 @@ if (!$columns) {
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
}
|
||||
|
||||
if ($adminer->selectImportPrint()) {
|
||||
print_fieldset("import", lang('Import'), !$rows);
|
||||
echo "<input type='file' name='csv_file'> ";
|
||||
echo html_select("separator", array("csv" => "CSV,", "csv;" => "CSV;", "tsv" => "TSV"), $adminer_import["format"], 1); // 1 - select
|
||||
echo " <input type='submit' name='import' value='" . lang('Import') . "'>";
|
||||
echo "<input type='hidden' name='token' value='$token'>\n";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
|
||||
$adminer->selectEmailPrint(array_filter($email_fields, 'strlen'), $columns);
|
||||
|
||||
echo "<p><input type='hidden' name='token' value='$token'></p>\n";
|
||||
echo "</form>\n";
|
||||
}
|
||||
}
|
||||
|
@@ -1,9 +1,10 @@
|
||||
<?php
|
||||
$SEQUENCE = $_GET["sequence"];
|
||||
$row = $_POST;
|
||||
|
||||
if ($_POST && !$error) {
|
||||
$link = substr(ME, 0, -1);
|
||||
$name = trim($_POST["name"]);
|
||||
$name = trim($row["name"]);
|
||||
if ($_POST["drop"]) {
|
||||
query_redirect("DROP SEQUENCE " . idf_escape($SEQUENCE), $link, lang('Sequence has been dropped.'));
|
||||
} elseif ($SEQUENCE == "") {
|
||||
@@ -17,14 +18,13 @@ if ($_POST && !$error) {
|
||||
|
||||
page_header($SEQUENCE != "" ? lang('Alter sequence') . ": " . h($SEQUENCE) : lang('Create sequence'), $error);
|
||||
|
||||
$row = $_POST;
|
||||
if (!$row) {
|
||||
$row = array("name" => $SEQUENCE);
|
||||
$row["name"] = $SEQUENCE;
|
||||
}
|
||||
?>
|
||||
|
||||
<form action="" method="post">
|
||||
<p><input name="name" value="<?php echo h($row["name"]); ?>">
|
||||
<p><input name="name" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php
|
||||
if ($SEQUENCE != "") {
|
||||
|
@@ -20,18 +20,20 @@ if (!$error && $_POST) {
|
||||
$fp = false;
|
||||
$query = $_POST["query"];
|
||||
if ($_POST["webfile"]) {
|
||||
$fp = @fopen((file_exists("adminer.sql") ? "adminer.sql"
|
||||
: (file_exists("adminer.sql.gz") ? "compress.zlib://adminer.sql.gz"
|
||||
: "compress.bzip2://adminer.sql.bz2"
|
||||
)), "rb");
|
||||
$fp = @fopen((file_exists("adminer.sql")
|
||||
? "adminer.sql"
|
||||
: "compress.zlib://adminer.sql.gz"
|
||||
), "rb");
|
||||
$query = ($fp ? fread($fp, 1e6) : false);
|
||||
} elseif ($_FILES && $_FILES["sql_file"]["error"] != UPLOAD_ERR_NO_FILE) {
|
||||
} elseif ($_FILES && $_FILES["sql_file"]["error"][0] != 4) { // 4 - UPLOAD_ERR_NO_FILE
|
||||
$query = get_file("sql_file", true);
|
||||
}
|
||||
|
||||
if (is_string($query)) { // get_file() returns error as number, fread() as false
|
||||
if (function_exists('memory_get_usage')) {
|
||||
@ini_set("memory_limit", max(ini_bytes("memory_limit"), 2 * strlen($query) + memory_get_usage() + 8e6)); // @ - may be disabled, 2 - substr and trim, 8e6 - other variables
|
||||
}
|
||||
|
||||
if ($query != "" && strlen($query) < 1e6) { // don't add big queries
|
||||
$q = $query . (ereg(";[ \t\r\n]*\$", $query) ? "" : ";"); //! doesn't work with DELIMITER |
|
||||
if (!$history || reset(end($history)) != $q) { // no repeated queries
|
||||
@@ -41,6 +43,7 @@ if (!$error && $_POST) {
|
||||
stop_session();
|
||||
}
|
||||
}
|
||||
|
||||
$space = "(?:\\s|/\\*.*\\*/|(?:#|-- )[^\n]*\n|--\n)";
|
||||
$delimiter = ";";
|
||||
$offset = 0;
|
||||
@@ -57,6 +60,7 @@ if (!$error && $_POST) {
|
||||
parse_str($_COOKIE["adminer_export"], $adminer_export);
|
||||
$dump_format = $adminer->dumpFormat();
|
||||
unset($dump_format["sql"]);
|
||||
|
||||
while ($query != "") {
|
||||
if (!$offset && preg_match("~^$space*DELIMITER\\s+(\\S+)~i", $query, $match)) {
|
||||
$delimiter = $match[1];
|
||||
@@ -71,6 +75,7 @@ if (!$error && $_POST) {
|
||||
break;
|
||||
}
|
||||
$offset = $pos + strlen($found);
|
||||
|
||||
if ($found && rtrim($found) != $delimiter) { // find matching quote or comment end
|
||||
while (preg_match('(' . ($found == '/*' ? '\\*/' : ($found == '[' ? ']' : (ereg('^-- |^#', $found) ? "\n" : preg_quote($found) . "|\\\\."))) . '|$)s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES
|
||||
$s = $match[0][0];
|
||||
@@ -83,6 +88,7 @@ if (!$error && $_POST) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else { // end of a query
|
||||
$empty = false;
|
||||
$q = substr($query, 0, $pos);
|
||||
@@ -98,17 +104,22 @@ if (!$error && $_POST) {
|
||||
if ($connection->multi_query($q) && is_object($connection2) && preg_match("~^$space*USE\\b~isU", $q)) {
|
||||
$connection2->query($q);
|
||||
}
|
||||
|
||||
do {
|
||||
$result = $connection->store_result();
|
||||
$end = 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 = " <span class='time'>(" . format_time($start, $end) . ")</span>"
|
||||
. (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) {
|
||||
echo ($_POST["only_errors"] ? $print : "");
|
||||
echo "<p class='error'>" . lang('Error in query') . ": " . error() . "\n";
|
||||
echo "<p class='error'>" . lang('Error in query') . ($connection->errno ? " ($connection->errno)" : "") . ": " . error() . "\n";
|
||||
$errors[] = " <a href='#sql-$commands'>$commands</a>";
|
||||
if ($_POST["error_stops"]) {
|
||||
break 2;
|
||||
}
|
||||
|
||||
} elseif (is_object($result)) {
|
||||
$orgtables = select($result, $connection2);
|
||||
if (!$_POST["only_errors"]) {
|
||||
@@ -132,6 +143,7 @@ if (!$error && $_POST) {
|
||||
}
|
||||
echo "</form>\n";
|
||||
}
|
||||
|
||||
} else {
|
||||
if (preg_match("~^$space*(CREATE|DROP|ALTER)$space+(DATABASE|SCHEMA)\\b~isU", $q)) {
|
||||
restart_session();
|
||||
@@ -142,23 +154,29 @@ if (!$error && $_POST) {
|
||||
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());
|
||||
|
||||
$line += substr_count($q.$found, "\n");
|
||||
$query = substr($query, $offset);
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($empty) {
|
||||
echo "<p class='message'>" . lang('No commands to execute.') . "\n";
|
||||
} elseif ($_POST["only_errors"]) {
|
||||
echo "<p class='message'>" . lang('%d query(s) executed OK.', $commands - count($errors)) . format_time($total_start, microtime()) . "\n";
|
||||
echo "<p class='message'>" . lang('%d query(s) executed OK.', $commands - count($errors));
|
||||
echo " <span class='time'>(" . format_time($total_start, microtime()) . ")</span>\n";
|
||||
} elseif ($errors && $commands > 1) {
|
||||
echo "<p class='error'>" . lang('Error in query') . ": " . implode("", $errors) . "\n";
|
||||
}
|
||||
//! MS SQL - SET SHOWPLAN_ALL OFF
|
||||
|
||||
} else {
|
||||
echo "<p class='error'>" . upload_error($query) . "\n";
|
||||
}
|
||||
@@ -176,41 +194,38 @@ if ($_POST) {
|
||||
$q = $history[$_GET["history"]][0];
|
||||
}
|
||||
textarea("query", $q, 20);
|
||||
echo ($_POST ? "" : "<script type='text/javascript'>document.getElementsByTagName('textarea')[0].focus();</script>\n");
|
||||
|
||||
echo ($_POST ? "" : "<script type='text/javascript'>focus(document.getElementsByTagName('textarea')[0]);</script>\n");
|
||||
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;"') . '> (< ' . 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 upload') . ': <input type="file" name="sql_file[]" multiple'
|
||||
. ($_FILES && $_FILES["sql_file"]["error"][0] != 4 ? '' : ' onchange="this.form[\'only_errors\'].checked = true;"') // 4 - UPLOAD_ERR_NO_FILE
|
||||
. '> (< ' . 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>
|
||||
<input type="submit" value="<?php echo lang('Execute'); ?>" title="Ctrl+Enter">
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
<?php
|
||||
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";
|
||||
|
||||
print_fieldset("webfile", lang('From server'), $_POST["webfile"], "document.getElementById('form')['only_errors'].checked = true; ");
|
||||
$compress = array();
|
||||
foreach (array("gz" => "zlib", "bz2" => "bz2") as $key => $val) {
|
||||
if (extension_loaded($val)) {
|
||||
$compress[] = ".$key";
|
||||
}
|
||||
}
|
||||
echo lang('Webserver file %s', "<code>adminer.sql" . ($compress ? "[" . implode("|", $compress) . "]" : "") . "</code>");
|
||||
echo lang('Webserver file %s', "<code>adminer.sql" . (extension_loaded("zlib") ? "[.gz]" : "") . "</code>");
|
||||
echo ' <input type="submit" name="webfile" value="' . lang('Run file') . '">';
|
||||
echo "</div></fieldset>\n";
|
||||
|
||||
if ($history) {
|
||||
print_fieldset("history", lang('History'), $_GET["history"] != "");
|
||||
foreach ($history as $key => $val) {
|
||||
for ($val = end($history); $val; $val = prev($history)) { // not array_reverse() to save memory
|
||||
$key = key($history);
|
||||
list($q, $time) = $val;
|
||||
echo '<a href="' . h(ME . "sql=&history=$key") . '">' . lang('Edit') . "</a> <span class='time'>" . @date("H:i:s", $time) . "</span> <code class='jush-$jush'>" . shorten_utf8(ltrim(str_replace("\n", " ", str_replace("\r", "", preg_replace('~^(#|-- ).*~m', '', $q)))), 80, "</code>") . "<br>\n"; // @ - time zone may be not set
|
||||
echo '<a href="' . h(ME . "sql=&history=$key") . '">' . lang('Edit') . "</a> <span class='time' title='" . @date('Y-m-d', $time) . "'>" . @date("H:i:s", $time) . "</span> <code class='jush-$jush'>" . shorten_utf8(ltrim(str_replace("\n", " ", str_replace("\r", "", preg_replace('~^(#|-- ).*~m', '', $q)))), 80, "</code>") . "<br>\n"; // @ - time zone may be not set
|
||||
}
|
||||
echo "<input type='submit' name='clear' value='" . lang('Clear') . "'>\n";
|
||||
echo "<a href='" . h(ME . "sql=&history=all") . "'>" . lang('Edit all') . "</a>\n";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
?>
|
||||
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
|
@@ -11,7 +11,7 @@ form { margin: 0; }
|
||||
table { margin: 1em 20px 0 0; border: 0; border-top: 1px solid #999; border-left: 1px solid #999; font-size: 90%; }
|
||||
td, th { border: 0; border-right: 1px solid #999; border-bottom: 1px solid #999; padding: .2em .3em; }
|
||||
th { background: #eee; text-align: left; }
|
||||
thead th { text-align: center; }
|
||||
thead th { text-align: center; padding: .2em .5em; }
|
||||
thead td, thead th { background: #ddf; }
|
||||
fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: .8em .5em 0 0; border: 1px solid #999; }
|
||||
p { margin: .8em 20px 0 0; }
|
||||
@@ -21,6 +21,7 @@ code { background: #eee; }
|
||||
tbody tr:hover td, tbody tr:hover th { background: #eee; }
|
||||
pre { margin: 1em 0 0; }
|
||||
input[type=image] { vertical-align: middle; }
|
||||
input.default { background: #ddf; }
|
||||
.version { color: #777; font-size: 67%; }
|
||||
.js .hidden, .nojs .jsonly { display: none; }
|
||||
.js .column { position: absolute; background: #ddf; padding: .3em 1ex .3em 0; margin-top: -.3em; }
|
||||
@@ -45,10 +46,13 @@ input[type=image] { vertical-align: middle; }
|
||||
.active { font-weight: bold; }
|
||||
.sqlarea { width: 98%; }
|
||||
.icon { width: 18px; height: 18px; }
|
||||
.size { width: 6ex; }
|
||||
.help { cursor: help; }
|
||||
.pages { position: fixed; bottom: 0; left: 21em; padding: 5px; background: #ddf; border: 1px solid #999; }
|
||||
#menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; }
|
||||
#menu p { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
|
||||
#dbs { overflow: hidden; }
|
||||
#logins, #tables { white-space: nowrap; overflow: auto; }
|
||||
#logins, #tables { white-space: nowrap; overflow: auto; text-overflow: ellipsis; }
|
||||
#logins a, #tables a { background: #fff; }
|
||||
#logout { background: none; border: none; color: blue; font: inherit; padding: 0; text-decoration: underline; cursor: pointer; }
|
||||
#logout:hover { color: red; }
|
||||
@@ -67,6 +71,16 @@ input[type=image] { vertical-align: middle; }
|
||||
.rtl #breadcrumb { left: auto; right: 21em; margin: 0 -18px 0 0; }
|
||||
.rtl #lang, .rtl #menu { left: auto; right: 0; }
|
||||
|
||||
@media all and (max-device-width: 880px) {
|
||||
.pages { left: auto; }
|
||||
#menu { position: static; width: auto; }
|
||||
#content { margin-left: 10px; }
|
||||
#lang { position: static; border-top: 1px solid #999; }
|
||||
#breadcrumb { left: auto; }
|
||||
.rtl #content { margin-right: 10px; }
|
||||
.rtl #breadcrumb { right: auto; }
|
||||
}
|
||||
|
||||
@media print {
|
||||
#lang, #menu { display: none; }
|
||||
#content { margin-left: 1em; }
|
||||
|
@@ -63,6 +63,9 @@ function typePassword(el, disable) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Hide or show some login rows for selected driver
|
||||
* @param HTMLSelectElement
|
||||
*/
|
||||
function loginDriver(driver) {
|
||||
var trs = parentTag(driver, 'table').rows;
|
||||
for (var i=1; i < trs.length - 1; i++) {
|
||||
@@ -72,13 +75,44 @@ function loginDriver(driver) {
|
||||
|
||||
|
||||
|
||||
var dbCtrl;
|
||||
var dbPrevious;
|
||||
|
||||
/** Check if database should be opened to a new window
|
||||
* @param MouseEvent
|
||||
* @param HTMLSelectElement
|
||||
*/
|
||||
function dbMouseDown(event, el) {
|
||||
dbCtrl = isCtrl(event);
|
||||
if (dbPrevious == undefined) {
|
||||
dbPrevious = el.value;
|
||||
}
|
||||
}
|
||||
|
||||
/** Load database after selecting it
|
||||
* @param HTMLSelectElement
|
||||
*/
|
||||
function dbChange(el) {
|
||||
if (dbCtrl) {
|
||||
el.form.target = '_blank';
|
||||
}
|
||||
el.form.submit();
|
||||
el.form.target = '';
|
||||
if (dbCtrl && dbPrevious != undefined) {
|
||||
el.value = dbPrevious;
|
||||
dbPrevious = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** 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.shiftKey && !event.altKey && !isCtrl(event)) {
|
||||
if (event.keyCode == 9) { // 9 - Tab
|
||||
// inspired by http://pallieter.org/Projects/insertTab/
|
||||
if (target.setSelectionRange) {
|
||||
@@ -165,6 +199,30 @@ function selectFieldChange(form) {
|
||||
setHtml('noindex', (ok ? '' : '!'));
|
||||
}
|
||||
|
||||
/** Create edit query form
|
||||
* @param MouseEvent
|
||||
* @param HTMLSpanElement
|
||||
* @param string
|
||||
*/
|
||||
function selectEditSql(event, el, label) {
|
||||
var a = parentTag(event.target || event.srcElement, 'a');
|
||||
if (!isCtrl(event) || (a && a.href)) {
|
||||
return;
|
||||
}
|
||||
var sql = el.firstChild;
|
||||
var input = document.createElement('input');
|
||||
input.name = 'query';
|
||||
input.value = sql.textContent || sql.innerText;
|
||||
input.style.width = sql.offsetWidth + 'px';
|
||||
el.innerHTML = '';
|
||||
el.appendChild(input);
|
||||
var submit = document.createElement('input');
|
||||
submit.type = 'submit';
|
||||
submit.value = label;
|
||||
el.appendChild(submit);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
var added = '.', rowCount;
|
||||
@@ -227,17 +285,13 @@ function editingNameChange(field) {
|
||||
/** Add table row for next field
|
||||
* @param HTMLInputElement
|
||||
* @param boolean
|
||||
* @param boolean
|
||||
* @return boolean
|
||||
*/
|
||||
function editingAddRow(button, allowed, focus) {
|
||||
if (allowed && rowCount >= allowed) {
|
||||
return false;
|
||||
}
|
||||
function editingAddRow(button, focus) {
|
||||
var match = /(\d+)(\.\d+)?/.exec(button.name);
|
||||
var x = match[0] + (match[2] ? added.substr(match[2].length) : added) + '1';
|
||||
var row = parentTag(button, 'tr');
|
||||
var row2 = row.cloneNode(true);
|
||||
var row2 = cloneNode(row);
|
||||
var tags = row.getElementsByTagName('select');
|
||||
var tags2 = row2.getElementsByTagName('select');
|
||||
for (var i=0; i < tags.length; i++) {
|
||||
@@ -309,7 +363,10 @@ function editingTypeChange(type) {
|
||||
el.className = (/(char|text|enum|set)$/.test(text) ? '' : 'hidden');
|
||||
}
|
||||
if (el.name == name + '[unsigned]') {
|
||||
el.className = (/(int|float|double|decimal)$/.test(text) ? '' : 'hidden');
|
||||
el.className = (/((^|[^o])int|float|double|decimal)$/.test(text) ? '' : 'hidden');
|
||||
}
|
||||
if (el.name == name + '[on_update]') {
|
||||
el.className = (text == 'timestamp' ? '' : 'hidden');
|
||||
}
|
||||
if (el.name == name + '[on_delete]') {
|
||||
el.className = (/`/.test(text) ? '' : 'hidden');
|
||||
@@ -355,6 +412,15 @@ function columnShow(checked, column) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Hide column with default values in narrow window
|
||||
*/
|
||||
function editingHideDefaults() {
|
||||
if (innerWidth < document.documentElement.scrollWidth) {
|
||||
document.getElementById('defaults').checked = false;
|
||||
columnShow(false, 5);
|
||||
}
|
||||
}
|
||||
|
||||
/** Display partition options
|
||||
* @param HTMLSelectElement
|
||||
*/
|
||||
@@ -368,7 +434,7 @@ function partitionByChange(el) {
|
||||
* @param HTMLInputElement
|
||||
*/
|
||||
function partitionNameChange(el) {
|
||||
var row = parentTag(el, 'tr').cloneNode(true);
|
||||
var row = cloneNode(parentTag(el, 'tr'));
|
||||
row.firstChild.firstChild.value = '';
|
||||
parentTag(el, 'table').appendChild(row);
|
||||
el.onchange = function () {};
|
||||
@@ -381,7 +447,7 @@ function partitionNameChange(el) {
|
||||
*/
|
||||
function foreignAddRow(field) {
|
||||
field.onchange = function () { };
|
||||
var row = parentTag(field, 'tr').cloneNode(true);
|
||||
var row = cloneNode(parentTag(field, 'tr'));
|
||||
var selects = row.getElementsByTagName('select');
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
selects[i].name = selects[i].name.replace(/\]/, '1$&');
|
||||
@@ -397,7 +463,7 @@ function foreignAddRow(field) {
|
||||
*/
|
||||
function indexesAddRow(field) {
|
||||
field.onchange = function () { };
|
||||
var row = parentTag(field, 'tr').cloneNode(true);
|
||||
var row = cloneNode(parentTag(field, 'tr'));
|
||||
var selects = row.getElementsByTagName('select');
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
selects[i].name = selects[i].name.replace(/indexes\[\d+/, '$&1');
|
||||
@@ -440,7 +506,7 @@ function indexesAddColumn(field, prefix) {
|
||||
select.selectedIndex = 3;
|
||||
select.onchange();
|
||||
}
|
||||
var column = field.parentNode.cloneNode(true);
|
||||
var column = cloneNode(field.parentNode);
|
||||
select = column.getElementsByTagName('select')[0];
|
||||
select.name = select.name.replace(/\]\[\d+/, '$&1');
|
||||
select.selectedIndex = 0;
|
||||
|
@@ -40,12 +40,12 @@ function selectValue(select) {
|
||||
|
||||
/** Get parent node with specified tag name.
|
||||
* @param HTMLElement
|
||||
* @param string
|
||||
* @param string regular expression
|
||||
* @return HTMLElement
|
||||
*/
|
||||
function parentTag(el, tag) {
|
||||
var re = new RegExp('^' + tag + '$', 'i');
|
||||
while (!re.test(el.tagName)) {
|
||||
while (el && !re.test(el.tagName)) {
|
||||
el = el.parentNode;
|
||||
}
|
||||
return el;
|
||||
@@ -114,9 +114,10 @@ function formChecked(el, name) {
|
||||
|
||||
/** Select clicked row
|
||||
* @param MouseEvent
|
||||
* @param [boolean] force click
|
||||
*/
|
||||
function tableClick(event) {
|
||||
var click = (!window.getSelection || getSelection().isCollapsed);
|
||||
function tableClick(event, click) {
|
||||
click = (click || !window.getSelection || getSelection().isCollapsed);
|
||||
var el = event.target || event.srcElement;
|
||||
while (!/^tr$/i.test(el.tagName)) {
|
||||
if (/^(table|a|input|textarea)$/i.test(el.tagName)) {
|
||||
@@ -130,7 +131,7 @@ function tableClick(event) {
|
||||
}
|
||||
el = el.firstChild.firstChild;
|
||||
if (click) {
|
||||
el.click && el.click();
|
||||
el.checked = !el.checked;
|
||||
el.onclick && el.onclick();
|
||||
}
|
||||
trCheck(el);
|
||||
@@ -217,7 +218,7 @@ function pageClick(href, page, event) {
|
||||
*/
|
||||
function menuOver(el, event) {
|
||||
var a = event.target;
|
||||
if (/^a$/i.test(a.tagName) && a.offsetLeft + a.offsetWidth > a.parentNode.offsetWidth) {
|
||||
if (/^a$/i.test(a.tagName) && a.offsetLeft + a.offsetWidth > a.parentNode.offsetWidth - 15) { // 15 - ellipsis
|
||||
el.style.overflow = 'visible';
|
||||
}
|
||||
}
|
||||
@@ -239,7 +240,7 @@ function selectAddRow(field) {
|
||||
selectFieldChange(field.form);
|
||||
};
|
||||
field.onchange();
|
||||
var row = field.parentNode.cloneNode(true);
|
||||
var row = cloneNode(field.parentNode);
|
||||
var selects = row.getElementsByTagName('select');
|
||||
for (var i=0; i < selects.length; i++) {
|
||||
selects[i].name = selects[i].name.replace(/[a-z]\[\d+/, '$&1');
|
||||
@@ -254,6 +255,15 @@ function selectAddRow(field) {
|
||||
field.parentNode.parentNode.appendChild(row);
|
||||
}
|
||||
|
||||
/** Clear column name after resetting search
|
||||
* @param HTMLInputElement
|
||||
*/
|
||||
function selectSearchSearch(el) {
|
||||
if (!el.value) {
|
||||
el.parentNode.firstChild.selectedIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Toggles column context menu
|
||||
@@ -292,6 +302,15 @@ function selectSearch(name) {
|
||||
}
|
||||
|
||||
|
||||
/** Check if Ctrl key (Command key on Mac) was pressed
|
||||
* @param KeyboardEvent|MouseEvent
|
||||
* @return boolean
|
||||
*/
|
||||
function isCtrl(event) {
|
||||
return (event.ctrlKey || event.metaKey) && !event.altKey; // shiftKey allowed
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Send form by Ctrl+Enter on <select> and <textarea>
|
||||
* @param KeyboardEvent
|
||||
@@ -300,7 +319,7 @@ function selectSearch(name) {
|
||||
*/
|
||||
function bodyKeydown(event, button) {
|
||||
var target = event.target || event.srcElement;
|
||||
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
|
||||
if (isCtrl(event) && (event.keyCode == 13 || event.keyCode == 10) && /select|textarea|input/i.test(target.tagName)) { // 13|10 - Enter
|
||||
target.blur();
|
||||
if (button) {
|
||||
target.form[button].click();
|
||||
@@ -317,10 +336,10 @@ function bodyKeydown(event, button) {
|
||||
*/
|
||||
function bodyClick(event) {
|
||||
var target = event.target || event.srcElement;
|
||||
if ((event.ctrlKey || event.shiftKey) && target.type == 'submit' && /input/i.test(target.tagName)) {
|
||||
if ((isCtrl(event) || event.shiftKey) && target.type == 'submit' && /input/i.test(target.tagName)) {
|
||||
target.form.target = '_blank';
|
||||
setTimeout(function () {
|
||||
// if (event.ctrlKey) { focus(); } doesn't work
|
||||
// if (isCtrl(event)) { focus(); } doesn't work
|
||||
target.form.target = '';
|
||||
}, 0);
|
||||
}
|
||||
@@ -333,7 +352,7 @@ function bodyClick(event) {
|
||||
* @return boolean
|
||||
*/
|
||||
function editingKeydown(event) {
|
||||
if ((event.keyCode == 40 || event.keyCode == 38) && event.ctrlKey && !event.altKey && !event.metaKey) { // 40 - Down, 38 - Up, shiftKey allowed
|
||||
if ((event.keyCode == 40 || event.keyCode == 38) && isCtrl(event)) { // 40 - Down, 38 - Up
|
||||
var target = event.target || event.srcElement;
|
||||
var sibling = (event.keyCode == 40 ? 'nextSibling' : 'previousSibling');
|
||||
var el = target.parentNode.parentNode[sibling];
|
||||
@@ -411,11 +430,16 @@ function ajaxSetHtml(url) {
|
||||
* @param HTMLElement
|
||||
* @param MouseEvent
|
||||
* @param number display textarea instead of input, 2 - load long text
|
||||
* @param string warning to display
|
||||
*/
|
||||
function selectDblClick(td, event, text) {
|
||||
if (/input|textarea/i.test(td.firstChild.tagName)) {
|
||||
function selectClick(td, event, text, warning) {
|
||||
var target = event.target || event.srcElement;
|
||||
if (!isCtrl(event) || /input|textarea/i.test(td.firstChild.tagName) || /^a$/i.test(target.tagName)) {
|
||||
return;
|
||||
}
|
||||
if (warning) {
|
||||
return alert(warning);
|
||||
}
|
||||
var original = td.innerHTML;
|
||||
text = text || /\n/.test(original);
|
||||
var input = document.createElement(text ? 'textarea' : 'input');
|
||||
@@ -423,7 +447,7 @@ function selectDblClick(td, event, text) {
|
||||
if (!event) {
|
||||
event = window.event;
|
||||
}
|
||||
if (event.keyCode == 27 && !(event.ctrlKey || event.shiftKey || event.altKey || event.metaKey)) { // 27 - Esc
|
||||
if (event.keyCode == 27 && !event.shiftKey && !event.altKey && !isCtrl(event)) { // 27 - Esc
|
||||
td.innerHTML = original;
|
||||
}
|
||||
};
|
||||
@@ -450,6 +474,7 @@ function selectDblClick(td, event, text) {
|
||||
}
|
||||
td.innerHTML = '';
|
||||
td.appendChild(input);
|
||||
setupSubmitHighlight(td);
|
||||
input.focus();
|
||||
if (text == 2) { // long text
|
||||
return ajax(location.href + '&' + encodeURIComponent(td.id) + '=', function (request) {
|
||||
@@ -485,12 +510,10 @@ function selectLoadMore(a, limit, loading) {
|
||||
if (href) {
|
||||
a.removeAttribute('href');
|
||||
return ajax(href, function (request) {
|
||||
document.getElementById('table').innerHTML += request.responseText;
|
||||
var rows = 0;
|
||||
request.responseText.replace(/(^|\n)<tr/g, function () {
|
||||
rows++;
|
||||
});
|
||||
if (rows < limit) {
|
||||
var tbody = document.createElement('tbody');
|
||||
tbody.innerHTML = request.responseText;
|
||||
document.getElementById('table').appendChild(tbody);
|
||||
if (tbody.children.length < limit) {
|
||||
a.parentNode.removeChild(a);
|
||||
} else {
|
||||
a.href = href.replace(/\d+$/, function (page) {
|
||||
@@ -514,3 +537,88 @@ function eventStop(event) {
|
||||
event.cancelBubble = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Setup highlighting of default submit button on form field focus
|
||||
* @param HTMLElement
|
||||
*/
|
||||
function setupSubmitHighlight(parent) {
|
||||
for (var key in { input: 1, select: 1, textarea: 1 }) {
|
||||
var inputs = parent.getElementsByTagName(key);
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
if (!/submit|image|file/.test(inputs[i].type)) {
|
||||
addEvent(inputs[i], 'focus', inputFocus);
|
||||
addEvent(inputs[i], 'blur', inputBlur);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Highlight default submit button
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function inputFocus() {
|
||||
var submit = findDefaultSubmit(this.form);
|
||||
if (submit) {
|
||||
submit.className += ' default';
|
||||
}
|
||||
}
|
||||
|
||||
/** Unhighlight default submit button
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function inputBlur() {
|
||||
var submit = findDefaultSubmit(this.form);
|
||||
if (submit) {
|
||||
submit.className = submit.className.replace(/ default( |$)/, '$1');
|
||||
}
|
||||
}
|
||||
|
||||
/** Find submit button used by Enter
|
||||
* @param HTMLFormElement
|
||||
* @return HTMLInputElement
|
||||
*/
|
||||
function findDefaultSubmit(form) {
|
||||
var inputs = form.getElementsByTagName('input');
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
var input = inputs[i];
|
||||
if (input.type == 'submit') {
|
||||
return input;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Add event listener
|
||||
* @param HTMLElement
|
||||
* @param string without 'on'
|
||||
* @param function
|
||||
*/
|
||||
function addEvent(el, action, handler) {
|
||||
if (el.addEventListener) {
|
||||
el.addEventListener(action, handler, false);
|
||||
} else {
|
||||
el.attachEvent('on' + action, handler);
|
||||
}
|
||||
}
|
||||
|
||||
/** Defer focusing element
|
||||
* @param HTMLElement
|
||||
*/
|
||||
function focus(el) {
|
||||
setTimeout(function () { // this has to be an anonymous function because Firefox passes some arguments to setTimeout callback
|
||||
el.focus();
|
||||
}, 0);
|
||||
}
|
||||
|
||||
/** Clone node and setup submit highlighting
|
||||
* @param HTMLElement
|
||||
* @return HTMLElement
|
||||
*/
|
||||
function cloneNode(el) {
|
||||
var el2 = el.cloneNode(true);
|
||||
setupSubmitHighlight(el2);
|
||||
return el2;
|
||||
}
|
||||
|
@@ -4,9 +4,10 @@ $fields = fields($TABLE);
|
||||
if (!$fields) {
|
||||
$error = error();
|
||||
}
|
||||
$table_status = ($fields ? table_status($TABLE) : array());
|
||||
$table_status = table_status($TABLE, true);
|
||||
|
||||
page_header(($fields && is_view($table_status) ? lang('View') : lang('Table')) . ": " . h($TABLE), $error);
|
||||
|
||||
$adminer->selectLinks($table_status);
|
||||
$comment = $table_status["Comment"];
|
||||
if ($comment != "") {
|
||||
@@ -26,7 +27,7 @@ if ($fields) {
|
||||
echo "</table>\n";
|
||||
|
||||
if (!is_view($table_status)) {
|
||||
echo "<h3>" . lang('Indexes') . "</h3>\n";
|
||||
echo "<h3 id='indexes'>" . lang('Indexes') . "</h3>\n";
|
||||
$indexes = indexes($TABLE);
|
||||
if ($indexes) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
@@ -43,7 +44,7 @@ if ($fields) {
|
||||
echo '<p><a href="' . h(ME) . 'indexes=' . urlencode($TABLE) . '">' . lang('Alter indexes') . "</a>\n";
|
||||
|
||||
if (fk_support($table_status)) {
|
||||
echo "<h3>" . lang('Foreign keys') . "</h3>\n";
|
||||
echo "<h3 id='foreign-keys'>" . lang('Foreign keys') . "</h3>\n";
|
||||
$foreign_keys = foreign_keys($TABLE);
|
||||
if ($foreign_keys) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
@@ -68,7 +69,7 @@ if ($fields) {
|
||||
}
|
||||
|
||||
if (support("trigger")) {
|
||||
echo "<h3>" . lang('Triggers') . "</h3>\n";
|
||||
echo "<h3 id='triggers'>" . lang('Triggers') . "</h3>\n";
|
||||
$triggers = triggers($TABLE);
|
||||
if ($triggers) {
|
||||
echo "<table cellspacing='0'>\n";
|
||||
@@ -79,5 +80,6 @@ if ($fields) {
|
||||
}
|
||||
echo '<p><a href="' . h(ME) . 'trigger=' . urlencode($TABLE) . '">' . lang('Add trigger') . "</a>\n";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -1,29 +1,36 @@
|
||||
<?php
|
||||
$TABLE = $_GET["trigger"];
|
||||
$name = $_GET["name"];
|
||||
$trigger_options = trigger_options();
|
||||
$trigger_event = array("INSERT", "UPDATE", "DELETE");
|
||||
$row = (array) trigger($name) + array("Trigger" => $TABLE . "_bi");
|
||||
|
||||
$dropped = false;
|
||||
if ($_POST && !$error && in_array($_POST["Timing"], $trigger_options["Timing"]) && in_array($_POST["Event"], $trigger_event) && in_array($_POST["Type"], $trigger_options["Type"])) {
|
||||
$timing_event = " $_POST[Timing] $_POST[Event]";
|
||||
$on = " ON " . table($TABLE);
|
||||
$dropped = drop_create(
|
||||
"DROP TRIGGER " . idf_escape($_GET["name"]) . ($jush == "pgsql" ? $on : ""),
|
||||
"CREATE TRIGGER " . idf_escape($_POST["Trigger"]) . ($jush == "mssql" ? $on . $timing_event : $timing_event . $on) . rtrim(" $_POST[Type]\n$_POST[Statement]", ";") . ";",
|
||||
ME . "table=" . urlencode($TABLE),
|
||||
lang('Trigger has been dropped.'),
|
||||
lang('Trigger has been altered.'),
|
||||
lang('Trigger has been created.'),
|
||||
$_GET["name"]
|
||||
);
|
||||
if ($_POST) {
|
||||
if (!$error && in_array($_POST["Timing"], $trigger_options["Timing"]) && in_array($_POST["Event"], $trigger_event) && in_array($_POST["Type"], $trigger_options["Type"])) {
|
||||
// don't use drop_create() because there may not be more triggers for the same action
|
||||
$on = " ON " . table($TABLE);
|
||||
$drop = "DROP TRIGGER " . idf_escape($name) . ($jush == "pgsql" ? $on : "");
|
||||
$location = ME . "table=" . urlencode($TABLE);
|
||||
if ($_POST["drop"]) {
|
||||
query_redirect($drop, $location, lang('Trigger has been dropped.'));
|
||||
} else {
|
||||
if ($name != "") {
|
||||
queries($drop);
|
||||
}
|
||||
queries_redirect(
|
||||
$location,
|
||||
($name != "" ? lang('Trigger has been altered.') : lang('Trigger has been created.')),
|
||||
queries(create_trigger($on, $_POST))
|
||||
);
|
||||
if ($name != "") {
|
||||
queries(create_trigger($on, $row + array("Type" => reset($trigger_options["Type"]))));
|
||||
}
|
||||
}
|
||||
}
|
||||
$row = $_POST;
|
||||
}
|
||||
|
||||
page_header(($_GET["name"] != "" ? lang('Alter trigger') . ": " . h($_GET["name"]) : lang('Create trigger')), $error, array("table" => $TABLE));
|
||||
|
||||
$row = $_POST;
|
||||
if (!$row) {
|
||||
$row = trigger($_GET["name"]) + array("Trigger" => $TABLE . "_bi");
|
||||
}
|
||||
page_header(($name != "" ? lang('Alter trigger') . ": " . h($name) : lang('Create trigger')), $error, array("table" => $TABLE));
|
||||
?>
|
||||
|
||||
<form action="" method="post" id="form">
|
||||
@@ -32,11 +39,10 @@ if (!$row) {
|
||||
<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"]); ?>
|
||||
</table>
|
||||
<p><?php echo lang('Name'); ?>: <input name="Trigger" value="<?php echo h($row["Trigger"]); ?>" maxlength="64">
|
||||
<p><?php echo lang('Name'); ?>: <input name="Trigger" value="<?php echo h($row["Trigger"]); ?>" maxlength="64" autocapitalize="off">
|
||||
<p><?php textarea("Statement", $row["Statement"]); ?>
|
||||
<p>
|
||||
<input type="submit" value="<?php echo lang('Save'); ?>">
|
||||
<?php if ($_GET["name"] != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<?php if ($dropped) { ?><input type="hidden" name="dropped" value="1"><?php } ?>
|
||||
<?php if ($name != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
|
@@ -1,20 +1,20 @@
|
||||
<?php
|
||||
$TYPE = $_GET["type"];
|
||||
$row = $_POST;
|
||||
|
||||
if ($_POST && !$error) {
|
||||
$link = substr(ME, 0, -1);
|
||||
if ($_POST["drop"]) {
|
||||
query_redirect("DROP TYPE " . idf_escape($TYPE), $link, lang('Type has been dropped.'));
|
||||
} else {
|
||||
query_redirect("CREATE TYPE " . idf_escape(trim($_POST["name"])) . " $_POST[as]", $link, lang('Type has been created.'));
|
||||
query_redirect("CREATE TYPE " . idf_escape(trim($row["name"])) . " $row[as]", $link, lang('Type has been created.'));
|
||||
}
|
||||
}
|
||||
|
||||
page_header($TYPE != "" ? lang('Alter type') . ": " . h($TYPE) : lang('Create type'), $error);
|
||||
|
||||
$row = $_POST;
|
||||
if (!$row) {
|
||||
$row = array("as" => "AS ");
|
||||
$row["as"] = "AS ";
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -24,7 +24,7 @@ if (!$row) {
|
||||
if ($TYPE != "") {
|
||||
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
|
||||
} else {
|
||||
echo "<input name='name' value='" . h($row['name']) . "'>\n";
|
||||
echo "<input name='name' value='" . h($row['name']) . "' autocapitalize='off'>\n";
|
||||
textarea("as", $row["as"]);
|
||||
echo "<p><input type='submit' value='" . lang('Save') . "'>\n";
|
||||
}
|
||||
|
@@ -26,6 +26,7 @@ if ($_POST) {
|
||||
}
|
||||
$grants = array();
|
||||
$old_pass = "";
|
||||
|
||||
if (isset($_GET["host"]) && ($result = $connection->query("SHOW GRANTS FOR " . q($USER) . "@" . q($_GET["host"])))) { //! use information_schema for MySQL 5 - column names in column privileges are not escaped
|
||||
while ($row = $result->fetch_row()) {
|
||||
if (preg_match('~GRANT (.*) ON (.*) TO ~', $row[0], $match) && preg_match_all('~ *([^(,]*[^ ,(])( *\\([^)]+\\))?~', $match[1], $matches, PREG_SET_ORDER)) { //! escape the part between ON and TO
|
||||
@@ -46,18 +47,27 @@ if (isset($_GET["host"]) && ($result = $connection->query("SHOW GRANTS FOR " . q
|
||||
|
||||
if ($_POST && !$error) {
|
||||
$old_user = (isset($_GET["host"]) ? q($USER) . "@" . q($_GET["host"]) : "''");
|
||||
$new_user = q($_POST["user"]) . "@" . q($_POST["host"]); // if $_GET["host"] is not set then $new_user is always different
|
||||
$pass = q($_POST["pass"]);
|
||||
if ($_POST["drop"]) {
|
||||
query_redirect("DROP USER $old_user", ME . "privileges=", lang('User has been dropped.'));
|
||||
} else {
|
||||
$created = false;
|
||||
if ($old_user != $new_user) {
|
||||
$created = queries(($connection->server_info < 5 ? "GRANT USAGE ON *.* TO" : "CREATE USER") . " $new_user IDENTIFIED BY" . ($_POST["hashed"] ? " PASSWORD" : "") . " $pass");
|
||||
$error = !$created;
|
||||
} elseif ($_POST["pass"] != $old_pass || !$_POST["hashed"]) {
|
||||
queries("SET PASSWORD FOR $new_user = " . ($_POST["hashed"] ? $pass : "PASSWORD($pass)"));
|
||||
$new_user = q($_POST["user"]) . "@" . q($_POST["host"]); // if $_GET["host"] is not set then $new_user is always different
|
||||
$pass = $_POST["pass"];
|
||||
if ($pass != '' && !$_POST["hashed"]) {
|
||||
// compute hash in a separate query so that plain text password is not saved to history
|
||||
$pass = $connection->result("SELECT PASSWORD(" . q($pass) . ")");
|
||||
$error = !$pass;
|
||||
}
|
||||
|
||||
$created = false;
|
||||
if (!$error) {
|
||||
if ($old_user != $new_user) {
|
||||
$created = queries(($connection->server_info < 5 ? "GRANT USAGE ON *.* TO" : "CREATE USER") . " $new_user IDENTIFIED BY PASSWORD " . q($pass));
|
||||
$error = !$created;
|
||||
} elseif ($pass != $old_pass) {
|
||||
queries("SET PASSWORD FOR $new_user = " . q($pass));
|
||||
}
|
||||
}
|
||||
|
||||
if (!$error) {
|
||||
$revoke = array();
|
||||
foreach ($new_grants as $object => $grant) {
|
||||
@@ -83,6 +93,7 @@ if ($_POST && !$error) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$error && isset($_GET["host"])) {
|
||||
if ($old_user != $new_user) {
|
||||
queries("DROP USER $old_user");
|
||||
@@ -94,7 +105,9 @@ if ($_POST && !$error) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
queries_redirect(ME . "privileges=", (isset($_GET["host"]) ? lang('User has been altered.') : lang('User has been created.')), !$error);
|
||||
|
||||
if ($created) {
|
||||
// delete new user in case of an error
|
||||
$connection->query("DROP USER $new_user");
|
||||
@@ -113,15 +126,15 @@ if ($_POST) {
|
||||
if ($old_pass != "") {
|
||||
$row["hashed"] = true;
|
||||
}
|
||||
$grants[(DB != "" && !isset($_GET["host"]) ? idf_escape(addcslashes(DB, "%_")) : "") . ".*"] = array();
|
||||
$grants[(DB == "" || $grants ? "" : idf_escape(addcslashes(DB, "%_\\"))) . ".*"] = array();
|
||||
}
|
||||
|
||||
?>
|
||||
<form action="" method="post">
|
||||
<table cellspacing="0">
|
||||
<tr><th><?php echo lang('Server'); ?><td><input name="host" maxlength="60" value="<?php echo h($row["host"]); ?>">
|
||||
<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('Server'); ?><td><input name="host" maxlength="60" value="<?php echo h($row["host"]); ?>" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Username'); ?><td><input name="user" maxlength="16" value="<?php echo h($row["user"]); ?>" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Password'); ?><td><input name="pass" id="pass" value="<?php echo h($row["pass"]); ?>">
|
||||
<?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);"); ?>
|
||||
</table>
|
||||
@@ -129,13 +142,14 @@ if ($_POST) {
|
||||
<?php
|
||||
//! MAX_* limits, REQUIRE
|
||||
echo "<table cellspacing='0'>\n";
|
||||
echo "<thead><tr><th colspan='2'><a href='http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/grant.html#priv_level' target='_blank' rel='noreferrer'>" . lang('Privileges') . "</a>";
|
||||
echo "<thead><tr><th colspan='2'><a href='http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/grant.html#priv_level' target='_blank' rel='noreferrer' class='help'>" . lang('Privileges') . "</a>";
|
||||
$i = 0;
|
||||
foreach ($grants as $object => $grant) {
|
||||
echo '<th>' . ($object != "*.*" ? "<input name='objects[$i]' value='" . h($object) . "' size='10'>" : "<input type='hidden' name='objects[$i]' value='*.*' size='10'>*.*"); //! separate db, table, columns, PROCEDURE|FUNCTION, routine
|
||||
echo '<th>' . ($object != "*.*" ? "<input name='objects[$i]' value='" . h($object) . "' size='10' autocapitalize='off'>" : "<input type='hidden' name='objects[$i]' value='*.*' size='10'>*.*"); //! separate db, table, columns, PROCEDURE|FUNCTION, routine
|
||||
$i++;
|
||||
}
|
||||
echo "</thead>\n";
|
||||
|
||||
foreach (array(
|
||||
"" => "",
|
||||
"Server Admin" => lang('Server'),
|
||||
@@ -161,6 +175,7 @@ foreach (array(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
?>
|
||||
<p>
|
||||
|
@@ -1,33 +1,45 @@
|
||||
<?php
|
||||
$TABLE = $_GET["view"];
|
||||
$dropped = false;
|
||||
$row = $_POST;
|
||||
|
||||
if ($_POST && !$error) {
|
||||
$name = trim($_POST["name"]);
|
||||
$dropped = drop_create(
|
||||
"DROP VIEW " . table($TABLE),
|
||||
"CREATE VIEW " . table($name) . " AS\n$_POST[select]",
|
||||
($_POST["drop"] ? substr(ME, 0, -1) : ME . "table=" . urlencode($name)),
|
||||
lang('View has been dropped.'),
|
||||
lang('View has been altered.'),
|
||||
lang('View has been created.'),
|
||||
$TABLE
|
||||
);
|
||||
$name = trim($row["name"]);
|
||||
$as = " AS\n$row[select]";
|
||||
$location = ME . "table=" . urlencode($name);
|
||||
$message = lang('View has been altered.');
|
||||
|
||||
if (!$_POST["drop"] && $TABLE == $name && $jush != "sqlite") {
|
||||
query_redirect(($jush == "mssql" ? "ALTER" : "CREATE OR REPLACE") . " VIEW " . table($name) . $as, $location, $message);
|
||||
} else {
|
||||
$temp_name = $name . "_adminer_" . uniqid();
|
||||
drop_create(
|
||||
"DROP VIEW " . table($TABLE),
|
||||
"CREATE VIEW " . table($name) . $as,
|
||||
"DROP VIEW " . table($name),
|
||||
"CREATE VIEW " . table($temp_name) . $as,
|
||||
"DROP VIEW " . table($temp_name),
|
||||
($_POST["drop"] ? substr(ME, 0, -1) : $location),
|
||||
lang('View has been dropped.'),
|
||||
$message,
|
||||
lang('View has been created.'),
|
||||
$TABLE,
|
||||
$name
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
page_header(($TABLE != "" ? lang('Alter view') : lang('Create view')), $error, array("table" => $TABLE), $TABLE);
|
||||
|
||||
$row = $_POST;
|
||||
if (!$row && $TABLE != "") {
|
||||
if (!$_POST && $TABLE != "") {
|
||||
$row = view($TABLE);
|
||||
$row["name"] = $TABLE;
|
||||
}
|
||||
?>
|
||||
|
||||
<form action="" method="post">
|
||||
<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" autocapitalize="off">
|
||||
<p><?php textarea("select", $row["select"]); ?>
|
||||
<p>
|
||||
<?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'); ?>">
|
||||
<?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; ?>">
|
||||
|
73
changes.txt
73
changes.txt
@@ -1,3 +1,76 @@
|
||||
Adminer 3.7.0 (released 2013-05-19):
|
||||
Allow more SQL files to be uploaded at the same time
|
||||
Print run time next to executed queries
|
||||
Don't drop original view and routine before creating the new one
|
||||
Highlight default submit button
|
||||
Add server placeholder to login form
|
||||
Disable SQL export when applying functions in select
|
||||
Allow using lang() in plugins (customization)
|
||||
Remove bzip2 compression support
|
||||
Constraint memory used in TAR export
|
||||
Allow exporting views dependent on each other (bug #3459151)
|
||||
Fix resetting search (bug #3612507)
|
||||
Don't use LIMIT 1 if updating unique row (bug #3613109)
|
||||
Restrict editing rows without unique identifier to search results
|
||||
Display navigation bellow main content on mobile browsers
|
||||
Get number of rows on export page asynchronously
|
||||
MySQL: Optimize create table page and Editor navigation
|
||||
MySQL: Display bit type as binary number
|
||||
MySQL: Improve export of binary data types
|
||||
MySQL: Fix handling of POINT data type (bug #3582578)
|
||||
MySQL: Don't export binary and geometry columns twice in select
|
||||
MySQL: Fix EXPLAIN in MySQL < 5.1, bug since Adminer 3.6.4
|
||||
SQLite: Export views
|
||||
PostgreSQL: Fix swapped NULL and NOT NULL columns in weird setups
|
||||
|
||||
Adminer 3.6.4 (released 2013-04-26):
|
||||
Display pagination on a fixed position
|
||||
Increase default select limit to 50
|
||||
Display SQL edit form on Ctrl+click on the select query
|
||||
Display SQL history from newest
|
||||
Recover original view, trigger, routine if creating fails
|
||||
Do not store plain text password to history in creating user
|
||||
Selectable ON UPDATE CURRENT_TIMESTAMP field in create table
|
||||
Open database to a new window after selecting it with Ctrl
|
||||
Clear column name after resetting search (bug #3601200)
|
||||
Explain partitions in SQL query (bug #3600150)
|
||||
Allow loading more data with inline edit (bug #3605531)
|
||||
Stay on the same page after deleting rows (bug #3605845)
|
||||
Respect checked tables in export filename (bug #3245464)
|
||||
Respect PHP configuration max_input_vars
|
||||
Fix unsetting permanent login after logout
|
||||
Disable autocapitalize in identifiers on mobile browsers
|
||||
MySQL: Compatibility with MySQL 5.6
|
||||
MySQL: Move ALTER export to plugin
|
||||
MySQL: Use numeric time zone in export
|
||||
MySQL: Link processlist documentation
|
||||
SQLite: Export indexes
|
||||
|
||||
Adminer 3.6.3 (released 2013-01-23):
|
||||
Display error code in SQL query
|
||||
Allow specifying external links
|
||||
Treat Meta key same as Ctrl
|
||||
Fix XSS in displaying non-UTF-8 strings
|
||||
Don't use type="number" for decimal numbers
|
||||
|
||||
Adminer 3.6.2 (released 2012-12-21):
|
||||
Edit values by Ctrl+click instead of double click
|
||||
Don't select row on double click
|
||||
Support NULL in routine calls
|
||||
Shorten printed values in varchar fields
|
||||
Display table default values on wide screens
|
||||
Display date in SQL history
|
||||
HTML5 input fields
|
||||
Display warning for missing UPDATE privilege
|
||||
Fix switching language on first load
|
||||
Support enabled mbstring.func_overload
|
||||
MySQL: Prolong comment length since MySQL 5.5
|
||||
PostgreSQL: Fix process list in version 9.2
|
||||
MS SQL: Support databases starting with number
|
||||
|
||||
Adminer 3.6.1 (released 2012-09-17):
|
||||
Fix compiled version on PHP with multibyte support
|
||||
|
||||
Adminer 3.6.0 (released 2012-09-16):
|
||||
Load more data in select
|
||||
Edit strings with \n in textarea
|
||||
|
161
compile.php
161
compile.php
@@ -9,7 +9,11 @@ function add_apo_slashes($s) {
|
||||
}
|
||||
|
||||
function add_quo_slashes($s) {
|
||||
return addcslashes($s, "\n\r\$\"\\");
|
||||
$return = $s;
|
||||
$return = addcslashes($return, "\n\r\$\"\\");
|
||||
$return = preg_replace('~\0(?![0-7])~', '\\\\0', $return);
|
||||
$return = addcslashes($return, "\0");
|
||||
return $return;
|
||||
}
|
||||
|
||||
function remove_lang($match) {
|
||||
@@ -38,6 +42,19 @@ function put_file($match) {
|
||||
}
|
||||
$return = file_get_contents(dirname(__FILE__) . "/$project/$match[2]");
|
||||
if (basename($match[2]) != "lang.inc.php" || !$_SESSION["lang"]) {
|
||||
if (basename($match[2]) == "lang.inc.php") {
|
||||
$return = str_replace('function lang($idf, $number = null) {', 'function lang($idf, $number = null) {
|
||||
if (is_string($idf)) { // compiled version uses numbers, string comes from a plugin
|
||||
// English translation is closest to the original identifiers //! pluralized translations are not found
|
||||
$pos = array_search($idf, get_translations("en")); //! this should be cached
|
||||
if ($pos !== false) {
|
||||
$idf = $pos;
|
||||
}
|
||||
}', $return, $count);
|
||||
if (!$count) {
|
||||
echo "lang() not found\n";
|
||||
}
|
||||
}
|
||||
$tokens = token_get_all($return); // to find out the last token
|
||||
return "?>\n$return" . (in_array($tokens[count($tokens) - 1][0], array(T_CLOSE_TAG, T_INLINE_HTML), true) ? "<?php" : "");
|
||||
} elseif (preg_match('~\\s*(\\$pos = (.+\n).+;)~sU', $return, $match2)) {
|
||||
@@ -46,16 +63,19 @@ function put_file($match) {
|
||||
return '$_SESSION[lang]';
|
||||
}
|
||||
|
||||
function lang(\$translation, \$number) {
|
||||
\$pos = $match2[2]\t\t: " . (preg_match("~\\\$LANG == '$_SESSION[lang]'.* \\? (.+)\n~U", $match2[1], $match3) ? $match3[1] : "1") . '
|
||||
);
|
||||
$translation = str_replace("%d", "%s", $translation[$pos]);
|
||||
function lang(\$translation, \$number = null) {
|
||||
if (is_array(\$translation)) {
|
||||
\$pos = $match2[2]\t\t\t: " . (preg_match("~\\\$LANG == '$_SESSION[lang]'.* \\? (.+)\n~U", $match2[1], $match3) ? $match3[1] : "1") . '
|
||||
);
|
||||
$translation = $translation[$pos];
|
||||
}
|
||||
$translation = str_replace("%d", "%s", $translation);
|
||||
$number = number_format($number, 0, ".", lang(\',\'));
|
||||
return sprintf($translation, $number);
|
||||
}
|
||||
';
|
||||
} else {
|
||||
echo "lang() not found\n";
|
||||
echo "lang() \$pos not found\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,13 +139,19 @@ if ($_SESSION["translations_version"] != ' . $translations_version . ') {
|
||||
$translations = array();
|
||||
$_SESSION["translations_version"] = ' . $translations_version . ';
|
||||
}
|
||||
if (!$translations) {
|
||||
switch ($LANG) {' . $return . '
|
||||
|
||||
function get_translations($lang) {
|
||||
switch ($lang) {' . $return . '
|
||||
}
|
||||
$translations = array();
|
||||
foreach (explode("\n", lzw_decompress($compressed)) as $val) {
|
||||
$translations[] = (strpos($val, "\t") ? explode("\t", $val) : $val);
|
||||
}
|
||||
return $translations;
|
||||
}
|
||||
|
||||
if (!$translations) {
|
||||
$translations = get_translations($LANG);
|
||||
}
|
||||
';
|
||||
}
|
||||
@@ -271,6 +297,12 @@ function compile_file($match) {
|
||||
return '"' . add_quo_slashes($file) . '"';
|
||||
}
|
||||
|
||||
$project = "adminer";
|
||||
if ($_SERVER["argv"][1] == "editor") {
|
||||
$project = "editor";
|
||||
array_shift($_SERVER["argv"]);
|
||||
}
|
||||
|
||||
$driver = "";
|
||||
if (file_exists(dirname(__FILE__) . "/adminer/drivers/" . $_SERVER["argv"][1] . ".inc.php")) {
|
||||
$driver = $_SERVER["argv"][1];
|
||||
@@ -280,12 +312,15 @@ if (file_exists(dirname(__FILE__) . "/adminer/drivers/" . $_SERVER["argv"][1] .
|
||||
unset($_COOKIE["adminer_lang"]);
|
||||
$_SESSION["lang"] = $_SERVER["argv"][1]; // Adminer functions read language from session
|
||||
include dirname(__FILE__) . "/adminer/include/lang.inc.php";
|
||||
if (isset($_SESSION["lang"])) {
|
||||
if (isset($_SERVER["argv"][2]) || !isset($langs[$_SESSION["lang"]])) {
|
||||
echo "Usage: php compile.php [driver] [lang]\nPurpose: Compile adminer[-driver][-lang].php and editor[-driver][-lang].php.\n";
|
||||
exit(1);
|
||||
}
|
||||
if (isset($langs[$_SESSION["lang"]])) {
|
||||
include dirname(__FILE__) . "/adminer/lang/$_SESSION[lang].inc.php";
|
||||
array_shift($_SERVER["argv"]);
|
||||
}
|
||||
|
||||
if ($_SERVER["argv"][1]) {
|
||||
echo "Usage: php compile.php [editor] [driver] [lang]\n";
|
||||
echo "Purpose: Compile adminer[-driver][-lang].php or editor[-driver][-lang].php.\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// check function definition in drivers
|
||||
@@ -306,59 +341,57 @@ foreach (glob(dirname(__FILE__) . "/adminer/drivers/" . ($driver ? $driver : "*"
|
||||
|
||||
include dirname(__FILE__) . "/adminer/include/pdo.inc.php";
|
||||
$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) {
|
||||
$lang_ids = array(); // global variable simplifies usage in a callback function
|
||||
$file = file_get_contents(dirname(__FILE__) . "/$project/index.php");
|
||||
if ($driver) {
|
||||
$connection = (object) array("server_info" => 5.1); // MySQL support is version specific
|
||||
$_GET[$driver] = true; // to load the driver
|
||||
include_once dirname(__FILE__) . "/adminer/drivers/$driver.inc.php";
|
||||
foreach ($features as $key => $feature) {
|
||||
if (!support($feature)) {
|
||||
if (!is_int($key)) {
|
||||
$feature = $key;
|
||||
}
|
||||
$file = str_replace("} elseif (isset(\$_GET[\"$feature\"])) {\n\tinclude \"./$feature.inc.php\";\n", "", $file);
|
||||
$lang_ids = array(); // global variable simplifies usage in a callback function
|
||||
$file = file_get_contents(dirname(__FILE__) . "/$project/index.php");
|
||||
if ($driver) {
|
||||
$connection = (object) array("server_info" => 5.1); // MySQL support is version specific
|
||||
$_GET[$driver] = true; // to load the driver
|
||||
include_once dirname(__FILE__) . "/adminer/drivers/$driver.inc.php";
|
||||
foreach ($features as $key => $feature) {
|
||||
if (!support($feature)) {
|
||||
if (!is_int($key)) {
|
||||
$feature = $key;
|
||||
}
|
||||
}
|
||||
if (!support("routine")) {
|
||||
$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("} elseif (isset(\$_GET[\"$feature\"])) {\n\tinclude \"./$feature.inc.php\";\n", "", $file);
|
||||
}
|
||||
}
|
||||
$file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file);
|
||||
$file = str_replace('include "../adminer/include/coverage.inc.php";', '', $file);
|
||||
if ($driver) {
|
||||
$file = preg_replace('(include "../adminer/drivers/(?!' . preg_quote($driver) . ').*\\s*)', '', $file);
|
||||
if (!support("routine")) {
|
||||
$file = str_replace("if (isset(\$_GET[\"callf\"])) {\n\t\$_GET[\"call\"] = \$_GET[\"callf\"];\n}\nif (isset(\$_GET[\"function\"])) {\n\t\$_GET[\"procedure\"] = \$_GET[\"function\"];\n}\n", "", $file);
|
||||
}
|
||||
$file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file); // bootstrap.inc.php
|
||||
if ($driver) {
|
||||
foreach ($features as $feature) {
|
||||
if (!support($feature)) {
|
||||
$file = preg_replace("((\t*)" . preg_quote('if (support("' . $feature . '")') . ".*\n\\1\\})sU", '', $file);
|
||||
}
|
||||
}
|
||||
if (count($drivers) == 1) {
|
||||
$file = str_replace('<?php echo html_select("driver", $drivers, DRIVER); ?>', "<input type='hidden' name='driver' value='" . ($driver == "mysql" ? "server" : $driver) . "'>" . reset($drivers), $file);
|
||||
}
|
||||
}
|
||||
$file = preg_replace_callback("~lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])~s", 'lang_ids', $file);
|
||||
$file = preg_replace_callback('~\\b(include|require) "([^"]*\\$LANG.inc.php)";~', 'put_file_lang', $file);
|
||||
$file = str_replace("\r", "", $file);
|
||||
if ($_SESSION["lang"]) {
|
||||
// single language version
|
||||
$file = preg_replace_callback("~(<\\?php\\s*echo )?lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])(;\\s*\\?>)?~s", 'remove_lang', $file);
|
||||
$file = str_replace("<?php switch_lang(); ?>\n", "", $file);
|
||||
$file = str_replace('<?php echo $LANG; ?>', $_SESSION["lang"], $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
|
||||
$replace = 'h(preg_replace("~\\\\\\\\?.*~", "", ME)) . "?file=\\1&version=' . $VERSION;
|
||||
$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("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file);
|
||||
$file = php_shrink($file);
|
||||
|
||||
$filename = $project . (preg_match('~-dev$~', $VERSION) ? "" : "-$VERSION") . ($driver ? "-$driver" : "") . ($_SESSION["lang"] ? "-$_SESSION[lang]" : "") . ".php";
|
||||
fwrite(fopen($filename, "w"), $file); // file_put_contents() since PHP 5
|
||||
echo "$filename created (" . strlen($file) . " B).\n";
|
||||
}
|
||||
$file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file);
|
||||
$file = str_replace('include "../adminer/include/coverage.inc.php";', '', $file);
|
||||
if ($driver) {
|
||||
$file = preg_replace('(include "../adminer/drivers/(?!' . preg_quote($driver) . ').*\\s*)', '', $file);
|
||||
}
|
||||
$file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file); // bootstrap.inc.php
|
||||
if ($driver) {
|
||||
foreach ($features as $feature) {
|
||||
if (!support($feature)) {
|
||||
$file = preg_replace("((\t*)" . preg_quote('if (support("' . $feature . '")') . ".*\n\\1\\})sU", '', $file);
|
||||
}
|
||||
}
|
||||
if (count($drivers) == 1) {
|
||||
$file = str_replace('<?php echo html_select("driver", $drivers, DRIVER); ?>', "<input type='hidden' name='driver' value='" . ($driver == "mysql" ? "server" : $driver) . "'>" . reset($drivers), $file);
|
||||
}
|
||||
}
|
||||
$file = preg_replace_callback("~lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])~s", 'lang_ids', $file);
|
||||
$file = preg_replace_callback('~\\b(include|require) "([^"]*\\$LANG.inc.php)";~', 'put_file_lang', $file);
|
||||
$file = str_replace("\r", "", $file);
|
||||
if ($_SESSION["lang"]) {
|
||||
// single language version
|
||||
$file = preg_replace_callback("~(<\\?php\\s*echo )?lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])(;\\s*\\?>)?~s", 'remove_lang', $file);
|
||||
$file = str_replace("<?php switch_lang(); ?>\n", "", $file);
|
||||
$file = str_replace('<?php echo $LANG; ?>', $_SESSION["lang"], $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
|
||||
$replace = 'h(preg_replace("~\\\\\\\\?.*~", "", ME)) . "?file=\\1&version=' . $VERSION;
|
||||
$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("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file);
|
||||
$file = php_shrink($file);
|
||||
|
||||
$filename = $project . (preg_match('~-dev$~', $VERSION) ? "" : "-$VERSION") . ($driver ? "-$driver" : "") . ($_SESSION["lang"] ? "-$_SESSION[lang]" : "") . ".php";
|
||||
fwrite(fopen($filename, "w"), $file); // file_put_contents() since PHP 5
|
||||
echo "$filename created (" . strlen($file) . " B).\n";
|
||||
|
@@ -51,7 +51,10 @@ 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"], #logout{ height:16px; border: none; position: absolute; top: 0; left: 140px; margin-top: 8px; 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; text-indent: 16px; color: #21759B; }
|
||||
html/*\*/>/*/*/body input[name="logout"], #logout{ height:16px; width:20px; border: none; position: fixed; top: 0; left: 160px; margin-top: 10px; 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; text-indent: 22px; overflow: hidden; color: #21759B; margin-left:14px; }
|
||||
|
||||
|
||||
|
||||
#logout:hover { color: #D54E21; text-decoration: none; }
|
||||
|
||||
body {margin: 0; line-height: 1.25em; font-size: 13px; background: #F9F9F9;}
|
||||
@@ -98,21 +101,32 @@ img {vertical-align: middle; margin: 0; padding: 0;}
|
||||
.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;}
|
||||
#breadcrumb, #lang {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 }
|
||||
#breadcrumb, #lang {margin-top: 4px; height: 22px; display: block; position: fixed; top: 0; left: 260px; padding: 2px 12px; line-height: 1.25em }
|
||||
#breadcrumb {z-index: 100; background-color: #DFDFDF; }
|
||||
|
||||
#lang {right: 20px; left: auto; z-index: 10; }
|
||||
#lang select {font-size: 8pt;}
|
||||
#menu {position: absolute; padding: 10px; margin: 0; top: 0; left: 0; width: 220px; 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;}
|
||||
#menu form p {padding-left: 0; margin-top: 5px; text-align: left;}
|
||||
#menu form p.logout {margin-top: 25px; }
|
||||
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; font-size: 0; height: 2px;}
|
||||
h2 {padding: 22px 0 0 10px; font-size: 0; height: 2px; border-bottom: none;}
|
||||
h3 {margin: 40px 0 0; font-weight: 400; font-size: 130%;}
|
||||
#menu h1 {height: 25px; padding: 0 10px; margin: 0; line-height: 20px; display: block; }
|
||||
#menu h1 {position:fixed; height: 22px; width: 100%; padding: 8px 10px 4px 20px; top: 0; left: 0; margin: 0; line-height: 20px; display: block; background-color: #DFDFDF; border-bottom: 1px solid #004000;}
|
||||
/* border-bottom: none; */
|
||||
#menu h1 a { font-size: 13px; }
|
||||
/*#dbs {position: absolute; top: 70px; }
|
||||
* #dbs {margin: 0; }
|
||||
p.logout {margin-top: 30px;}
|
||||
#dbs {position: relative; top: -20px; height: 0;}
|
||||
* */
|
||||
|
||||
|
||||
#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;}
|
||||
@@ -123,7 +137,9 @@ legend a {color: #333; text-decoration: none; cursor: default;}
|
||||
legend a:hover {color: #333;}
|
||||
code {background: transparent;}
|
||||
fieldset, legend, 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, #lang,
|
||||
#breadcrumb, #lang {-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-bottomright: 5px; -khtml-border-bottom-right-radius: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-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;}
|
||||
#logins a, #tables a {background: #F1F1F1;}
|
||||
|
@@ -52,8 +52,10 @@ 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;}
|
||||
|
||||
.logout {font-size: 8pt !important;}
|
||||
#logout{ height:17px; border: none; background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJHSURBVDjLlZPNi81hFMc/z7137p1mTCFvNZfGSzLIWNjZKRvFRoqNhRCSYm8xS3+AxRRZ2JAFJWJHSQqTQkbEzYwIM+6Yid/znJfH4prLXShOnb6r8/nWOd8Tcs78bz0/f+KMu50y05nK/wy+uHDylbutqS5extvGcxaWqtoGDA8PZ3dnrs2srQc2Zko41UXLmLdyDW5OfvsUkUgbYGbU63UAQggdmvMzFmzZCgTi7CQmkZwdEaX0JwDgTnGbTCaE0G4zw80omhPI92lcEtkNkdgJCCHwJX7mZvNaB0A14SaYJlwTrpHsTkoFlV1nt2c3x5YYo1/vM9A/gKpxdfwyu/v3teCayKq4JEwT5EB2R6WgYmrs2bYbcUNNUVfEhIfFYy69uci+1fuRX84mkawFSxd/4nVWUopUVIykwlQxRTJBTIDA4Pp1jBZPuNW4wUAPmCqWIn29X1k4f5Ku8g9mpKCkakRLVEs1auVuauVuyqHMo8ejNCe+sWPVTkQKXCMmkeZUmUZjETF1tc6ooly+fgUVw9So1/tRN6YnZji46QghBFKKuAouERNhMlbAHZFE6e7pB+He8MMw+GGI4xtOMf1+lsl3TQ4NHf19BSlaO1DB9BfMHdX0O0iqSgiBbJkjm491hClJbA1LxCURgpPzXwAHhg63necAIi3XngXLcRU0fof8ETMljIyM5LGxMcbHxzvy/6fuXdWgt6+PWncv1e4euqo1ZmabvHs5+jn8yzufO7hiiZmuNpNBM13rbvVSpbrXJE7/BMkHtU9jFIC/AAAAAElFTkSuQmCC") no-repeat center left; overflow: hidden; text-indent: 18px; line-height: 0px; cursor:pointer; margin-left:6px; color: #21759B; text-decoration: underline;}
|
||||
#logout:hover {text-decoration: none; color: #D54E21;}
|
||||
#logins a, #tables a {background: none repeat scroll 0 0 transparent;}
|
||||
body {margin: 0; line-height: 1.25em; font-size: 13px; background: #F9F9F9;}
|
||||
body, 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;}
|
||||
@@ -66,6 +68,7 @@ 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;}
|
||||
tr:first-child th {padding-right: 30px;}
|
||||
td:first-child, th:first-child {border-left-width: 0;}
|
||||
thead td, thead th {background-color: #DFDFDF; border: none; border-bottom: 1px #BBB solid;}
|
||||
thead tr:hover td, thead tr:hover th {background-color: #DDD !important;}
|
||||
@@ -98,7 +101,7 @@ img {vertical-align: middle; margin: 0; padding: 0;}
|
||||
.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 {height: 23px; width: 250px; display: block; padding: 1px 10px; position: absolute; top: 0; left: 0; text-align: center; background-color: #f1f1f1; border: 1px solid #E3E3E3; line-height: 1.25em;}
|
||||
#lang select {font-size: 8pt;}
|
||||
#breadcrumb {margin: 0; height: 21px; display: block; position: absolute; top: 0; left: 300px; background-color: #f1f1f1; border: 1px solid #E3E3E3; padding: 2px 12px; line-height: 1.25em }
|
||||
#menu {position: absolute; padding: 10px; margin: 0; top: 28px; left: 0; width: 250px; background-color: #f1f1f1; border: 1px solid #E3E3E3;}
|
||||
@@ -123,3 +126,4 @@ fieldset, legend, h2, table, .error, .message {-moz-border-radius: 5px; -khtml-b
|
||||
#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;}
|
570
designs/nette/adminer.css
Normal file
570
designs/nette/adminer.css
Normal file
@@ -0,0 +1,570 @@
|
||||
/* Theme "Nette" for Adminer, (c) David Grudl */
|
||||
|
||||
/*
|
||||
it is based on some parts of:
|
||||
- Nette Framework design - http://api.nette.org
|
||||
- CSS by Brade - http://www.bradezone.com
|
||||
- Silk icon set 1.3 by Mark James - http://www.famfamfam.com/lab/icons/silk
|
||||
- CSS icons by Hever - http://hev.cz
|
||||
*/
|
||||
|
||||
|
||||
body {
|
||||
background: #FFF;
|
||||
color: #333;
|
||||
font: 13px/18px Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
/* generic */
|
||||
a, a:visited {
|
||||
padding: 3px 2px;
|
||||
color: #006AEB;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
background-color: #006AEB !important;
|
||||
border-bottom: 1px solid #006AEB;
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-bottom: 4px;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
background: none;
|
||||
border: none;
|
||||
color: #666;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
height: 40px;
|
||||
padding: 0 0 8px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
background: transparent;
|
||||
border: none;
|
||||
color: #333;
|
||||
font: 32px Georgia,serif;
|
||||
margin: 0;
|
||||
padding: 10px 0 8px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
margin: 0;
|
||||
padding: 4px 0;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
border: 1px solid #CCC;
|
||||
float: left;
|
||||
margin-bottom: 8px;
|
||||
margin-right: 4px;
|
||||
min-height: 48px;
|
||||
padding: 0 4px 4px;
|
||||
}
|
||||
|
||||
fieldset div {
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
border: 1px solid #CCC;
|
||||
color: #555;
|
||||
font: 13px Helvetica,Arial,sans-serif;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
select {
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
textarea, .sqlarea {
|
||||
font-family: Consolas,monospace;
|
||||
height: 500px;
|
||||
}
|
||||
|
||||
input[type=submit] {
|
||||
background: #4890E7;
|
||||
color: white;
|
||||
cursor: pointer;
|
||||
padding: 3px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
input[type=submit]:hover {
|
||||
background-color: #006AEB;
|
||||
}
|
||||
|
||||
input[type=image], input[type=checkbox] {
|
||||
border: none;
|
||||
padding: 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
label input[type=checkbox], td input[type=radio], td span select {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
fieldset select {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
option {
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
optgroup {
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
code {
|
||||
background: #EEE;
|
||||
font-family: Consolas,monospace;
|
||||
padding: 2px 4px;
|
||||
}
|
||||
|
||||
code a:hover {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
table {
|
||||
border: 1px solid #D0CDC4;
|
||||
font-size: inherit;
|
||||
margin: 4px 0 8px;
|
||||
}
|
||||
|
||||
tbody tr:hover td, tbody tr:hover th {
|
||||
background: #EDF4FF;
|
||||
}
|
||||
|
||||
th, td {
|
||||
background: inherit;
|
||||
border: 1px dotted #CCC;
|
||||
border-width:0 0 0 1px;
|
||||
font-weight: normal;
|
||||
margin: 0;
|
||||
padding: 3px 5px;
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.odd th, .odd td {
|
||||
background: #FCFAF5;
|
||||
}
|
||||
|
||||
.js .checked th, .js .checked td {
|
||||
background: #CEE0FC;
|
||||
}
|
||||
|
||||
thead th, thead td {
|
||||
background: #F2EEE1;
|
||||
border-color: #D0CDC4;
|
||||
font-weight: bold;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
thead tr:hover td, thead tr:hover th,
|
||||
.js thead .checked th, .js thead .checked td {
|
||||
background: #F2EEE1;
|
||||
}
|
||||
|
||||
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 {
|
||||
background: transparent;
|
||||
font-weight: bold;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.error {
|
||||
color: #C00;
|
||||
}
|
||||
|
||||
.message {
|
||||
color: #090;
|
||||
}
|
||||
|
||||
/* specific */
|
||||
|
||||
#content {
|
||||
height: 100%;
|
||||
margin: 40px 0 0 300px;
|
||||
padding: 20px;
|
||||
background: white;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
#content:after {
|
||||
clear: both;
|
||||
content: "";
|
||||
display: table;
|
||||
}
|
||||
|
||||
#content > h2:before {
|
||||
display: block;
|
||||
content: "";
|
||||
color: #FF9;
|
||||
font-size: 13px;
|
||||
background: #333;
|
||||
line-height: 40px;
|
||||
margin: 0;
|
||||
padding: 0 0 0 20px;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 300px;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
|
||||
}
|
||||
|
||||
#content > #breadcrumb + h2:before {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#content > p {
|
||||
clear: left;
|
||||
}
|
||||
|
||||
#lang {
|
||||
background: #333;
|
||||
color: #FFF;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
padding: 0 0 0 40px;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 260px;
|
||||
}
|
||||
|
||||
#lang select {
|
||||
border: none;
|
||||
background: #5F5F5F;
|
||||
color: white;
|
||||
}
|
||||
|
||||
#menu {
|
||||
background: #FCFAF5;
|
||||
border-right: 5px solid #E4E2DA;
|
||||
bottom: 0;
|
||||
margin: 0;
|
||||
overflow: auto;
|
||||
padding: 10px 15px;
|
||||
position: fixed;
|
||||
top: 40px;
|
||||
width: 240px;
|
||||
}
|
||||
|
||||
#menu a {
|
||||
color: #333;
|
||||
border: none;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
#tables a {
|
||||
padding: 1px 2px;
|
||||
}
|
||||
|
||||
#menu a:hover {
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
#menu p {
|
||||
border: none;
|
||||
margin: 0 0 4px;
|
||||
padding: 0 0 4px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#breadcrumb {
|
||||
background: #333;
|
||||
color: #FFF;
|
||||
line-height: 40px;
|
||||
margin: 0;
|
||||
padding: 0 0 0 20px;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 300px;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
#breadcrumb a {
|
||||
color: #FF9;
|
||||
}
|
||||
|
||||
#breadcrumb a:hover {
|
||||
background: transparent;
|
||||
border-color: #FF9;
|
||||
color: #FF9;
|
||||
}
|
||||
|
||||
#schema .table {
|
||||
background: #F3F3F3;
|
||||
padding: 4px 8px;
|
||||
}
|
||||
|
||||
#logins a, #tables a {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/* 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 {
|
||||
height: 30px;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
* html form#form {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#content > p.tabs + *:after {
|
||||
display: table;
|
||||
clear: both;
|
||||
content: "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* icons */
|
||||
.error {
|
||||
background: 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 #FFEEEE;
|
||||
padding-left: 38px;
|
||||
}
|
||||
|
||||
.message, #menu p.message {
|
||||
background: 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 #EEFFEE;
|
||||
padding-left: 38px;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 center;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
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 center ;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
select[name="db"] {
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll left center white;
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
select[name="db"] option {
|
||||
padding-left: 18px;
|
||||
}
|
||||
|
||||
#menu p a[href*="&select="] {
|
||||
display: inline-block;
|
||||
margin-right: 8px;
|
||||
overflow: hidden;
|
||||
padding-left: 0;
|
||||
text-decoration: none;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
#menu p a[href*="&select="]:before {
|
||||
content: 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=");
|
||||
padding-right: 5px;
|
||||
display: inline-block;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
#menu p a[href*="&table="], #menu p a[href*="&view="] {
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
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 center;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
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 center;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
a[href*="&default="] {
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ7SURBVHjabFPfa1JhGH6OR88odSKDaTEzS9i0jejXBtVuBzGooOgqoquu+heii27aRUTUaKx1nbAYDCqqm4raoBZDZrqhaCw31janm3r0eOb8+t4PFXW98Jz3O985z/P++j6JMQZJkroAODhk/Mfs/nZrJpLN8eUGxx/OqdQ/kgC3M7qub5fL5T1ujHtGvrYmlEolFggEnvB/j3IYiCe4VYF+IheLRaZpGiNPyOfzLJfLsXQ6zVKZDZZKpfaJkEkkQNEoCs9EeBJSVVUIZDIZkQ3tFQoFNjk5KURE+VWBczyD75VKBaFQCLu7uwJ8T4DWQ0ND1CtUewZZlgc4b65JQKQjSfXe8KggUfIEbf0zMnOvIFv6oKa+gBVWbhsbu03kSCRSj1xDTcSHWTj7bsLmOYXt391Y+jgx0iRAUf1+f+uEBFmNP4TZegHp+CIUSYe13QlLxxGbsTE6WSwWE4RaZIJbmYL9+CWU1gJQDkpYDi5BK5R2VDU3YGw9NF6vt+k9u3gPNu9laKtjMChlmCxumNkKnk0v3B19F48aG9OlLJLJZL1m685LdPZe5eTnMJjK0LMepGaDcA6PYPRWb5R4hsYSSMTlcuGAxhuZGEfniWHofycgKwylrBubM/M4fG0MbY6eeob7pvDz/TgsUhJlfj3WQk9h71SgpV3Y+hGGfP4+TLZDTSUaGodAj+Vfr+G/eAdtyW+ITs8g+CGN6Kcguq48gtt3thaoUi2b0XkmIi+7UiQfS2xCD7+B5+QgzOZurIcS8N14DKXDIzIkMrcCTVeIVZvnql5nw/VB+9fTxxxyf48H+T114cVU+MHb+a3VlmEReYNzk/8EGADOaaVGDf2TtwAAAABJRU5ErkJggg==") no-repeat scroll 2px center;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
#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 center;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
#content p a[href*="&page="] {
|
||||
background-image: none;
|
||||
padding: .2em .5em;
|
||||
}
|
||||
|
||||
#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 center;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
#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 center;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
#content p 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 center;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
#content p a[href*="&schema="] {
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFOSURBVDjLtVK7SgNRED0b9iuM2lr4QK1DQIyk0FZsJAj+gH+ilRZb2NjaRHTLmA9QFKz9huzm7t37Hu+u7IJgQjR6YLjDzOXMmcMERIR5EE5qXA4z4sqACYWEC5wfLQXf/WtMIuDSoL0A7DZDjBj/uYI0l8jzEEJYJMkvCEZM4PqZIxlzpGk+kSCY18TGtGYcx9Tv96dOqBUMBgNyzsFaC621312Ac+59yJFlGRhj5VvVoigKvniglEK32w1mkd3r9ejPPAjOhqdknYX18p1/rzo3pYqTh0OSRkJI5UMgPn4s61sX66SkhtEGcISGsQad5gH2FvehfV5BaIF2cwet5RZyKeu68pe5ubKG7dUNP5AQGltMN57Mosgr5EIiVQmYGvtc1PVicqHY+dXpk8Dg7v22XKFo1ARe9v1bDOlXKKKCs4Sn1xdU1v3vIc2CD3bN4xJjfJWvAAAAAElFTkSuQmCC") no-repeat scroll 2px center;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
#content p a[href*="&sql="] {
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ5SURBVHjapFNLaxNRFP4mnZmQZtKYpJ2I8ZE0NSbSWKpgBYNUhIJQUDddCaILwb34C0RcCi60vpa14sZFoSjxUWxTFEubFkxf9kFS+7Jp0yQmM5mH905SF9pSwQt3vnPnnvPNd86cA13Xsds+23XKsdMdQx//s0z/6hi54he3e8/0d3ZuK0FTFGhUJkVVhSbLUAiq5IxSCQrBEkGWOu8Lh38HGrlpWnlXCKhNSbZQo3cEE9FomYAuKZstE2wFa8RR1cpKqK2o4JhxmLVJVAlh5Df6IFj5MgENcHq9EAMBg2RucBDVLpdxVon0iXdvIf8sQHRIsNReht3XjI3ZI8iuPAOrkDyorBq3G6vT08ikUuAsFiN46HkXXL56eI41QV1/BMF+GulvCfCMDFvNXtSIHrC0KDTPhXgc7lAQdQ2thk2XIpewnkzCJvTA4T8PabEbfDWD+ZFxyEUdX94sw6QVCkZlxWAQU+8/YGZgALV+v0HgbWmBNzQMR0M7it8fg+HWwQk2cLkkcvJh5NNFsCVJMgq1ubiE5o4OI5CS8FYrya8b9saLKC48gIlTIG/6sBaLw3PpHrTEMrSXr4kPIaAKFkbjSA0PEVuFlB+DO8Ah2HoB8tITVPE6iplDWOn7jLn0CSQevoDV6TI+zEpUASkkZzaTYrLIrH3C/qMCFEbE4th9OEQexfQBrPYP44d+DuY91eBp+1dGgFVIDb729kKpdJfQtIy2yFNMdN/E5McYzAebUEhOYjZuQXaj5+9W/nOYbl9vLN26doOFScVI9BXmZ6dy9jpnpO1O5dfsRtBxxlk4Xu9mT4Z80DkpVlhZvdp+d3RmpyH7JcAAnHiAVYWMsdkAAAAASUVORK5CYII=") no-repeat scroll 2px center;
|
||||
padding-left: 24px;
|
||||
}
|
||||
|
||||
table tbody input[type="checkbox"] {
|
||||
display: block;
|
||||
float: left;
|
||||
}
|
||||
|
||||
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 center;
|
||||
padding-right: 18px;
|
||||
}
|
||||
|
||||
table input + a[href*="&edit="][href*="&where"] {
|
||||
clear: right;
|
||||
display: block;
|
||||
float: left;
|
||||
line-height: 15px;
|
||||
margin-right: 8px;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
text-decoration: none;
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
table input + a[href*="&edit="][href*="&where"]:before {
|
||||
content: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC");
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
table input + a[href*="&edit="][href*="&where"]:hover {
|
||||
background: #FFC;
|
||||
color: white;
|
||||
margin-left: 19px;
|
||||
margin-top: -1px;
|
||||
overflow: visible;
|
||||
padding: 1px 2px;
|
||||
position: absolute;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
table a[href*="&clone="] {
|
||||
clear: right;
|
||||
display: block;
|
||||
float: left;
|
||||
line-height: 15px;
|
||||
margin-right: 8px;
|
||||
overflow: hidden;
|
||||
padding-top: 0;
|
||||
text-decoration: none;
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
table a[href*="&clone="]:before {
|
||||
content: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADHSURBVCjPdZFNbsIwFAa/5B5FuQPCOQ9HQuqCq3SHUAtrrgFCSKQk8Y80XTjYJqiajRfj55GftNBKJtGoRiXSytlAZORzM1ckExjouHEm0LPdqHkTRnruXAgEPGpVq1JVCJ6RB3dOfHFEa7W5RzLx3kjPDse8ZxKisue9JwkByzevPQGZQnD8kHuunEvB43EcyD0dt/kEzzGdLD2/k9Ckb261zs9ZhiggVRO12jzN4Z5C+tQq90T+ETK20/J1tU2xeCOjpT7+APfbTaDnTb/mAAAAAElFTkSuQmCC");
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
table a[href*="&clone="]:hover {
|
||||
background: #FFC;
|
||||
border: 1px solid #CCC;
|
||||
color: white;
|
||||
font-size: .9em;
|
||||
margin-left: 42px;
|
||||
margin-top: -2px;
|
||||
overflow: visible;
|
||||
padding: 1px 2px;
|
||||
position: absolute;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
input[name="delete"], input[name="drop"] {
|
||||
background: 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;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-size: .9em;
|
||||
padding: 1px 5px 1px 18px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
input[name="delete"]:hover, input[name="drop"]:hover {
|
||||
background: 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==") no-repeat scroll left center;
|
||||
color: red;
|
||||
}
|
||||
|
||||
#logout {
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJHSURBVDjLlZPNi81hFMc/z7137p1mTCFvNZfGSzLIWNjZKRvFRoqNhRCSYm8xS3+AxRRZ2JAFJWJHSQqTQkbEzYwIM+6Yid/znJfH4prLXShOnb6r8/nWOd8Tcs78bz0/f+KMu50y05nK/wy+uHDylbutqS5extvGcxaWqtoGDA8PZ3dnrs2srQc2Zko41UXLmLdyDW5OfvsUkUgbYGbU63UAQggdmvMzFmzZCgTi7CQmkZwdEaX0JwDgTnGbTCaE0G4zw80omhPI92lcEtkNkdgJCCHwJX7mZvNaB0A14SaYJlwTrpHsTkoFlV1nt2c3x5YYo1/vM9A/gKpxdfwyu/v3teCayKq4JEwT5EB2R6WgYmrs2bYbcUNNUVfEhIfFYy69uci+1fuRX84mkawFSxd/4nVWUopUVIykwlQxRTJBTIDA4Pp1jBZPuNW4wUAPmCqWIn29X1k4f5Ku8g9mpKCkakRLVEs1auVuauVuyqHMo8ejNCe+sWPVTkQKXCMmkeZUmUZjETF1tc6ooly+fgUVw9So1/tRN6YnZji46QghBFKKuAouERNhMlbAHZFE6e7pB+He8MMw+GGI4xtOMf1+lsl3TQ4NHf19BSlaO1DB9BfMHdX0O0iqSgiBbJkjm491hClJbA1LxCURgpPzXwAHhg63necAIi3XngXLcRU0fof8ETMljIyM5LGxMcbHxzvy/6fuXdWgt6+PWncv1e4euqo1ZmabvHs5+jn8yzufO7hiiZmuNpNBM13rbvVSpbrXJE7/BMkHtU9jFIC/AAAAAElFTkSuQmCC") no-repeat scroll left center;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
margin-left: 6px;
|
||||
overflow: hidden;
|
||||
text-indent: 18px;
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
|
||||
/* paginator */
|
||||
.pages {
|
||||
margin: 1em 0;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
.pages a[href*="&page="] {
|
||||
margin: .2em;
|
||||
padding: .2em .5em;
|
||||
border: 1px solid #9AAFE5;
|
||||
text-decoration: none;
|
||||
}
|
@@ -42,7 +42,7 @@ html>/**/body h1 {
|
||||
padding: 6px 6px 5px 35px;
|
||||
}
|
||||
/* Logout */
|
||||
html>/**/body input[name="logout"] {
|
||||
html>/**/body input[name="logout"], #logout {
|
||||
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAkVJREFUeNqMU01rE1EUPZkMaGI+JEMkXyaNiKINzSJLBSEEaRbRVf6Ai1Jw68K9O3dCN3ZR/AUxC0UCwW4k4KKoGKVioGATg4kNY2aSTDqZifdOmmmKFr1weG/e3HPeue++59i4BTgceAogg3/H6+kUm+YUDdMEaIRICyBkvPeeZVwul5XlIEVBEGyMXz7C8vJ1HHz/ttT49C4/UPqvKG2T0BANcybNZEmSTpCdTqeFPcqp1Wr8X1q5eVtSep3w14/v8yoJCSwwF/kbmedsN5lMotlsol6vo6eMpBurd1OmgawwMQDGnCzLMkajkU3mkTeYUp2hUAjRaBStVgu6rmNC6yKTOex6x2MLPA8EAhBF0RIwyQaL8Oj1emEYBoF4X4SLIOwwiS3yj2KxiG63i06nYzngTRYFZmWZMwcfxgE2sLNRKNi9GgwGKNB3uVxGIpGwHbC4oihQVdWas7AY1/aZkymVSrZALpdDtVpFPB7/w8H+Txnp+1uYvHkyK+EqeiBkgsEgUqmUpVypVBCLxRCJRGaHuCDAF+fFwzvHDvSjQ+REPjCPx2PdBxbgNe7O5KgEjnjkAiT/udkZsMBYPxZgsIv5nMkM6pjVWo65EDvgzYXnbUBWcKLvi2SO/hDw+/3QNM3CXECldfHHIc7vKdh9vJo97QEJ7rP4PD1wp69cuxT2+XxSu922nPQHJEAJ2lsdDzjx1Dd4iNG6PJS2t+trZ1zu/Ep6KUxuJZWqcuA/Yz0O/KIdlSEuazrWqIIsNWT3twADAMZTN2W0KIqPAAAAAElFTkSuQmCC") no-repeat 2px bottom;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
|
76
designs/price/adminer.css
Normal file
76
designs/price/adminer.css
Normal file
@@ -0,0 +1,76 @@
|
||||
/**
|
||||
* @package Adminer.css - v1.0.0 - January 08, 2013
|
||||
* @author James Price
|
||||
* @version $Id$
|
||||
* @copyright Copyright <20> 2013 Neurotechnics Pty Ltd. http://www.neurotechnics.com/
|
||||
* @license MIT: http://mit-license.org/
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the <20>Software<72>), to deal in
|
||||
* the Software without restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
||||
* Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED <20>AS IS<49>, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/* IE doesn't support inline images - So, we use a hack that IE cannot interpret */
|
||||
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$="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 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 #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:1px 0 0 16px; overflow:hidden; width:0; text-decoration:none; }
|
||||
html/*\*/>/*/*/body #menu p a[href*="&table="], html/*\*/>/*/*/body #menu p a[href*="&view="] {margin:0; line-height:18px; padding-bottom:1px; text-decoration:none;}
|
||||
html/*\*/>/*/*/body #content p a[href*="&create="] {padding-left:22px;}
|
||||
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 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*="&tbsdesc="] {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==")}
|
||||
body{background-color:#eee}
|
||||
form{margin:0;overflow:auto}
|
||||
#breadcrumb{position:absolute;top:0;left:0;height:2.6em;margin:0;padding:5px 5px 0 22em;width:-moz-available!important;width:100%;line-height:1.6em;border:1px solid #444;white-space:nowrap;color:#fff;background:#7abcff;background:-moz-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#7abcff),color-stop(44%,#60abf8),color-stop(100%,#4096ee));background:-webkit-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-o-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-ms-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:linear-gradient(to bottom,#7abcff 0,#60abf8 44%,#4096ee 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7abcff',endColorstr='#4096ee',GradientType=0)}
|
||||
#menu,#content{background-color:#fff;border-radius:10px;border:1px solid #444;box-shadow:0 0 5px #999;margin:5em 1em 2em 0}
|
||||
#menu{position:absolute;top:0;left:0;margin-left:1em;padding:0 0 30px;width:19em}
|
||||
#content{border:1px solid #444;margin-left:21.5em;padding:10px 10px 30px 30px}
|
||||
#menu h1,#content h2{line-height:44px;margin:0;padding:0 20px;border-bottom:1px solid #000;border-radius:9px 9px 0 0;display:block;color:#FFF;background:#1e5799;background:-moz-linear-gradient(top,#1e5799 0,#2989d8 50%,#207cca 51%,#7db9e8 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#1e5799),color-stop(50%,#2989d8),color-stop(51%,#207cca),color-stop(100%,#7db9e8));background:-webkit-linear-gradient(top,#1e5799 0,#2989d8 50%,#207cca 51%,#7db9e8 100%);background:-o-linear-gradient(top,#1e5799 0,#2989d8 50%,#207cca 51%,#7db9e8 100%);background:-ms-linear-gradient(top,#1e5799 0,#2989d8 50%,#207cca 51%,#7db9e8 100%);background:linear-gradient(to bottom,#1e5799 0,#2989d8 50%,#207cca 51%,#7db9e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1e5799',endColorstr='#7db9e8',GradientType=0)}
|
||||
#menu h1,#menu h1 a,#menu h1 span{color:#fff}
|
||||
#menu h1{line-height:41px}
|
||||
#content h2{font-weight:normal;position:relative;left:-30px;top:-10px;height:44px;width:100%}
|
||||
table{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;border-color:#999 -moz-use-text-color -moz-use-text-color #999;border-image:none;border-right:0 none;border-style:solid none none solid;border-width:1px 0 0 1px;font-size:90%;margin:1em 20px 0 0}
|
||||
td,th{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;border-color:-moz-use-text-color #999 #999 -moz-use-text-color;border-image:none;border-style:none solid solid none;border-width:0 1px 1px 0;padding:.2em .3em}
|
||||
thead td,thead th{background:#eee;background:-moz-linear-gradient(top,#eee 0,#ccc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#eee),color-stop(100%,#ccc));background:-webkit-linear-gradient(top,#eee 0,#ccc 100%);background:-o-linear-gradient(top,#eee 0,#ccc 100%);background:-ms-linear-gradient(top,#eee 0,#ccc 100%);background:linear-gradient(to bottom,#eee 0,#ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee',endColorstr='#cccccc',GradientType=0)}
|
||||
td{background-color:#f4f8ff}
|
||||
.odd td{background-color:#fff}
|
||||
tbody tr:hover td,tbody tr:hover th{background-color:#FFE}
|
||||
p.tabs{margin:0 20px 0 0}
|
||||
.jush-sql{background:0}
|
||||
.jush{padding:5px 15px 3px;margin:0 20px;background-color:#fff;border:1px solid #369;border-radius:4px}
|
||||
fieldset{border:1px solid #999;border-radius:5px;display:inline;margin:.8em .5em 0 0;padding:.5em .8em;vertical-align:top}
|
||||
a{color:#369}
|
||||
a:hover{color:#28c}
|
||||
#logout,#logins a,#logins a:link,#breadcrumb a,#breadcrumb a:link,.logout a,.logout a:link,.tabs a,.tabs a:link{display:inline-block;border:1px solid #667eac;border-radius:4px;padding:3px 8px;margin:2px 0;vertical-align:middle;text-decoration:none;color:#fff;background:#7abcff;background:-moz-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#7abcff),color-stop(44%,#60abf8),color-stop(100%,#4096ee));background:-webkit-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-o-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-ms-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:linear-gradient(to bottom,#7abcff 0,#60abf8 44%,#4096ee 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7abcff',endColorstr='#4096ee',GradientType=0)}
|
||||
.logout a,.logout a:link,#logout{padding:3px 4px}
|
||||
#logout:hover,#logins a:hover,#tables a:hover,#breadcrumb a:hover,.logout a:hover,.tabs a:hover{color:#fff;text-decoration:none;background:#93c9ff;background:-moz-linear-gradient(top,#93c9ff 0,#79b8f7 44%,#57a2ed 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#93c9ff),color-stop(44%,#79b8f7),color-stop(100%,#57a2ed));background:-webkit-linear-gradient(top,#93c9ff 0,#79b8f7 44%,#57a2ed 100%);background:-o-linear-gradient(top,#93c9ff 0,#79b8f7 44%,#57a2ed 100%);background:-ms-linear-gradient(top,#93c9ff 0,#79b8f7 44%,#57a2ed 100%);background:linear-gradient(to bottom,#93c9ff 0,#79b8f7 44%,#57a2ed 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#93c9ff',endColorstr='#57a2ed',GradientType=0)}
|
||||
#breadcrumb a,#breadcrumb a:link{border:1px solid #246;padding:2px 6px;margin:1px auto;line-height:1.6em}
|
||||
#logins a,#tables a{background:none repeat scroll 0 0 #fff;padding:2px 6px;margin:1px 0;font-size:.8em}
|
||||
a[title='Show structure'],#tables a[title='Show structure']{border:0;background:0;color:#369}
|
||||
.jush a{border:0;background:0;margin:0;padding:0}
|
||||
a.active,a.active:link,a.active:hover{text-decoration:underline}
|
@@ -9,6 +9,7 @@ if ($adminer->homepage()) {
|
||||
}
|
||||
echo "<table cellspacing='0' class='nowrap checkable' onclick='tableClick(event);'>\n";
|
||||
echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^tables\[/);"><th>' . lang('Table') . '<td>' . lang('Rows') . "</thead>\n";
|
||||
|
||||
foreach (table_status() as $table => $row) {
|
||||
$name = $adminer->tableName($row);
|
||||
if (isset($row["Engine"]) && $name != "") {
|
||||
@@ -18,6 +19,7 @@ if ($adminer->homepage()) {
|
||||
echo "<td align='right'><a href='" . h(ME . "edit=") . urlencode($table) . "'>" . ($row["Engine"] == "InnoDB" && $val ? "~ $val" : $val) . "</a>";
|
||||
}
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
echo "<script type='text/javascript'>tableCheck();</script>\n";
|
||||
echo "</form>\n";
|
||||
|
@@ -45,11 +45,11 @@ class Adminer {
|
||||
function loginForm() {
|
||||
?>
|
||||
<table cellspacing="0">
|
||||
<tr><th><?php echo lang('Username'); ?><td><input type="hidden" name="auth[driver]" value="server"><input id="username" name="auth[username]" value="<?php echo h($_GET["username"]); ?>">
|
||||
<tr><th><?php echo lang('Username'); ?><td><input type="hidden" name="auth[driver]" value="server"><input name="auth[username]" id="username" value="<?php echo h($_GET["username"]); ?>" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
|
||||
</table>
|
||||
<script type="text/javascript">
|
||||
document.getElementById('username').focus();
|
||||
focus(document.getElementById('username'));
|
||||
</script>
|
||||
<?php
|
||||
echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
|
||||
@@ -75,7 +75,6 @@ document.getElementById('username').focus();
|
||||
if ($set !== null) {
|
||||
echo '<p class="tabs"><a href="' . h(ME . 'edit=' . urlencode($TABLE) . $set) . '">' . lang('New item') . "</a>\n";
|
||||
}
|
||||
echo "<a href='" . h(remove_from_uri("page")) . "&page=last' title='" . lang('Last page') . "'>>></a>\n";
|
||||
}
|
||||
|
||||
function foreignKeys($table) {
|
||||
@@ -93,7 +92,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
$return[$row["TABLE_NAME"]]["keys"][$row["CONSTRAINT_NAME"]][$row["COLUMN_NAME"]] = $row["REFERENCED_COLUMN_NAME"];
|
||||
}
|
||||
foreach ($return as $key => $val) {
|
||||
$name = $this->tableName(table_status($key));
|
||||
$name = $this->tableName(table_status($key, true));
|
||||
if ($name != "") {
|
||||
$search = preg_quote($tableName);
|
||||
$separator = "(:|\\s*-)?\\s+";
|
||||
@@ -162,8 +161,12 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
return $return;
|
||||
}
|
||||
|
||||
function selectLink($val, $field) {
|
||||
}
|
||||
|
||||
function selectVal($val, $link, $field) {
|
||||
$return = ($val === null ? " " : $val);
|
||||
$link = h($link);
|
||||
if (ereg('blob|bytea', $field["type"]) && !is_utf8($val)) {
|
||||
$return = lang('%d byte(s)', strlen($val));
|
||||
if (ereg("^(GIF|\xFF\xD8\xFF|\x89PNG\x0D\x0A\x1A\x0A)", $val)) { // GIF|JPG|PNG, getimagetype() works with filename
|
||||
@@ -231,13 +234,13 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
if (($val["col"] == "" || $columns[$val["col"]]) && "$val[col]$val[val]" != "") {
|
||||
echo "<div><select name='where[$i][col]'><option value=''>(" . lang('anywhere') . ")" . optionlist($columns, $val["col"], true) . "</select>";
|
||||
echo html_select("where[$i][op]", array(-1 => "") + $this->operators, $val["op"]);
|
||||
echo "<input name='where[$i][val]' value='" . h($val["val"]) . "'></div>\n";
|
||||
echo "<input type='search' name='where[$i][val]' value='" . h($val["val"]) . "' onsearch='selectSearchSearch(this);'></div>\n";
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
echo "<div><select name='where[$i][col]' onchange='this.nextSibling.nextSibling.onchange();'><option value=''>(" . lang('anywhere') . ")" . optionlist($columns, null, true) . "</select>";
|
||||
echo html_select("where[$i][op]", array(-1 => "") + $this->operators);
|
||||
echo "<input name='where[$i][val]' onchange='selectAddRow(this);'></div>\n";
|
||||
echo "<input type='search' name='where[$i][val]' onchange='selectAddRow(this);' onsearch='selectSearch(this);'></div>\n";
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
|
||||
@@ -268,7 +271,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
|
||||
function selectLimitPrint($limit) {
|
||||
echo "<fieldset><legend>" . lang('Limit') . "</legend><div>"; // <div> for easy styling
|
||||
echo html_select("limit", array("", "30", "100"), $limit);
|
||||
echo html_select("limit", array("", "50", "100"), $limit);
|
||||
echo "</div></fieldset>\n";
|
||||
}
|
||||
|
||||
@@ -370,7 +373,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
}
|
||||
|
||||
function selectLimitProcess() {
|
||||
return (isset($_GET["limit"]) ? $_GET["limit"] : "30");
|
||||
return (isset($_GET["limit"]) ? $_GET["limit"] : "50");
|
||||
}
|
||||
|
||||
function selectLengthProcess() {
|
||||
@@ -494,6 +497,9 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
return array('csv' => 'CSV,', 'csv;' => 'CSV;', 'tsv' => 'TSV');
|
||||
}
|
||||
|
||||
function dumpDatabase($db) {
|
||||
}
|
||||
|
||||
function dumpTable() {
|
||||
echo "\xef\xbb\xbf"; // UTF-8 byte order mark
|
||||
}
|
||||
@@ -556,7 +562,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
||||
<?php
|
||||
$this->databasesPrint($missing);
|
||||
if ($missing != "db" && $missing != "ns") {
|
||||
$table_status = table_status();
|
||||
$table_status = table_status('', true);
|
||||
if (!$table_status) {
|
||||
echo "<p class='message'>" . lang('No tables.') . "\n";
|
||||
} else {
|
||||
|
@@ -13,6 +13,7 @@ $drivers[DRIVER] = lang('Login');
|
||||
if (isset($_GET["select"]) && ($_POST["edit"] || $_POST["clone"]) && !$_POST["save"]) {
|
||||
$_GET["edit"] = $_GET["select"];
|
||||
}
|
||||
|
||||
if (isset($_GET["download"])) {
|
||||
include "../adminer/download.inc.php";
|
||||
} elseif (isset($_GET["edit"])) {
|
||||
|
@@ -8,7 +8,7 @@ function selectFieldChange(form) {
|
||||
|
||||
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)) {
|
||||
if (/^a$/i.test(el.tagName) && !(event.button || event.shiftKey || event.altKey || isCtrl(event))) {
|
||||
field.value = el.firstChild.data;
|
||||
field.previousSibling.value = decodeURIComponent(el.href.replace(/.*=/, ''));
|
||||
field.nextSibling.style.display = 'none';
|
||||
|
1
externals/CodeMirror2
vendored
1
externals/CodeMirror2
vendored
Submodule externals/CodeMirror2 deleted from 8feb48b37c
2
externals/jush
vendored
2
externals/jush
vendored
Submodule externals/jush updated: d5d52b19fb...e19e1fbd00
2
lang.php
2
lang.php
@@ -5,7 +5,7 @@ unset($_COOKIE["adminer_lang"]);
|
||||
$_SESSION["lang"] = $_SERVER["argv"][1]; // Adminer functions read language from session
|
||||
if (isset($_SESSION["lang"])) {
|
||||
include dirname(__FILE__) . "/adminer/include/lang.inc.php";
|
||||
if (isset($_SERVER["argv"][2]) || !isset($langs[$_SESSION["lang"]])) {
|
||||
if (isset($_SERVER["argv"][2]) || (!isset($langs[$_SESSION["lang"]]) && $_SESSION["lang"] != "xx")) {
|
||||
echo "Usage: php lang.php [lang]\nPurpose: Update adminer/lang/*.inc.php from source code messages.\n";
|
||||
exit(1);
|
||||
}
|
||||
|
151
plugins/dump-alter.php
Normal file
151
plugins/dump-alter.php
Normal file
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
|
||||
/** Exports one database (e.g. development) so that it can be synced with other database (e.g. production)
|
||||
* @link http://www.adminer.org/plugins/#use
|
||||
* @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 AdminerDumpAlter {
|
||||
|
||||
function dumpFormat() {
|
||||
if (DRIVER == 'server') {
|
||||
return array('sql_alter' => 'Alter');
|
||||
}
|
||||
}
|
||||
|
||||
function _database() {
|
||||
// drop old tables
|
||||
$query = "SELECT TABLE_NAME, ENGINE, TABLE_COLLATION, TABLE_COMMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()";
|
||||
echo "DELIMITER ;;
|
||||
CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN
|
||||
DECLARE _table_name, _engine, _table_collation varchar(64);
|
||||
DECLARE _table_comment varchar(64);
|
||||
DECLARE done bool DEFAULT 0;
|
||||
DECLARE tables CURSOR FOR $query;
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
|
||||
OPEN tables;
|
||||
REPEAT
|
||||
FETCH tables INTO _table_name, _engine, _table_collation, _table_comment;
|
||||
IF NOT done THEN
|
||||
CASE _table_name";
|
||||
foreach (get_rows($query) as $row) {
|
||||
$comment = q($row["ENGINE"] == "InnoDB" ? preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["TABLE_COMMENT"]) : $row["TABLE_COMMENT"]);
|
||||
echo "
|
||||
WHEN " . q($row["TABLE_NAME"]) . " THEN
|
||||
" . (isset($row["ENGINE"]) ? "IF _engine != '$row[ENGINE]' OR _table_collation != '$row[TABLE_COLLATION]' OR _table_comment != $comment THEN
|
||||
ALTER TABLE " . idf_escape($row["TABLE_NAME"]) . " ENGINE=$row[ENGINE] COLLATE=$row[TABLE_COLLATION] COMMENT=$comment;
|
||||
END IF" : "BEGIN END") . ";";
|
||||
}
|
||||
echo "
|
||||
ELSE
|
||||
SET alter_command = CONCAT(alter_command, 'DROP TABLE `', REPLACE(_table_name, '`', '``'), '`;\\n');
|
||||
END CASE;
|
||||
END IF;
|
||||
UNTIL done END REPEAT;
|
||||
CLOSE tables;
|
||||
END;;
|
||||
DELIMITER ;
|
||||
CALL adminer_alter(@adminer_alter);
|
||||
DROP PROCEDURE adminer_alter;
|
||||
|
||||
SELECT @adminer_alter;
|
||||
";
|
||||
}
|
||||
|
||||
function dumpDatabase($db) {
|
||||
static $first = true;
|
||||
if ($_POST["format"] == "sql_alter") {
|
||||
if ($first) {
|
||||
$first = false;
|
||||
echo "SET @adminer_alter = '';\n\n";
|
||||
register_shutdown_function(array($this, '_database'));
|
||||
} else {
|
||||
$this->_database();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function dumpTable($table, $style, $is_view = false) {
|
||||
if ($_POST["format"] == "sql_alter") {
|
||||
$create = create_sql($table, $_POST["auto_increment"]);
|
||||
if ($is_view) {
|
||||
echo substr_replace($create, " OR REPLACE", 6, 0) . ";\n\n";
|
||||
} else {
|
||||
echo substr_replace($create, " IF NOT EXISTS", 12, 0) . ";\n\n";
|
||||
// create procedure which iterates over original columns and adds new and removes old
|
||||
$query = "SELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, COLLATION_NAME, COLUMN_TYPE, EXTRA, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = " . q($table) . " ORDER BY ORDINAL_POSITION";
|
||||
echo "DELIMITER ;;
|
||||
CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN
|
||||
DECLARE _column_name, _collation_name, after varchar(64) DEFAULT '';
|
||||
DECLARE _column_type, _column_default text;
|
||||
DECLARE _is_nullable char(3);
|
||||
DECLARE _extra varchar(30);
|
||||
DECLARE _column_comment varchar(255);
|
||||
DECLARE done, set_after bool DEFAULT 0;
|
||||
DECLARE add_columns text DEFAULT '";
|
||||
$fields = array();
|
||||
$after = "";
|
||||
foreach (get_rows($query) as $row) {
|
||||
$default = $row["COLUMN_DEFAULT"];
|
||||
$row["default"] = ($default !== null ? q($default) : "NULL");
|
||||
$row["after"] = q($after); //! rgt AFTER lft, lft AFTER id doesn't work
|
||||
$row["alter"] = escape_string(idf_escape($row["COLUMN_NAME"])
|
||||
. " $row[COLUMN_TYPE]"
|
||||
. ($row["COLLATION_NAME"] ? " COLLATE $row[COLLATION_NAME]" : "")
|
||||
. ($default !== null ? " DEFAULT " . ($default == "CURRENT_TIMESTAMP" ? $default : $row["default"]) : "")
|
||||
. ($row["IS_NULLABLE"] == "YES" ? "" : " NOT NULL")
|
||||
. ($row["EXTRA"] ? " $row[EXTRA]" : "")
|
||||
. ($row["COLUMN_COMMENT"] ? " COMMENT " . q($row["COLUMN_COMMENT"]) : "")
|
||||
. ($after ? " AFTER " . idf_escape($after) : " FIRST")
|
||||
);
|
||||
echo ", ADD $row[alter]";
|
||||
$fields[] = $row;
|
||||
$after = $row["COLUMN_NAME"];
|
||||
}
|
||||
echo "';
|
||||
DECLARE columns CURSOR FOR $query;
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
|
||||
SET @alter_table = '';
|
||||
OPEN columns;
|
||||
REPEAT
|
||||
FETCH columns INTO _column_name, _column_default, _is_nullable, _collation_name, _column_type, _extra, _column_comment;
|
||||
IF NOT done THEN
|
||||
SET set_after = 1;
|
||||
CASE _column_name";
|
||||
foreach ($fields as $row) {
|
||||
echo "
|
||||
WHEN " . q($row["COLUMN_NAME"]) . " THEN
|
||||
SET add_columns = REPLACE(add_columns, ', ADD $row[alter]', IF(
|
||||
_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]
|
||||
, '', ', MODIFY $row[alter]'));"
|
||||
; //! don't replace in comment
|
||||
}
|
||||
echo "
|
||||
ELSE
|
||||
SET @alter_table = CONCAT(@alter_table, ', DROP ', _column_name);
|
||||
SET set_after = 0;
|
||||
END CASE;
|
||||
IF set_after THEN
|
||||
SET after = _column_name;
|
||||
END IF;
|
||||
END IF;
|
||||
UNTIL done END REPEAT;
|
||||
CLOSE columns;
|
||||
IF @alter_table != '' OR add_columns != '' THEN
|
||||
SET alter_command = CONCAT(alter_command, 'ALTER TABLE " . table($table) . "', SUBSTR(CONCAT(add_columns, @alter_table), 2), ';\\n');
|
||||
END IF;
|
||||
END;;
|
||||
DELIMITER ;
|
||||
CALL adminer_alter(@adminer_alter);
|
||||
DROP PROCEDURE adminer_alter;
|
||||
|
||||
";
|
||||
//! indexes
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
62
plugins/dump-json.php
Normal file
62
plugins/dump-json.php
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
/** Dump to JSON format
|
||||
* @link http://www.adminer.org/plugins/#use
|
||||
* @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 AdminerDumpJson {
|
||||
/** @access protected */
|
||||
var $database = false;
|
||||
|
||||
function dumpFormat() {
|
||||
return array('json' => 'JSON');
|
||||
}
|
||||
|
||||
function dumpTable($table, $style, $is_view = false) {
|
||||
if ($_POST["format"] == "json") {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function _database() {
|
||||
echo "}\n";
|
||||
}
|
||||
|
||||
function dumpData($table, $style, $query) {
|
||||
if ($_POST["format"] == "json") {
|
||||
if ($this->database) {
|
||||
echo ",\n";
|
||||
} else {
|
||||
$this->database = true;
|
||||
echo "{\n";
|
||||
register_shutdown_function(array($this, '_database'));
|
||||
}
|
||||
$connection = connection();
|
||||
$result = $connection->query($query, 1);
|
||||
if ($result) {
|
||||
echo '"' . addcslashes($table, "\r\n\"\\") . "\": [\n";
|
||||
$first = true;
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
echo ($first ? "" : ", ");
|
||||
$first = false;
|
||||
foreach ($row as $key => $val) {
|
||||
json_row($key, $val);
|
||||
}
|
||||
json_row("");
|
||||
}
|
||||
echo "]";
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function dumpHeaders($identifier, $multi_table = false) {
|
||||
if ($_POST["format"] == "json") {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
return "json";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -19,6 +19,7 @@ class AdminerDumpZip {
|
||||
}
|
||||
|
||||
function _zip($string, $state) {
|
||||
// ZIP can be created without temporary file by gzcompress - see PEAR File_Archive
|
||||
$this->data .= $string;
|
||||
if ($state & PHP_OUTPUT_HANDLER_END) {
|
||||
$zip = new ZipArchive;
|
||||
|
21
plugins/json-column.php
Normal file
21
plugins/json-column.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/** Display JSON values as table in edit
|
||||
* @link http://www.adminer.org/plugins/#use
|
||||
* @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 AdminerJsonColumn {
|
||||
|
||||
function editInput($table, $field, $attrs, $value) {
|
||||
if (substr($value, 0, 1) == '{' && ($json = json_decode($value, true))) {
|
||||
echo "<table cellspacing='0'>";
|
||||
foreach ($json as $key => $val) {
|
||||
echo "<tr><th>" . h($key) . "<td><code class='jush-js'>" . h(json_encode($val)) . "</code>";
|
||||
}
|
||||
echo "</table>";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
17
plugins/links-direct.php
Normal file
17
plugins/links-direct.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
/** Avoid redirecting of external links through adminer.org and disclose the URL of installed Adminer to visited links
|
||||
* @link http://www.adminer.org/plugins/#use
|
||||
* @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 AdminerLinksDirect {
|
||||
|
||||
function selectLink($val, $field) {
|
||||
if (is_url($val)) {
|
||||
return $val;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
43
plugins/master-slave.php
Normal file
43
plugins/master-slave.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
/** Execute writes on master and reads on slave
|
||||
* @link http://www.adminer.org/plugins/#use
|
||||
* @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 AdminerMasterSlave {
|
||||
private $masters = array();
|
||||
|
||||
/**
|
||||
* @param array ($slave => $master)
|
||||
*/
|
||||
function AdminerMasterSlave($masters) {
|
||||
$this->masters = $masters;
|
||||
}
|
||||
|
||||
function credentials() {
|
||||
if ($_POST && isset($this->masters[SERVER])) {
|
||||
return array($this->masters[SERVER], $_GET["username"], get_session("pwds"));
|
||||
}
|
||||
}
|
||||
|
||||
function login($login, $password) {
|
||||
if (!$_POST && ($master = &$_SESSION["master"])) {
|
||||
$connection = connection();
|
||||
$connection->query("DO MASTER_POS_WAIT('" . q($master['File']) . "', $master[Position])");
|
||||
$master = null;
|
||||
}
|
||||
}
|
||||
|
||||
function messageQuery($query) {
|
||||
//! doesn't work with sql.inc.php
|
||||
$connection = connection();
|
||||
$result = $connection->query('SHOW MASTER STATUS');
|
||||
if ($result) {
|
||||
restart_session();
|
||||
$_SESSION["master"] = $result->fetch_assoc();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -191,6 +191,11 @@ class AdminerPlugin extends Adminer {
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
}
|
||||
|
||||
function selectLink() {
|
||||
$args = func_get_args();
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
}
|
||||
|
||||
function selectVal() {
|
||||
$args = func_get_args();
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
@@ -296,6 +301,11 @@ class AdminerPlugin extends Adminer {
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
}
|
||||
|
||||
function dumpDatabase() {
|
||||
$args = func_get_args();
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
}
|
||||
|
||||
function dumpTable() {
|
||||
$args = func_get_args();
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
|
@@ -56,7 +56,6 @@
|
||||
<td>Query executed OK</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
</tbody></table>
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -41,7 +41,6 @@
|
||||
<td>Database has been created.</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
</tbody></table>
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -41,7 +41,6 @@
|
||||
<td>Item 2 has been inserted.</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
</tbody></table>
|
||||
</body>
|
||||
</html>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user