From ae601d6e8701fad67b4d7f15fcaeb262ab7d8f66 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sun, 8 Jul 2007 00:01:23 +0000 Subject: [PATCH] r1569: Added improvements to convert_database_charset.php --- install/convert_database_charset.php | 86 ++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 25 deletions(-) diff --git a/install/convert_database_charset.php b/install/convert_database_charset.php index 8b5e448..272c57c 100644 --- a/install/convert_database_charset.php +++ b/install/convert_database_charset.php @@ -31,6 +31,15 @@ define('TARGET', 'utf8_general_ci'); $bugsys->input_clean('step', TYPE_UINT); +// columns to convert per table +$columnConversions = array(); + +// primary keys that are text +$primaryKeys = array(); + +// fulltext +$fulltext = array(); + // ################################################################### function PrintContinue($step) @@ -63,19 +72,49 @@ if ($bugsys->in['step'] == 0) else if ($bugsys->in['step'] == 1) { + echo '

Preserve Existing Data

'; + echo '

This converts all the table columns that are stored with a character set to a BLOB type to ensure there are no problems with the target character set.

'; + + $admin->table_start(); + $admin->table_head('Column Preservation'); + $admin->table_column_head(array('Table', 'Column')); + + // get rid of indices that are strings + $db->showerrors = false; + $db->query("ALTER TABLE " . TABLE_PREFIX . "bug DROP INDEX summary"); + $db->query("ALTER TABLE " . TABLE_PREFIX . "comment DROP INDEX comment"); + $db->query("ALTER TABLE " . TABLE_PREFIX . "language DROP INDEX languagecode"); + $db->query("ALTER TABLE " . TABLE_PREFIX . "language DROP INDEX langcode"); + $db->showerrors = true; + + $tables = $db->query("SHOW TABLES"); + while ($table = $db->fetch_array($tables, false)) + { + $columns = $db->query("SHOW FULL COLUMNS FROM $table[0]"); + while ($col = $db->fetch_array($columns)) + { + if (!is_null($col['Collation']) AND (strpos($col['Type'], 'char') !== false OR strpos($col['Type'], 'text') !== false)) + { + $columnConversions[$table[0]][$col['Field']] = $col['Type']; + if ($col['Key'] == 'PRI') + { + $db->query("ALTER TABLE $table[0] DROP PRIMARY KEY"); + $primaryKeys[$table[0]] = $col['Field']; + } + $db->query("ALTER TABLE $table[0] MODIFY $col[Field] BLOB"); + $admin->row_text($table[0], $col['Field']); + } + } + } + + $admin->table_end(); + echo '

Convert Database Character Set

'; echo '

This step changes the database\'s character set.

'; require './includes/config.php'; $db->query("ALTER DATABASE $database COLLATE " . TARGET); - - PrintContinue(2); -} - -// ################################################################### -else if ($bugsys->in['step'] == 2) -{ echo '

Convert Table Character Set

'; echo '

This converts each table\'s character set and collation.

'; @@ -91,14 +130,7 @@ else if ($bugsys->in['step'] == 2) } $admin->table_end(); - - PrintContinue(3); -} - -// ################################################################### -else if ($bugsys->in['step'] == 3) -{ echo '

Convert Table Columns

'; echo '

This converts all the table columns that are stored with a character set.

'; @@ -106,28 +138,32 @@ else if ($bugsys->in['step'] == 3) $admin->table_head('Column Conversion'); $admin->table_column_head(array('Table', 'Column')); - $tables = $db->query("SHOW TABLES"); - while ($table = $db->fetch_array($tables, false)) + foreach ($columnConversions AS $table => $columns) { - $columns = $db->query("SHOW FULL COLUMNS FROM $table[0]"); - while ($col = $db->fetch_array($columns)) + foreach ($columns AS $column => $type) { - if (!is_null($col['Collation']) AND (strpos($col['Type'], 'char') !== false OR strpos($col['Type'], 'text') !== false)) - { - $db->query("ALTER TABLE $table[0] MODIFY $col[Field] $col[Type] COLLATE " . TARGET); - $admin->row_text($table[0], $col['Field']); - } + $db->query("ALTER TABLE $table MODIFY $column $type COLLATE " . TARGET); + $admin->row_text($table, $column); } } + foreach ($primaryKeys AS $table => $field) + { + $db->query("ALTER TABLE $table ADD PRIMARY KEY ($field)"); + } + + $db->query("ALTER TABLE " . TABLE_PREFIX . "bug ADD FULLTEXT(summary)"); + $db->query("ALTER TABLE " . TABLE_PREFIX . "comment ADD FULLTEXT(comment)"); + $db->query("ALTER TABLE " . TABLE_PREFIX . "language ADD UNIQUE(langcode)"); + $admin->table_end(); - PrintContinue(4); + PrintContinue(2); } // ################################################################### -else if ($bugsys->in['step'] == 4) +else if ($bugsys->in['step'] == 2) { echo '

Conversion Complete

'; echo '

Your database has now been converted to the ' . TARGET . ' collation. Congratulations. Please check that everything is operating correctly.

'; -- 2.22.5