%PDF- %PDF-
Direktori : /home/dordingu/www/taflan/old/stk/tools/support/ |
Current File : /home/dordingu/www/taflan/old/stk/tools/support/mysql_upgrader.php |
<?php /** * * @package Support Toolkit - MySQL Upgrader * @copyright (c) 2009 phpBB Group * @license http://opensource.org/licenses/gpl-license.php GNU Public License * */ /** * @ignore */ if (!defined('IN_PHPBB')) { exit; } class mysql_upgrader { /** * The database cleaner object * @var database_cleaner */ var $_db_cleaner = null; /** * The build script * @var string */ var $_upgrader = ''; /** * Do we have a datafile for this version? */ function tool_active() { // Only available for MySQL DBMS global $db; if (!in_array($db->sql_layer, array('mysql', 'mysql4', 'mysqli'))) { return 'TOOL_MYSQL_ONLY'; } // Load the database cleaner here, we piggy back on the database // cleaner for this tool if (!class_exists('database_cleaner')) { require STK_ROOT_PATH . 'tools/support/database_cleaner.' . PHP_EXT; } $this->_db_cleaner = new database_cleaner(); // Is the database cleaner available? return $this->_db_cleaner->tool_active(); } /** * Display Options */ function display_options() { global $cache, $error; // The user requested to download the result? if (($download = request_var('download', false)) !== false) { $this->_download_result(); } else if (($run = request_var('run', false)) !== false) { $this->_run_result(); } $cache->destroy('_stk_mysql_upgrader_result'); // Won't win a beauty contest, but it works $error[] = user_lang('MYSQL_UPGRADER_BACKUP'); return array( 'title' => 'MYSQL_UPGRADER', 'vars' => array( 'legend1' => 'MYSQL_UPGRADER', 'download' => array('lang' => 'MYSQL_UPGRADER_DOWNLOAD', 'type' => 'checkbox:mode', 'default' => true, 'explain' => 'true'), 'run' => array('lang' => 'MYSQL_UPGRADER_RUN', 'type' => 'checkbox:mode', 'explain' => 'true'), ), ); } /** * Run Tool */ function run_tool() { global $cache, $db, $dbname, $table_prefix, $template, $umil; // Setup the database cleaner $this->_db_cleaner->_setup(); // See what to do $mode = request_var('mode', 'download'); $run_result = ($mode == 'run') ? true : false; $sql = 'DESCRIBE ' . POSTS_TABLE . ' post_text'; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $mysql_indexer = $drop_index = false; if (strtolower($row['Type']) === 'mediumtext') { $mysql_indexer = true; } if (strtolower($row['Key']) === 'mul') { $drop_index = true; } foreach ($this->_db_cleaner->data->tables as $table_name => $table_data) { // Write comment about table if (!$run_result) { $this->_upgrader .= '# Table: ' . $table_name . PHP_EOL; } // Create Table statement $generator = $textimage = false; // Do we need to DROP a fulltext index before we alter the table? if ($table_name == ($table_prefix . 'posts') && $drop_index) { $this->_upgrader .= 'ALTER TABLE ' . $table_name . PHP_EOL; $this->_upgrader .= 'DROP INDEX post_text, '; $this->_upgrader .= 'DROP INDEX post_subject, '; $this->_upgrader .= 'DROP INDEX post_content;' . PHP_EOL . PHP_EOL; } $line = 'ALTER TABLE ' . $table_name . PHP_EOL; // Table specific so we don't get overlap $modded_array = array(); // Write columns one by one... foreach ($table_data['COLUMNS'] as $column_name => $column_data) { // Get type if (strpos($column_data[0], ':') !== false) { list($orig_column_type, $column_length) = explode(':', $column_data[0]); $column_type = sprintf($umil->db_tools->dbms_type_map['mysql_41'][$orig_column_type . ':'], $column_length); if (isset($umil->db_tools->dbms_type_map['mysql_40'][$orig_column_type . ':']['limit']) && isset($umil->db_tools->dbms_type_map['mysql_40'][$orig_column_type . ':']['limit'][0])) { switch ($umil->db_tools->dbms_type_map['mysql_40'][$orig_column_type . ':']['limit'][0]) { case 'mult': if (($column_length * $umil->db_tools->dbms_type_map['mysql_40'][$orig_column_type . ':']['limit'][1]) > $umil->db_tools->dbms_type_map['mysql_40'][$orig_column_type . ':']['limit'][2]) { $modded_array[$column_name] = $column_type; } break; } } $orig_column_type .= ':'; } else { $orig_column_type = $column_data[0]; $other_column_type = $umil->db_tools->dbms_type_map['mysql_40'][$column_data[0]]; if ($other_column_type == 'text' || $other_column_type == 'blob') { $modded_array[$column_name] = $column_type; } $column_type = $umil->db_tools->dbms_type_map['mysql_41'][$column_data[0]]; } // Adjust default value if db-dependant specified if (is_array($column_data[1])) { $column_data[1] = (isset($column_data[1][$dbms])) ? $column_data[1][$dbms] : $column_data[1]['default']; } $line .= "\tMODIFY {$column_name} {$column_type} "; // For hexadecimal values do not use single quotes if (!is_null($column_data[1]) && substr($column_type, -4) !== 'text' && substr($column_type, -4) !== 'blob') { $line .= (strpos($column_data[1], '0x') === 0) ? "DEFAULT {$column_data[1]} " : "DEFAULT '{$column_data[1]}' "; } $line .= 'NOT NULL'; if (isset($column_data[2])) { if ($column_data[2] == 'auto_increment') { $line .= ' auto_increment'; } else if ($column_data[2] == 'true_sort') { $line .= ' COLLATE utf8_unicode_ci'; } else if ($column_data[2] == 'no_sort') { $line .= ' COLLATE utf8_bin'; } } else if (preg_match('/(?:var)?char|(?:medium)?text/i', $column_type)) { $line .= ' COLLATE utf8_bin'; } $line .= ',' . PHP_EOL; } // Write Keys if (isset($table_data['KEYS'])) { foreach ($table_data['KEYS'] as $key_name => $key_data) { $temp = ''; if (!is_array($key_data[1])) { $key_data[1] = array($key_data[1]); } $temp .= ($key_data[0] == 'INDEX') ? "\tADD KEY" : ''; $temp .= ($key_data[0] == 'UNIQUE') ? "\tADD UNIQUE" : ''; $repair = false; foreach ($key_data[1] as $key => $col_name) { if (isset($modded_array[$col_name])) { $repair = true; } } if ($repair) { $line .= "\tDROP INDEX " . $key_name . ',' . PHP_EOL; $line .= $temp; $line .= ' ' . $key_name . ' (' . implode(', ', $key_data[1]) . '),' . PHP_EOL; } } } //$line .= "\tCONVERT TO CHARACTER SET `utf8`$newline"; $line .= "\tDEFAULT CHARSET=utf8 COLLATE=utf8_bin;" . PHP_EOL . PHP_EOL; $this->_upgrader .= $line . PHP_EOL; // Do we now need to re-add the fulltext index? ;) if ($table_name == ($table_prefix . 'posts') && $drop_index) { $this->_upgrader .= 'ALTER TABLE ' . $table_name . ' ADD FULLTEXT (post_subject), ADD FULLTEXT (post_text), ADD FULLTEXT post_content (post_subject, post_text);' . PHP_EOL; } } // Write the result also to the cache so it can be downloaded later on $cache->put('_stk_mysql_upgrader_result', $this->_upgrader); // If the user only checked "run" than we run the result set if ($run_result) { redirect(append_sid(STK_INDEX, array('c' => 'support', 't' => 'mysql_upgrader', 'run' => true))); } // Set the template var $template->assign_vars(array( 'L_MYSQL_UPGRADER_RESULT' => user_lang('MYSQL_UPGRADER_RESULT', append_sid(STK_INDEX, array('c' => 'support', 't' => 'mysql_upgrader', 'download' => true))), 'UPGRADER' => str_replace("\t", " ", nl2br($this->_upgrader)), )); // Output the result to the template page_header(user_lang('MYSQL_UPGRADER')); $template->set_filenames(array( 'body' => 'tools/mysql_upgrader.html', )); page_footer(); } /** * Download the MySQL Upgrader script * @access private * @return void */ function _download_result() { global $cache; // Read from the cache $result = $cache->get('_stk_mysql_upgrader_result'); if ($result === false) { return; } // Write the file header('Content-Type: text/x-delimtext; name="mysql_upgrader.sql"'); header('Content-disposition: attachment; filename=mysql_upgrader.sql'); print($result); // Exit garbage_collection(); exit_handler(); } /** * Directly run the script * @access private * @return void */ function _run_result() { global $cache, $umil; // Read from teh cache $this->_upgrader = $cache->get('_stk_mysql_upgrader_result'); if ($this->_upgrader === false) { return; } // Split up in seperate queries $queries = explode(';', $this->_upgrader); // The right query $step = request_var('step', 0); if (!empty($queries[$step])) { $query = trim($queries[$step]); $umil->db_tools->db->sql_query($query); meta_refresh(0, append_sid(STK_INDEX, array('c' => 'support', 't' => 'mysql_upgrader', 'run' => true, 'step' => ++$step))); trigger_error(user_lang('QUERY_FINISHED', $step, sizeof($queries))); } trigger_error('MYSQL_UPGRADER_SUCCESSFULL'); } }