$export_type, 'single_table' => isset($single_table) ) ); // Backward compatbility $type = $what; // Check export type if (! isset($export_plugin)) { PMA_fatalError(__('Bad type!')); } /** * valid compression methods */ $compression_methods = array( 'zip', 'gzip' ); /** * init and variable checking */ $compression = false; $onserver = false; $save_on_server = false; $buffer_needed = false; // Is it a quick or custom export? if ($_REQUEST['quick_or_custom'] == 'quick') { $quick_export = true; } else { $quick_export = false; } if ($_REQUEST['output_format'] == 'astext') { $asfile = false; } else { $asfile = true; if (in_array($_REQUEST['compression'], $compression_methods)) { $compression = $_REQUEST['compression']; $buffer_needed = true; } if (($quick_export && ! empty($_REQUEST['quick_export_onserver'])) || (! $quick_export && ! empty($_REQUEST['onserver'])) ) { if ($quick_export) { $onserver = $_REQUEST['quick_export_onserver']; } else { $onserver = $_REQUEST['onserver']; } // Will we save dump on server? $save_on_server = ! empty($cfg['SaveDir']) && $onserver; } } // Does export require to be into file? if ($export_plugin->getProperties()->getForceFile() != null && ! $asfile) { $message = PMA_Message::error( __('Selected export type has to be saved in file!') ); if ($export_type == 'server') { $active_page = 'server_export.php'; include 'server_export.php'; } elseif ($export_type == 'database') { $active_page = 'db_export.php'; include 'db_export.php'; } else { $active_page = 'tbl_export.php'; include 'tbl_export.php'; } exit(); } // Generate error url and check for needed variables if ($export_type == 'server') { $err_url = 'server_export.php?' . PMA_URL_getCommon(); } elseif ($export_type == 'database' && strlen($db)) { $err_url = 'db_export.php?' . PMA_URL_getCommon($db); // Check if we have something to export if (isset($table_select)) { $tables = $table_select; } else { $tables = array(); } } elseif ($export_type == 'table' && strlen($db) && strlen($table)) { $err_url = 'tbl_export.php?' . PMA_URL_getCommon($db, $table); } else { PMA_fatalError(__('Bad parameters!')); } /** * Increase time limit for script execution and initializes some variables */ @set_time_limit($cfg['ExecTimeLimit']); if (! empty($cfg['MemoryLimit'])) { @ini_set('memory_limit', $cfg['MemoryLimit']); } register_shutdown_function('PMA_shutdown'); // Start with empty buffer $dump_buffer = ''; $dump_buffer_len = 0; // We send fake headers to avoid browser timeout when buffering $time_start = time(); } /** * Sets a session variable upon a possible fatal error during export * * @return void */ function PMA_shutdown() { $a = error_get_last(); if ($a != null && strpos($a['message'], "execution time")) { //write in partially downloaded file for future reference of user print_r($a); //set session variable to check if there was error while exporting $_SESSION['pma_export_error'] = $a['message']; } } /** * Detect ob_gzhandler * * @return bool */ function PMA_isGzHandlerEnabled() { return in_array('ob_gzhandler', ob_list_handlers()); } /** * Detect whether gzencode is needed; it might not be needed if * the server is already compressing by itself * * @return bool Whether gzencode is needed */ function PMA_gzencodeNeeded() { /* * We should gzencode only if the function exists * but we don't want to compress twice, therefore * gzencode only if transparent compression is not enabled * and gz compression was not asked via $cfg['OBGzip'] * but transparent compression does not apply when saving to server */ if (@function_exists('gzencode') && ((! @ini_get('zlib.output_compression') && ! PMA_isGzHandlerEnabled()) || $GLOBALS['save_on_server']) ) { return true; } else { return false; } } /** * Output handler for all exports, if needed buffering, it stores data into * $dump_buffer, otherwise it prints thems out. * * @param string $line the insert statement * * @return bool Whether output succeeded */ function PMA_exportOutputHandler($line) { global $time_start, $dump_buffer, $dump_buffer_len, $save_filename; // Kanji encoding convert feature if ($GLOBALS['output_kanji_conversion']) { $line = PMA_Kanji_strConv( $line, $GLOBALS['knjenc'], isset($GLOBALS['xkana']) ? $GLOBALS['xkana'] : '' ); } // If we have to buffer data, we will perform everything at once at the end if ($GLOBALS['buffer_needed']) { $dump_buffer .= $line; if ($GLOBALS['onfly_compression']) { $dump_buffer_len += strlen($line); if ($dump_buffer_len > $GLOBALS['memory_limit']) { if ($GLOBALS['output_charset_conversion']) { $dump_buffer = PMA_convertString( 'utf-8', $GLOBALS['charset_of_file'], $dump_buffer ); } if ($GLOBALS['compression'] == 'gzip' && PMA_gzencodeNeeded() ) { // as a gzipped file // without the optional parameter level because it bugs $dump_buffer = gzencode($dump_buffer); } if ($GLOBALS['save_on_server']) { $write_result = @fwrite($GLOBALS['file_handle'], $dump_buffer); if ($write_result != strlen($dump_buffer)) { $GLOBALS['message'] = PMA_Message::error( __('Insufficient space to save the file %s.') ); $GLOBALS['message']->addParam($save_filename); return false; } } else { echo $dump_buffer; } $dump_buffer = ''; $dump_buffer_len = 0; } } else { $time_now = time(); if ($time_start >= $time_now + 30) { $time_start = $time_now; header('X-pmaPing: Pong'); } // end if } } else { if ($GLOBALS['asfile']) { if ($GLOBALS['output_charset_conversion']) { $line = PMA_convertString( 'utf-8', $GLOBALS['charset_of_file'], $line ); } if ($GLOBALS['save_on_server'] && strlen($line) > 0) { $write_result = @fwrite($GLOBALS['file_handle'], $line); if (! $write_result || ($write_result != strlen($line))) { $GLOBALS['message'] = PMA_Message::error( __('Insufficient space to save the file %s.') ); $GLOBALS['message']->addParam($save_filename); return false; } $time_now = time(); if ($time_start >= $time_now + 30) { $time_start = $time_now; header('X-pmaPing: Pong'); } // end if } else { // We export as file - output normally echo $line; } } else { // We export as html - replace special chars echo htmlspecialchars($line); } } return true; } // end of the 'PMA_exportOutputHandler()' function // Defines the default format. // For SQL always use \n as MySQL wants this on all platforms. if (!defined('TESTSUITE')) { if ($what == 'sql') { $crlf = "\n"; } else { $crlf = PMA_Util::whichCrlf(); } $output_kanji_conversion = function_exists('PMA_Kanji_strConv') && $type != 'xls'; // Do we need to convert charset? $output_charset_conversion = $asfile && $GLOBALS['PMA_recoding_engine'] != PMA_CHARSET_NONE && isset($charset_of_file) && $charset_of_file != 'utf-8' && $type != 'xls'; // Use on the fly compression? $onfly_compression = $GLOBALS['cfg']['CompressOnFly'] && $compression == 'gzip'; if ($onfly_compression) { $memory_limit = trim(@ini_get('memory_limit')); $memory_limit_num = (int)substr($memory_limit, 0, -1); // 2 MB as default if (empty($memory_limit) || '-1' == $memory_limit) { $memory_limit = 2 * 1024 * 1024; } elseif (strtolower(substr($memory_limit, -1)) == 'm') { $memory_limit = $memory_limit_num * 1024 * 1024; } elseif (strtolower(substr($memory_limit, -1)) == 'k') { $memory_limit = $memory_limit_num * 1024; } elseif (strtolower(substr($memory_limit, -1)) == 'g') { $memory_limit = $memory_limit_num * 1024 * 1024 * 1024; } else { $memory_limit = (int)$memory_limit; } // Some of memory is needed for other things and as threshold. // During export I had allocated (see memory_get_usage function) // approx 1.2MB so this comes from that. if ($memory_limit > 1500000) { $memory_limit -= 1500000; } // Some memory is needed for compression, assume 1/3 $memory_limit /= 8; } // Generate filename and mime type if needed if ($asfile) { $pma_uri_parts = parse_url($cfg['PmaAbsoluteUri']); if ($export_type == 'server') { if (isset($remember_template)) { $GLOBALS['PMA_Config']->setUserValue( 'pma_server_filename_template', 'Export/file_template_server', $filename_template ); } } elseif ($export_type == 'database') { if (isset($remember_template)) { $GLOBALS['PMA_Config']->setUserValue( 'pma_db_filename_template', 'Export/file_template_database', $filename_template ); } } else { if (isset($remember_template)) { $GLOBALS['PMA_Config']->setUserValue( 'pma_table_filename_template', 'Export/file_template_table', $filename_template ); } } $filename = PMA_Util::expandUserString($filename_template); // remove dots in filename (coming from either the template or already // part of the filename) to avoid a remote code execution vulnerability $filename = PMA_sanitizeFilename($filename, $replaceDots = true); // Grab basic dump extension and mime type // Check if the user already added extension; // get the substring where the extension would be if it was included $extension_start_pos = strlen($filename) - strlen( $export_plugin->getProperties()->getExtension() ) - 1; $user_extension = substr($filename, $extension_start_pos, strlen($filename)); $required_extension = "." . $export_plugin->getProperties()->getExtension(); if (strtolower($user_extension) != $required_extension) { $filename .= $required_extension; } $mime_type = $export_plugin->getProperties()->getMimeType(); // If dump is going to be compressed, set correct mime_type and add // compression to extension if ($compression == 'gzip') { $filename .= '.gz'; $mime_type = 'application/x-gzip'; } elseif ($compression == 'zip') { $filename .= '.zip'; $mime_type = 'application/zip'; } } // Open file on server if needed if ($save_on_server) { $save_filename = PMA_Util::userDir($cfg['SaveDir']) . preg_replace('@[/\\\\]@', '_', $filename); unset($message); if (file_exists($save_filename) && ((! $quick_export && empty($_REQUEST['onserverover'])) || ($quick_export && $_REQUEST['quick_export_onserverover'] != 'saveitover')) ) { $message = PMA_Message::error( __( 'File %s already exists on server, ' . 'change filename or check overwrite option.' ) ); $message->addParam($save_filename); } else { if (is_file($save_filename) && ! is_writable($save_filename)) { $message = PMA_Message::error( __( 'The web server does not have permission ' . 'to save the file %s.' ) ); $message->addParam($save_filename); } else { if (! $file_handle = @fopen($save_filename, 'w')) { $message = PMA_Message::error( __( 'The web server does not have permission ' . 'to save the file %s.' ) ); $message->addParam($save_filename); } } } if (isset($message)) { if ($export_type == 'server') { $active_page = 'server_export.php'; include 'server_export.php'; } elseif ($export_type == 'database') { $active_page = 'db_export.php'; include 'db_export.php'; } else { $active_page = 'tbl_export.php'; include 'tbl_export.php'; } exit(); } } /** * Send headers depending on whether the user chose to download a dump file * or not */ if (! $save_on_server) { if ($asfile) { // Download // (avoid rewriting data containing HTML with anchors and forms; // this was reported to happen under Plesk) @ini_set('url_rewriter.tags', ''); $filename = PMA_sanitizeFilename($filename); PMA_downloadHeader($filename, $mime_type); } else { // HTML if ($export_type == 'database') { $num_tables = count($tables); if ($num_tables == 0) { $message = PMA_Message::error( __('No tables found in database.') ); $active_page = 'db_export.php'; include 'db_export.php'; exit(); } } $backup_cfgServer = $cfg['Server']; $cfg['Server'] = $backup_cfgServer; unset($backup_cfgServer); echo "\n" . '
' . "\n"; //echo '
' . "\n";

            /**
             * Displays a back button with all the $_REQUEST data in the URL
             * (store in a variable to also display after the textarea)
             */
            $back_button = '

[ $value) { $back_button .= '&' . urlencode($name) . '=' . urlencode($value); } $back_button .= '&repopulate=1">Back ]

'; echo $back_button; echo '
' . "\n"; echo '' . "\n" . '
' . "\n"; echo $back_button; echo "\n"; echo '
' . "\n"; echo "\n"; ?>