diff --git a/adminer/dump.inc.php b/adminer/dump.inc.php index 78ade4ee4..4e0e0fe04 100644 --- a/adminer/dump.inc.php +++ b/adminer/dump.inc.php @@ -71,7 +71,8 @@ $data = (DB == "" || in_array($name, (array) $_POST["data"])); if ($table || $data) { if ($ext == "tar") { - ob_start(); + $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)) { @@ -84,7 +85,8 @@ echo "\nDELIMITER ;;\n$triggers\nDELIMITER ;\n"; } if ($ext == "tar") { - tar_file((DB != "" ? "" : "$db/") . "$name.csv", ob_get_clean()); + ob_end_flush(); + tar_file((DB != "" ? "" : "$db/") . "$name.csv", $tmp_file); } elseif ($is_sql) { echo "\n"; } diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index da42e3233..9cb939a63 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -409,13 +409,13 @@ 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 -* @param string +/** Add a file to TAR * @param 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]); @@ -423,8 +423,8 @@ function tar_file($filename, $contents) { $return .= sprintf("%06o", $checksum) . "\0 "; echo $return; echo str_repeat("\0", 512 - strlen($return)); - echo $contents; - echo str_repeat("\0", 511 - (strlen($contents) + 511) % 512); + $tmp_file->send(); + echo str_repeat("\0", 511 - ($tmp_file->size + 511) % 512); } /** Get INI bytes value diff --git a/adminer/include/tmpfile.inc.php b/adminer/include/tmpfile.inc.php new file mode 100644 index 000000000..6fa58c195 --- /dev/null +++ b/adminer/include/tmpfile.inc.php @@ -0,0 +1,21 @@ +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); + } +} diff --git a/adminer/index.php b/adminer/index.php index dd667f345..a024aabdd 100644 --- a/adminer/index.php +++ b/adminer/index.php @@ -8,6 +8,7 @@ */ include "./include/bootstrap.inc.php"; +include "./include/tmpfile.inc.php"; $enum_length = "'(?:''|[^'\\\\]|\\\\.)*+'"; $inout = "IN|OUT|INOUT"; diff --git a/changes.txt b/changes.txt index 417db3cf4..1f53f7624 100644 --- a/changes.txt +++ b/changes.txt @@ -4,6 +4,7 @@ Print run time next to executed queries 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) MySQL: Optimize create table page and Editor navigation MySQL: Display bit type as binary number diff --git a/todo.txt b/todo.txt index f682ba0ce..6adabfebb 100644 --- a/todo.txt +++ b/todo.txt @@ -4,7 +4,6 @@ Variables editation Blob download and image display in edit form (important for Editor with hidden fields in select and SQL command) Add title to Logout, edit (in select) and select (in menu) for style "hever" Export by GET parameters -Files are missing in TAR due to exhausted memory - can be fixed by creating a temporary file Draggable columns in alter table (thanks to Michal Manak)