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