From 17f00975486d28e12a4773ebb0a2b12b1d211da4 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Mon, 30 Jan 2006 17:29:30 +0000
Subject: [PATCH] Le script de restauration n'etait pas vraiment surchargeable
 car la fonction import_all_dist se contentait de faire l'authentification
 ftp, et declenchait une redirection provoquant l'appel d'une fonction
 import_init non surchargeable dans ce seul contexte. A present, c'est a
 nouveau import_all qui est appelee et elle s'apercoit qu'elle a deja
 authentifie, donc passe a la suite.

Cette strategie fait migrer dans le script central le test (auparavant dans le script d'accueil), d'une restauration interrompue,  mais c'est plus logique.
---
 ecrire/exec_accueil.php    |  11 ----
 ecrire/exec_import_all.php |  54 ++++++++++++++-----
 ecrire/inc_import.php      | 105 +++++++++++++++++--------------------
 ecrire/index.php           |   6 +++
 4 files changed, 95 insertions(+), 81 deletions(-)

diff --git a/ecrire/exec_accueil.php b/ecrire/exec_accueil.php
index 7af4911635..802270c48e 100644
--- a/ecrire/exec_accueil.php
+++ b/ecrire/exec_accueil.php
@@ -435,17 +435,6 @@ function accueil_dist()
   etat_base_accueil();
   debut_droite();
 
-//
-// Restauration d'une archive
-//
-
-if ($meta["debut_restauration"]) {
-	@ignore_user_abort(1);
-	include_ecrire("inc_import");
-	import_init();
-	exit;
- }
-
 //
 // Articles post-dates en attente de publication
 //
diff --git a/ecrire/exec_import_all.php b/ecrire/exec_import_all.php
index b317608016..740a848b85 100644
--- a/ecrire/exec_import_all.php
+++ b/ecrire/exec_import_all.php
@@ -37,24 +37,50 @@ function verifier_version_sauvegarde ($archive) {
 		return _T('avis_probleme_archive', array('archive' => $archive));
 }
 
-function import_all_dist()
-{
+function import_all_check() {
+
 	global $archive;
+
+	// cas de l'appel apres demande de confirmation
 	if ($archive) {
-	$action = _T('info_restauration_sauvegarde', array('archive' => $archive));
-	$commentaire = verifier_version_sauvegarde ($archive);
-	}
+			$action = _T('info_restauration_sauvegarde', array('archive' => $archive));
+			$commentaire = verifier_version_sauvegarde ($archive);
+		}
 
-  debut_admin(generer_url_post_ecrire("import_all","archive=$archive"), $action, $commentaire);
+	// au tout premier appel, on ne revient pas de cette fonction
+	debut_admin(generer_url_post_ecrire("import_all","archive=$archive"), $action, $commentaire);
 
-  $archive = _DIR_SESSIONS . $archive;
+	// on est revenu: l'authentification ftp est ok
+	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: ./');
+}
+
+function import_all_dist()
+{
+	// si l'appel est explicite, passer par l'authentification ftp
+	if (!$GLOBALS['meta']["debut_restauration"])
+		import_all_check();
 
-  ecrire_meta("debut_restauration", "debut");
-  ecrire_meta("fichier_restauration", $archive);
-  ecrire_meta("status_restauration", "0");
-  ecrire_metas();
-  
-  fin_admin($action);
-  header("Location: ./");
+	// puis commencer ou continuer
+	include_ecrire('inc_import');
+	import_all_continue(array(
+'spip_auteurs',
+'spip_articles',
+'spip_breves',
+'spip_documents',
+'spip_forum',
+'spip_mots',
+'spip_groupes_mots',
+'spip_petitions',
+'spip_rubriques',
+'spip_signatures',
+'spip_types_documents',
+'spip_visites'));		
 }
 ?>
diff --git a/ecrire/inc_import.php b/ecrire/inc_import.php
index fc323391ff..73f7d13bc5 100644
--- a/ecrire/inc_import.php
+++ b/ecrire/inc_import.php
@@ -10,11 +10,9 @@
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-
-//
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-
+include_ecrire('inc_presentation');
 include_ecrire ("inc_acces");
 
 
@@ -310,7 +308,6 @@ function import_objet_0_0($f, $gz=false) {
 
 	$p = $pos + $abs_pos;
 	ecrire_meta("status_restauration", "$p");
-//	ecrire_metas();
 
 	return $import_ok = true;
 }
@@ -321,8 +318,7 @@ function import_objet($f, $gz = false) {
 
 function import_fin() {
 	// Effacer l'ancien acces admin
-	$query = "DELETE FROM spip_auteurs WHERE id_auteur=0";
-	spip_query($query);
+	spip_query("DELETE FROM spip_auteurs WHERE id_auteur=0");
 
 	if ($charset = $GLOBALS['meta']['charset_restauration'])
 		ecrire_meta('charset', $charset);
@@ -344,8 +340,7 @@ function import_abandon() {
 	ecrire_metas();
 }
 
-
-function import_all($f, $gz=false) {
+function import_tables($f, $tables, $gz=false) {
 	global $import_ok;
 	global $auth_htaccess;
 	global $connect_id_auteur;
@@ -405,30 +400,7 @@ function import_all($f, $gz=false) {
 
 	// Destruction des entrees non restaurees
 
-	$query = "DELETE FROM spip_rubriques WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
-	$query = "DELETE FROM spip_breves WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
-	$query = "DELETE FROM spip_auteurs WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
-	$query = "DELETE FROM spip_articles WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
-	$query = "DELETE FROM spip_documents WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
-	$query = "DELETE FROM spip_types_documents WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
-	$query = "DELETE FROM spip_forum WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
-	$query = "DELETE FROM spip_mots WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
-	$query = "DELETE FROM spip_groupes_mots WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
-	$query = "DELETE FROM spip_petitions WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
-	$query = "DELETE FROM spip_signatures WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
-	$query = "DELETE FROM spip_visites WHERE UNIX_TIMESTAMP(maj) < $my_date";
-	spip_query($query);
+	detruit_non_restaurees($mydate, $tables);
 
 	import_fin();
 
@@ -438,9 +410,19 @@ function import_all($f, $gz=false) {
 }
 
 
+// Destruction des entrees non restaurees
+
+function detruit_non_restaurees($mydate, $tables)
+{
+	foreach ($tables as $v) 
+	  spip_query("DELETE FROM $v WHERE UNIX_TIMESTAMP(maj) < $my_date");
+}
+
+
 function affiche_progression_javascript($abs_pos) {
 	global $affiche_progression_pourcent;
 	include_ecrire('inc_charsets');
+
 	flush();
 	echo " -->\n<script type='text/javascript'><!--\n";
 
@@ -461,49 +443,60 @@ function affiche_progression_javascript($abs_pos) {
 	flush();
 }
 
-function import_init()
+function import_all_continue($tables)
 {
-  global $meta, $flag_gz, $buf, $pos, $abs_pos;
-	$archive = $meta["fichier_restauration"];
+	global $meta, $flag_gz, $buf, $pos, $abs_pos;
+
+	@ignore_user_abort(1);
+
+	$request = unserialize($meta['request_restauration']);
+
+	$archive = _DIR_SESSIONS . $request['archive'];
+
+	debut_page(_T('titre_page_index'), "asuivre", "asuivre");
+
+	debut_gauche();
+
+	debut_droite();
+
+	if (!@is_readable($archive)) {
+		$texte_boite = _T('info_erreur_restauration');
+		debut_boite_alerte();
+		echo "<font FACE='Verdana,Arial,Sans,sans-serif' SIZE=4 color='black'><B>$texte_boite</B></font>";
+		fin_boite_alerte();
+		fin_html();
+		exit;
+	}
+
 	$my_pos = $meta["status_restauration"];
-	$ok = @is_readable($archive);
 
-	if ($ok) {
-		if (ereg("\.gz$", $archive)) {
+	if (ereg("\.gz$", $archive)) {
 			$affiche_progression_pourcent = false;
 			$taille = taille_en_octets($my_pos);
 			$gz = true;
-		}
-		else {
+	} else {
 			$affiche_progression_pourcent = filesize($archive);
 			$taille = floor(100 * $my_pos / $affiche_progression_pourcent)." %";
 			$gz = false;
 		}
-		$texte_boite = _T('info_base_restauration')."<p>
+	$texte_boite = _T('info_base_restauration')."<p>
 		<form name='progression'><center><input type='text' size=10 style='text-align:center;' name='taille' value='$taille'><br>
 		<input type='text' class='forml' name='recharge' value='"._T('info_recharger_page')."'></center></form>";
-	}
-	else {
-		$texte_boite = _T('info_erreur_restauration');
-	}
 
 	debut_boite_alerte();
 	echo "<font FACE='Verdana,Arial,Sans,sans-serif' SIZE=4 color='black'><B>$texte_boite</B></font>";
 	fin_boite_alerte();
-	fin_page("jimmac");
+	fin_page();
 	echo "</HTML><font color='white'>\n<!--";
 	@flush();
 
-	if ($ok) {
-		$_fopen = ($gz) ? gzopen : fopen;
-		$f = $_fopen($archive, "rb");
-		$pos = 0;
-		$buf = "";
-		if (!import_all($f, $gz)) import_abandon();
-	}
-	else {
-		import_fin();
-	}
+	$_fopen = ($gz) ? gzopen : fopen;
+	$f = $_fopen($archive, "rb");
+	$pos = 0;
+	$buf = "";
+	if (!import_tables($f, $tables, $gz))
+		import_abandon();
+	else	import_fin();
 }
 
 ?>
diff --git a/ecrire/index.php b/ecrire/index.php
index 5785be790a..d5836451bd 100644
--- a/ecrire/index.php
+++ b/ecrire/index.php
@@ -155,6 +155,12 @@ if (!isset($reinstall)) {
 	}
  }
 
+//
+// Controle d' interruption d'une longue restauration
+//
+if ($GLOBALS['_COOKIE']['spip_admin'] AND $GLOBALS['meta']["debut_restauration"])
+	$exec = 'import_all';
+
 $var_f = include_fonction($exec);
 $var_f();
 
-- 
GitLab