From c8b00bd774f34738de9191c4f28977e2e381b3a0 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Tue, 23 Jan 2007 18:26:14 +0000
Subject: [PATCH] backup en travaux, pas fonctionnel mais en bonne voie

---
 ecrire/action/export_all.php |  2 +-
 ecrire/exec/export_all.php   | 21 +++++---
 ecrire/inc/export.php        | 99 ++++++++++++++++++------------------
 3 files changed, 65 insertions(+), 57 deletions(-)

diff --git a/ecrire/action/export_all.php b/ecrire/action/export_all.php
index 4452004c51..b2f5647b35 100644
--- a/ecrire/action/export_all.php
+++ b/ecrire/action/export_all.php
@@ -31,7 +31,7 @@ function action_export_all_dist()
 
 	list($file, $nb) = split('/', $arg);
 	$file =  $dir . $file;
-	$files = ramasse_parties($file, $file, $nb, true);
+	//$files = ramasse_parties($file, $file, $nb, true);
 	
 	effacer_meta("status_dump");
 	ecrire_metas();
diff --git a/ecrire/exec/export_all.php b/ecrire/exec/export_all.php
index b0951360a8..55048f8c63 100644
--- a/ecrire/exec/export_all.php
+++ b/ecrire/exec/export_all.php
@@ -93,13 +93,18 @@ function exec_export_all_dist()
 		$status_dump = explode("::",$status_dump);
 		ecrire_metas();
 
-// Au cas ou le dernier dump n'aurait pas ete acheve correctement
+		// Au cas ou le dernier dump n'aurait pas ete acheve correctement
 
 		foreach(preg_files($file .  ".part\.[0-9]*") as $dummy)
 			@unlink($dummy);
 
 		$reprise = '';
-	} else	$reprise = " (" . $status_dump[2] . ", " . $status_dump[3] . ")";
+		// creer l'en tete du fichier
+		ecrire_fichier($dir.$archive, export_entete(),false,false);
+		
+	} 
+	else	
+		$reprise = " (" . $status_dump[2] . ", " . $status_dump[3] . ")";
 
 	list($tables_for_dump, $tables_for_link) = export_all_list_tables();
 
@@ -111,8 +116,12 @@ 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);
 	}
@@ -136,8 +145,8 @@ function exec_export_all_dist()
 	if (!($timeout = ini_get('max_execution_time')*1000));
 	$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");
+	// 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 "<div style='text-align: left'>\n";
 	$etape = 1;
@@ -157,15 +166,15 @@ function exec_export_all_dist()
 		  }
 		  if ($GLOBALS['flag_ob_flush']) ob_flush();
 		  flush();
-		  $etape++;
 		  $sous_etape = 0;
 		}
+	  $etape++;
 	}
 	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 install_fin_html();
-	}
+}
 
 // construction de la liste des tables pour le dump :
 // toutes les tables principales
diff --git a/ecrire/inc/export.php b/ecrire/inc/export.php
index defe85dc29..75031cff6b 100644
--- a/ecrire/inc/export.php
+++ b/ecrire/inc/export.php
@@ -31,30 +31,26 @@ function export_nom_fichier_dump($dir,$gz=true){
 // prevenir autant que possible un Time-out.
 
 // http://doc.spip.org/@ramasse_parties
-function ramasse_parties($archive, $partfile, $nb, $fin=''){
+function ramasse_parties($archive, $partfile, $files = array()){
 
-	$files = array();
+	$files_o = array();
+	if (!count($files))
+		$files = preg_files(dirname($archive)."/",basename($partfile).".part_[0-9]+_[0-9]+");
 	$ok = true;
-	if (!ecrire_fichier($archive,$fin ? export_entete() : '',false,false))
-	  $ok = false;
-	else {
-		for($cpt =1; $cpt <= $nb; $cpt++) {
-			if (file_exists($f = $partfile.".$cpt")) {
-			  $contenu = "";
-			  if (lire_fichier ($f, $contenu)) {
-			    if (!ecrire_fichier($archive,$contenu,false,false))
-			      { $ok = false; break;}
-			  }
-			  unlink($f);
-			  $files[]=$f;
-			}
-		}
+	foreach($files as $f) {
+	  $contenu = "";
+	  if (lire_fichier ($f, $contenu)) {
+	    if (!ecrire_fichier($archive,$contenu,false,false))
+	      { $ok = false; break;}
+	  }
+	  unlink($f);
+	  $files_o[]=$f;
 	}
 
 	if ($fin AND $ok)
 		$ok = ecrire_fichier($archive, export_enpied(),false,false);
 
-	return $ok ? $files : false;
+	return $ok ? $files_o : false;
 }
 
 define('_EXPORT_TRANCHES_LIMITE', 400);
@@ -72,11 +68,11 @@ define('_EXPORT_TRANCHES_LIMITE', 400);
 function export_objets($table, $liens, $etape, $cpt, $dir, $archive, $gz, $total) {
 	global $tables_principales;
 
-	$debut = $cpt * _EXPORT_TRANCHES_LIMITE;
-	$filetable = $dir . $archive . '_' . $etape . '.';
+	$filetable = $dir . $archive . '.part_' . sprintf('%3d',$etape);
 	$prim = isset($tables_principales[$table])
 	  ? $tables_principales[$table]['key']["PRIMARY KEY"]
 	  : '';
+	$debut = $cpt * _EXPORT_TRANCHES_LIMITE;
 
 	while (1){ // on ne connait pas le nb de paquets d'avance
 
@@ -85,26 +81,29 @@ function export_objets($table, $liens, $etape, $cpt, $dir, $archive, $gz, $total
 		// car les admins restreints peuvent parcourir
 		// une portion de table vide pour eux.
 		if ($string) { 
-// on ecrit dans un fichier generique
-// puis on le renomme pour avoir une operation atomique 
-			$cpt++;
-			ecrire_fichier ($filetable, $string);
-			rename($filetable,$filetable . $cpt);
+			// on ecrit dans un fichier generique
+			// puis on le renomme pour avoir une operation atomique 
+			ecrire_fichier ($filetable . '.temp', $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);
 		}
-
-		$debut += _EXPORT_TRANCHES_LIMITE;
-		if ($debut >= $total) {break;}
-		echo " $debut";
-	// on se contente d'une ecriture en base pour aller plus vite
-	// a la relecture on en profitera pour mettre le cache a jour
+		$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."; 
-	$filetable = $dir . $archive . '_' . $etape;
-	ramasse_parties($dir . $archive . ".$etape", $filetable, $cpt);
+	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
 	ecrire_meta("status_dump", $status_dump,'non');
 
 }
@@ -120,28 +119,28 @@ function build_while($debut, $table, $prim) {
 	$string = '';
 	while ($row = spip_fetch_array($result,SPIP_ASSOC)) {
 	  if ((!isset($row['impt'])) OR $row['impt']=='oui') {
-		      if (!($ok = $connect_toutes_rubriques)) {
-			if (isset($row['id_rubrique']))
-			  $ok = autoriser('publierdans','rubrique',$row['id_rubrique']);
-			elseif (isset($row['id_article']))
-			  $ok = autoriser('modifier','article',$row['id_article']);
-			else $ok = true;
+			if (!($ok = $connect_toutes_rubriques)) {
+				if (isset($row['id_rubrique']))
+				  $ok = autoriser('publierdans','rubrique',$row['id_rubrique']);
+				elseif (isset($row['id_article']))
+				  $ok = autoriser('modifier','article',$row['id_article']);
+				else $ok = true;
+			}
 			if ($ok) {
 			  $attributs = "";
-			  if ($chercher_logo) {
-				if ($logo = $chercher_logo($row[$prim], $prim, 'on'))
-				  $attributs .= ' on="' . $logo[3] . '"';
-				if ($logo = $chercher_logo($row[$prim], $prim, 'off'))
-				  $attributs .= ' off="' . $logo[3] . '"';
-			  }
-
-			  $string .= "<$table$attributs>\n";
-			  foreach ($row as $k => $v) {
-				$string .= "<$k>" . text_to_xml($row[$k]) . "</$k>\n";
+				if ($chercher_logo) {
+					if ($logo = $chercher_logo($row[$prim], $prim, 'on'))
+					  $attributs .= ' on="' . $logo[3] . '"';
+					if ($logo = $chercher_logo($row[$prim], $prim, 'off'))
+					  $attributs .= ' off="' . $logo[3] . '"';
+				}
+
+				$string .= "<$table$attributs>\n";
+				foreach ($row as $k => $v) {
+					$string .= "<$k>" . text_to_xml($row[$k]) . "</$k>\n";
 			  }
-			  $string .= "</$table>\n\n";
+				$string .= "</$table>\n\n";
 			}
-		      }
 	  }
 	}
 	spip_free_result($result);
-- 
GitLab