/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2011 *
+ * Copyright (c) 2001-2014 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
- @list(, $gz, $archive, $rub, $version) = explode(',', $arg);
+ @list(, , $archive, $rub) = explode(',', $arg);
$meta = base_dump_meta_name($rub);
+ $file = ramasse_parties($rub, $archive, $meta);
+ $size = !$file ? 0 : @(!file_exists($file) ? 0 : filesize($file));
+ $metatable = $meta . '_tables';
+ $tables = isset($GLOBALS['meta'][$metatable])?unserialize($GLOBALS['meta'][$metatable]):array();
+ effacer_meta($metatable);
+ effacer_meta($meta);
+ utiliser_langue_visiteur();
+ if (!$size)
+ $corps = _T('avis_erreur_sauvegarde', array('type'=>'.', 'id_objet'=>'. .'));
+ else {
+ $corps = export_all_report_size($file, $rub, $size, generer_url_ecrire())
+ . export_all_report_tables($tables);
+ }
+ include_spip('inc/minipres');
+ echo minipres(_T('info_sauvegarde'), $corps);
+}
+
+function export_all_rename($nom, $subdir)
+{
+ $dir = dirname($subdir);
+ $dest = $dir . '/' . $nom;
+ if (file_exists($dest)) {
+ $n = 1;
+ while (@file_exists($new = "$dir/$n-$nom")) $n++;
+ spip_log("renomme vieux $dest en $new");
+ @rename($dest, $new);
+ }
+ return $dest;
+}
+
+// Concatenation des tranches
+
+// http://doc.spip.org/@ramasse_parties
+function ramasse_parties($rub, $archive, $meta)
+{
$dir = base_dump_dir($meta);
- $file = $dir . $archive;
+ $files = preg_files($dir . $archive . ".part_[0-9]+_[0-9]+[.gz]?");
+ if (!$files) return false;
+ $ok = true;
+ $files_o = array();
+ $but = export_all_rename($archive, $dir);
+ // creer l'en tete du fichier
+ ecrire_fichier($but, export_entete(_VERSION_ARCHIVE),false);
+ foreach($files as $f) {
+ $contenu = "";
+ if (lire_fichier ($f, $contenu)) {
+ if (!ecrire_fichier($but,$contenu,false,false))
+ { $ok = false; break;}
+ }
+ spip_unlink($f);
+ $files_o[]=$f;
+ }
+ ecrire_fichier($but, export_enpied(),false,false);
+ spip_unlink($dir);
+ spip_log("concatenation " . join(' ', $files_o));
+ return $ok ? $but : false;
+}
- utiliser_langue_visiteur();
- export_all_fin($file, $meta, $rub);
+function export_all_end($meta, $archive){
+ $dir = base_dump_dir($meta);
+ $file = $dir . $archive;
}
-// http://doc.spip.org/@export_all_fin
-function export_all_fin($file, $meta, $rub)
+// http://doc.spip.org/@export_entete
+function export_entete($version_archive)
{
- global $spip_lang_left,$spip_lang_right;
+ return
+"<" . "?xml version=\"1.0\" encoding=\"".
+$GLOBALS['meta']['charset']."\"?".">\n" .
+"<SPIP
+ version=\"" . $GLOBALS['spip_version_affichee'] . "\"
+ version_base=\"" . $GLOBALS['spip_version_base'] . "\"
+ version_archive=\"" . $version_archive . "\"
+ adresse_site=\"" . $GLOBALS['meta']["adresse_site"] . "\"
+ dir_img=\"" . _DIR_IMG . "\"
+ dir_logos=\"" . _DIR_LOGOS . "\"
+>\n";
+}
- $metatable = $meta . '_tables';
- $tables_sauvegardees = isset($GLOBALS['meta'][$metatable])?unserialize($GLOBALS['meta'][$metatable]):array();
- effacer_meta($meta);
- effacer_meta($metatable);
- $size = @(!file_exists($file) ? 0 : filesize($file));
+// production de l'en-pied du fichier d'archive
+// http://doc.spip.org/@export_enpied
+function export_enpied () { return "</SPIP>\n";}
+
+function export_all_report_size($dest, $rub, $size, $retour)
+{
+ global $spip_lang_left,$spip_lang_right;
- if (!$size) {
- $corps = _T('avis_erreur_sauvegarde', array('type'=>'.', 'id_objet'=>'. .'));
-
- } else {
- $subdir = dirname($file);
- $dir = dirname($subdir);
- $nom = basename($file);
- $dest = $dir . '/' . $nom;
- if (file_exists($dest)) {
- $n = 1;
- while (@file_exists($new = "$dir/$n-$nom")) $n++;
- @rename($dest, $new);
- }
- if (@rename($file, $dest)) {
- spip_unlink($subdir);
- spip_log("$file renomme en $dir/$nom");
- }
// ne pas effrayer inutilement: il peut y avoir moins de fichiers
// qu'annonce' si certains etaient vides
- $n = _T('taille_octets', array('taille' => number_format($size, 0, ' ', ' ')));
+ $n = _T('taille_octets', array('taille' => number_format($size, 0, ' ', ' ')));
// cette chaine est a refaire car il y a double ambiguite:
// - si plusieurs SPIP dans une base SQL (cf table_prefix)
// - si on exporte seulement une rubrique
# _T('info_sauvegarde_reussi_02',
- if ($rub) {
+ if ($rub) {
$titre = sql_getfetsel('titre', 'spip_rubriques', "id_rubrique=$rub");
$titre = _T('info_sauvegarde_rubrique_reussi',
- array('archive' => ':<br /><b>'.joli_repertoire("$dir/$nom")."</b> ($n)", 'titre' => "<b>$titre</b>"));
- }
- else
+ array('archive' => ':<br /><b>'.joli_repertoire($dest)."</b> ($n)", 'titre' => "<b>$titre</b>"));
+ } else
$titre = _T('info_sauvegarde_reussi_02',
- array('archive' => ':<br /><b>'.joli_repertoire("$dir/$nom")."</b> ($n)"));
+ array('archive' => ':<br /><b>'.joli_repertoire($dest)."</b> ($n)"));
- $corps = "<p style='text-align: $spip_lang_left'>".
+ include_spip('inc/filtres');
+ return "<p style='text-align: $spip_lang_left'>".
$titre .
- " <a href='" . generer_url_ecrire() . "'>".
+ " <a href='" . $retour . "'>".
_T('info_sauvegarde_reussi_03')
. "</a> "
._T('info_sauvegarde_reussi_04')
- . "</p>\n";
-
- include_spip('inc/filtres');
- $corps .= "<div style='text-align: $spip_lang_right'>"
- . bouton_action(_T("retour"), generer_url_ecrire())
- . "</div>";
-
- // afficher la liste des tables qu'on a sauvegarde
- sort($tables_sauvegardees);
- $n = floor(count($tables_sauvegardees)/2);
- $corps .= "<div style='width:49%;float:left;'><ul><li>" . join('</li><li>', array_slice($tables_sauvegardees,0,$n)) . "</li></ul></div>"
- . "<div style='width:49%;float:left;'><ul><li>" . join('</li><li>', array_slice($tables_sauvegardees,$n)) . "</li></ul></div>"
- . "<div class='nettoyeur'></div>";
- }
- include_spip('inc/minipres');
- echo minipres(_T('info_sauvegarde'), $corps);
- exit;
+ . "</p>\n"
+ . "<div style='text-align: $spip_lang_right'>"
+ . bouton_action(_T("retour"), $retour)
+ . "</div>" ;
}
-
+function export_all_report_tables($tables_sauvegardees)
+{
+ sort($tables_sauvegardees);
+ $n = floor(count($tables_sauvegardees)/2);
+
+ return "<div style='width:49%;float:left;'><ul><li>"
+ . join('</li><li>', array_slice($tables_sauvegardees,0,$n))
+ . "</li></ul></div>"
+ . "<div style='width:49%;float:left;'><ul><li>"
+ . join('</li><li>', array_slice($tables_sauvegardees,$n))
+ . "</li></ul></div>"
+ . "<div class='nettoyeur'></div>";
+}
?>