123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- <?php
- /**
- * This file has a single job - database backup.
- *
- * Simple Machines Forum (SMF)
- *
- * @package SMF
- * @author Simple Machines http://www.simplemachines.org
- * @copyright 2011 Simple Machines
- * @license http://www.simplemachines.org/about/smf/license.php BSD
- *
- * @version 2.1 Alpha 1
- */
- if (!defined('SMF'))
- die('Hacking attempt...');
- /**
- * Dumps the database.
- * It writes all of the database to standard output.
- * It uses gzip compression if compress is set in the URL/post data.
- * It may possibly time out, and mess up badly if you were relying on it. :P
- * The data dumped depends on whether "struct" and "data" are passed.
- * It requires an administrator and the session hash by post.
- * It is called from ManageMaintenance.php.
- */
- function DumpDatabase2()
- {
- global $db_name, $scripturl, $context, $modSettings, $crlf, $smcFunc, $db_prefix;
- // Administrators only!
- if (!allowedTo('admin_forum'))
- fatal_lang_error('no_dump_database', 'critical');
- // You can't dump nothing!
- if (!isset($_REQUEST['struct']) && !isset($_REQUEST['data']))
- $_REQUEST['data'] = true;
- checkSession('post');
- // We will need this, badly!
- db_extend();
- // Attempt to stop from dying...
- @set_time_limit(600);
-
- // @todo ... fail on not getting the requested memory?
- setMemoryLimit('256M');
- // Start saving the output... (don't do it otherwise for memory reasons.)
- if (isset($_REQUEST['compress']) && function_exists('gzencode'))
- {
- // Make sure we're gzipping output, but then say we're not in the header ^_^.
- if (empty($modSettings['enableCompressedOutput']))
- @ob_start('ob_gzhandler', 65536);
- // Try to clean any data already outputted.
- elseif (ob_get_length() != 0)
- {
- ob_end_clean();
- @ob_start('ob_gzhandler', 65536);
- }
- // Send faked headers so it will just save the compressed output as a gzip.
- header('Content-Type: application/x-gzip');
- header('Accept-Ranges: bytes');
- header('Content-Encoding: none');
- // Gecko browsers... don't like this. (Mozilla, Firefox, etc.)
- if (!isBrowser('gecko'))
- header('Content-Transfer-Encoding: binary');
- // The file extension will include .gz...
- $extension = '.sql.gz';
- }
- else
- {
- // Get rid of the gzipping alreading being done.
- if (!empty($modSettings['enableCompressedOutput']))
- @ob_end_clean();
- // If we can, clean anything already sent from the output buffer...
- elseif (ob_get_length() != 0)
- ob_clean();
- // Tell the client to save this file, even though it's text.
- header('Content-Type: ' . (isBrowser('ie') || isBrowser('opera') ? 'application/octetstream' : 'application/octet-stream'));
- header('Content-Encoding: none');
- // This time the extension should just be .sql.
- $extension = '.sql';
- }
- // This should turn off the session URL parser.
- $scripturl = '';
- // If this database is flat file and has a handler function pass it to that.
- if (!empty($smcFunc['db_get_backup']))
- {
- $smcFunc['db_get_backup']();
- exit;
- }
- // Send the proper headers to let them download this file.
- header('Content-Disposition: filename="' . $db_name . '-' . (empty($_REQUEST['struct']) ? 'data' : (empty($_REQUEST['data']) ? 'structure' : 'complete')) . '_' . strftime('%Y-%m-%d') . $extension . '"');
- header('Cache-Control: private');
- header('Connection: close');
- // This makes things simpler when using it so very very often.
- $crlf = "\r\n";
- // SQL Dump Header.
- echo
- '-- ==========================================================', $crlf,
- '--', $crlf,
- '-- Database dump of tables in `', $db_name, '`', $crlf,
- '-- ', timeformat(time(), false), $crlf,
- '--', $crlf,
- '-- ==========================================================', $crlf,
- $crlf;
- // Get all tables in the database....
- if (preg_match('~^`(.+?)`\.(.+?)$~', $db_prefix, $match) != 0)
- {
- $db = strtr($match[1], array('`' => ''));
- $dbp = str_replace('_', '\_', $match[2]);
- }
- else
- {
- $db = false;
- $dbp = $db_prefix;
- }
- // Dump each table.
- $tables = $smcFunc['db_list_tables'](false, $db_prefix . '%');
- foreach ($tables as $tableName)
- {
- if (function_exists('apache_reset_timeout'))
- @apache_reset_timeout();
- // Are we dumping the structures?
- if (isset($_REQUEST['struct']))
- {
- echo
- $crlf,
- '--', $crlf,
- '-- Table structure for table `', $tableName, '`', $crlf,
- '--', $crlf,
- $crlf,
- $smcFunc['db_table_sql']($tableName), ';', $crlf;
- }
- // How about the data?
- if (!isset($_REQUEST['data']) || substr($tableName, -10) == 'log_errors')
- continue;
- // Are there any rows in this table?
- $get_rows = $smcFunc['db_insert_sql']($tableName);
- // No rows to get - skip it.
- if (empty($get_rows))
- continue;
- echo
- $crlf,
- '--', $crlf,
- '-- Dumping data in `', $tableName, '`', $crlf,
- '--', $crlf,
- $crlf,
- $get_rows,
- '-- --------------------------------------------------------', $crlf;
- unset($get_rows);
- }
- echo
- $crlf,
- '-- Done', $crlf;
- exit;
- }
- ?>
|