True, 'nonavbar' => True, 'currentapp' => 'home', 'noapi' => True ); include('./inc/functions.inc.php'); // Authorize the user to use setup app and load the database // Does not return unless user is authorized if (!$GLOBALS['phpgw_setup']->auth('Config') || @$_POST['cancel']) { Header('Location: index.php'); exit; } $GLOBALS['phpgw_setup']->loaddb(); $GLOBALS['phpgw_setup']->translation->setup_translation_sql(); $translation = &$GLOBALS['phpgw_setup']->translation->sql; $translation->translation(True); // to get the mbstring warnings $tpl_root = $GLOBALS['phpgw_setup']->html->setup_tpl_dir('setup'); $setup_tpl = CreateObject('phpgwapi.Template',$tpl_root); $setup_tpl->set_file(array( 'T_head' => 'head.tpl', 'T_footer' => 'footer.tpl', 'T_system_charset' => 'system_charset.tpl', )); $stage_title = lang('Change system-charset'); $stage_desc = lang('This program will convert your database to a new system-charset.'); if ($diagnostics || !@$_POST['convert']) { $GLOBALS['phpgw_setup']->html->show_header($stage_title,False,'config',$GLOBALS['phpgw_setup']['ConfigDomain'] . '(' . $phpgw_domain[$GLOBALS['phpgw_setup']['ConfigDomain']]['db_type'] . ')'); } if (@$_POST['convert']) { if (empty($_POST['current_charset'])) { $errors[] = lang('You need to select your current charset!'); $GLOBALS['phpgw_setup']->html->show_header($stage_title,False,'config',$GLOBALS['phpgw_setup']['ConfigDomain'] . '(' . $phpgw_domain[$GLOBALS['phpgw_setup']['ConfigDomain']]['db_type'] . ')'); } else { convert_db($_POST['current_charset'],$_POST['new_charset'],$diagnostics); if (!$diagnostics) { Header('Location: index.php'); } echo '

'.lang("Database successfully converted from '%1' to '%2'",$_POST[current_charset],$_POST[new_charset])."

\n"; echo '

'.lang('Click here to return to setup.')."

\n"; exit; } } function convert_db($from,$to,$diagnostics=1) { if ($diagnostics) echo "

Converting database from '$from' to '$to'

\n"; @set_time_limit(0); // this might take a while $db2 = $GLOBALS['phpgw_setup']->db; $setup_info = $GLOBALS['phpgw_setup']->detection->get_versions(); $setup_info = $GLOBALS['phpgw_setup']->detection->get_db_versions($setup_info); // Visit each app/setup dir, look for a phpgw_lang file foreach($setup_info as $app => $data) { if ($diagnostics) echo "

$app: "; if (!isset($data['tables']) || !count($data['tables']) || !$GLOBALS['phpgw_setup']->app_registered($app) || !($table_definitions = $db2->get_table_definitions($app))) { if ($diagnostics) echo "skipping (no tables or not installed)

\n"; continue; } foreach($table_definitions as $table => $definition) { if ($diagnostics) { echo "
start converting table '$table' ... "; } $db2->set_column_definitions($definitions['fd']); $updates = 0; $GLOBALS['phpgw_setup']->db->query("SELECT * FROM $table",__LINE__,__FILE__); while($columns = $GLOBALS['phpgw_setup']->db->row(True)) { $update = array(); foreach($columns as $name => $data) { switch($definition['fd'][$name]['type']) { case 'char': case 'varchar': case 'text': case 'longtext': $converted = $GLOBALS['translation']->convert($data,$from,$to); if ($converted != $data) { $update[$name] = $converted; } break; } } if (count($update)) { if (count($definition['pk'])) { $db2->query($query="UPDATE $table SET ".$db2->column_data_implode(',',$update)." WHERE ".$db2->column_data_implode(' AND ',$columns,True,$definition['pk']),__LINE__,__FILE__); } else { // if we have no primary key, we need to delete and re-write the row $db2->query($query="DELETE FROM $table WHERE ".$db2->column_data_implode(' AND ',$columns),__LINE__,__FILE__); if ($diagnostics > 1) echo "   $query
\n"; $db2->query($query="INSERT INTO $table (".implode(',',array_keys($columns)).") VALUES (".$db2->column_data_implode(',',array_merge($columns,$update),False).")",__LINE__,__FILE__); } if ($diagnostics > 1) echo "   $query

\n"; ++$updates; } } if ($diagnostics) { $GLOBALS['phpgw_setup']->db->query("SELECT count(*) FROM $table",__LINE__,__FILE__); $GLOBALS['phpgw_setup']->db->next_record(); $total = $GLOBALS['phpgw_setup']->db->f(0); echo " done, $updates/$total rows updated"; } } } @$GLOBALS['phpgw_setup']->db->query("DELETE FROM phpgw_config WHERE config_app='phpgwapi' AND config_name='system_charset'",__LINE__,__FILE__); $GLOBALS['phpgw_setup']->db->query("INSERT INTO phpgw_config (config_app,config_name,config_value) VALUES ('phpgwapi','system_charset','$to')",__LINE__,__FILE__); } $setup_tpl->set_var('stage_title',$stage_title); $setup_tpl->set_var('stage_desc',$stage_desc); $setup_tpl->set_var('error_msg',is_array($errors) ? implode('
',$errors) : ' '); $setup_tpl->set_var('lang_convert',lang('Convert')); $setup_tpl->set_var('lang_cancel',lang('Cancel')); $setup_tpl->set_var('lang_current',lang('Current system-charset')); $setup_tpl->set_var('lang_convert_to',lang('Charset to convert to')); $setup_tpl->set_var('lang_warning','Warning: This feature is still experimental. DO NOT USE IT ON A PRODUCTION SYSTEM.
Hopefully you know what you do ;-)'); $installed_charsets = $translation->get_installed_charsets(); if ($translation->system_charset || count($installed_charsets) == 1) { reset($installed_charsets); list($current_charset) = each($installed_charsets); if ($translation->system_charset) { $current_charset = $translation->system_charset; } $setup_tpl->set_var('current_charset',"$current_charset". "\n"); } else { $options = '\n"; foreach($installed_charsets as $charset => $description) { $options .= "\n"; } $setup_tpl->set_var('current_charset',"\n"); } if ($translation->system_charset == 'utf-8' || count($installed_charsets) == 1) { reset($installed_charsets); list($other_charset) = each($installed_charsets); if (!$translation->system_charset || $other_charset == $translation->system_charset) { $other_charset = 'utf-8'; } $setup_tpl->set_var('new_charset',"$other_charset\n"); } else { if ($translation->system_charset != 'utf-8') { $options = '\n"; } foreach($installed_charsets as $charset => $description) { if ($charset != $translation->system_charset) { $options .= "\n"; } } $setup_tpl->set_var('new_charset',"\n"); } $setup_tpl->pparse('out','T_system_charset'); $GLOBALS['phpgw_setup']->html->show_footer(); ?>