Valider f755e051 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Eviter les process concourants de restauration qui provoquaient des insert en double,

creeant des donnees en double en cas de fusion ou de table sans cle primaire (f&t)
resoud notamment #956, en placant un id de session de restauration dans les meta
que l'on renouvelle a chaque debut de session, et verifie avant chaque insert/update
parent 2e505d0f
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -109,6 +109,7 @@ function import_all_fin($request) {
	effacer_meta("date_optimisation");
	effacer_meta('version_archive_restauration');
	effacer_meta('tag_archive_restauration');
	effacer_meta('restauration_session_id');
	ecrire_metas();
	if ($request['insertion'] == 'passe2') 
		spip_query("DROP TABLE spip_translate");
+17 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -197,6 +197,16 @@ function detruit_restaurateur()
	}
}

// verifier que l'id de session restauration place dans une meta correspond toujours a la session en cours
// sinon cela signifie que la page a ete rechargee, et qu'une autre session a repris depuis le dernier abs_pos
// il faut absolument ne plus rien faire et mourir ...

function import_verifie_session() {
	$row = spip_abstract_fetsel(array('valeur'),array('spip_meta'),array("nom='restauration_session_id'"));
	if ($row['valeur']!=_RESTAURATION_SESSION_ID)
		die('la place est prise');
}

// http://doc.spip.org/@import_tables
function import_tables($request, $dir) {
	global $import_ok, $abs_pos,  $affiche_progression_pourcent;
@@ -234,6 +244,13 @@ function import_tables($request, $dir) {
			$gz = 'fread';
	}

	// creer un id de la session d'import qui sera utilise pour verifier qu'on a toujours la main
	// avant chaque insert/update
	// permet d'eviter les process concourants qui realisent le meme insert/update
	include_spip('inc/acces');
	@define('_RESTAURATION_SESSION_ID',creer_uniqid());
	ecrire_meta('restauration_session_id',_RESTAURATION_SESSION_ID,'non');
	
	if ($abs_pos==0) {
		list($tag, $atts, $charset) = import_debut($file, $gz);
	// improbable: fichier correct avant debut_admin et plus apres
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -69,6 +69,7 @@ function inc_import_1_3_dist($lecteur, $request, $gz='fread', $atts=array()) {

	if ($values === false) return  ($import_ok = false);

	import_verifie_session(); // verifier qu'on a toujours la main pour faire des insertions en base
	if ($values) $boucle($values, $new, $desc, $request, $atts);

	return $import_ok = $new;