Skip to content
Extraits de code Groupes Projets
Valider 7a319d84 rédigé par esj's avatar esj
Parcourir les fichiers

Tâche #685, suite de [7952]. Lors de l'insertion d'une sauvegarde, encoder...

Tâche #685, suite de [7952]. Lors de l'insertion d'une sauvegarde, encoder celle-ci dans le charset courant du site, sinon c'est le bazar. Marche aussi quand on insère une sauvegarde à l'ancien format (1.2) mais pas à l'anté-diluvien (non numéroté).
parent 3aee5d86
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -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
......
......@@ -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");
......
......@@ -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
......
......@@ -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 = " ";
}
?>
......@@ -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);
}
}
......
<?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'];
}
?>
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter