diff --git a/adminer/dump.inc.php b/adminer/dump.inc.php
index 6966ab08..c6baa49b 100644
--- a/adminer/dump.inc.php
+++ b/adminer/dump.inc.php
@@ -146,6 +146,7 @@ DROP PROCEDURE adminer_drop;
}
}
}
+ dump();
exit;
}
@@ -164,7 +165,7 @@ if ($dbh->server_info >= 5) {
}
echo "
| " . lang('Output') . " | $dump_output\n"; // token is not needed but checked in bootstrap for all POST data
echo " |
|---|
| " . lang('Format') . " | $dump_format\n";
-echo " |
|---|
| " . lang('Compression') . " | " . ($dump_compress ? $dump_compress : lang('None of the supported PHP extensions (%s) are available.', 'zlib')) . "\n";
+echo " |
|---|
| " . lang('Compression') . " | " . ($dump_compress ? $dump_compress : lang('None of the supported PHP extensions (%s) are available.', 'zlib, bz2')) . "\n";
echo " |
|---|
| " . lang('Database') . " | \n";
echo " |
|---|
| " . lang('Tables') . " | \n";
echo " |
|---|
| " . lang('Data') . " | \n";
diff --git a/adminer/include/export.inc.php b/adminer/include/export.inc.php
index 13f6d635..2cdced7c 100644
--- a/adminer/include/export.inc.php
+++ b/adminer/include/export.inc.php
@@ -127,39 +127,47 @@ function dump_data($table, $style, $select = "") {
$s = "\n($s)";
if (!$buffer) {
$buffer = $insert . $s;
+ } elseif (strlen($buffer) + 1 + strlen($s) < $max_packet) { // 1 - separator length
+ $buffer .= ",$s";
} else {
- if (strlen($buffer) + 1 + strlen($s) < $max_packet) { // 1 - separator length
- $buffer .= ",$s";
- } else {
- dump("$buffer;\n");
- $buffer = $insert . $s;
- }
+ $buffer .= ";\n";
+ dump($buffer);
+ $buffer = $insert . $s;
}
}
}
}
if ($_POST["format"] != "csv" && $style != "INSERT+UPDATE" && $buffer) {
- dump("$buffer;\n");
+ $buffer .= ";\n";
+ dump($buffer);
}
}
}
}
function dump_headers($identifier, $multi_table = false) {
+ $compress = $_POST["compress"];
$filename = (strlen($identifier) ? friendly_url($identifier) : "dump");
$ext = ($_POST["format"] == "sql" ? "sql" : ($multi_table ? "tar" : "csv")); // multiple CSV packed to TAR
- header("Content-Type: " . ($_POST["compress"] == "gz" ? "application/x-gzip" : ($ext == "tar" ? "application/x-tar" : ($ext == "sql" || $_POST["output"] != "file" ? "text/plain" : "text/csv")) . "; charset=utf-8"));
- if ($_POST["output"] == "file" || $_POST["compress"]) {
- header("Content-Disposition: attachment; filename=$filename.$ext" . ($_POST["compress"] == "gz" ? ".gz" : ""));
+ header("Content-Type: " .
+ ($compress == "bz2" ? "application/x-bzip" :
+ ($compress == "gz" ? "application/x-gzip" :
+ ($ext == "tar" ? "application/x-tar" :
+ ($ext == "sql" || $_POST["output"] != "file" ? "text/plain" : "text/csv") . "; charset=utf-8"
+ ))));
+ if ($_POST["output"] == "file" || $compress) {
+ header("Content-Disposition: attachment; filename=$filename.$ext" . (ereg('[0-9a-z]', $compress) ? ".$compress" : ""));
}
return $ext;
}
$compress = array();
if (function_exists('gzencode')) {
- $compress['gz'] = 'GZIP';
+ $compress['gz'] = 'gzip';
+}
+if (function_exists('bzcompress')) {
+ $compress['bz2'] = 'bzip2';
}
-// bzcompress can't be called repetitively, bzopen requires temporary file
// ZipArchive requires temporary file, ZIP can be created by gzcompress - see PEAR File_Archive
$dump_output = "";
$dump_format = "";
diff --git a/adminer/include/functions.inc.php b/adminer/include/functions.inc.php
index 6dd971c4..8318968f 100644
--- a/adminer/include/functions.inc.php
+++ b/adminer/include/functions.inc.php
@@ -360,9 +360,18 @@ function process_input($field) {
}
}
-function dump($string) {
- if ($_POST["compress"] == "gz") {
- echo gzencode($string);
+function dump($string = null) { // null $string forces sending of buffer
+ static $buffer = ""; // used to improve compression and to allow GZ archives unpackable in Total Commander
+ if ($_POST["compress"]) {
+ $buffer .= $string;
+ if (!isset($string) || strlen($buffer) > 1e6) {
+ if ($_POST["compress"] == "bz2") {
+ echo bzcompress($buffer); // should not be called repeatedly but it would require whole buffer in memory or temporary file
+ } else {
+ echo gzencode($buffer);
+ }
+ $buffer = "";
+ }
} else {
echo $string;
}
diff --git a/adminer/select.inc.php b/adminer/select.inc.php
index 9bf4882e..3f7754cf 100644
--- a/adminer/select.inc.php
+++ b/adminer/select.inc.php
@@ -48,6 +48,7 @@ if ($_POST && !$error) {
}
dump_data($_GET["select"], "INSERT", implode(" UNION ALL ", $union));
}
+ dump();
exit;
}
if (!$adminer->selectEmailProcess($where)) {
|
|---|