From c405f293c93bcdfe7f5d44e8fcd8f694a1a6c65f Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Sun, 17 Dec 2006 18:47:30 +0000
Subject: [PATCH] "gerer le champ 'imp' a l'import "

---
 ecrire/inc/import_1_3.php | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/ecrire/inc/import_1_3.php b/ecrire/inc/import_1_3.php
index 15fae536f1..31bb18dc20 100644
--- a/ecrire/inc/import_1_3.php
+++ b/ecrire/inc/import_1_3.php
@@ -114,6 +114,7 @@ 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 (!spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')')) {
 			$GLOBALS['erreur_restauration'] = spip_sql_error();
@@ -122,7 +123,37 @@ function import_replace($values, $table, $desc, $request) {
 		// 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";
+				}
+			}
+			if (isset($where[$table])) {
+				$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'")) {
+					$GLOBALS['erreur_restauration'] = spip_sql_error();
+				}
+			}
+		}
 	}
 }
 
-- 
GitLab