function exec_convert_sql_utf8_dist() { include_spip('inc/minipres'); include_spip('inc/charsets'); $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"); #volontairement non traduit (obsolete) // 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/abstract_sql'); if ($c = sql_get_charset($charset_spip)){ $sql_charset = $c['charset']; $sql_collation = $c['collation']; $charset_supporte = true; } if (!$charset_supporte) { $utf8_supporte = sql_get_charset('utf8'); $res = _L("Le charset SPIP actuel $charset_spip n'est pas supporte par votre serveur MySQL<br/>"); if ($utf8_supporte) $res .= _L("Votre serveur supporte utf-8, vous devriez convertir votre site en utf-8 avant de recommencer cette operation"); echo minipres($action, $res); } else { $commentaire = ""; //$commentaire = _T('utf8_convert_avertissement', // array('orig' => $charset_orig,'charset' => 'utf-8')); $commentaire .= "<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 .= '<br />'._T('utf8_convert_timeout'); $commentaire .= "<hr />\n"; $admin = charger_fonction('admin', 'inc'); echo $admin('convert_sql_utf8', $action, $commentaire); } } }
function exec_convert_utf8_dist() { include_spip('inc/minipres'); include_spip('inc/charsets'); // Definir le titre de la page (et le nom du fichier admin) $action = _T('utf8_convertir_votre_site'); // si meta deja la, c'est une reprise apres timeout. if ($GLOBALS['meta']['convert_utf8'] AND $GLOBALS['meta']['admin']) { $admin = charger_fonction('admin', 'inc'); echo $admin('convert_utf8', $action, '', true); } else { $charset_orig = $GLOBALS['meta']['charset']; // tester si le charset d'origine est connu de spip if (!load_charset($charset_orig)) convert_utf8_non($action, _T('utf8_convert_erreur_orig', array('charset' => "<b>".$charset_orig."</b>"))); // ne pas convertir si deja utf8 // ou si l'interface du serveur ne comprend rien else if (($charset_orig == 'utf-8')) convert_utf8_non($action, _T('utf8_convert_erreur_deja', array('charset' => $charset_orig))); else if(!sql_get_charset('utf-8')) convert_utf8_non($action, _L('Votre version du serveur SQL ne gere pas les charset')); else { $commentaire = _T('utf8_convert_avertissement', array('orig' => $charset_orig,'charset' => 'utf-8')); $commentaire .= "<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 .= '<br />'._T('utf8_convert_timeout'); $commentaire .= "<hr />\n"; $admin = charger_fonction('admin', 'inc'); echo $admin('convert_utf8', $action, $commentaire); } } }
function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db){ global $spip_version_base; // Prefix des tables : // contrairement a ce qui est dit dans le message (trop strict mais c'est // pour notre bien), on va tolerer les chiffres en plus des minuscules // S'il n'est pas defini par mes_options/inc/mutualiser, on va le creer // a partir de ce qui est envoye a l'installation if (!defined('_INSTALL_TABLE_PREFIX')) { $table_prefix = ($GLOBALS['table_prefix'] != 'spip') ? $GLOBALS['table_prefix'] : trim(preg_replace(',[^a-z0-9],','',strtolower(_request('tprefix')))); // S'il est vide on remet spip if (!$table_prefix) $table_prefix = 'spip'; } else { $table_prefix = _INSTALL_TABLE_PREFIX; } $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, 0, $login_db, $pass_db, '', $server_db); $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; $fquery = sql_serveur('query', $server_db); if ($choix_db == "new_spip") { $re = ',^[a-z_][a-z_0-9-]*$,i'; if (preg_match($re, $sel_db)) sql_create_base($sel_db, $server_db); else { $re = "Le nom de la base doit correspondre a $re"; spip_log($re); return "<!--\n$re\n-->"; } } // on rejoue la connexion apres avoir teste si il faut lui indiquer // un sql_mode install_mode_appel($server_db, false); $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, $sel_db, $login_db, $pass_db, $sel_db, $server_db); $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; // Completer le tableau decrivant la connexion $GLOBALS['connexions'][$server_db]['prefixe'] = $table_prefix; $GLOBALS['connexions'][$server_db]['db'] = $sel_db; $old = sql_showbase($table_prefix . "_meta", $server_db); if ($old) $old = sql_fetch($old, $server_db); if (!$old) { // Si possible, demander au serveur d'envoyer les textes // dans le codage std de SPIP, $charset = sql_get_charset(_DEFAULT_CHARSET, $server_db); if ($charset) { sql_set_charset($charset['charset'], $server_db); $GLOBALS['meta']['charset_sql_base'] = $charset['charset']; $GLOBALS['meta']['charset_collation_sql_base'] = $charset['collation']; $GLOBALS['meta']['charset_sql_connexion'] = $charset['charset']; $charsetbase = $charset['charset']; } else { spip_log(_DEFAULT_CHARSET . " inconnu du serveur SQL"); $charsetbase = 'standard'; } spip_log("Creation des tables. Codage $charsetbase"); creer_base($server_db); // AT LAST creer_base_types_doc($server_db); // memoriser avec quel charset on l'a creee if ($charset) { $t = array('nom' => 'charset_sql_base', 'valeur' => $charset['charset'], 'impt' => 'non'); @sql_insertq('spip_meta', $t, '', $server_db); $t['nom'] = 'charset_collation_sql_base'; $t['valeur'] = $charset['collation']; @sql_insertq('spip_meta', $t, '', $server_db); $t['nom'] = 'charset_sql_connexion'; $t['valeur'] = $charset['charset']; @sql_insertq('spip_meta', $t, '', $server_db); } $t = array('nom' => 'version_installee', 'valeur' => $spip_version_base, 'impt' => 'non'); @sql_insertq('spip_meta', $t, '', $server_db); $t['nom'] = 'nouvelle_install'; $t['valeur'] = 1; @sql_insertq('spip_meta', $t, '', $server_db); // positionner la langue par defaut du site si un cookie de lang a ete mis if (isset($_COOKIE['spip_lang_ecrire'])){ @sql_insertq('spip_meta', array('nom'=>'langue_site','valeur'=>$_COOKIE['spip_lang_ecrire']), '', $server_db); } } else { // pour recreer les tables disparues au besoin spip_log("Table des Meta deja la. Verification des autres."); creer_base($server_db); $fupdateq = sql_serveur('updateq', $server_db); $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='version_installee'", $server_db); if ($r) $r = sql_fetch($r, $server_db); $version_installee = !$r ? 0 : (double) $r['valeur']; if (!$version_installee OR ($spip_version_base < $version_installee)) { $fupdateq('spip_meta', array('valeur'=>$spip_version_base, 'impt'=>'non'), "nom='version_installee'", $server_db); spip_log("nouvelle version installee: $spip_version_base"); } // eliminer la derniere operation d'admin mal terminee // notamment la mise a jour @$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR nom='admin'", $server_db); } $ligne_rappel = install_mode_appel($server_db); $result_ok = @$fquery("SELECT COUNT(*) FROM spip_meta", $server_db); if (!$result_ok) return "<!--\nvielle = $old rappel= $ligne_rappel\n-->"; if ($chmod_db) { install_fichier_connexion(_FILE_CHMOD_TMP, "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', ". sprintf('0%3o',$chmod_db).");\n"); } if (preg_match(',(.*):(.*),', $adresse_db, $r)) list(,$adresse_db, $port) = $r; else $port = ''; // si ce fichier existe a cette etape c'est qu'il provient // d'une installation qui ne l'a pas cree correctement. // Le supprimer pour que _FILE_CONNECT_TMP prime. if (_FILE_CONNECT AND file_exists(_FILE_CONNECT)) spip_unlink(_FILE_CONNECT); install_fichier_connexion(_FILE_CONNECT_TMP, $ligne_rappel . install_connexion($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db, $table_prefix)); return ''; }
function import_init_meta($tag, $atts, $charset, $request) { $version_archive = $atts['version_archive']; $version_base = $atts['version_base']; $insert = $request['insertion'] ; $old = (!$insert && version_compare($version_base,$GLOBALS['spip_version_base'],'<') && !isset($GLOBALS['meta']['restauration_table_prefix'])); if ($old) { // creer une base avec les tables dans l'ancienne version // et changer de contexte $creer_base_anterieure = charger_fonction('create','maj/vieille_base'); $creer_base_anterieure($version_base); } if ($old OR $insert) { $init = $request['init']; spip_log("import_init_meta lance $init","import"); $init($request); } ecrire_meta('restauration_attributs_archive', serialize($atts),'non'); ecrire_meta('restauration_version_archive', $version_archive,'non'); ecrire_meta('restauration_tag_archive', $tag,'non'); // trouver le charset de la connexion sql qu'il faut utiliser pour la restauration // ou si le charset de la base est iso-xx // (on ne peut garder une connexion utf dans ce cas) // on laisse sql gerer la conversion de charset ! if (isset($GLOBALS['meta']['charset_sql_connexion']) OR (strncmp($charset,'iso-',4)==0) ){ include_spip('base/abstract_sql'); if ($sql_char = sql_get_charset($charset)){ $sql_char = $sql_char['charset']; ecrire_meta('restauration_charset_sql_connexion',$sql_char); } else { // faire la conversion de charset en php :( effacer_meta('restauration_charset_sql_connexion'); # precaution spip_log("charset de restauration inconnu de sql : $charset"); if ($insert) ecrire_meta('charset_insertion', $charset,'non'); else ecrire_meta('charset_restauration', $charset,'non'); } } $i = $insert ? ("insertion $insert") : ''; spip_log("Debut de l'importation (charset: $charset, format: $version_archive) $i"); return $version_archive; }
function convert_sql_utf8($titre){ define(_DEBUG_CONVERT, false); $charset_spip = $GLOBALS['meta']['charset']; $charset_supporte = false; $utf8_supporte = false; // verifier que mysql gere le charset courant pour effectuer les conversions if ($c = sql_get_charset($charset_spip)){ $sql_charset = $c['charset']; $sql_collation = $c['collation']; $charset_supporte = true; } if (!$charset_supporte){ $res = spip_query("SHOW CHARACTER SET"); while ($row = sql_fetch($res)){ if ($row['Charset']=='utf8') $utf8_supporte = true; } echo install_debut_html($titre); echo _L("Le charset SPIP actuel $charset_spip n'est pas supporte par votre serveur MySQL<br/>"); # non traduit car complexe & obsolete 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(); } else { 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 = sql_fetch($res)){ $charset2collations[$row['Collation']] = $row['Charset']; } $count = 0; // lister les tables spip include_spip('base/serial'); include_spip('base/auxiliaires'); $res = spip_query("SHOW TABLES"); while (($row = sql_fetch($res)) /*&& ($count<1)*/){ $nom = array_shift($row); if (preg_match(',^'.$GLOBALS['table_prefix'].'_(.*)$,',$nom,$regs)){ $count++; $nom = $regs[1]; echo "<hr /><h2>$nom</h2>"; // lister les champs de la table $res2 = spip_query("SHOW FULL COLUMNS FROM spip_$nom"); while ($row2 = sql_fetch($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); // sauf si blob expressement demande dans la description ! if (( $a = $GLOBALS['tables_principales']['spip_'.$nom]['field'][$champ] OR $a = $GLOBALS['tables_auxiliaires']['spip_'.$nom]['field'][$champ] ) AND preg_match(',blob,i', $a)) { echo "On ignore le champ blob $nom.$champ <hr />\n"; } else { $default = $row2['Default']?(" DEFAULT ".sql_quote($row2['Default'])):""; $notnull = ($row2['Null']=='YES')?"":" NOT NULL"; $q = "ALTER TABLE spip_$nom CHANGE $champ $champ $type_blob $default $notnull"; if (!_DEBUG_CONVERT) $b = spip_query($q); echo "<pre>$q</pre>$b\n"; $q = "ALTER TABLE spip_$nom CHANGE $champ $champ $type_texte CHARACTER SET $sql_charset COLLATE $sql_collation $default $notnull"; if (!_DEBUG_CONVERT) $b = spip_query($q); echo "<pre>$q</pre>\n"; } } } // on ne change le charset par defaut de la table que quand tous ses champs sont convertis $q = "ALTER TABLE spip_$nom DEFAULT CHARACTER SET $sql_charset COLLATE $sql_collation"; if (!_DEBUG_CONVERT) $b = spip_query($q); echo "<pre>$q</pre>$b\n"; } } ecrire_meta('charset_sql_base',$sql_charset,'non'); ecrire_meta('charset_sql_connexion',$sql_charset,'non'); } }