Valider 13ceb9ef rédigé par esj's avatar esj
Parcourir les fichiers

Tâche #685, suite de [7991]: la fusion est à présent blindée contre une...

Tâche #685, suite de [7991]: la fusion est à présent blindée contre une reprise pour cause de TimeOut ou autre. Et la 2e passe est provoquée par un 302, c'est plus clair.
parent c9a8ef17
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+28 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -116,9 +116,36 @@ function exec_import_all_dist()
	// precaution inutile I think (esj)
	list($my_date) = spip_fetch_array(spip_query("SELECT UNIX_TIMESTAMP(maj) AS d FROM spip_meta WHERE nom='debut_restauration'"), SPIP_NUM);

	if ($my_date) echo import_tables($request, $dir);
	if ($my_date) {

		if ($request['insertion'] == 'passe2') {
			include_spip('inc/import_insere');
			$trans = translate_init($request);
		} else $trans = array();

		$res = import_tables($request, $dir, $trans);
	}

	echo $res, "</body></html>\n";

	if ($request['insertion'] == 'on') {
			$request['insertion'] = 'passe2';
			import_all_debut($request);
			redirige_par_entete('./');
	} else if ($request['insertion']) 
			spip_query("DROP TABLE spip_translate");
	  
	if ($charset = $GLOBALS['meta']['charset_restauration']) {
			ecrire_meta('charset', $charset);
			ecrire_metas();
	}

	detruit_restaurateur();
	import_all_fin();
	include_spip('inc/rubriques');
	calculer_rubriques();

	if (!$res) ecrire_acces();	// Mise a jour du fichier htpasswd
}

// http://doc.spip.org/@import_all_debut
+7 −25
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -164,8 +164,8 @@ function import_tables($request, $dir, $trans=array()) {
	// ou initialisation de la table des translations,
	// mais pas lors d'une reprise.

	include_spip('inc/import_insere');
	if ($request['insertion']=='on') {
		include_spip('inc/import_insere');
		$request['init'] = (!$my_pos) ? 'insere_1_init' : 'insere_2_init';		$request['boucle'] = 'import_insere';
	} elseif ($request['insertion']=='passe2') {
		$request['init'] = 'insere_2_init';
@@ -200,7 +200,7 @@ function import_tables($request, $dir, $trans=array()) {
			ecrire_meta('charset_restauration', $charset);
		else	ecrire_meta('charset_insertion', $charset);
		ecrire_metas();
		spip_log("Debut de l'importation ($charset $version_archive)" . ($i ? ' en mode insertion' : ''));
		spip_log("Debut de l'importation (charset: $charset, archive: $version_archive)" . ($i ? " insertion $i" : ''));
	} else {
		spip_log("Reprise de l'importation interrompue en $my_pos");
		$_fseek = ($gz) ? gzseek : fseek;
@@ -222,39 +222,21 @@ function import_tables($request, $dir, $trans=array()) {
	// au debut de la restauration
		ecrire_meta("status_restauration", "$abs_pos");
		if ($oldtable != $table) {
			spip_log("Restauration de $table");
			affiche_progression_javascript($abs_pos,$size,$table);
			if ($oldtable) spip_log("Fin de restauration de $oldtable");

			$time_javascript = time();
			$oldtable = $table;
		}
	}

	if (!$import_ok) 
		$res =  _T('avis_archive_invalide');
	else {

		affiche_progression_javascript('100 %', $size);

		if ($request['insertion'] == 'on') {

			$request['insertion'] = 'passe2';
			import_all_debut($request);
			$trans = translate_init($request);
			spip_log("import_all passe 2");
			import_tables($request, $dir, $trans);
			spip_query("DROP TABLE spip_translate");
		}
		if ($charset = $GLOBALS['meta']['charset_restauration']) {
			ecrire_meta('charset', $charset);
			ecrire_metas();
		}
		include_spip('inc/rubriques');
		calculer_rubriques();
		$res = '';
		affiche_progression_javascript('100 %', $size);
	}
	detruit_restaurateur();
	if (!$res) ecrire_acces();	// Mise a jour du fichier htpasswd
	return $res . "</body></html>\n";;

	return $res ;
}

// http://doc.spip.org/@import_affiche_javascript
+32 −25
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -87,7 +87,7 @@ function import_insere($values, $table, $desc, $request, $trans) {
	}
	// et memoriser la correspondance dans la table auxiliaire
	// si different et pas de recherche dessus plus tard
	if (($n != $values[$type_id]) OR $table != 'id_groupe') {
	if (($n != $values[$type_id]) OR $type_id == 'id_groupe') {
		if (is_array($n))
		  list($id, $titre) = $n; 
		else {$id = $n; $titre = "";}
@@ -97,8 +97,18 @@ function import_insere($values, $table, $desc, $request, $trans) {
	}
}


// Renumerotation des entites collectees
// Le tableau de correspondance est passe en reference pour que le nouveau
// numero d'une entite soit calcule une seule fois, a sa premiere occurrence.
// Si une allocation est finalement necessaire, la renumerotation
// est repercutee sur la table SQL temporaire pour qu'en cas de reprise
// sur Time-Out il n'y ait pas reallocation.
// Autrement on evite cet acces SQL, quitte a recalculer le nouveau numero
// si une autre occurrence est rencontree a la reprise. Pas dramatique.

// http://doc.spip.org/@import_translate
function import_translate($values, $table, $desc, $request, $trans) {
function import_translate($values, $table, $desc, $request, &$trans) {
	$vals = '';

	foreach ($values as $k => $v) {
@@ -107,17 +117,13 @@ function import_translate($values, $table, $desc, $request, $trans) {
		if (isset($trans[$k]) AND isset($trans[$k][$v])) {
			list($g, $titre, $ajout) = $trans[$k][$v];
			if ($g < 0) {
			  // cas du  parent a verifier en plus du titre
			  // pour l'instant il n'y a que spip_mots
				if (!($g = import_identifie_mot_si_groupe(0-$g, $titre, $trans))) {
					$g = spip_abstract_insert('spip_mots', '', '()');
				$f = 'import_identifie_parent_' . $k;
				$g = $f(0-$g, $titre, $trans, $v);
				if ($g > 0)
				  // memoriser qu'on insere
				  $trans[$k][$v][2]=1;
				else $g = (0-$g);

				}
			// Memoriser le nouveau numero pour ne pas recalculer
			// Mise a jour de spip_translate pas indispensable,
			// on evite: si vraiment une interrupt a lieu et
			// retombe dessus, elle recalculera, pas dramatique
				$trans[$k][$v][0] = $g;
			}
			$v = $g;
@@ -125,8 +131,7 @@ function import_translate($values, $table, $desc, $request, $trans) {

		$vals .= "," . _q($v);
	}
	// si le champ titre est la, c'est une equivalence avec un existant
	// pas la peine d'ecraser avec les memes valerurs
	// pas la peine d'ecraser avec les memes valeurs si rien de neuf
	$p = $desc['key']["PRIMARY KEY"];
	$v = $values[$p];
	if (!isset($trans[$p]) OR !isset($trans[$p][$v]) OR $trans[$p][$v][2])
@@ -147,17 +152,19 @@ function import_identifie_id_mot($values, $table, $desc, $request, $trans) {
}

// mot de meme titre et de meme groupe ==> identification
function import_identifie_mot_si_groupe($id_groupe, $titre, $trans)
// mot de meme titre et de meme groupe ==> identification
function import_identifie_parent_id_mot($id_groupe, $titre, $trans, $v)
{
	if (!(isset($trans['id_groupe'])
	AND isset($trans['id_groupe'][$id_groupe])))
		return false;

	$titre = _q($titre);
	if (isset($trans['id_groupe'])
	AND isset($trans['id_groupe'][$id_groupe])) {
		$new = $trans['id_groupe'][$id_groupe][0];
		$r = spip_fetch_array(spip_query("SELECT id_mot FROM spip_mots WHERE titre=$titre AND id_groupe=$new" ));
		if ($r) return  (0 - $r['id_mot']);
	}
	$r = spip_abstract_insert('spip_mots', '', '()');
	spip_query("REPLACE spip_translate (id_old, id_new, titre, type, ajout) VALUES ($v,$r,$titre,'id_mot',1)");

	$r = spip_fetch_array(spip_query("SELECT id_mot FROM spip_mots WHERE titre=" . _q($titre) . " AND id_groupe=$new" ));

	return !$r ? false  : $r['id_mot'];
}
?>