From f68f362757f8dc6e486cf18a35697c34acf1b6b4 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sun, 26 Nov 2006 15:24:55 +0000
Subject: [PATCH] Permettre au script de fusion de site de reprendre sur
 interruption.

---
 ecrire/exec/import_all.php | 100 ++++++++-------------------
 ecrire/inc/admin.php       |   1 -
 ecrire/inc/import.php      | 136 +++++++++++++++++--------------------
 ecrire/inc/import_1_3.php  |  18 ++---
 4 files changed, 95 insertions(+), 160 deletions(-)

diff --git a/ecrire/exec/import_all.php b/ecrire/exec/import_all.php
index 9ea881f50d..d3bfe0a869 100644
--- a/ecrire/exec/import_all.php
+++ b/ecrire/exec/import_all.php
@@ -38,34 +38,16 @@ if ($f = include_spip('mes_fonctions', false)) {
 }
 
 // http://doc.spip.org/@verifier_version_sauvegarde
-function verifier_version_sauvegarde ($archive) {
+function verifier_sauvegarde ($archive, $dir) {
 	global $spip_version;
-	global $flag_gz, $connect_toutes_rubriques;
 
-	if ($connect_toutes_rubriques) {
-		$repertoire = _DIR_DUMP;
-		if(!@file_exists($repertoire)) {
-			$repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire);
-			$repertoire = sous_repertoire(_DIR_TMP, $repertoire);
-		}
-		$dir = $repertoire;
-	} else {
-		$repertoire = _DIR_TRANSFERT;
-		if(!@file_exists($repertoire)) {
-			$repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire);
-			$repertoire = sous_repertoire(_DIR_TMP, $repertoire);
-		}
-		if(!@file_exists($repertoire.$connect_login)) {
-			$sous_rep = sous_repertoire($repertoire, $connect_login);
-		}
-		$dir = $sous_rep . '/';
-	}
-	$_fopen = ($flag_gz) ? gzopen : fopen;
-	$_fread = ($flag_gz) ? gzread : fread;
+	$g = ereg("\.gz$", $archive);
+	$_fopen = ($g) ? gzopen : fopen;
+	$_fread = ($g) ? gzread : fread;
 	$buf_len = 1024; // la version doit etre dans le premier ko
+	$g = $dir . $archive;
 
-	if (@file_exists($f = $dir . $archive)) {
-		$f = $_fopen($f, "rb");
+	if (@file_exists($g) AND $f = $_fopen($g, "rb")) {
 		$buf = $_fread($f, $buf_len);
 
 		if (ereg('<SPIP [^>]* version_base="([0-9.]+)".*version_archive="([^"]+)"', $buf, $regs)
@@ -75,7 +57,7 @@ function verifier_version_sauvegarde ($archive) {
 		else
 			return _T('avis_erreur_version_archive', array('archive' => $archive));
 	} else
-		return _T('avis_probleme_archive', array('archive' => $archive));
+		return _T('avis_probleme_archive', array('archive' => $g));
 }
 
 
@@ -93,16 +75,17 @@ function import_charge_version($version_archive)
 // http://doc.spip.org/@exec_import_all_dist
 function exec_import_all_dist()
 {
+	$dir = import_queldir();
+
 	// si l'appel est explicite, 
 	// passer par l'authentification ftp et attendre d'etre rappele
 	if (!$GLOBALS['meta']["debut_restauration"]) {
-	// cas de l'appel apres demande de confirmation
 		$archive=_request('archive');
 		$insertion=_request('insertion');
 		if (!strlen($archive)) $archive=_request('archive_perso');
 		if ($archive) {
 			$action = _T('info_restauration_sauvegarde', array('archive' => $archive));
-			$commentaire = verifier_version_sauvegarde ($archive);
+			$commentaire = verifier_sauvegarde($archive, $dir);
 		}
 
 		// au tout premier appel, on ne revient pas de debut_admin
@@ -112,16 +95,9 @@ function exec_import_all_dist()
 		// si on est revenu c'est que l'authentification ftp est ok
 		// sinon il reste le meta request_restau; a ameliorer.
 		fin_admin($action);
-		// dire qu'on commence
-		ecrire_meta("request_restauration", serialize($_REQUEST));
-		ecrire_meta("debut_restauration", "debut");
-		ecrire_meta("status_restauration", "0");
-		ecrire_metas();
-		// se rappeler pour montrer illico ce qu'on fait 
-		header('Location: ./');
-		exit();
-	}
-
+		import_all_debut($_REQUEST);
+		$request = $_REQUEST;
+	} else $request = unserialize($GLOBALS['meta']['request_restauration']);
 	// au rappel, on commence (voire on continue)
 	@ini_set("zlib.output_compression","0"); // pour permettre l'affichage au fur et a mesure
 	// utiliser une version fraiche des metas (ie pas le cache)
@@ -136,55 +112,35 @@ function exec_import_all_dist()
 	debut_gauche();
 
 	debut_droite();
-	$request = unserialize($GLOBALS['meta']['request_restauration']);
-	spip_log("import_all " . $GLOBALS['meta']['request_restauration']);
-	$dir = import_queldir();
-	$r = import_tables($request, $dir);
+	
+	// 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 ($r) {
-		spip_log("Erreur: $r");
-	}
-	else {
-		if ($request['insertion']== 'on') {
-			$request['insertion'] = 'passe2';
-			ecrire_meta("request_restauration", serialize($request));
-			ecrire_meta("debut_restauration", "debut");
-			ecrire_meta("status_restauration", "0");
-			ecrire_metas();
-			spip_log("import_all passe 2");
-			$trans = translate_init($request);
-			$r = import_tables($request, $dir, $trans);
-			if ($r) spip_log("Erreur: $r");
-			spip_query("DROP TABLE spip_translate");
-		} 
-		ecrire_acces();	// Mise a jour du fichier htpasswd
-		detruit_restaurateur();
-		if ($charset = $GLOBALS['meta']['charset_restauration']) {
-				ecrire_meta('charset', $charset);
-				ecrire_metas();
-		}
-		import_fin();
-		include_spip('inc/rubriques');
-		calculer_rubriques();
-	}
-	echo "</body></html>\n";
+	if ($my_date) echo import_tables($request, $dir);
+
+	import_all_fin();
+}
+
+function import_all_debut($request) {
+	ecrire_meta("request_restauration", serialize($request));
+	ecrire_meta("debut_restauration", "debut");
+	ecrire_meta("status_restauration", "0");
+	ecrire_metas();
 }
 
-// http://doc.spip.org/@import_fin
-function import_fin() {
+function import_all_fin() {
 
 	effacer_meta("charset_restauration");
 	effacer_meta("status_restauration");
 	effacer_meta("debut_restauration");
 	effacer_meta("date_optimisation");
 	effacer_meta('request_restauration');
-	effacer_meta('fichier_restauration');
 	effacer_meta('version_archive_restauration');
 	effacer_meta('tag_archive_restauration');
 	ecrire_metas();
 }
 
-// http://doc.spip.org/@import_queldir
+// http://doc.spip.org/@import_all_continue
 function import_queldir()
 {
 	global $connect_toutes_rubriques;
diff --git a/ecrire/inc/admin.php b/ecrire/inc/admin.php
index 67afdb4a40..9119ffe396 100644
--- a/ecrire/inc/admin.php
+++ b/ecrire/inc/admin.php
@@ -33,7 +33,6 @@ function debut_admin($script, $action, $commentaire='') {
 
 	}
 	$signal = fichier_admin($action);
-	spip_log("debut_admin $signal");
 	if (@file_exists($dir . $signal)) {
 		spip_log ("Action admin: $action");
 		return true;
diff --git a/ecrire/inc/import.php b/ecrire/inc/import.php
index e073ac5a00..9b8f1734a9 100644
--- a/ecrire/inc/import.php
+++ b/ecrire/inc/import.php
@@ -102,16 +102,11 @@ function import_debut($f, $gz=false) {
 		}
 		$b = "";
 	}
-	return false;
+	// improbable: fichier correct avant le debut_admin et plus apres
+	import_all_fin();
+	die(_T('info_erreur_restauration'));
 }
 
-//
-// $f = handle fichier
-// $gz = flag utilisation zlib
-//
-// importe un objet depuis le fichier, retourne true si ok, false si erreur ou fin de fichier
-//
-
 // on conserve ce tableau pour faire des translations
 // de table eventuelles
 $tables_trans = array(
@@ -155,91 +150,66 @@ function detruit_restaurateur()
 
 // http://doc.spip.org/@import_tables
 function import_tables($request, $dir, $trans=array()) {
-	global $import_ok, $abs_pos, $my_pos;
-	global $affiche_progression_pourcent;
+	global $import_ok, $abs_pos,  $affiche_progression_pourcent;
 	static $time_javascript;
 
-	$my_pos = $GLOBALS['meta']["status_restauration"];
-	$archive = $dir . ($request['archive'] ? $request['archive'] : $request['archive_perso']);
-	$size = @filesize($archive);
-
-	// attention : si $request['archive']=="", alors archive='data/' 
-	// le test is_readable n'est donc pas suffisant
-	if (!@is_readable($archive)||is_dir($archive) || !$size) {
-		$texte_boite = _T('info_erreur_restauration');
-		echo debut_boite_alerte();
-		echo "<font face='Verdana,Arial,Sans,sans-serif' size='4' color='black'><b>$texte_boite</b></font>";
-		echo fin_boite_alerte();
-// renvoyer True pour effacer les meta sans refaire calculer_rubriques:
-// la restauration n'a pas encore commence, on peut eviter de tout casser
-		return $texte_boite;
-	}
-
-	if (ereg("\.gz$", $archive)) {
-			$size = false;
-			$taille = taille_en_octets($my_pos);
-			$_fopen = 'gzopen';
-			$gz = true;
-	} else {
-			$taille = floor(100 * $my_pos / $size)." %";
-			$_fopen = 'fopen';
-			$gz = false;
-	}
-
-	import_affiche_javascript($taille);
-
-	if ($GLOBALS['flag_ob_flush']) ob_flush();
-	flush();
-
-	list($my_date) = spip_fetch_array(spip_query("SELECT UNIX_TIMESTAMP(maj) AS d FROM spip_meta WHERE nom='debut_restauration'"), SPIP_NUM);
+	$my_pos = (!isset($GLOBALS['meta']["status_restauration"])) ? 0 :
+		$GLOBALS['meta']["status_restauration"];
 
-	if (!$my_date) return false;
+	// au premier appel destruction des tables a restaurer
+	// ou initialisation de la table des translations,
+	// mais pas lors d'une reprise.
 
 	if ($request['insertion']=='on') {
-		$request['init'] = 'insere_1_init';
-		$request['boucle'] = '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';
 		$request['boucle'] = 'import_translate';
 	} else {
-		$request['init'] = 'import_init';
+		$request['init'] = (!$my_pos) ? 'import_init_tables' : 'import_table_choix';
 		$request['boucle'] = 'import_replace';
 	}
 
-	$f = $_fopen($archive, "rb");
-	$my_pos = (!isset($GLOBALS['meta']["status_restauration"])) ? 0 :
-		$GLOBALS['meta']["status_restauration"];
+	$archive = $dir . ($request['archive'] ? $request['archive'] : $request['archive_perso']);
+
+	if (ereg("\.gz$", $archive)) {
+			$size = false;
+			$taille = taille_en_octets($my_pos);
+			$file = gzopen($archive, 'rb');
+			$gz = true;
+	} else {
+			$size = @filesize($archive);
+			$taille = floor(100 * $my_pos / $size)." %";
+			$file = fopen($archive, 'rb');
+			$gz = false;
+	}
 
 	if ($my_pos==0) {
-// par defaut pour les anciens sites
-// il est contenu dans le xml d'import et sera reecrit dans import_debut
+//  Pour les anciennes archives, indiquer le charset par defaut:
 		ecrire_meta('charset_restauration', 'iso-8859-1'); 
-		if ($r = import_debut($f, $gz)) {
-// tag ouvrant :
-// 'SPIP' pour un dump xml spip, nom de la base source pour un dump phpmyadmin
-			$tag_archive = $r[0];
-			$version_archive = $r[1]['version_archive'];
-		}
+//  les + recentes l'ont en debut de fichier et import_debut fera ecrire_meta
+		list($tag, $r) = import_debut($file, $gz);
+// tag ouvrant du Dump:
+// 'SPIP' si fait par spip, nom de la base source si fait par  phpmyadmin
+		$version_archive = $r['version_archive'];
 		ecrire_meta('version_archive_restauration', $version_archive);
-		ecrire_meta('tag_archive_restauration', $tag_archive);
+		ecrire_meta('tag_archive_restauration', $tag);
 		ecrire_metas();
 	} else {
 		// Reprise de l'importation
 		$_fseek = ($gz) ? gzseek : fseek;
-		$_fseek($f, $my_pos);
+		$_fseek($file, $my_pos);
 		$version_archive = $GLOBALS['meta']['version_archive_restauration'];
-		$tag_archive = $GLOBALS['meta']['tag_archive_restauration'];
-		// a completer pour les insertions
-		$request['init'] = 'import_table_choix';
 	}
 
 	$fimport = import_charge_version($version_archive);
 
-	// Normalement c'est controle par import_all auparavant
-	// c'est pour se proteger des reprises avortees
-	if (!$fimport) return _T('avis_archive_incorrect');
+	import_affiche_javascript($taille);
+
+	if ($GLOBALS['flag_ob_flush']) ob_flush();
+	flush();
 
-	while ($table = $fimport($f, $request, $gz, $trans)) {
+	while ($table = $fimport($file, $request, $gz, $trans)) {
 	// Pas d'ecriture SQL car sinon le temps double.
 	// Il faut juste faire attention a bien lire_metas()
 	// au debut de la restauration
@@ -249,18 +219,36 @@ function import_tables($request, $dir, $trans=array()) {
 			affiche_progression_javascript($abs_pos,$size,$table);
 			$time_javascript = time();
 		}
-
-		$my_pos = true;
 	}
 
-	if (!$import_ok) return  _T('avis_archive_invalide');
+	if (!$import_ok) 
+		$res =  _T('avis_archive_invalide');
+	else {
+
+		affiche_progression_javascript('100 %', $size);
 
-	affiche_progression_javascript('100 %', $size);
+		if ($request['insertion'] == 'on') {
 
-	return false;
+			$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");
+		}
+		detruit_restaurateur();
+		ecrire_acces();	// Mise a jour du fichier htpasswd
+		if ($charset = $GLOBALS['meta']['charset_restauration']) {
+			ecrire_meta('charset', $charset);
+			ecrire_metas();
+		}
+		include_spip('inc/rubriques');
+		calculer_rubriques();
+		$res = '';
+	}
+	return $res . "</body></html>\n";;
 }
 
-// http://doc.spip.org/@import_affiche_javascript
 function import_affiche_javascript($taille)
 {
 	$max_time = ini_get('max_execution_time')*1000;
@@ -373,6 +361,4 @@ function import_table_choix()
 	}
 	return $tables_for_dump;
 }	
-
-
 ?>
diff --git a/ecrire/inc/import_1_3.php b/ecrire/inc/import_1_3.php
index d9c5c3fb2c..aa71bd4afa 100644
--- a/ecrire/inc/import_1_3.php
+++ b/ecrire/inc/import_1_3.php
@@ -36,15 +36,9 @@ function description_table($nom){
 	return array($nom,array());
 }
 
-// http://doc.spip.org/@import_init
-function import_init($request, $my_pos) {
-
-	// au premier appel destruction des tables a restaurer
-	return (!$my_pos) ? import_init_tables() : import_table_choix();
-}
 
 // http://doc.spip.org/@insere_2_init
-function insere_2_init($request, $my_pos) {
+function insere_2_init($request) {
 
 	// l'insertion ne porte que sur les tables principales
 	$t = array_keys($GLOBALS['tables_principales']);
@@ -57,7 +51,7 @@ function insere_2_init($request, $my_pos) {
 }
 
 // http://doc.spip.org/@insere_1_init
-function insere_1_init($request, $my_pos) {
+function insere_1_init($request) {
 
   //  preparation de la table des translations
 	$spip_translate = array(
@@ -73,11 +67,11 @@ function insere_1_init($request, $my_pos) {
 	spip_create_table('spip_translate', $spip_translate, $spip_translate_key, true);
 	// au cas ou la derniere fois ce serait terminee anormalement
 	spip_query("DELETE FROM spip_translate");
-	return insere_2_init($request, $my_pos);
+	return insere_2_init($request);
 }
 
 // http://doc.spip.org/@translate_init
-function translate_init($request, $my_pos=0) {
+function translate_init($request) {
   /* 
    construire le tableau PHP de la table spip_translate
    (on l'a mis en table pour pouvoir reprendre apres interruption
@@ -93,7 +87,7 @@ function translate_init($request, $my_pos=0) {
 
 // http://doc.spip.org/@inc_import_1_3_dist
 function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) {
-	global $import_ok, $abs_pos, $my_pos, $tables_trans;
+	global $import_ok, $abs_pos, $tables_trans;
 	static $tables = '';
 	static $phpmyadmin, $fin;
 	static $field_desc = array ();
@@ -103,7 +97,7 @@ function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) {
 
 	if (!$tables OR $trans) {
 		$init = $request['init'];
-		$tables = $init($request, $my_pos);
+		$tables = $init($request);
 		$phpmyadmin = preg_match("{^phpmyadmin::}is",
 			$GLOBALS['meta']['version_archive_restauration'])
 			? array(array('&quot;','&gt;'),array('"','>'))
-- 
GitLab