Пример #1
0
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);
		}
	}
}
Пример #2
0
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);
		}
	}
}
Пример #3
0
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 '';
}
Пример #4
0
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;
}
Пример #5
0
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');
	}
}