From b179c775f3aae35ac6f28e10c26291b6ff133c72 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Tue, 19 Dec 2006 22:46:52 +0000
Subject: [PATCH] "sauvegarder/restaurer les meta qui ne sont pas liees au
 serveur mais au contenu les metas sont par defaut sauvegardable, sauf celle
 dont le champ impt='non' "

---
 ecrire/base/upgrade.php    | 10 +++++
 ecrire/exec/import_all.php |  9 ++---
 ecrire/inc/import.php      | 38 +++++++++++++++----
 ecrire/inc/import_1_3.php  | 76 ++++++++++++++------------------------
 4 files changed, 72 insertions(+), 61 deletions(-)

diff --git a/ecrire/base/upgrade.php b/ecrire/base/upgrade.php
index 905a540860..d78714cea6 100644
--- a/ecrire/base/upgrade.php
+++ b/ecrire/base/upgrade.php
@@ -1230,6 +1230,16 @@ function maj_base($version_cible = 0) {
 			spip_query("UPDATE spip_meta SET impt='non' WHERE nom="._q($nom));
 		maj_version('1.922');
 	}
+	if (upgrade_vers(1.923, $version_installee, $version_cible)) {
+		if (isset($GLOBALS['meta']['IMPORT_tables_noimport'])){
+			$IMPORT_tables_noimport = unserialize($GLOBALS['meta']['IMPORT_tables_noimport']);
+			foreach ($IMPORT_tables_noimport as $key=>$table)
+				if ($table=='spip_meta') unset($IMPORT_tables_noimport[$key]);
+			include_spip('inc/meta');
+			ecrire_meta('IMPORT_tables_noimport',serialize($IMPORT_tables_noimport),'non');
+		}
+		maj_version('1.923');
+	}
 }
 
 ?>
diff --git a/ecrire/exec/import_all.php b/ecrire/exec/import_all.php
index 6519152ee3..451f30c8bd 100644
--- a/ecrire/exec/import_all.php
+++ b/ecrire/exec/import_all.php
@@ -25,8 +25,7 @@ else{
 	include_spip('inc/meta');
 	$IMPORT_tables_noimport[]='spip_ajax_fonc';
 	$IMPORT_tables_noimport[]='spip_caches';
-	$IMPORT_tables_noimport[]='spip_meta';
-	ecrire_meta('IMPORT_tables_noimport',serialize($IMPORT_tables_noimport));
+	ecrire_meta('IMPORT_tables_noimport',serialize($IMPORT_tables_noimport),'non');
 	ecrire_metas();
 }
 
@@ -155,9 +154,9 @@ function import_all_milieu($request, $dir)
 
 // http://doc.spip.org/@import_all_debut
 function import_all_debut($request) {
-	ecrire_meta("request_restauration", serialize($request));
-	ecrire_meta("debut_restauration", "debut");
-	ecrire_meta("status_restauration", "0");
+	ecrire_meta("request_restauration", serialize($request),'non');
+	ecrire_meta("debut_restauration", "debut",'non');
+	ecrire_meta("status_restauration", "0",'non');
 	ecrire_metas();
 }
 
diff --git a/ecrire/inc/import.php b/ecrire/inc/import.php
index 3feb4c2295..aa2b448e70 100644
--- a/ecrire/inc/import.php
+++ b/ecrire/inc/import.php
@@ -131,6 +131,30 @@ function import_debut($f, $gz='fread') {
 $tables_trans = array(
 );
 
+// http://doc.spip.org/@description_table
+function description_table($nom){
+	global $tables_principales, $tables_auxiliaires, $table_des_tables, $tables_des_serveurs_sql;
+
+	$nom_table = $nom;
+	if (in_array($nom, $table_des_tables))
+	   $nom_table = 'spip_' . $nom;
+
+	include_spip('base/serial');
+	if (isset($tables_principales[$nom_table]))
+		return array($nom_table, $tables_principales[$nom_table]);
+
+	include_spip('base/auxiliaires');
+	$nom_table = 'spip_' . $nom;
+	if (isset($tables_auxiliaires[$nom_table]))
+		return array($nom_table, $tables_auxiliaires[$nom_table]);
+
+	if ($desc = spip_abstract_showtable($nom, '', true))
+	  if (isset($desc['field'])) {
+	    return array($nom, $desc);
+	  }
+	return array($nom,array());
+}
+
 // http://doc.spip.org/@import_init_tables
 function import_init_tables($request)
 {
@@ -141,8 +165,8 @@ function import_init_tables($request)
 	foreach($tables as $table){
 		// regarder si il y a au moins un champ impt='non'
 		if (($table!='spip_auteurs')&&(!in_array($table,$IMPORT_tables_noerase))){
-			$res = spip_query("SELECT impt FROM $table WHERE impt='non' LIMIT 0,1");
-			if (spip_num_rows($res))
+			$desc = description_table($table);
+			if (isset($desc['field']['impt']))
 				spip_query("DELETE FROM $table WHERE impt='oui'");
 			else
 				spip_query("DELETE FROM $table");
@@ -216,11 +240,11 @@ function import_tables($request, $dir) {
 // 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);
+		ecrire_meta('version_archive_restauration', $version_archive,'non');
+		ecrire_meta('tag_archive_restauration', $tag,'non');
 		if ( $i = $request['insertion'])
-			ecrire_meta('charset_insertion', $charset);
-		else	ecrire_meta('charset_restauration', $charset);
+			ecrire_meta('charset_insertion', $charset,'non');
+		else	ecrire_meta('charset_restauration', $charset,'non');
 		ecrire_metas();
 		spip_log("Debut de l'importation de $archive (charset: $charset, format: $version_archive)" . ($i ? " insertion $i" : ''));
 	} else {
@@ -243,7 +267,7 @@ function import_tables($request, $dir) {
 	while ($table = $fimport($file, $request, $gz)) {
 	  // memoriser pour pouvoir reprendre en cas d'interrupt,
 	  // mais pas d'ecriture sur fichier, ca ralentit trop
-		ecrire_meta("status_restauration", "$abs_pos");
+		ecrire_meta("status_restauration", "$abs_pos",'non');
 		if ($oldtable != $table) {
 			if ($oldtable) spip_log("$cpt entrees");
 			spip_log("Analyse de $table (commence en $pos)");
diff --git a/ecrire/inc/import_1_3.php b/ecrire/inc/import_1_3.php
index 27f21d47a8..25ab04d13e 100644
--- a/ecrire/inc/import_1_3.php
+++ b/ecrire/inc/import_1_3.php
@@ -12,30 +12,6 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-// http://doc.spip.org/@description_table
-function description_table($nom){
-	global $tables_principales, $tables_auxiliaires, $table_des_tables, $tables_des_serveurs_sql;
-
-	$nom_table = $nom;
-	if (in_array($nom, $table_des_tables))
-	   $nom_table = 'spip_' . $nom;
-
-	include_spip('base/serial');
-	if (isset($tables_principales[$nom_table]))
-		return array($nom_table, $tables_principales[$nom_table]);
-
-	include_spip('base/auxiliaires');
-	$nom_table = 'spip_' . $nom;
-	if (isset($tables_auxiliaires[$nom_table]))
-		return array($nom_table, $tables_auxiliaires[$nom_table]);
-
-	if ($desc = spip_abstract_showtable($nom, '', true))
-	  if (isset($desc['field'])) {
-	    return array($nom, $desc);
-	  }
-	return array($nom,array());
-}
-
 // http://doc.spip.org/@inc_import_1_3_dist
 function inc_import_1_3_dist($lecteur, $request, $gz='fread') {
   global $import_ok, $tables_trans,  $trans;
@@ -114,45 +90,47 @@ function inc_import_1_3_dist($lecteur, $request, $gz='fread') {
 
 // http://doc.spip.org/@import_replace
 function import_replace($values, $table, $desc, $request) {
-	static $where=array();
-	if (!isset($desc['field']['impt'])) // pas de champ de gestion d'import
+	if (!isset($desc['field']['impt'])) {// pas de champ de gestion d'import
 		if (!spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')')) {
 			$GLOBALS['erreur_restauration'] = spip_sql_error();
 	  }
-	else { 
+	}
+	else {
 		// la table contient un champ 'impt' qui permet de gerer des interdiction d'overwrite par import
 		// impt=oui : la ligne est surchargeable par import
 		// impt=non : la ligne ne doit pas etre ecrasee par un import
-		// on essaye un insert si jamais la primary existe pas
-		if (!spip_query("INSERT $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')')) {
-			// il faut gerer l'existence de la primary, et l'autorisation ou non de mettre a jour
-			if (!isset($where[$table])){
-				if (!isset($desc["PRIMARY KEY"]))
-					$GLOBALS['erreur_restauration'] = "champ 'impt' sans cle primaire sur la table $table";
-				else {
-					$keys = $desc["PRIMARY KEY"];
-					$keys = explode(",",$keys);
-					if (!is_array($keys)) $keys = array($keys);
-					$w = "";
-					foreach($keys as $key){
-						if (!isset($values[$key])){
-							$GLOBALS['erreur_restauration'] = "champ $key manquant a l'import sur la table $table";
-							$w .= " AND 0=1";
-							continue;
-						}
-						$w .= " AND $key="._q($values[$key]);
-					}
-					$where[$table] = strlen($w)?substr($w,6):"0=1";
+		// il faut gerer l'existence de la primary, et l'autorisation ou non de mettre a jour
+		$where = "";
+		if (!isset($desc['key']["PRIMARY KEY"]))
+			$GLOBALS['erreur_restauration'] = "champ impt sans cle primaire sur la table $table";
+		else {
+			$keys = $desc['key']["PRIMARY KEY"];
+			$keys = explode(",",$keys);
+			if (!is_array($keys)) $keys = array($keys);
+			$w = "";
+			foreach($keys as $key){
+				if (!isset($values[$key])){
+					$GLOBALS['erreur_restauration'] = "champ $key manquant a l'import sur la table $table";
+					$w .= " AND 0=1";
+					continue;
 				}
+				$w .= " AND $key="._q($values[$key]);
 			}
-			if (isset($where[$table])) {
+			$where = strlen($w)?substr($w,5):"0=1";
+		}
+		if ($where!="") {
+			$res = spip_query("SELECT * FROM $table WHERE ".$where." AND impt='oui'");
+			if (spip_num_rows($res)){
 				$set = "";
 				foreach($values as $key=>$value) $set .= ",$key="._q($value);
 				$set = substr($set,1);
-				if (!spip_query("UPDATE $table SET $set WHERE ".$where[$table]." AND impt='oui'")) {
+				if (!spip_query("UPDATE $table SET $set WHERE ".$where." AND impt='oui'")) {
 					$GLOBALS['erreur_restauration'] = spip_sql_error();
 				}
 			}
+			else{
+				spip_query("INSERT $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')');
+			}
 		}
 	}
 }
-- 
GitLab