diff options
Diffstat (limited to '')
| -rw-r--r-- | hugo/export.php | 983 |
1 files changed, 983 insertions, 0 deletions
diff --git a/hugo/export.php b/hugo/export.php new file mode 100644 index 0000000..937478c --- /dev/null +++ b/hugo/export.php @@ -0,0 +1,983 @@ +<?php +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * Main export handling code + * + * @package PhpMyAdmin + */ + +/** + * If we are sending the export file (as opposed to just displaying it + * as text), we have to bypass the usual PMA_Response mechanism + */ +if ($_POST['output_format'] == 'sendit') { + define('PMA_BYPASS_GET_INSTANCE', 1); +} + +/** + * Get the variables sent or posted to this script and a core script + */ +require_once 'libraries/common.inc.php'; +require_once 'libraries/zip.lib.php'; +require_once 'libraries/plugin_interface.lib.php'; + +/** + * Sets globals from $_POST + * + * - Please keep the parameters in order of their appearance in the form + * - Some of these parameters are not used, as the code below directly + * verifies from the superglobal $_POST or $_REQUEST + */ +$post_params = array( + 'db', + 'table', + 'single_table', + 'export_type', + 'export_method', + 'quick_or_custom', + 'db_select', + 'table_select', + 'limit_to', + 'limit_from', + 'allrows', + 'output_format', + 'filename_template', + 'remember_template', + 'charset_of_file', + 'compression', + 'what', + 'htmlword_structure_or_data', + 'htmlword_null', + 'htmlword_columns', + 'mediawiki_structure_or_data', + 'mediawiki_caption', + 'pdf_report_title', + 'pdf_structure_or_data', + 'odt_structure_or_data', + 'odt_relation', + 'odt_comments', + 'odt_mime', + 'odt_columns', + 'odt_null', + 'codegen_structure_or_data', + 'codegen_format', + 'excel_null', + 'excel_removeCRLF', + 'excel_columns', + 'excel_edition', + 'excel_structure_or_data', + 'yaml_structure_or_data', + 'ods_null', + 'ods_structure_or_data', + 'ods_columns', + 'json_structure_or_data', + 'xml_structure_or_data', + 'xml_export_functions', + 'xml_export_procedures', + 'xml_export_tables', + 'xml_export_triggers', + 'xml_export_views', + 'xml_export_contents', + 'texytext_structure_or_data', + 'texytext_columns', + 'texytext_null', + 'phparray_structure_or_data', + 'sql_include_comments', + 'sql_header_comment', + 'sql_dates', + 'sql_relation', + 'sql_mime', + 'sql_use_transaction', + 'sql_disable_fk', + 'sql_compatibility', + 'sql_structure_or_data', + 'sql_create_database', + 'sql_drop_table', + 'sql_procedure_function', + 'sql_create_table_statements', + 'sql_if_not_exists', + 'sql_auto_increment', + 'sql_backquotes', + 'sql_truncate', + 'sql_delayed', + 'sql_ignore', + 'sql_type', + 'sql_insert_syntax', + 'sql_max_query_size', + 'sql_hex_for_blob', + 'sql_utc_time', + 'csv_separator', + 'csv_enclosed', + 'csv_escaped', + 'csv_terminated', + 'csv_null', + 'csv_removeCRLF', + 'csv_columns', + 'csv_structure_or_data', + // csv_replace should have been here but we use it directly from $_POST + 'latex_caption', + 'latex_structure_or_data', + 'latex_structure_caption', + 'latex_structure_continued_caption', + 'latex_structure_label', + 'latex_relation', + 'latex_comments', + 'latex_mime', + 'latex_columns', + 'latex_data_caption', + 'latex_data_continued_caption', + 'latex_data_label', + 'latex_null' +); + +foreach ($post_params as $one_post_param) { + if (isset($_POST[$one_post_param])) { + $GLOBALS[$one_post_param] = $_POST[$one_post_param]; + } +} + +// sanitize this parameter which will be used below in a file inclusion +$what = PMA_securePath($what); + +PMA_Util::checkParameters(array('what', 'export_type')); + +// export class instance, not array of properties, as before +$export_plugin = PMA_getPlugin( + "export", + $what, + 'libraries/plugins/export/', + array( + 'export_type' => $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', + 'bzip2', +); + +/** + * 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_generate_common_url(); +} elseif ($export_type == 'database' && strlen($db)) { + $err_url = 'db_export.php?' . PMA_generate_common_url($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_generate_common_url($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']); +} + +// Start with empty buffer +$dump_buffer = ''; +$dump_buffer_len = 0; + +// We send fake headers to avoid browser timeout when buffering +$time_start = time(); + + +/** + * 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() +{ + if (@function_exists('gzencode') + && ! @ini_get('zlib.output_compression') + && ! PMA_isGzHandlerEnabled() + ) { + 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_str_conv( + $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_convert_string( + 'utf-8', + $GLOBALS['charset_of_file'], + $dump_buffer + ); + } + // as bzipped + if ($GLOBALS['compression'] == 'bzip2' + && @function_exists('bzcompress') + ) { + $dump_buffer = bzcompress($dump_buffer); + } elseif ($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 || ($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_convert_string( + '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 <CR><LF> format. +// For SQL always use \n as MySQL wants this on all platforms. +if ($what == 'sql') { + $crlf = "\n"; +} else { + $crlf = PMA_Util::whichCrlf(); +} + +$output_kanji_conversion = function_exists('PMA_kanji_str_conv') && $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' || $compression == 'bzip2'); +if ($onfly_compression) { + $memory_limit = trim(@ini_get('memory_limit')); + // 2 MB as default + if (empty($memory_limit)) { + $memory_limit = 2 * 1024 * 1024; + } + + if (strtolower(substr($memory_limit, -1)) == 'm') { + $memory_limit = (int)substr($memory_limit, 0, -1) * 1024 * 1024; + } elseif (strtolower(substr($memory_limit, -1)) == 'k') { + $memory_limit = (int)substr($memory_limit, 0, -1) * 1024; + } elseif (strtolower(substr($memory_limit, -1)) == 'g') { + $memory_limit = (int)substr($memory_limit, 0, -1) * 1024 * 1024 * 1024; + } else { + $memory_limit = (int)$memory_limit; + } + + // Some of memory is needed for other thins and as treshold. + // Nijel: 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 == 'bzip2') { + $filename .= '.bz2'; + $mime_type = 'application/x-bzip2'; + } elseif ($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" . '<div style="text-align: ' . $cell_align_left . '">' . "\n"; + //echo ' <pre>' . "\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 = '<p>[ <a href="'; + if ($export_type == 'server') { + $back_button .= 'server_export.php?' . PMA_generate_common_url(); + } elseif ($export_type == 'database') { + $back_button .= 'db_export.php?' . PMA_generate_common_url($db); + } else { + $back_button .= 'tbl_export.php?' . PMA_generate_common_url($db, $table); + } + + // Convert the multiple select elements from an array to a string + if ($export_type == 'server' && isset($_REQUEST['db_select'])) { + $_REQUEST['db_select'] = implode(",", $_REQUEST['db_select']); + } elseif ($export_type == 'database' && isset($_REQUEST['table_select'])) { + $_REQUEST['table_select'] = implode(",", $_REQUEST['table_select']); + } + + foreach ($_REQUEST as $name => $value) { + $back_button .= '&' . urlencode($name) . '=' . urlencode($value); + } + $back_button .= '&repopulate=1">Back</a> ]</p>'; + + echo $back_button; + echo ' <form name="nofunction">' . "\n" + // remove auto-select for now: there is no way to select + // only a part of the text; anyway, it should obey + // $cfg['TextareaAutoSelect'] + //. ' <textarea name="sqldump" cols="50" rows="30" onclick="this.select();" id="textSQLDUMP" wrap="OFF">' . "\n"; + . ' <textarea name="sqldump" cols="50" rows="30" id="textSQLDUMP" wrap="OFF">' . "\n"; + } // end download +} + +// Fake loop just to allow skip of remain of this code by break, I'd really +// need exceptions here :-) +do { + + // Add possibly some comments to export + if (! $export_plugin->exportHeader($db)) { + break; + } + + // Will we need relation & co. setup? + $do_relation = isset($GLOBALS[$what . '_relation']); + $do_comments = isset($GLOBALS[$what . '_include_comments']); + $do_mime = isset($GLOBALS[$what . '_mime']); + if ($do_relation || $do_comments || $do_mime) { + $cfgRelation = PMA_getRelationsParam(); + } + if ($do_mime) { + include_once 'libraries/transformations.lib.php'; + } + + // Include dates in export? + $do_dates = isset($GLOBALS[$what . '_dates']); + + /** + * Builds the dump + */ + // Gets the number of tables if a dump of a database has been required + if ($export_type == 'server') { + if (isset($db_select)) { + $tmp_select = implode($db_select, '|'); + $tmp_select = '|' . $tmp_select . '|'; + } + // Walk over databases + foreach ($GLOBALS['pma']->databases as $current_db) { + if (isset($tmp_select) + && strpos(' ' . $tmp_select, '|' . $current_db . '|') + ) { + if (! $export_plugin->exportDBHeader($current_db)) { + break 2; + } + if (! $export_plugin->exportDBCreate($current_db)) { + break 2; + } + if (method_exists($export_plugin, 'exportRoutines') + && strpos($GLOBALS['sql_structure_or_data'], 'structure') !== false + && isset($GLOBALS['sql_procedure_function']) + ) { + $export_plugin->exportRoutines($current_db); + } + + $tables = PMA_DBI_get_tables($current_db); + $views = array(); + foreach ($tables as $table) { + // if this is a view, collect it for later; + // views must be exported after the tables + $is_view = PMA_Table::isView($current_db, $table); + if ($is_view) { + $views[] = $table; + } + if ($GLOBALS[$what . '_structure_or_data'] == 'structure' + || $GLOBALS[$what . '_structure_or_data'] == 'structure_and_data' + ) { + // for a view, export a stand-in definition of the table + // to resolve view dependencies + if (! $export_plugin->exportStructure( + $current_db, $table, $crlf, $err_url, + $is_view ? 'stand_in' : 'create_table', $export_type, + $do_relation, $do_comments, $do_mime, $do_dates + )) { + break 3; + } + } + // if this is a view or a merge table, don't export data + if (($GLOBALS[$what . '_structure_or_data'] == 'data' + || $GLOBALS[$what . '_structure_or_data'] == 'structure_and_data') + && ! ($is_view || PMA_Table::isMerge($current_db, $table)) + ) { + $local_query = 'SELECT * FROM ' . PMA_Util::backquote($current_db) + . '.' . PMA_Util::backquote($table); + if (! $export_plugin->exportData($current_db, $table, $crlf, $err_url, $local_query)) { + break 3; + } + } + // now export the triggers (needs to be done after the data + // because triggers can modify already imported tables) + if ($GLOBALS[$what . '_structure_or_data'] == 'structure' + || $GLOBALS[$what . '_structure_or_data'] == 'structure_and_data' + ) { + if (! $export_plugin->exportStructure( + $current_db, $table, $crlf, $err_url, + 'triggers', $export_type, + $do_relation, $do_comments, $do_mime, $do_dates + )) { + break 2; + } + } + } + foreach ($views as $view) { + // no data export for a view + if ($GLOBALS[$what . '_structure_or_data'] == 'structure' + || $GLOBALS[$what . '_structure_or_data'] == 'structure_and_data' + ) { + if (! $export_plugin->exportStructure( + $current_db, $view, $crlf, $err_url, + 'create_view', $export_type, + $do_relation, $do_comments, $do_mime, $do_dates + )) { + break 3; + } + } + } + if (! $export_plugin->exportDBFooter($current_db)) { + break 2; + } + } + } + } elseif ($export_type == 'database') { + if (! $export_plugin->exportDBHeader($db)) { + break; + } + if (! $export_plugin->exportDBCreate($db)) { + break; + } + + if (method_exists($export_plugin, 'exportRoutines') + && strpos($GLOBALS['sql_structure_or_data'], 'structure') !== false + && isset($GLOBALS['sql_procedure_function']) + ) { + $export_plugin->exportRoutines($db); + } + + $i = 0; + $views = array(); + // $tables contains the choices from the user (via $table_select) + foreach ($tables as $table) { + // if this is a view, collect it for later; views must be exported after + // the tables + $is_view = PMA_Table::isView($db, $table); + if ($is_view) { + $views[] = $table; + } + if ($GLOBALS[$what . '_structure_or_data'] == 'structure' + || $GLOBALS[$what . '_structure_or_data'] == 'structure_and_data' + ) { + // for a view, export a stand-in definition of the table + // to resolve view dependencies + if (! $export_plugin->exportStructure( + $db, $table, $crlf, $err_url, + $is_view ? 'stand_in' : 'create_table', $export_type, + $do_relation, $do_comments, $do_mime, $do_dates + )) { + break 2; + } + } + // if this is a view or a merge table, don't export data + if (($GLOBALS[$what . '_structure_or_data'] == 'data' + || $GLOBALS[$what . '_structure_or_data'] == 'structure_and_data') + && ! ($is_view || PMA_Table::isMerge($db, $table)) + ) { + $local_query = 'SELECT * FROM ' . PMA_Util::backquote($db) + . '.' . PMA_Util::backquote($table); + if (! $export_plugin->exportData($db, $table, $crlf, $err_url, $local_query)) { + break 2; + } + } + // now export the triggers (needs to be done after the data because + // triggers can modify already imported tables) + if ($GLOBALS[$what . '_structure_or_data'] == 'structure' + || $GLOBALS[$what . '_structure_or_data'] == 'structure_and_data' + ) { + if (! $export_plugin->exportStructure( + $db, $table, $crlf, $err_url, + 'triggers', $export_type, + $do_relation, $do_comments, $do_mime, $do_dates + )) { + break 2; + } + } + } + foreach ($views as $view) { + // no data export for a view + if ($GLOBALS[$what . '_structure_or_data'] == 'structure' + || $GLOBALS[$what . '_structure_or_data'] == 'structure_and_data' + ) { + if (! $export_plugin->exportStructure( + $db, $view, $crlf, $err_url, + 'create_view', $export_type, + $do_relation, $do_comments, $do_mime, $do_dates + )) { + break 2; + } + } + } + + if (! $export_plugin->exportDBFooter($db)) { + break; + } + } else { + if (! $export_plugin->exportDBHeader($db)) { + break; + } + // We export just one table + // $allrows comes from the form when "Dump all rows" has been selected + if (isset($allrows) && $allrows == '0' && $limit_to > 0 && $limit_from >= 0) { + $add_query = ' LIMIT ' + . (($limit_from > 0) ? $limit_from . ', ' : '') + . $limit_to; + } else { + $add_query = ''; + } + + $is_view = PMA_Table::isView($db, $table); + if ($GLOBALS[$what . '_structure_or_data'] == 'structure' + || $GLOBALS[$what . '_structure_or_data'] == 'structure_and_data' + ) { + if (! $export_plugin->exportStructure( + $db, $table, $crlf, $err_url, + $is_view ? 'create_view' : 'create_table', $export_type, + $do_relation, $do_comments, $do_mime, $do_dates + )) { + break; + } + } + // If this is an export of a single view, we have to export data; + // for example, a PDF report + // if it is a merge table, no data is exported + if (($GLOBALS[$what . '_structure_or_data'] == 'data' + || $GLOBALS[$what . '_structure_or_data'] == 'structure_and_data') + && ! PMA_Table::isMerge($db, $table) + ) { + if (! empty($sql_query)) { + // only preg_replace if needed + if (! empty($add_query)) { + // remove trailing semicolon before adding a LIMIT + $sql_query = preg_replace('%;\s*$%', '', $sql_query); + } + $local_query = $sql_query . $add_query; + PMA_DBI_select_db($db); + } else { + $local_query = 'SELECT * FROM ' . PMA_Util::backquote($db) + . '.' . PMA_Util::backquote($table) . $add_query; + } + if (! $export_plugin->exportData($db, $table, $crlf, $err_url, $local_query)) { + break; + } + } + // now export the triggers (needs to be done after the data because + // triggers can modify already imported tables) + if ($GLOBALS[$what . '_structure_or_data'] == 'structure' + || $GLOBALS[$what . '_structure_or_data'] == 'structure_and_data' + ) { + if (! $export_plugin->exportStructure( + $db, $table, $crlf, $err_url, + 'triggers', $export_type, + $do_relation, $do_comments, $do_mime, $do_dates + )) { + break 2; + } + } + if (! $export_plugin->exportDBFooter($db)) { + break; + } + } + if (! $export_plugin->exportFooter()) { + break; + } + +} while (false); +// End of fake loop + +if ($save_on_server && 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 the dump as a file... + */ +if (! empty($asfile)) { + // Convert the charset if required. + if ($output_charset_conversion) { + $dump_buffer = PMA_convert_string( + 'utf-8', + $GLOBALS['charset_of_file'], + $dump_buffer + ); + } + + // Do the compression + // 1. as a zipped file + if ($compression == 'zip') { + if (@function_exists('gzcompress')) { + $zipfile = new ZipFile(); + $zipfile->addFile($dump_buffer, substr($filename, 0, -4)); + $dump_buffer = $zipfile->file(); + } + } elseif ($compression == 'bzip2') { + // 2. as a bzipped file + if (@function_exists('bzcompress')) { + $dump_buffer = bzcompress($dump_buffer); + } + } elseif ($compression == 'gzip' && PMA_gzencodeNeeded()) { + // 3. as a gzipped file + // without the optional parameter level because it bugs + $dump_buffer = gzencode($dump_buffer); + } + + /* If we saved on server, we have to close file now */ + if ($save_on_server) { + $write_result = @fwrite($file_handle, $dump_buffer); + fclose($file_handle); + if (strlen($dump_buffer) > 0 + && (! $write_result || ($write_result != strlen($dump_buffer))) + ) { + $message = new PMA_Message( + __('Insufficient space to save the file %s.'), + PMA_Message::ERROR, + $save_filename + ); + } else { + $message = new PMA_Message( + __('Dump has been saved to file %s.'), + PMA_Message::SUCCESS, + $save_filename + ); + } + + if ($export_type == 'server') { + $active_page = 'server_export.php'; + include_once 'server_export.php'; + } elseif ($export_type == 'database') { + $active_page = 'db_export.php'; + include_once 'db_export.php'; + } else { + $active_page = 'tbl_export.php'; + include_once 'tbl_export.php'; + } + exit(); + } else { + PMA_Response::getInstance()->disable(); + echo $dump_buffer; + } +} else { + /** + * Displays the dump... + * + * Close the html tags and add the footers if dump is displayed on screen + */ + echo '</textarea>' . "\n" + . ' </form>' . "\n"; + echo $back_button; + + echo "\n"; + echo '</div>' . "\n"; + echo "\n"; +?> +<script type="text/javascript"> +//<![CDATA[ + var $body = $("body"); + $("#textSQLDUMP") + .width($body.width() - 50) + .height($body.height() - 100); +//]]> +</script> +<?php +} // end if +?> |
