From f7476fcb2bbb00a7dba7687ca3788f550faf2dfa Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Mon, 1 Feb 2010 23:54:33 +0000
Subject: [PATCH] report de [15119] [15120] [15121]

---
 .gitattributes               |   1 +
 ecrire/action/export_all.php |  39 +-----
 ecrire/base/dump.php         | 121 ++++++++++++++++++
 ecrire/exec/admin_backup.php |  45 +++++++
 ecrire/exec/admin_tech.php   |   4 +-
 ecrire/exec/export_all.php   | 233 ++++++++++++-----------------------
 ecrire/inc/export.php        |   8 +-
 7 files changed, 251 insertions(+), 200 deletions(-)
 create mode 100644 ecrire/base/dump.php

diff --git a/.gitattributes b/.gitattributes
index 5ce029b166..d477f208b6 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -65,6 +65,7 @@ ecrire/base/connect_sql.php -text
 ecrire/base/convert_sql_utf8.php -text
 ecrire/base/convert_utf8.php -text
 ecrire/base/delete_all.php -text
+ecrire/base/dump.php -text
 ecrire/base/import_all.php -text
 ecrire/base/index.php -text
 ecrire/base/trouver_table.php -text
diff --git a/ecrire/action/export_all.php b/ecrire/action/export_all.php
index d9a5dad502..0f18ae3bc9 100644
--- a/ecrire/action/export_all.php
+++ b/ecrire/action/export_all.php
@@ -32,29 +32,7 @@ function action_export_all_dist()
 	$file = $dir . $archive;
 
 	utiliser_langue_visiteur();
-	if ($quoi =='start'){
-	// en mode partiel, commencer par les articles et les rubriques
-	// pour savoir quelles parties des autres tables sont a sauver
-		if ($rub) {
-			if ($t = array_search('spip_rubriques', $tables)) {
-				unset($tables[$t]);
-				array_unshift($tables, 'spip_rubriques');
-			}
-			if ($t = array_search('spip_articles', $tables)) {
-				unset($tables[$t]);
-				array_unshift($tables, 'spip_articles');
-			}
-		}
-		// creer l'en tete du fichier et retourner dans l'espace prive
-		ecrire_fichier($file, export_entete($version),false);
-		$v = serialize(array($gz, $archive, $rub, $tables, 1, 0));
-		ecrire_meta($meta, $v, 'non');
-		include_spip('inc/headers');
-		  // rub=$rub sert AUSSI a distinguer cette redirection
-		  // d'avec l'appel initial sinon FireFox croit malin
-		  // d'optimiser la redirection
-		redirige_url_ecrire('export_all',"rub=$rub");
-	} elseif ($quoi=='end') export_all_fin($file, $meta, $rub);
+	if ($quoi=='end') export_all_fin($file, $meta, $rub);
 }
 
 // http://doc.spip.org/@export_all_fin
@@ -131,21 +109,6 @@ function export_all_fin($file, $meta, $rub)
 	exit;
 }
 
-// http://doc.spip.org/@export_entete
-function export_entete($version_archive)
-{
-	return
-"<" . "?xml version=\"1.0\" encoding=\"".
-$GLOBALS['meta']['charset']."\"?".">\n" .
-"<SPIP 
-	version=\"" . $GLOBALS['spip_version_affichee'] . "\" 
-	version_base=\"" . $GLOBALS['spip_version_base'] . "\" 
-	version_archive=\"" . $version_archive . "\"
-	adresse_site=\"" .  $GLOBALS['meta']["adresse_site"] . "\"
-	dir_img=\"" . _DIR_IMG . "\"
-	dir_logos=\"" . _DIR_LOGOS . "\"
->\n";
-}
 
 // production de l'entete du fichier d'archive
 // http://doc.spip.org/@export_enpied
diff --git a/ecrire/base/dump.php b/ecrire/base/dump.php
new file mode 100644
index 0000000000..206cea96ea
--- /dev/null
+++ b/ecrire/base/dump.php
@@ -0,0 +1,121 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2010                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+define('_VERSION_ARCHIVE', '1.3');
+
+include_spip('base/serial');
+include_spip('base/auxiliaires');
+include_spip('public/interfaces'); // pour table_jointures
+
+// NB: Ce fichier peut ajouter des tables (old-style)
+// donc il faut l'inclure "en globals"
+if ($f = find_in_path('mes_fonctions.php')) {
+	global $dossier_squelettes;
+	@include_once ($f);
+}
+
+if (@is_readable(_CACHE_PLUGINS_FCT)){
+	// chargement optimise precompile
+	include_once(_CACHE_PLUGINS_FCT);
+}
+
+// par defaut tout est exporte sauf les tables ci-dessous
+global $EXPORT_tables_noexport;
+
+$EXPORT_tables_noexport= array(
+	'spip_caches', // plugin invalideur
+	'spip_resultats', // resultats de recherche ... c'est un cache !
+	'spip_referers',
+	'spip_referers_articles',
+	'spip_visites',
+	'spip_visites_articles',
+	'spip_versions', // le dump des fragments n'est pas robuste
+	'spip_versions_fragments' // le dump des fragments n'est pas robuste
+	);
+
+if (!$GLOBALS['connect_toutes_rubriques']){
+	$EXPORT_tables_noexport[]='spip_messages';
+	$EXPORT_tables_noexport[]='spip_auteurs_messages';
+}
+
+//var_dump($EXPORT_tables_noexport);
+$EXPORT_tables_noexport = pipeline('lister_tables_noexport',$EXPORT_tables_noexport);
+
+
+/**
+ * construction de la liste des tables pour le dump :
+ * toutes les tables principales
+ * + toutes les tables auxiliaires hors relations
+ * + les tables relations dont les deux tables liees sont dans la liste
+ *
+ * @global <type> $tables_principales
+ * @global <type> $tables_auxiliaires
+ * @global <type> $tables_jointures
+ * @param array $exclude_tables
+ * @return array
+ */
+function base_liste_table_for_dump($exclude_tables = array()){
+	$tables_for_dump = array();
+	$tables_pointees = array();
+	global $tables_principales;
+	global $tables_auxiliaires;
+	global $tables_jointures;
+
+	// on construit un index des tables de liens
+	// pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees
+	$tables_for_link = array();
+	foreach($tables_jointures as $table => $liste_relations)
+		if (is_array($liste_relations))
+		{
+			$nom = $table;
+			if (!isset($tables_auxiliaires[$nom])&&!isset($tables_principales[$nom]))
+				$nom = "spip_$table";
+			if (isset($tables_auxiliaires[$nom])||isset($tables_principales[$nom])){
+				foreach($liste_relations as $link_table){
+					if (isset($tables_auxiliaires[$link_table])/*||isset($tables_principales[$link_table])*/){
+						$tables_for_link[$link_table][] = $nom;
+					}
+					else if (isset($tables_auxiliaires["spip_$link_table"])/*||isset($tables_principales["spip_$link_table"])*/){
+						$tables_for_link["spip_$link_table"][] = $nom;
+					}
+				}
+			}
+		}
+
+	$liste_tables = array_merge(array_keys($tables_principales),array_keys($tables_auxiliaires));
+	foreach($liste_tables as $table){
+	  //		$name = preg_replace("{^spip_}","",$table);
+	  if (		!isset($tables_pointees[$table])
+	  		&&	!in_array($table,$exclude_tables)
+	  		&&	!isset($tables_for_link[$table])){
+			$tables_for_dump[] = $table;
+			$tables_pointees[$table] = 1;
+		}
+	}
+	foreach ($tables_for_link as $link_table =>$liste){
+		$connecte = true;
+		foreach($liste as $connect_table)
+			if (!in_array($connect_table,$tables_for_dump))
+				$connecte = false;
+		if ($connecte)
+			# on ajoute les liaisons en premier
+			# si une restauration est interrompue,
+			# cela se verra mieux si il manque des objets
+			# que des liens
+			array_unshift($tables_for_dump,$link_table);
+	}
+	return array($tables_for_dump, $tables_for_link);
+}
+
+?>
\ No newline at end of file
diff --git a/ecrire/exec/admin_backup.php b/ecrire/exec/admin_backup.php
index 82be6c12c7..ae7faaa7f1 100644
--- a/ecrire/exec/admin_backup.php
+++ b/ecrire/exec/admin_backup.php
@@ -13,6 +13,7 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/presentation');
+include_spip('base/dump');
 
 function exec_admin_backup_dist()
 {
@@ -101,6 +102,7 @@ function exec_admin_backup_dist()
 		  "</b>$nom<b>.xml</b></li></ul>\n"
 		  . "\n<input type='hidden' name='reinstall' value='non' />";
 
+		$res .= options_avancees_dump();
 		echo
 			generer_form_ecrire('export_all', $res, '', _T('texte_sauvegarde_base')),
 			fin_cadre_trait_couleur(true);
@@ -131,4 +133,47 @@ function nom_fichier_dump()
 	}
 	return $nom;
 }
+
+
+function options_avancees_dump(){
+	list($tables,) = base_liste_table_for_dump($GLOBALS['EXPORT_tables_noexport']);
+	$plie = _T('info_options_avancees');
+	$res = controle_tables_en_base('export', $tables);
+	$res = "<h3>"._T('install_tables_base')."</h3>"
+	 . "\n<ol style='spip'><li>\n" .
+			join("</li>\n<li>", $res) .
+			"</li></ol>\n";
+
+	$res = block_parfois_visible('export_tables', $plie, $res, '', false);
+ 	return $res;
+}
+
+
+// Fabrique la liste a cocher des tables presentes
+function controle_tables_en_base($name, $check)
+{
+	$p = '/^' . $GLOBALS['table_prefix'] . '/';
+	$res = $check;
+	foreach(sql_alltable() as $t) {
+		$t = preg_replace($p, 'spip', $t);
+		if (!in_array($t, $check)) $res[]= $t;
+	}
+	sort($res);
+
+	foreach ($res as $k => $t) {
+
+		$c = "type='checkbox'"
+		. (in_array($t, $check) ? " checked='checked'" : '')
+		. " onclick='manuel=false'";
+
+		$res[$k] = "<input $c value='$t' id='$name_$t' name='$name"
+			. "[]' />\n"
+			. $t
+			. " ("
+			.  sql_countsel($t)
+	  		. ")";
+	}
+	return $res;
+}
+
 ?>
diff --git a/ecrire/exec/admin_tech.php b/ecrire/exec/admin_tech.php
index 76b8736870..e8824e2c35 100644
--- a/ecrire/exec/admin_tech.php
+++ b/ecrire/exec/admin_tech.php
@@ -34,7 +34,7 @@ function exec_admin_tech_dist()
 
 		echo debut_droite('',true);
 
-		//
+	//
 		// Lien vers la reparation
 		//
 
@@ -131,4 +131,4 @@ function autres_bases()
 	  . fin_cadre_trait_couleur(true);
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/ecrire/exec/export_all.php b/ecrire/exec/export_all.php
index d9c3a4ede0..c908c62683 100644
--- a/ecrire/exec/export_all.php
+++ b/ecrire/exec/export_all.php
@@ -12,193 +12,114 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-define('_VERSION_ARCHIVE', '1.3');
+/**
+ * 
+ * On arrive ici depuis exec=admin_tech
+ * - le premier coup on initialise par exec_export_all_args puis export_all_start
+ * - ensuite on enchaine sur inc/export, qui remplit le dump et renvoie ici a chaque timeout
+ * - a chaque coup on relance inc/export
+ * - lorsque inc/export a fini, il retourne $arg que l'on renvoie
+ *   vers action=export_all avec un end
+ * - action=export_all clos le fichier et affiche le resume
+ * 
+ */
 
-include_spip('base/serial');
-include_spip('base/auxiliaires');
 include_spip('inc/presentation');
-include_spip('public/interfaces'); // pour table_jointures
-
-// NB: Ce fichier peut ajouter des tables (old-style)
-// donc il faut l'inclure "en globals"
-if ($f = find_in_path('mes_fonctions.php')) {
-	global $dossier_squelettes;
-	@include_once ($f); 
-}
-
-if (@is_readable(_CACHE_PLUGINS_FCT)){
-	// chargement optimise precompile
-	include_once(_CACHE_PLUGINS_FCT);
-}
-
-// par defaut tout est exporte sauf les tables ci-dessous
-
-global $EXPORT_tables_noexport;
-
-$EXPORT_tables_noexport= array(
-	'spip_caches', // plugin invalideur
-	'spip_resultats', // resultats de recherche ... c'est un cache !
-	'spip_referers',
-	'spip_referers_articles',
-	'spip_visites',
-	'spip_visites_articles',
-	'spip_versions', // le dump des fragments n'est pas robuste
-	'spip_versions_fragments' // le dump des fragments n'est pas robuste
-	);
-
-if (!$GLOBALS['connect_toutes_rubriques']){
-	$EXPORT_tables_noexport[]='spip_messages';
-	$EXPORT_tables_noexport[]='spip_auteurs_messages';
-}
-
-//var_dump($EXPORT_tables_noexport);
-$EXPORT_tables_noexport = pipeline('lister_tables_noexport',$EXPORT_tables_noexport);
-
+include_spip('base/dump');
 
 // http://doc.spip.org/@exec_export_all_dist
-function exec_export_all_dist()
-{
+function exec_export_all_dist(){
 	$rub = intval(_request('id_parent'));
 	$meta = "status_dump_"
 	  . ($rub ? ($rub .'_') : '')  
 	  . $GLOBALS['visiteur_session']['id_auteur'];
 
-	if (!isset($GLOBALS['meta'][$meta]))
-		echo exec_export_all_args($rub, _request('gz'));
-	else {
-		$export = charger_fonction('export', 'inc');
-		if (!$export($meta))
-			echo exec_export_all_args($rub, _request('gz'));
+	if (!isset($GLOBALS['meta'][$meta])){
+		// c'est un demarrage en arrivee directe depuis exec=admin_tech
+		// on initialise
+		exec_export_all_args($meta, $rub, _request('gz'));
 	}
+
+	$export = charger_fonction('export', 'inc');
+	$arg = $export($meta);
+
+	include_spip('inc/headers');
+	redirige_par_entete(generer_action_auteur("export_all",$arg,'',true, true));
+
 }
 
 // L'en tete du fichier doit etre cree a partir de l'espace public
 // Ici on construit la liste des tables pour confirmation.
 // Envoi automatique en cas d'inaction (sauf si appel incorrect $nom=NULL)
 
-function exec_export_all_args($rub, $gz)
-{
+function exec_export_all_args($meta, $rub, $gz){
+
 	$gz = $gz ? '.gz' : '';
 	$nom = $gz 
 	?  _request('znom_sauvegarde') 
 	:  _request('nom_sauvegarde');
+
 	if (!preg_match(',^[\w_][\w_.]*$,', $nom)) $nom = 'dump';
 	$archive = $nom . '.xml' . $gz;
-	list($tables,) = export_all_list_tables();
-	$clic =  _T('bouton_valider');
-	$plie = _T('install_tables_base');
-	$res = controle_tables_en_base('export', $tables, $rub);
-	$res = "\n<ol style='text-align:left'><li>\n" .
-			join("</li>\n<li>", $res) .
-			"</li></ol>\n";
-
-	$res = block_parfois_visible('export_tables', $plie, $res, '', false)
-	. "<div style='text-align: center;'><input type='submit' value='"
-	. $clic
-	. "' /></div>";
-
-  	$arg = "start,$gz,$archive,$rub," .  _VERSION_ARCHIVE;
-	$id = 'form_export';
-	$att = " method='post' id='$id'";
-	$timeout = 'if (manuel) document.getElementById(manuel).submit()';
-	$corps = (($nom !== NULL)
-	? http_script("manuel= '$id'; window.setTimeout('$timeout', 60000);")
-	: '')
-	. generer_action_auteur('export_all', $arg, '', $res,  $att, true);
-	include_spip('inc/presentation');
-	$r = envoi_link('spip', true);
-	$r =  f_jQuery($r);
-	include_spip('inc/minipres');
-	$res = minipres(_T('info_sauvegarde'), $corps);
-	return str_replace('</head>', $r . '</head>', $res);
-}
 
-// construction de la liste des tables pour le dump :
-// toutes les tables principales
-// + toutes les tables auxiliaires hors relations
-// + les tables relations dont les deux tables liees sont dans la liste
+	// si pas de tables listees en post, utiliser la liste par defaut
+	if (!$tables = _request('export'))
+		list($tables,) = base_liste_table_for_dump($GLOBALS['EXPORT_tables_noexport']);
 
-// http://doc.spip.org/@export_all_list_tables
-function export_all_list_tables()
-{
-	$tables_for_dump = array();
-	$tables_pointees = array();
-	global $EXPORT_tables_noexport;
-	global $tables_principales;
-	global $tables_auxiliaires;
-	global $tables_jointures;
-
-// on construit un index des tables de liens
-// pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees
-	$tables_for_link = array();
-	foreach($tables_jointures as $table => $liste_relations)
-		if (is_array($liste_relations))
-		{
-			$nom = $table;
-			if (!isset($tables_auxiliaires[$nom])&&!isset($tables_principales[$nom]))
-				$nom = "spip_$table";
-			if (isset($tables_auxiliaires[$nom])||isset($tables_principales[$nom])){
-				foreach($liste_relations as $link_table){
-					if (isset($tables_auxiliaires[$link_table])/*||isset($tables_principales[$link_table])*/){
-						$tables_for_link[$link_table][] = $nom;
-					}
-					else if (isset($tables_auxiliaires["spip_$link_table"])/*||isset($tables_principales["spip_$link_table"])*/){
-						$tables_for_link["spip_$link_table"][] = $nom;
-					}
-				}
-			}
-		}
+	export_all_start($meta, $gz, $archive, $rub, _VERSION_ARCHIVE, $tables);
 	
-	$liste_tables = array_merge(array_keys($tables_principales),array_keys($tables_auxiliaires));
-	foreach($liste_tables as $table){
-	  //		$name = preg_replace("{^spip_}","",$table);
-	  if (		!isset($tables_pointees[$table]) 
-	  		&&	!in_array($table,$EXPORT_tables_noexport) 
-	  		&&	!isset($tables_for_link[$table])){
-			$tables_for_dump[] = $table;
-			$tables_pointees[$table] = 1;
-		}
-	}
-	foreach ($tables_for_link as $link_table =>$liste){
-		$connecte = true;
-		foreach($liste as $connect_table)
-			if (!in_array($connect_table,$tables_for_dump))
-				$connecte = false;
-		if ($connecte)
-			# on ajoute les liaisons en premier
-			# si une restauration est interrompue,
-			# cela se verra mieux si il manque des objets
-			# que des liens
-			array_unshift($tables_for_dump,$link_table);
-	}
-	return array($tables_for_dump, $tables_for_link);
 }
 
-// Fabrique la liste a cocher des tables presentes
 
-function controle_tables_en_base($name, $check, $rub)
-{
-	$p = '/^' . $GLOBALS['table_prefix'] . '/';
-	$res = $check;
-	foreach(sql_alltable() as $t) {
-		$t = preg_replace($p, 'spip', $t);
-		if (!in_array($t, $check)) $res[]= $t;
-	}
+function export_all_start($meta, $gz, $archive, $rub, $version, $tables){
 
-	$rub = $rub ? " <= "  : '';
-	foreach ($res as $k => $t) {
+	// determine upload va aussi initialiser l'index "restreint"
+	$maindir = determine_upload();
+	if (!$GLOBALS['visiteur_session']['restreint'])
+		$maindir = _DIR_DUMP;
+	$dir = sous_repertoire($maindir, $meta);
+	$file = $dir . $archive;
 
-		$c = "type='checkbox'"
-		. (in_array($t, $check) ? " checked='checked'" : '')
-		. " onclick='manuel=false'";
+	utiliser_langue_visiteur();
 
-		$res[$k] = "<input $c value='$t' id='$name_$t' name='$name"
-			. "[]' />\n"
-			. $t
-			. " ($rub"
-			.  sql_countsel($t)
-	  		. ")";
+	// en mode partiel, commencer par les articles et les rubriques
+	// pour savoir quelles parties des autres tables sont a sauver
+	if ($rub) {
+		if ($t = array_search('spip_rubriques', $tables)) {
+			unset($tables[$t]);
+			array_unshift($tables, 'spip_rubriques');
+		}
+		if ($t = array_search('spip_articles', $tables)) {
+			unset($tables[$t]);
+			array_unshift($tables, 'spip_articles');
+		}
 	}
-	return $res;
+	// creer l'en tete du fichier et retourner dans l'espace prive
+	ecrire_fichier($file, export_entete($version),false);
+	$v = serialize(array($gz, $archive, $rub, $tables, 1, 0));
+	ecrire_meta($meta, $v, 'non');
+	include_spip('inc/headers');
+		// rub=$rub sert AUSSI a distinguer cette redirection
+		// d'avec l'appel initial sinon FireFox croit malin
+		// d'optimiser la redirection
+	redirige_url_ecrire('export_all',"rub=$rub");
+
+
+}
+
+// http://doc.spip.org/@export_entete
+function export_entete($version_archive)
+{
+	return
+"<" . "?xml version=\"1.0\" encoding=\"".
+$GLOBALS['meta']['charset']."\"?".">\n" .
+"<SPIP
+	version=\"" . $GLOBALS['spip_version_affichee'] . "\"
+	version_base=\"" . $GLOBALS['spip_version_base'] . "\"
+	version_archive=\"" . $version_archive . "\"
+	adresse_site=\"" .  $GLOBALS['meta']["adresse_site"] . "\"
+	dir_img=\"" . _DIR_IMG . "\"
+	dir_logos=\"" . _DIR_LOGOS . "\"
+>\n";
 }
 ?>
diff --git a/ecrire/inc/export.php b/ecrire/inc/export.php
index 0feaf4e17e..a21110e1cb 100644
--- a/ecrire/inc/export.php
+++ b/ecrire/inc/export.php
@@ -21,7 +21,8 @@ function inc_export_dist($meta)
 	if (!isset($GLOBALS['meta'][$meta])) {
 		include_spip('inc/minipres');
 		echo minipres();
-	} else {
+	}
+	else {
 		$start = false;
 		list($gz, $archive, $rub, $tables_for_dump, $etape_actuelle, $sous_etape) = 
 			unserialize($GLOBALS['meta'][$meta]);
@@ -60,8 +61,7 @@ function inc_export_dist($meta)
 		}
 		$all = count($tables_for_dump);
 		if ($etape_actuelle > $all OR !$all){
-			include_spip('inc/headers');
-			redirige_par_entete(generer_action_auteur("export_all","end,$gz,$archive,$rub",'',true, true));
+			return "end,$gz,$archive,$rub"; // c'est fini !
 		}
 
 		include_spip('inc/minipres');
@@ -297,7 +297,7 @@ function export_select($row, $les_rubriques, $les_meres) {
 	if (isset($row['impt']) AND $row['impt'] !='oui') return false;
 	if (!$les_rubriques) return true;
 
-	// numero de rubrique non determinant pour les forums (0 à 99%)
+	// numero de rubrique non determinant pour les forums (0 � 99%)
 	if (isset($row['id_rubrique']) AND $row['id_rubrique']) {
 		if (in_array($row['id_rubrique'], $les_rubriques)) {
 			if (isset($row['id_article']))
-- 
GitLab