Valider 0a4dd8f1 rédigé par esj's avatar esj
Parcourir les fichiers

Nouvelle procédure de mise à jour.

D'une part, apparition d'un fichier {{{maj.log}}} utilisé exlusivement pour les opérations de mises à jour et sans limitation de taille, afin de disposer facilement de cette information complète à tout moment.

Ensuite, le fichier des mises à jour est à présent l'affectation d'un tableau '''maj''' (indexé par les parties entière et fractionnaire de '''spip_version''').

Chaque entrée est un tableau des opérations à faire en séquence.

Chaque opération est un tableau dont le premier est une fonction ('''sql_alter''' le plus souvent, mais aussi n'importe quelle fonction PHP) et les suivants ses arguments.

La boucle de mise à jour consiste à appliquer les fonctions des entrées strictement supérieures à '''version_installee''', et inférieures ou égales à '''spip_version'''). A chaque opération (pas seulement chaque numéro de mise à jour) une meta mémorise le point de sauvegarde, afin de pouvoir reprendre au bon endroit en cas de Time-out (autrement dit la fonction serie_alter est automatiquement appelée pour chaque mise à jour).

Un autre avantage de cette représentation est que si la mise à jour 1.N contient une erreur, découverte alors qu'on en est à la version 1.N+P, il est facile de neutraliser le code fautif pour les bases n'en ayant pas été victimes, et d'aiguiller vers un code spécifique pour les autres. Voir par exemple comment la 1.950 rattrape une telle situation.

En l'état, la mise à jour d'une base en 1.9.2 (1.926) vers la courante 1.957 produit les erreurs suivantes, dues à de mauvaises mises à jour dans la série (qui n'a pas changé en ce qui concerne la suite d'appels MySQL) pour lesquelles la facilité ci-dessus n'a pas encore été appliquée:

{{{
Oct 17 19:28:25 132.227.64.22 (pid 292) Unknown column 'maj' in 'spip_urls' - ALTER TABLE 
`spip192`.spip_urls CHANGE maj date DATETIME DEFAULT '0000-00-00 00:00:00' NOT NULL
Oct 17 19:28:25 132.227.64.22 (pid 292) Unknown column 'maj' in 'spip_urls' - ALTER TABLE 
`spip192`.spip_urls CHANGE `maj` date DATETIME DEFAULT '0000-00-00 00:00:00' NOT NULL
Oct 17 19:28:25 132.227.64.22 (pid 292) Unknown column 'id_type' in 'spip_types_documents'
 - ALTER TABLE `spip192`.spip_types_documents CHANGE `id_type` `id_type` BIGINT( 21 ) NOT 
NULL 
Oct 17 19:28:25 132.227.64.22 (pid 292) Can't DROP 'id_type'; check that column/key exists
 - ALTER TABLE `spip192`.spip_types_documents DROP `id_type`
Oct 17 19:28:25 132.227.64.22 (pid 292) Can't DROP 'extension'; check that column/key exis
ts - ALTER TABLE `spip192`.spip_types_documents DROP INDEX `extension`
}}}
parent bc99d5f9
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+19 −18
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -66,7 +66,7 @@ function maj_base($version_cible = 0) {
	}
}

// A partir des > 1.926 (i.e SPIP 1.9.2), le while ci-dessus aboutit ici.
// A partir des > 1.926 (i.e SPIP > 1.9.2), le while ci-dessus aboutit ici.
// Se relancer soi-meme pour eviter l'interruption pendant une operation SQL
// (qu'on espere pas trop longue chacune)
// evidemment en ecrivant dans la meta a quel numero on en est.
@@ -82,15 +82,15 @@ function maj_while($version_installee, $version_cible)
	$time = time();
	$n = 0;

	$chgt = $GLOBALS['maj'][$pref];
	while ($installee < $cible) {
		$installee++;
		$f = 'maj_'  . $pref . '_' .$installee;
		if (function_exists($f)) {
			$f();
			$n = time() - $time;
			spip_log("$f ($n secondes de $version_installee a $installee))");
		} else spip_log("pas de MAJ $pref" . ".$installee");
		$version = ($pref . '.' . $installee);
		if (isset($chgt[$installee])) {
			serie_alter($installee, $chgt[$installee]);
			$n = time() - $time;
			spip_log("MAJ de $version_installee a $version en $n secondes",'maj');
		} else spip_log("MAJ $version: rien pour SQL", 'maj');
		ecrire_meta('version_installee', $version,'non');
		if ($n >= _UPGRADE_TIME_OUT) {
			redirige_par_entete(generer_url_ecrire('upgrade', "reinstall=$installee", true));
@@ -98,19 +98,22 @@ function maj_while($version_installee, $version_cible)
	}
}

// Appliquer une serie de spip_query() qui risquent de partir en timeout
// cf. maj/v019.php
// Appliquer une serie de chgt qui risquent de partir en timeout
// (Alter cree une copie temporaire d'une table, c'est lourd)

// http://doc.spip.org/@serie_alter
function serie_alter($serie, $q = array()) {
	$etape = intval(@$GLOBALS['meta']['upgrade_etape_'.$serie]);
	foreach ($q as $i => $req) {
		if ($i >= $etape) {
			spip_log("serie_alter etape $i: ".$req);
			sql_alter($req);
			$f = array_shift($req);
			spip_log("maj $serie etape $i: $f ".join(',',$req),'maj');
			if (function_exists($f)) {
			  call_user_func_array($f, $req);
			  ecrire_meta('upgrade_etape_'.$serie, $i+1);
			}
		}
	}
	effacer_meta('upgrade_etape_'.$serie);
}

@@ -123,9 +126,7 @@ function convertir_un_champ_blob_en_text($table,$champ,$type){
		if (strtolower($row['Type'])!=strtolower($type)) {
			$default = $row['Default']?(" DEFAULT "._q($row['Default'])):"";
			$notnull = ($row['Null']=='YES')?"":" NOT NULL";
			$q = "ALTER TABLE $table CHANGE $champ $champ $type $default $notnull";
			spip_log($q);
			spip_query($q);
			sql_alter("TABLE $table CHANGE $champ $champ $type $default $notnull");
		}
	}
}
@@ -141,7 +142,7 @@ function upgrade_test() {
	return $result;
}

// pour versions anterieures a 1.945
// pour versions anterieures a 1.922
// http://doc.spip.org/@maj_version
function maj_version ($version, $test = true) {
	if ($test) {
@@ -150,7 +151,7 @@ function maj_version ($version, $test = true) {
		else {
			// on le fait manuellement, car ecrire_meta utilise le champs impt qui est absent sur les vieilles versions
			$GLOBALS['meta']['version_installee'] = $version;
			spip_query("UPDATE spip_meta SET valeur=" . _q($version) ."$r WHERE nom=" . _q('version_installee') );
			sql_updateq('spip_meta',  array('valeur' => $version), "nom=" . _q('version_installee') );
		}
		spip_log("mise a jour de la base en $version");
	} else {
+5 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -151,7 +151,8 @@ function pipeline($action, $val=null) {
function spip_log($message, $logname=NULL, $logdir=NULL, $logsuf=NULL) {
	static $compteur = array();
	global $nombre_de_logs, $taille_des_logs;
	if ($compteur[$logname]++ > 100 || !$nombre_de_logs || !$taille_des_logs)
	if (($logname != 'maj') AND
	    ($compteur[$logname]++ > 100 || !$nombre_de_logs || !$taille_des_logs))
		return;

	$logfile = ($logdir===NULL ? _DIR_LOG : $logdir)
@@ -187,8 +188,9 @@ function spip_log($message, $logname=NULL, $logdir=NULL, $logsuf=NULL) {
		}
	}

	// Dupliquer l'erreur SQL dans le log general
	if ($logname !== NULL)	spip_log($message);
	// Dupliquer les erreurs specifiques dans le log general
	if ($logname !== NULL)
		spip_log($logname=='maj' ? 'cf maj.log' : $message);
}

// Fonction appelee par le fichier cree dans config/ a l'instal'.
+295 −270

Fichier modifié.

La taille limite d'aperçu a été dépassée, l'affichage des modifications a donc été réduit.