From 702e949d30286b76f32dfdccce61f9858e5bc7bf Mon Sep 17 00:00:00 2001 From: jakubvrana Date: Fri, 28 Aug 2009 14:44:43 +0000 Subject: [PATCH] Bzip2 compression git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@1036 7c3ca157-0c34-0410-bff1-cbf682f78f5c --- adminer/dump.inc.php | 3 ++- adminer/include/export.inc.php | 32 +++++++++++++++++++------------ adminer/include/functions.inc.php | 15 ++++++++++++--- adminer/select.inc.php | 1 + 4 files changed, 35 insertions(+), 16 deletions(-) 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)) {