From 6d961d793a35ccc1ec69389995401a71070d2a0d Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Tue, 23 Jan 2007 22:14:09 +0000
Subject: [PATCH] "retour du dump mixant toutes les contraintes (sauvegardes
 partielles des admin restreints, interruption/reprise en cours pour les
 grosses bases) les parties sont en .gz par defaut, meme si le dump final est
 non comprimee la sauvegarde des logos est desactivee par defaut, il suffit de
 mettre la globale $EXPORT_logos=true pour les sauvegarder Cela meritera une
 checkbox, comme pour la restauration/fusion"

---
 ecrire/action/export_all.php | 83 +++++++++++++++++++++++-------------
 ecrire/exec/export_all.php   | 47 ++++++++++----------
 ecrire/inc/export.php        | 26 +++++------
 3 files changed, 91 insertions(+), 65 deletions(-)

diff --git a/ecrire/action/export_all.php b/ecrire/action/export_all.php
index b2f5647b35..25cbcbb6d9 100644
--- a/ecrire/action/export_all.php
+++ b/ecrire/action/export_all.php
@@ -21,43 +21,68 @@ function action_export_all_dist()
 {
 	global $connect_toutes_rubriques ;
 	
-        $securiser_action = charger_fonction('securiser_action', 'inc');
-        $arg = $securiser_action();
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$arg = $securiser_action();
 
 	// determine upload va aussi initialiser connect_toutes_rubrique
 	$dir = determine_upload();
 	if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP))
 		$dir = _DIR_DUMP;
 
-	list($file, $nb) = split('/', $arg);
-	$file =  $dir . $file;
-	//$files = ramasse_parties($file, $file, $nb, true);
+	list($archive, $action) = split('/', $arg);
 	
-	effacer_meta("status_dump");
-	ecrire_metas();
-
-	$n = _T('taille_octets',
-		array('taille' => number_format(filesize($file), 0, ' ', ' ')));
-	$n = _T('info_sauvegarde_reussi_02',
-		array('archive' => ':<br /><b>'.joli_repertoire($file)."</b> ($n)"));
-
-	echo install_debut_html(_T('info_sauvegarde'));
-	if (!$files) {
-	  echo _T('avis_erreur_sauvegarde', array('type'=>'.', 'id_objet'=>'. .'));
-
-	} else {
-	// ne pas effrayer inutilement: il peut y avoir moins de fichiers
-	// qu'annonce' si certains etaient vides
+#	var_dump($file);
+#	var_dump($action);
+	$file =  $dir . $archive;
+#	var_dump($file);
+#die();		
+	include_spip('inc/meta');
+	if ($action=='start'){
+		// ecrire le debut du fichier
+		include_spip('inc/export');
+		ecrire_fichier($file, export_entete(),false);
+		
+		lire_metas();
+		$status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
+		$gz = $statut_dump[0];
+		// ca demarre
+		ecrire_meta("status_dump", "$gz::$archive::1::0",'non');
+		ecrire_metas();
+		
+		// retour a la case depart pour vraiment faire le dump
+		include_spip('inc/headers');
+		redirige_par_entete(_request('redirect'));
+	}
+	elseif($action=='end'){
 
-	echo "<!--", join("\n", $files), '-->';
-	echo "<p style='text-align: left'>".
-	  $n,
-	" <a href='" . _DIR_RESTREINT . "'>".
-	_T('info_sauvegarde_reussi_03')
-	. "</a> "
-	._T('info_sauvegarde_reussi_04')
-	. "</p>\n";
+		effacer_meta("status_dump");
+		ecrire_metas();
+	
+		$size = 0;
+		if (file_exists($file))
+			$size = filesize($file);
+		$n = _T('taille_octets',
+			array('taille' => number_format($size, 0, ' ', ' ')));
+		$n = _T('info_sauvegarde_reussi_02',
+			array('archive' => ':<br /><b>'.joli_repertoire($file)."</b> ($n)"));
+	
+		echo install_debut_html(_T('info_sauvegarde'));
+		if (!$size) {
+		  echo _T('avis_erreur_sauvegarde', array('type'=>'.', 'id_objet'=>'. .'));
+	
+		} else {
+			// ne pas effrayer inutilement: il peut y avoir moins de fichiers
+			// qu'annonce' si certains etaient vides
+		
+			echo "<p style='text-align: left'>".
+			  $n,
+			" <a href='" . _DIR_RESTREINT . "'>".
+			_T('info_sauvegarde_reussi_03')
+			. "</a> "
+			._T('info_sauvegarde_reussi_04')
+			. "</p>\n";
+		}
+		echo install_fin_html();
 	}
-	echo install_fin_html();
 }
 ?>
\ No newline at end of file
diff --git a/ecrire/exec/export_all.php b/ecrire/exec/export_all.php
index 55048f8c63..73bba2faff 100644
--- a/ecrire/exec/export_all.php
+++ b/ecrire/exec/export_all.php
@@ -58,7 +58,9 @@ $GLOBALS['flag_ob_flush'] = function_exists('ob_flush');
 // http://doc.spip.org/@exec_export_all_dist
 function exec_export_all_dist()
 {
-	global $archive, $gz, $connect_toutes_rubriques;
+	global $connect_toutes_rubriques;
+	$gz = _request('gz');
+	$redirect = generer_url_ecrire("export_all","gz=$gz",true);
 
 	if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP))
 		$dir = _DIR_DUMP;
@@ -69,10 +71,7 @@ function exec_export_all_dist()
 		$dir = preg_replace(",^" . _DIR_RACINE .",", '', $dir);
 		redirige_par_entete(generer_url_action("test_dirs", "test_dir=$dir", true));
 	}
-	if (!$archive) $archive = export_nom_fichier_dump($dir,$gz);
 	
-	$file = $dir . $archive;
-  
 	// utiliser une version fraiche des metas (ie pas le cache)
 	include_spip('inc/meta');
 	lire_metas();
@@ -81,27 +80,28 @@ function exec_export_all_dist()
 		$start = true;
 	} else{
 		$status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
-		if (($status_dump[0]!=$gz)||($status_dump[1]!=$archive))
-			$start = true;
-		else
-			$start = ($status_dump[2]==0)&&($status_dump[3]==0);
+		$start = ($status_dump[2]==0)&&($status_dump[3]==0);
+		$gz = $status_dump[0];
+		$archive = $status_dump[1];
 	}
+	$file = $dir . $archive;
 
 	if ($start){
-		$status_dump = "$gz::$archive::1::0";
+		$archive = export_nom_fichier_dump($dir,$gz);
+		$status_dump = "$gz::$archive::0::0";
 		ecrire_meta("status_dump", "$status_dump",'non');
 		$status_dump = explode("::",$status_dump);
 		ecrire_metas();
 
 		// Au cas ou le dernier dump n'aurait pas ete acheve correctement
-
-		foreach(preg_files($file .  ".part\.[0-9]*") as $dummy)
+		foreach(preg_files($file .  ".part_[0-9]+_[0-9]+") as $dummy)
 			@unlink($dummy);
 
 		$reprise = '';
-		// creer l'en tete du fichier
-		ecrire_fichier($dir.$archive, export_entete(),false,false);
-		
+		// (provisoire) creer l'en tete du fichier
+		include_spip('inc/headers');
+		redirige_par_entete(generer_action_auteur("export_all","$archive/start",$redirect,true));
+		//ecrire_fichier($dir.$archive, export_entete(),false,false);
 	} 
 	else	
 		$reprise = " (" . $status_dump[2] . ", " . $status_dump[3] . ")";
@@ -115,15 +115,13 @@ function exec_export_all_dist()
 
 	// Pour avoir les valeurs de _DIR_IMG etc relatives a l'espace public
 	// la phase finale de reunion des fichiers en un seul est faite la-bas
-	$href = generer_action_auteur("export_all","$archive/$all",'',true);
-	
 	
 	ramasse_parties($dir.$archive, $dir.$archive);
 
 	if ($etape_actuelle > $all){ // au timeout
 		ecrire_fichier($dir.$archive, export_enpied(),false,false);
 		include_spip('inc/headers');
-		redirige_par_entete($href);
+		redirige_par_entete(generer_action_auteur("export_all","$archive/end",'',true));
 	}
 
 	echo install_debut_html(_T('info_sauvegarde') . " ($all)");
@@ -146,13 +144,16 @@ function exec_export_all_dist()
 	$timeout = 30000; // parions sur une valeur tellement courante ...
 	if ($start) $timeout = round($timeout/2);
 	// script de rechargement auto sur timeout
-	//echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".generer_url_ecrire("export_all","archive=$archive&gz=$gz",true)."\";',$timeout);</script>\n");
+	echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".$redirect."\";',$timeout);</script>\n");
 
 	echo "<div style='text-align: left'>\n";
 	$etape = 1;
 
 	// Instancier une fois pour toutes, car on va boucler un max.
-	$GLOBALS['chercher_logo'] = charger_fonction('chercher_logo', 'inc',true);
+	if (isset($GLOBALS['EXPORT_logos']) && $GLOBALS['EXPORT_logos']==true)
+		$GLOBALS['chercher_logo'] = charger_fonction('chercher_logo', 'inc',true);
+	else
+		$GLOBALS['chercher_logo'] = false;
 	foreach($tables_for_dump as $table){
 		if ($etape_actuelle <= $etape) {
 		  $r = spip_query("SELECT COUNT(*) FROM $table");
@@ -160,10 +161,8 @@ function exec_export_all_dist()
 		  $r = $r[0];
 		  echo "\n<br /><strong>",$etape, '. ', $table,"</strong> ";
 		  if (!$r) echo _T('texte_vide');
-		  else {
-		    $liens = $tables_for_link[$table];
-		    export_objets($table, $liens, $etape, $sous_etape,$dir, $archive, $gz, $r);
-		  }
+		  else
+		    export_objets($table, $etape, $sous_etape,$dir, $archive, $gz, $r);
 		  if ($GLOBALS['flag_ob_flush']) ob_flush();
 		  flush();
 		  $sous_etape = 0;
@@ -172,7 +171,7 @@ function exec_export_all_dist()
 	}
 	echo "</div>\n";
 	// si Javascript est dispo, anticiper le Time-out
-	echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"$href\";',0);</script>\n");
+	echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"$redirect\";',0);</script>\n");
 	echo install_fin_html();
 }
 
diff --git a/ecrire/inc/export.php b/ecrire/inc/export.php
index 75031cff6b..67311df955 100644
--- a/ecrire/inc/export.php
+++ b/ecrire/inc/export.php
@@ -35,7 +35,7 @@ function ramasse_parties($archive, $partfile, $files = array()){
 
 	$files_o = array();
 	if (!count($files))
-		$files = preg_files(dirname($archive)."/",basename($partfile).".part_[0-9]+_[0-9]+");
+		$files = preg_files(dirname($archive)."/",basename($partfile).".part_[0-9]+_[0-9]+[.gz]?");
 	$ok = true;
 	foreach($files as $f) {
 	  $contenu = "";
@@ -46,14 +46,11 @@ function ramasse_parties($archive, $partfile, $files = array()){
 	  unlink($f);
 	  $files_o[]=$f;
 	}
-
-	if ($fin AND $ok)
-		$ok = ecrire_fichier($archive, export_enpied(),false,false);
-
 	return $ok ? $files_o : false;
 }
 
 define('_EXPORT_TRANCHES_LIMITE', 400);
+define('_EXTENSION_PARTIES', '.gz');
 
 //
 // Exportation de table SQL au format xml
@@ -65,10 +62,10 @@ define('_EXPORT_TRANCHES_LIMITE', 400);
 // et on memorise dans le serveur qu'on va passer a la table suivante.
 
 // http://doc.spip.org/@export_objets
-function export_objets($table, $liens, $etape, $cpt, $dir, $archive, $gz, $total) {
+function export_objets($table, $etape, $cpt, $dir, $archive, $gz, $total) {
 	global $tables_principales;
 
-	$filetable = $dir . $archive . '.part_' . sprintf('%3d',$etape);
+	$filetable = $dir . $archive . '.part_' . sprintf('%03d',$etape);
 	$prim = isset($tables_principales[$table])
 	  ? $tables_principales[$table]['key']["PRIMARY KEY"]
 	  : '';
@@ -83,24 +80,29 @@ function export_objets($table, $liens, $etape, $cpt, $dir, $archive, $gz, $total
 		if ($string) { 
 			// on ecrit dans un fichier generique
 			// puis on le renomme pour avoir une operation atomique 
-			ecrire_fichier ($filetable . '.temp', $string);
+			ecrire_fichier ($temp = $filetable . '.temp' . _EXTENSION_PARTIES, $string);
 			// le fichier destination peut deja exister si on sort d'un timeout entre le rename et le ecrire_meta
-			if (file_exists($f = $filetable . sprintf('_%4d',$cpt))) @unlink($f);
-			rename($filetable . '.temp', $f);
+			if (file_exists($f = $filetable . sprintf('_%04d',$cpt) . _EXTENSION_PARTIES)) @unlink($f);
+			rename($temp, $f);
 		}
 		$cpt++;
 		$status_dump = "$gz::$archive::$etape::$cpt";
 		// on se contente d'une ecriture en base pour aller plus vite
 		// a la relecture on en profitera pour mettre le cache a jour
 		ecrire_meta("status_dump", $status_dump,'non');
-//die();
+
 		$debut = $cpt * _EXPORT_TRANCHES_LIMITE;
 		if ($debut >= $total) {break;}
 		echo " $debut";
 
 	}
 	echo " $total."; 
-	ramasse_parties($dir.$archive, $dir.$archive);
+	
+	# on prefere ne pas faire le ramassage ici de peur d'etre interrompu par le timeout au mauvais moment
+	# le ramassage aura lieu en debut de hit suivant, et ne sera normalement pas interrompu car le temps pour ramasser
+	# est plus court que le temps pour creer les parties
+	# ramasse_parties($dir.$archive, $dir.$archive);
+	
 	$status_dump = "$gz::$archive::" . ($etape+1) . "::0";
 	// on se contente d'une ecriture en base pour aller plus vite
 	// a la relecture on en profitera pour mettre le cache a jour
-- 
GitLab