diff --git a/.gitattributes b/.gitattributes index bc9657be545134586500ed04097515bfc6098320..91a9c5a2bb78e7c610b8ba9067cb3a31653310e3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -475,6 +475,7 @@ ecrire/inc/iconifier.php -text ecrire/inc/import_0_0.php -text ecrire/inc/import_1_2.php -text ecrire/inc/import_1_3.php -text +ecrire/inc/import_insere.php -text ecrire/inc/informer.php -text ecrire/inc/informer_auteur.php -text ecrire/inc/instituer_article.php -text diff --git a/ecrire/exec/import_all.php b/ecrire/exec/import_all.php index c8bf9d6b83c5a83cdb96bfab7ec24a3ae7d413af..677c9129611f202b7c24a3ea9db6a6031d029695 100644 --- a/ecrire/exec/import_all.php +++ b/ecrire/exec/import_all.php @@ -133,6 +133,7 @@ function import_all_debut($request) { function import_all_fin() { effacer_meta("charset_restauration"); + effacer_meta("charset_insertion"); effacer_meta("status_restauration"); effacer_meta("debut_restauration"); effacer_meta("date_optimisation"); diff --git a/ecrire/inc/import.php b/ecrire/inc/import.php index d706d13f1e3b55967cf9b39379e8dacc0a7cacdf..61f013fd6f37cee61bd877dfab39d95c54beb2ed 100644 --- a/ecrire/inc/import.php +++ b/ecrire/inc/import.php @@ -84,12 +84,15 @@ function xml_parse_tag($texte) { // http://doc.spip.org/@import_debut function import_debut($f, $gz=false) { $b = ""; +// Pour les anciennes archives, indiquer le charset par defaut: + $charset = 'iso-8859-1'; +// les + recentes l'ont en debut de ce fichier $flag_phpmyadmin = false; while ($t = xml_fetch_tag($f, $b, $gz, false)) { $r = xml_parse_tag($t); if ($r[0] == '?xml' AND $r[1]['encoding']) - ecrire_meta('charset_restauration', strtolower($r[1]['encoding'])); - if ($r[0] == "SPIP") return $r; + $charset = strtolower($r[1]['encoding']); + elseif ($r[0] == "SPIP") {$r[2] = $charset; return $r;} if (($r[0] == "!--") && (preg_match(",phpmyadmin\sxml\sdump,is",$r[1]))){ // c'est un dump xml phpmyadmin // on interprete le commentaire pour recuperer la version de phpmydadmin @@ -97,12 +100,13 @@ function import_debut($f, $gz=false) { $flag_phpmyadmin = true; } if (($r[0] != "!--") && ($flag_phpmyadmin == true)){ - $r[1] = array('version_archive'=>"phpmyadmin::$version"); + $r[1] = array('version_archive'=>"phpmyadmin::$version"); + $r[2] = $charset; return $r; } $b = ""; } - // improbable: fichier correct avant le debut_admin et plus apres + // improbable: fichier correct avant debut_admin et plus apres import_all_fin(); die(_T('info_erreur_restauration')); } @@ -118,7 +122,7 @@ function import_init_tables($request) global $IMPORT_tables_noerase, $connect_id_auteur; // grand menage // on vide toutes les tables dont la restauration est demandee - $tables = import_table_choix($request); + $tables = import_table_choix($request); foreach($tables as $table){ if (($table!='spip_auteurs')&&(!in_array($table,$IMPORT_tables_noerase))) @@ -126,7 +130,6 @@ function import_init_tables($request) } // Bidouille pour garder l'acces admin actuel pendant toute la restauration - spip_log("la bidouille"); spip_query("UPDATE spip_auteurs SET id_auteur=0, extra=$connect_id_auteur WHERE id_auteur=$connect_id_auteur"); spip_query("DELETE FROM spip_auteurs WHERE id_auteur!=0"); @@ -161,6 +164,7 @@ function import_tables($request, $dir, $trans=array()) { // ou initialisation de la table des translations, // mais pas lors d'une reprise. + include_spip('inc/import_insere'); if ($request['insertion']=='on') { $request['init'] = (!$my_pos) ? 'insere_1_init' : 'insere_2_init'; $request['boucle'] = 'import_insere'; } elseif ($request['insertion']=='passe2') { @@ -186,15 +190,15 @@ function import_tables($request, $dir, $trans=array()) { } if ($my_pos==0) { -// Pour les anciennes archives, indiquer le charset par defaut: - ecrire_meta('charset_restauration', 'iso-8859-1'); -// les + recentes l'ont en debut de fichier et import_debut fera ecrire_meta - list($tag, $r) = import_debut($file, $gz); + list($tag, $r, $charset) = import_debut($file, $gz); // 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); + if ($request['insertion']=='off') + ecrire_meta('charset_restauration', $charset); + else ecrire_meta('charset_insertion', $charset); ecrire_metas(); } else { // Reprise de l'importation diff --git a/ecrire/inc/import_1_2.php b/ecrire/inc/import_1_2.php index b023e94768bd3954236e4aaf1d3da20d28eb2af7..7b9ef90a73a60b76dd9c16ae118afc874de2a6db 100644 --- a/ecrire/inc/import_1_2.php +++ b/ecrire/inc/import_1_2.php @@ -45,7 +45,7 @@ function inc_import_1_2_dist($f, $request, $gz=false, $t='') { static $tables; if (!$tables) { $init = $request['init']; - $init($request); + $a_importer = $init($request); $tables = array( 'article' => 'spip_articles', 'auteur' => 'spip_auteurs', @@ -72,7 +72,7 @@ function inc_import_1_2_dist($f, $request, $gz=false, $t='') { $id_objet = 0; $table = isset($tables[$type]) ? $tables[$type] : $type; - if (!isset($field_desc[$table])){ + if (in_array($table, $a_importer) AND !isset($field_desc[$table])) { // recuperer la description de la table pour connaitre ses champs valides list($nom,$desc) = description_table($table); @@ -83,6 +83,10 @@ function inc_import_1_2_dist($f, $request, $gz=false, $t='') { } $fields = $field_desc[$table]; + $char = $GLOBALS['meta']['charset_insertion']; + if ($char == $GLOBALS['meta']['charset_restauration']) $char = ''; + + $values = array(); // Lire les champs de l'objet for (;;) { $b = ''; @@ -107,12 +111,14 @@ function inc_import_1_2_dist($f, $request, $gz=false, $t='') { } } else if ($fields==NULL or isset($fields[$col])) { + if ($char) + $value = importer_charset($value, $charset); $values[$col] = _q($value); if ($col == $id) $id_objet = $value; } } } - + if ($values) { if (!spip_query("REPLACE $table (" . join(',', array_keys($values)) . ') VALUES (' . join(',', $values) . ')')) { echo "--><br><font color='red'><b>"._T('avis_erreur_mysql')."</b></font>\n<font color='black'><tt>".spip_sql_error()."</tt></font>\n<!--"; $GLOBALS['erreur_restauration'] = true; @@ -153,8 +159,8 @@ function inc_import_1_2_dist($f, $request, $gz=false, $t='') { spip_abstract_insert($table_lien, "($id, id_$type_lien)", join(',', $t)); } } - - return $import_ok = " "; + } + return $import_ok = " "; } ?> diff --git a/ecrire/inc/import_1_3.php b/ecrire/inc/import_1_3.php index 2a0cf42bd52c8780cbf2e09bb72189e27ceaccc8..90bd47ee1faff2e92dfc8fc1eea43276107b5087 100644 --- a/ecrire/inc/import_1_3.php +++ b/ecrire/inc/import_1_3.php @@ -36,63 +36,6 @@ function description_table($nom){ return array($nom,array()); } - -// http://doc.spip.org/@insere_2_init -function insere_2_init($request) { - - // l'insertion porte sur les tables principales ... - $t = array_keys($GLOBALS['tables_principales']); - // ... mais pas cette table car elle n'est pas extensible .. - // (si on essaye ==> duplication sur la cle secondaire) - unset($t[array_search('spip_types_documents', $t)]); - // .. ni celle-ci a cause de la duplication des login - unset($t[array_search('spip_auteurs', $t)]); - // et les tables auxiliaires sur les mots car on sait les identifier - $t[]= 'spip_mots_articles'; - $t[]= 'spip_mots_breves'; - $t[]= 'spip_mots_rubriques'; - $t[]= 'spip_mots_syndic'; - $t[]= 'spip_mots_forum'; - $t[]= 'spip_mots_documents'; - - return $t; -} - -// http://doc.spip.org/@insere_1_init -function insere_1_init($request) { - - // preparation de la table des translations - $spip_translate = array( - "type" => "VARCHAR(16) NOT NULL", - "titre" => "text NOT NULL", - "id_old" => "BIGINT (21) DEFAULT '0' NOT NULL", - "id_new" => "BIGINT (21) DEFAULT '0' NOT NULL"); - - $spip_translate_key = array( - "PRIMARY KEY" => "id_old, id_new, type", - "KEY id_old" => "id_old"); - - include_spip('base/create'); - spip_create_table('spip_translate', $spip_translate, $spip_translate_key, true); - // au cas ou la derniere fois ce serait terminee anormalement - spip_query("DELETE FROM spip_translate"); - return insere_2_init($request); -} - -// http://doc.spip.org/@translate_init -function translate_init($request) { - /* - construire le tableau PHP de la table spip_translate - (mis en table pour pouvoir reprendre apres interruption) - */ - $q = spip_query("SELECT * FROM spip_translate"); - $trans = array(); - while ($r = spip_fetch_array($q)) { - $trans[$r['type']][$r['id_old']] = array($r['id_new'], $r['titre']); - } - return $trans; -} - // http://doc.spip.org/@inc_import_1_3_dist function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) { global $import_ok, $abs_pos, $tables_trans; @@ -136,7 +79,7 @@ function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) { if ($request['insertion']=='on') { // Ne memoriser que la cle primaire pour le premier tour de l'insertion. // car les autres cles rentreraient en conflit avec les presentes -// Prendre le champ titre pour pouvoir identifier +// Prendre le strict necessaire pour pouvoir identifier avec l'existant $b = array(); if (isset($desc['field'][$p='titre'])) $b[$p]= $desc['field'][$p]; @@ -162,100 +105,20 @@ function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) { return $import_ok = $new; } -/* --------- les 3 fonctions possibles pour l'index "boucle" -- */ - // http://doc.spip.org/@import_replace function import_replace($values, $table, $desc, $request, $trans) { if (!spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',$values) . ')')) $GLOBALS['erreur_restauration'] = spip_sql_error(); } -// http://doc.spip.org/@import_insere -function import_insere($values, $table, $desc, $request, $trans) { - $type_id = $desc['key']["PRIMARY KEY"]; - - // reserver une place dans les tables principales si nouveau - if ((!function_exists($f = 'import_identifie_' . $type_id)) - OR (!$n = $f($values, $table, $desc, $request, $trans))) { - $n = spip_abstract_insert($table, '', '()'); - if (!$n) - $GLOBALS['erreur_restauration'] = spip_sql_error(); - } - - // et memoriser la correspondance dans la table auxilaire - // si different et pas de recherche dessus plus tard - if ($n AND (($n != $values[$type_id]) OR $table != 'id_groupe')) { - if (is_array($n)) - list($id, $titre) = $n; // _q() deja applique sur $titre - else {$id = $n; $titre = "''";} - spip_abstract_insert('spip_translate', - "(id_old, id_new, titre, type)", - "(". $values[$type_id] .",$id, $titre, '$type_id')"); - } -} - -// http://doc.spip.org/@import_translate -function import_translate($values, $table, $desc, $request, $trans) { - $vals = ''; - - foreach ($values as $k => $v) { - - if ($k=='id_parent' OR $k=='id_secteur') $k = 'id_rubrique'; - - if (isset($trans[$k]) AND isset($trans[$k][$v])) { - list($g, $titre) = $trans[$k][$v]; - if ($g < 0) { - // cas du parent a verifier en plus du titre - if (!($g = import_identifie_mot_si_groupe(0-$g, $titre, $trans))) - $g = spip_abstract_insert($table, '', '()'); - // On connait enfin le nouveau numero. - // Mise a jour de spip_translate pas indispensable, - // on evite: si vraiment une interrupt a lieu et - // retombe dessus, elle recalculera, et alors ? - $trans[$k][$v] = array($g, $titre); - - } - $v = $g; - } - - $vals .= ",$v"; - } - return spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .substr($vals,1) . ')'); -} - -/* --------- Fin des 3 fonctions possibles pour l'index "boucle" -- */ - -// deux groupes de mots ne peuvent avoir le meme titre ==> identification -function import_identifie_id_groupe($values, $table, $desc, $request, $trans) { - // _q() deja appliquee - $n = spip_fetch_array(spip_query("SELECT id_groupe FROM spip_groupes_mots WHERE titre=" . $values['titre'])); - return $n ? $n['id_groupe'] : false; -} - -// pour un mot le titre est insuffisant, il faut aussi l'identite du groupe. -// Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif -function import_identifie_id_mot($values, $table, $desc, $request, $trans) { - return array((0 - $values['id_groupe']), $values['titre']); -} - -// mot de meme et de meme groupe ==> identification -function import_identifie_mot_si_groupe($id_groupe, $titre, $trans) -{ - if (!(isset($trans['id_groupe']) - AND isset($trans['id_groupe'][$id_groupe]))) - return false; - - $new = $trans['id_groupe'][$id_groupe][0]; - - $r = spip_fetch_array(spip_query($q = "SELECT id_mot, id_groupe FROM spip_mots WHERE titre=" . _q($titre) . " AND id_groupe=$new" )); - - return !$r ? false : $r['id_mot']; -} - // http://doc.spip.org/@import_lire_champs function import_lire_champs($f, $fields, $gz, $phpmyadmin, $table) { $values = array(); + + $char = $GLOBALS['meta']['charset_insertion']; + if ($char == $GLOBALS['meta']['charset_restauration']) $char = ''; + for (;;) { $b = ''; if (!($col = xml_fetch_tag($f, $b, $gz))) return false; @@ -271,6 +134,8 @@ function import_lire_champs($f, $fields, $gz, $phpmyadmin, $table) if ( ($col != 'maj') AND (isset($fields[$col])) ) { if ($phpmyadmin) $value = str_replace($phpmyadmin[0],$phpmyadmin[1],$value); + if ($char) + $value = importer_charset($value, $charset); $values[$col]= _q($value); } } diff --git a/ecrire/inc/import_insere.php b/ecrire/inc/import_insere.php new file mode 100644 index 0000000000000000000000000000000000000000..2c5d18fc135d71e3f50b89f0420af1541364b5e5 --- /dev/null +++ b/ecrire/inc/import_insere.php @@ -0,0 +1,152 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2006 * + * 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; + +// http://doc.spip.org/@insere_2_init +function insere_2_init($request) { + + // l'insertion porte sur les tables principales ... + $t = array_keys($GLOBALS['tables_principales']); + // ... mais pas cette table car elle n'est pas extensible .. + // (si on essaye ==> duplication sur la cle secondaire) + unset($t[array_search('spip_types_documents', $t)]); + // .. ni celle-ci a cause de la duplication des login + unset($t[array_search('spip_auteurs', $t)]); + // et les tables auxiliaires sur les mots car on sait les identifier + $t[]= 'spip_mots_articles'; + $t[]= 'spip_mots_breves'; + $t[]= 'spip_mots_rubriques'; + $t[]= 'spip_mots_syndic'; + $t[]= 'spip_mots_forum'; + $t[]= 'spip_mots_documents'; + + return $t; +} + +// http://doc.spip.org/@insere_1_init +function insere_1_init($request) { + + // preparation de la table des translations + $spip_translate = array( + "type" => "VARCHAR(16) NOT NULL", + "titre" => "text NOT NULL", + "id_old" => "BIGINT (21) DEFAULT '0' NOT NULL", + "id_new" => "BIGINT (21) DEFAULT '0' NOT NULL"); + + $spip_translate_key = array( + "PRIMARY KEY" => "id_old, id_new, type", + "KEY id_old" => "id_old"); + + include_spip('base/create'); + spip_create_table('spip_translate', $spip_translate, $spip_translate_key, true); + // au cas ou la derniere fois ce serait terminee anormalement + spip_query("DELETE FROM spip_translate"); + return insere_2_init($request); +} + +// http://doc.spip.org/@translate_init +function translate_init($request) { + /* + construire le tableau PHP de la table spip_translate + (mis en table pour pouvoir reprendre apres interruption) + */ + $q = spip_query("SELECT * FROM spip_translate"); + $trans = array(); + while ($r = spip_fetch_array($q)) { + $trans[$r['type']][$r['id_old']] = array($r['id_new'], $r['titre']); + } + return $trans; +} + + +// http://doc.spip.org/@import_insere +function import_insere($values, $table, $desc, $request, $trans) { + $type_id = $desc['key']["PRIMARY KEY"]; + + // reserver une place dans les tables principales si nouveau + if ((!function_exists($f = 'import_identifie_' . $type_id)) + OR (!$n = $f($values, $table, $desc, $request, $trans))) { + $n = spip_abstract_insert($table, '', '()'); + if (!$n) + $GLOBALS['erreur_restauration'] = spip_sql_error(); + } + + // et memoriser la correspondance dans la table auxilaire + // si different et pas de recherche dessus plus tard + if ($n AND (($n != $values[$type_id]) OR $table != 'id_groupe')) { + if (is_array($n)) + list($id, $titre) = $n; // _q() deja applique sur $titre + else {$id = $n; $titre = "''";} + spip_abstract_insert('spip_translate', + "(id_old, id_new, titre, type)", + "(". $values[$type_id] .",$id, $titre, '$type_id')"); + } +} + +// http://doc.spip.org/@import_translate +function import_translate($values, $table, $desc, $request, $trans) { + $vals = ''; + + foreach ($values as $k => $v) { + + if ($k=='id_parent' OR $k=='id_secteur') $k = 'id_rubrique'; + + if (isset($trans[$k]) AND isset($trans[$k][$v])) { + list($g, $titre) = $trans[$k][$v]; + if ($g < 0) { + // cas du parent a verifier en plus du titre + if (!($g = import_identifie_mot_si_groupe(0-$g, $titre, $trans))) + $g = spip_abstract_insert($table, '', '()'); + // Memoriser le nouveau numero pour ne pas recalculer + // Mise a jour de spip_translate pas indispensable, + // on evite: si vraiment une interrupt a lieu et + // retombe dessus, elle recalculera, pas dramatique + $trans[$k][$v] = array($g, $titre); + } + $v = $g; + } + + $vals .= ",$v"; + } + return spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .substr($vals,1) . ')'); +} + + +// deux groupes de mots ne peuvent avoir le meme titre ==> identification +function import_identifie_id_groupe($values, $table, $desc, $request, $trans) { + // _q() deja appliquee + $n = spip_fetch_array(spip_query("SELECT id_groupe FROM spip_groupes_mots WHERE titre=" . $values['titre'])); + return $n ? $n['id_groupe'] : false; +} + +// pour un mot le titre est insuffisant, il faut aussi l'identite du groupe. +// Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif +function import_identifie_id_mot($values, $table, $desc, $request, $trans) { + return array((0 - $values['id_groupe']), $values['titre']); +} + +// mot de meme et de meme groupe ==> identification +function import_identifie_mot_si_groupe($id_groupe, $titre, $trans) +{ + if (!(isset($trans['id_groupe']) + AND isset($trans['id_groupe'][$id_groupe]))) + return false; + + $new = $trans['id_groupe'][$id_groupe][0]; + + $r = spip_fetch_array(spip_query($q = "SELECT id_mot, id_groupe FROM spip_mots WHERE titre=" . _q($titre) . " AND id_groupe=$new" )); + + return !$r ? false : $r['id_mot']; +} +?> +