diff --git a/.gitattributes b/.gitattributes index 1abba21f8eab2434bee59ac54de6583b32ecbc7b..268d1fd7953e4f7fd0b82c548063bd461bd1d57e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -394,6 +394,7 @@ ecrire/action/tourner.php -text ecrire/action/virtualiser.php -text ecrire/balise/index.php -text ecrire/base/admin_repair.php -text +ecrire/base/convert_sql_utf8.php -text ecrire/base/convert_utf8.php -text ecrire/base/delete_all.php -text ecrire/base/import_all.php -text @@ -464,6 +465,7 @@ ecrire/exec/configuration.php -text ecrire/exec/configurer.php -text ecrire/exec/controle_forum.php -text ecrire/exec/controle_petition.php -text +ecrire/exec/convert_sql_utf8.php -text ecrire/exec/convert_utf8.php -text ecrire/exec/copier_local.php -text ecrire/exec/dater.php -text diff --git a/ecrire/base/convert_sql_utf8.php b/ecrire/base/convert_sql_utf8.php new file mode 100644 index 0000000000000000000000000000000000000000..f17cbdb685061cf5f25ba17b2e56fe54952745ae --- /dev/null +++ b/ecrire/base/convert_sql_utf8.php @@ -0,0 +1,112 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2007 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined("_ECRIRE_INC_VERSION")) return; + + +// http://doc.spip.org/@base_convert_utf8_dist +function base_convert_sql_utf8_dist($titre, $reprise=false) +{ + // poser un verrou (et abandonner si l'action est en cours) + + if (!spip_get_lock('conversion_charset_sql')) { + echo minipres(_T('utf8_convert_attendez')); + exit; + } + + include_spip('inc/meta'); + ecrire_meta('convert_sql_utf8','oui','non'); + echo install_debut_html($titre); + + echo "<p>", _T('utf8_convert_timeout'), "</p><hr />\n"; + + convert_sql_utf8(); + + echo "<p><b>"._T('utf8_convert_termine')."</b></p>"; + effacer_meta('convert_sql_utf8'); + + // bouton "retour au site" + redirige_par_entete + echo "<p style='text-align: right'>", + "<a href='", generer_url_ecrire("config_lang"), "'> >> ", + _T('icone_retour'),"</a></p>", + install_fin_html(); +} + +function convert_sql_utf8(){ + include_spip('base/db_mysql'); + + $charset_spip = $GLOBALS['meta']['charset']; + $charset_supporte = false; + $utf8_supporte = false; + // verifier que mysql gere le charset courant pour effectuer les conversions + if ($c = spip_mysql_character_set($charset_spip)){ + $sql_charset = $c['charset']; + $sql_collation = $c['collation']; + $charset_supporte = true; + } + if (!$charset_supporte){ + $res = spip_query("SHOW CHARACTER SET"); + while ($row = spip_fetch_array($res)){ + if ($row['Charset']=='utf8') $utf8_supporte = true; + } + echo _L("le Charset SPIP actuel $charset_spip n'est pas supporte par votre serveur mySql<br/>"); + if ($utf8_supporte) + echo _L("Votre serveur supporte utf-8, vous devriez convertir votre site en utf-8 avant de recommencer cette operation"); + echo install_fin_html(); + exit; + } + echo _L("Charset Actuel du site SPIP : $charset_spip<br/>"); + echo _L("Conversion des champs des tables spip de type latin1 vers <b>$sql_charset</b> (collation $sql_collation) <br/>"); + // lister les collations et leur charset correspondant + $res = spip_query("SHOW COLLATION"); + $charset2collations = array(); + while ($row = spip_fetch_array($res)){ + $charset2collations[$row['Collation']] = $row['Charset']; + } + + $count = 0; + // lister les tables spip + $res = spip_query("SHOW TABLES"); + while (($row = spip_fetch_array($res,SPIP_NUM)) /*&& ($count<1)*/){ + $nom = $row[0]; + if (preg_match(',^'.$GLOBALS['table_prefix'].'_(.*)$,',$nom,$regs)){ + $count++; + $nom = $regs[1]; + echo "<hr/>$nom<br/>"; + // lister les champs de la table + $res2 = spip_query("SHOW FULL COLUMNS FROM spip_$nom"); + while ($row2 = spip_fetch_array($res2)){ + $collation = $row2['Collation']; + $champ = $row2['Field']; + if ($collation!="NULL" + && isset($charset2collations[$collation]) + && $charset2collations[$collation]=='latin1'){ + echo "Conversion de '$champ' depuis $collation (".$charset2collations[$collation]."):"; + // conversion de latin1 vers le charset reel du contenu + $type_texte= $row2['Type']; + $type_blob = "blob"; + if (strpos($type_texte,"text")!==FALSE) $type_blob = str_replace("text","blob",$type_texte); + echo spip_query("ALTER TABLE spip_$nom CHANGE $champ $champ $type_blob")." "; + echo spip_query("ALTER TABLE spip_$nom CHANGE $champ $champ $type_texte CHARACTER SET $sql_charset COLLATE $sql_collation")." "; + echo "<br/>"; + } + } + // on ne change le charset par defaut de la table que quand tous ses champs sont convertis + spip_query("ALTER TABLE spip_$nom DEFAULT CHARACTER SET $sql_charset COLLATE $sql_collation"); + } + } + ecrire_meta('charset_sql_base',$sql_charset,'non'); + ecrire_meta('charset_sql_connexion',$sql_charset,'non'); + ecrire_metas(); + spip_release_lock('conversion_charset_sql'); +} +?> \ No newline at end of file diff --git a/ecrire/exec/convert_sql_utf8.php b/ecrire/exec/convert_sql_utf8.php new file mode 100644 index 0000000000000000000000000000000000000000..f24ec910c23a9536d2757d0d5d5648a8bd2b2132 --- /dev/null +++ b/ecrire/exec/convert_sql_utf8.php @@ -0,0 +1,75 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2007 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined("_ECRIRE_INC_VERSION")) return; + +// En cas d'erreur, une page admin normale avec bouton de retour + +// http://doc.spip.org/@convert_utf8_non +function convert_utf8_non($action, $message) { + + echo minipres($action, ('<p>'.$message. "</p>\n<p style='text-align: right'><a href='" . generer_url_ecrire("config_lang"). "'> >> "._T('icone_retour')."</a>")); + exit; +} + +function exec_convert_sql_utf8_dist() { + include_spip('inc/minipres'); + include_spip('inc/meta'); + include_spip('inc/charsets'); + lire_metas(); + + $charset_spip = $GLOBALS['meta']['charset']; + // Definir le titre de la page (et le nom du fichier admin) + //$action = _T('utf8_convertir_votre_site'); + $action = _L("Conversion de la base en $charset_spip"); + + // si meta deja la, c'est une reprise apres timeout. + if ($GLOBALS['meta']['convert_sql_utf8']) { + $base = charger_fonction('convert_sql_utf8', 'base'); + $base($action, true); + } else { + $charset_supporte = false; + $utf8_supporte = false; + // verifier que mysql gere le charset courant pour effectuer les conversions + include_spip('base/db_mysql'); + if ($c = spip_mysql_character_set($charset_spip)){ + $sql_charset = $c['charset']; + $sql_collation = $c['collation']; + $charset_supporte = true; + } + if (!$charset_supporte){ + $res = spip_query("SHOW CHARACTER SET"); + while ($row = spip_fetch_array($res)){ + if ($row['Charset']=='utf8') $utf8_supporte = true; + } + echo _L("le Charset SPIP actuel $charset_spip n'est pas supporte par votre serveur mySql<br/>"); + if ($utf8_supporte) + echo _L("Votre serveur supporte utf-8, vous devriez convertir votre site en utf-8 avant de recommencer cette operation"); + echo install_fin_html(); + exit; + } + + $commentaire = ""; + //$commentaire = _T('utf8_convert_avertissement', + // array('orig' => $charset_orig,'charset' => 'utf-8')); + $commentaire .= "<p><small>" + . http_img_pack('warning.gif', _T('info_avertissement'), "style='width: 48px; height: 48px; float: right;margin: 10px;'"); + $commentaire .= _T('utf8_convert_backup', array('charset' => 'utf-8')) + ."</small>"; + $commentaire .= '<p>'._T('utf8_convert_timeout'); + $commentaire .= "<hr />\n"; + + $admin = charger_fonction('admin', 'inc'); + $admin('convert_sql_utf8', $action, $commentaire); + } +} +?> \ No newline at end of file