Valider 77d7197b rédigé par esj's avatar esj
Parcourir les fichiers

Fin de la tache #685, (suite de [8442] [8370]): les sauvegardes produites par...

Fin de la tache #685, (suite de [8442] [8370]): les sauvegardes produites par SPIP indiquent à présent lorsqu'un objet a des logos on et/ou off, et si oui le type (gif/jpg/png) de chacun. Du coup, la fusion d'une sauvegarde avec la BD d'un site importe ces logos sans essayer les 3 formats pour chacun des 2 et 
pour chaque objet de la sauvegarde.

Le format des sauvegardes a donc un peu changé en ce que les balises de tables (<spip_rubriques>, <spip_articles> etc) peuvent avoir des attributs, on et off en l'occurrence. On ne passe pas à un numérotation 1.4 du format de sauvegarde pour autant, tout analyseur XML étant supposé savoir qu'une balise peut avoir des attributs.

Par ailleurs, la sauvegarde pour admin restreint est un peu plus fine (on n'exporte plus les modifs de versions des articles non administrés), mais reste encore grossière sur certains points (importation de tous les auteurs et de tous les références de documents) mais c'est mineur.

Aussi dans ce dépot: migration de la fonction description_table, auparavant confiné dans le inc/import, dans base/abstract_sql, pour partage ultérieur avec du code très ressemblant.
parent 0fec32e6
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+33 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -159,4 +159,37 @@ function calcul_mysql_in($val, $valeurs, $not='') {

	return "($in_sql)";
}


// Une version d'abstract_showtable prenant en compte les tables predefinies
// Faudrait tester un jour si ca accelere vraiment.

function description_table($nom){
	global $tables_principales, $tables_auxiliaires, $table_des_tables, $tables_des_serveurs_sql;
	static $tables_externes = array();

	if (isset($tables_externes[$nom]))
		return array($nom, $tables_externes[$nom]);

	$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'])) {
			$tables_externes[$nom] = $desc;
			return array($nom, $desc);
		}

	return array($nom,array());
}
?>
+3 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -141,6 +141,9 @@ function exec_export_all_dist()

	echo "<div style='text-align: left'>\n";
	$etape = 1;

	// Instancier une fois pour toutes, car on va boucler un max.
	$GLOBALS['chercher_logo'] = charger_fonction('chercher_logo', 'inc',true);
	foreach($tables_for_dump as $table){
		if ($etape_actuelle <= $etape) {
		  $r = spip_query("SELECT COUNT(*) FROM $table");
+34 −17
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -25,11 +25,14 @@ function export_nom_fichier_dump($dir,$gz=true){
	return $nom;
}

// Concatenation des tranches
// Il faudrait ouvrir une seule fois le fichier, et d'abord sous un autre nom
// et sans detruire les tranches: au final renommage+destruction massive pour
// prevenir autant que possible un Time-out.

// http://doc.spip.org/@ramasse_parties
function ramasse_parties($archive, $partfile, $nb, $fin=''){
	// a ameliorer par un preg_file
	// si le rammassage est interrompu par un timeout, on perd des morceaux

	$files = array();
	$ok = true;
	if (!ecrire_fichier($archive,$fin ? export_entete() : '',false,false))
@@ -67,14 +70,17 @@ define('_EXPORT_TRANCHES_LIMITE', 400);

// http://doc.spip.org/@export_objets
function export_objets($table, $liens, $etape, $cpt, $dir, $archive, $gz, $total) {
	static $etape_affichee=array();
	global $tables_principales;

	$debut = $cpt * _EXPORT_TRANCHES_LIMITE;
	$filetable = $dir . $archive . '_' . $etape . '.';
	$prim = isset($tables_principales[$table])
	  ? $tables_principales[$table]['key']["PRIMARY KEY"]
	  : '';

	while (1){ // on ne connait pas le nb de paquets d'avance

		$string = build_while($debut, $table);
		$string = build_while($debut, $table, $prim);
		// attention $string vide ne suffit pas a sortir
		// car les admins restreints peuvent parcourir
		// une portion de table vide pour eux.
@@ -106,20 +112,29 @@ function export_objets($table, $liens, $etape, $cpt, $dir, $archive, $gz, $total
// Construit la version xml  des champs d'une table

// http://doc.spip.org/@build_while
function build_while($debut, $table) {
	global $connect_toutes_rubriques ;
	global $tables_principales;
	static $table_fields=array();
function build_while($debut, $table, $prim) {
	global $connect_toutes_rubriques, $chercher_logo ;

	$result = spip_query("SELECT * FROM $table LIMIT $debut," . _EXPORT_TRANCHES_LIMITE);

	$string = '';
	while ($row = spip_fetch_array($result,SPIP_ASSOC)) {
		if ((!isset($row['impt']) OR $row['impt']=='oui')
		AND ($connect_toutes_rubriques
		     OR !isset($row['id_rubrique'])
		     OR autoriser('publierdans','rubrique',$row['id_rubrique']))) {
	  if ((!isset($row['impt'])) OR $row['impt']=='oui') {
		      if (!($ok = $connect_toutes_rubriques)) {
			if (isset($row['id_rubrique']))
			  $ok = autoriser('publierdans','rubrique',$row['id_rubrique']);
			elseif (isset($row['id_article']))
			  $ok = autoriser('modifier','article',$row['id_article']);
			else $ok = true;
			if ($ok) {
			  $attributs = "";
			  if ($chercher_logo) {
				if ($logo = $chercher_logo($row[$prim], $prim, 'on'))
				  $attributs .= ' on="' . $logo[3] . '"';
				if ($logo = $chercher_logo($row[$prim], $prim, 'off'))
				  $attributs .= ' off="' . $logo[3] . '"';
			  }

			  $string .= "<$table$attributs>\n";
			  foreach ($row as $k => $v) {
				$string .= "<$k>" . text_to_xml($row[$k]) . "</$k>\n";
@@ -127,6 +142,8 @@ function build_while($debut, $table) {
			  $string .= "</$table>\n\n";
			}
		      }
	  }
	}
	spip_free_result($result);
	return $string;
}
+27 −42
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -13,10 +13,9 @@
if (!defined("_ECRIRE_INC_VERSION")) return;

include_spip('inc/presentation');
include_spip ("inc/acces");
include_spip('inc/acces');
include_spip('inc/indexation'); // pour la fonction primary_index_table 
include_spip('base/serial');
include_spip('base/auxiliaires');
include_spip('base/abstract_sql');

// NB: Ce fichier peut ajouter des tables (old-style)
// donc il faut l'inclure "en globals"
@@ -82,7 +81,7 @@ function xml_parse_tag($texte) {

	list($tag, $atts) = split('[[:space:]]+', $texte, 2);
	$result[0] = $tag;
	$result[1] = '';
	$result[1] = array();

	if (!$atts) return $result;
	if ($tag=='!--'){
@@ -97,6 +96,8 @@ function xml_parse_tag($texte) {
	return $result;
}

// Balise ouvrante:
// 'SPIP' si fait par spip, nom de la base source si fait par  phpmyadmin

// http://doc.spip.org/@import_debut
function import_debut($f, $gz='fread') {
@@ -130,29 +131,6 @@ 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)
@@ -233,37 +211,29 @@ function import_tables($request, $dir) {
	}

	if ($abs_pos==0) {
		list($tag, $r, $charset) = import_debut($file, $gz);
		list($tag, $atts, $charset) = import_debut($file, $gz);
	// improbable: fichier correct avant debut_admin et plus apres
		if (!$tag) return !($import_ok = true);
// 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,'non');
		ecrire_meta('tag_archive_restauration', $tag,'non');
		if ( $i = $request['insertion'])
			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" : ''));
		$version_archive = import_init_meta($tag, $atts, $charset, $request);
	} else {
		$version_archive = $GLOBALS['meta']['version_archive_restauration'];
		spip_log("Reprise de l'importation de $archive interrompue en $abs_pos");
		$atts = unserialize($GLOBALS['meta']['attributs_archive_restauration']);
		spip_log("Reprise de l'importation interrompue en $abs_pos");
		$_fseek = ($gz=='gzread') ? 'gzseek' : 'fseek';
		$_fseek($file, $abs_pos);
	}


	$fimport = import_charge_version($version_archive);

	import_affiche_javascript($taille);

	if ($GLOBALS['flag_ob_flush']) ob_flush();
	flush();

	$oldtable ='';
	$cpt = 0;
	$pos = $abs_pos;
	while ($table = $fimport($file, $request, $gz)) {
	while ($table = $fimport($file, $request, $gz, $atts)) {
	  // memoriser pour pouvoir reprendre en cas d'interrupt,
	  // mais pas d'ecriture sur fichier, ca ralentit trop
		ecrire_meta("status_restauration", "$abs_pos",'non');
@@ -280,7 +250,8 @@ function import_tables($request, $dir) {
	spip_log("$cpt entrees");

	if (!$import_ok) 
		$res =  _T('avis_archive_invalide');
	  $res =  _T('avis_archive_invalide') . ' ' .
	    _T('taille_octets', array('taille' => $pos)) ;
	else {
		$res = '';
		affiche_progression_javascript('100 %', $size);
@@ -289,6 +260,20 @@ function import_tables($request, $dir) {
	return $res ;
}

function import_init_meta($tag, $atts, $charset, $request)
{
	$version_archive = $atts['version_archive'];
	ecrire_meta('attributs_archive_restauration', serialize($atts),'non');
	ecrire_meta('version_archive_restauration', $version_archive,'non');
	ecrire_meta('tag_archive_restauration', $tag,'non');
	if ( $i = $request['insertion'])
		ecrire_meta('charset_insertion', $charset,'non');
	else	ecrire_meta('charset_restauration', $charset,'non');
	ecrire_metas();
	spip_log("Debut de l'importation (charset: $charset, format: $version_archive)" . ($i ? " insertion $i" : ''));
	return $version_archive;
}

// http://doc.spip.org/@import_affiche_javascript
function import_affiche_javascript($taille)
{
+39 −28
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -13,7 +13,7 @@
if (!defined("_ECRIRE_INC_VERSION")) return;

// http://doc.spip.org/@inc_import_1_3_dist
function inc_import_1_3_dist($lecteur, $request, $gz='fread') {
function inc_import_1_3_dist($lecteur, $request, $gz='fread', $atts=array()) {
  global $import_ok, $tables_trans,  $trans;
	static $tables = '';
	static $phpmyadmin, $fin;
@@ -35,6 +35,11 @@ function inc_import_1_3_dist($lecteur, $request, $gz='fread') {
	$b = false;
	if (!($table = xml_fetch_tag($lecteur, $b, $gz))) return false;
	if ($table == $fin) return !($import_ok = true);
	if (strpos($table,'=')) {
	  list($table, $attl) = xml_parse_tag($table);
	  $atts = array_merge($atts, $attl);
	}

	$new = isset($tables_trans[$table]) ? $tables_trans[$table]: $table; 

	// indique a la fois la fonction a appliquer
@@ -50,29 +55,8 @@ function inc_import_1_3_dist($lecteur, $request, $gz='fread') {
		list($nom,$desc) = description_table($table);
		if (!isset($desc['field']))
			$desc = $defaut;
		else {
			if ($request['insertion']=='on') {
// Au premier tour de l'insertion, ne memoriser que le strict necessaire 
// pour pouvoir identifier avec l'existant.
// (Faudrait convenir d'une structure de donnees, c'est lourd & inextensible)
				$b = array();
				if (isset($desc['field'][$p='titre']))
					$b[$p]= $desc['field'][$p];
				if (isset($desc['field'][$p='id_groupe']))
					$b[$p]= $desc['field'][$p];
				if (isset($desc['field'][$p='id_parent']))
					$b[$p]= $desc['field'][$p];
				if (isset($desc['field'][$p='id_rubrique']))
					$b[$p]= $desc['field'][$p];
				if (isset($desc['field'][$p='fichier'])) {
					$b[$p]= $desc['field'][$p];
					$b['taille']= $desc['field']['taille'];
				}
				$p = $desc['key']["PRIMARY KEY"];
				$b[$p] = $desc['field'][$p];
				$desc['field'] = $b; 
			}
		}
		elseif ($request['insertion']=='on')
			$desc['field'] = import_collecte($desc); 
		$field_desc[$boucle][$table] = $desc;
	}

@@ -83,13 +67,41 @@ function inc_import_1_3_dist($lecteur, $request, $gz='fread') {
				     '/' . $table);

	if ($values === false) return  ($import_ok = false);
	if ($values) $boucle($values, $new, $desc, $request);

	if ($values) $boucle($values, $new, $desc, $request, $atts);

	return $import_ok = $new;
}

// Au premier tour de l'insertion, ne memoriser que le strict necessaire 
// pour pouvoir identifier avec l'existant.
// (Faudrait convenir d'une structure de donnees, c'est lourd & inextensible)

function import_collecte($desc)
{
	$fields = $desc['field'];
	$b = array();
	if (isset($fields[$p='titre']))
	  $b[$p]= $fields[$p];
	if (isset($fields[$p='id_groupe']))
	  $b[$p]= $fields[$p];
	if (isset($fields[$p='id_parent']))
	  $b[$p]= $fields[$p];
	if (isset($fields[$p='id_rubrique']))
	  $b[$p]= $fields[$p];
	if (isset($fields[$p='fichier'])) {
	  $b[$p]= $fields[$p];
	  $b['taille']= $fields['taille'];
	}
	$p = $desc['key']["PRIMARY KEY"];
	$b[$p] = $fields[$p];
	return $b;
}

// Les 2 derniers args ne servent que pour l'insertion

// http://doc.spip.org/@import_replace
function import_replace($values, $table, $desc, $request) {
function import_replace($values, $table, $desc, $request, $atts='') {
	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();
@@ -153,8 +165,7 @@ function import_lire_champs($f, $fields, $gz, $phpmyadmin, $table)
		if (!($col = xml_fetch_tag($f, $b, $gz))) return false;
		if ($col[0] == '/') { 
			if ($col != $table) {
				spip_log("restauration de la table $table, tag fermant inattendu:");
				spip_log($col);
				spip_log("table $table, tag fermant inattendu:$col");
		  }
			break;
		}
Chargement en cours