diff --git a/.gitattributes b/.gitattributes index 367490a7ffbb7dbf9f2cc1bb51da54e2eb90f533..650869feacdfd11e4966492f848178c58d8b082b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -333,6 +333,7 @@ ecrire/action/editer_mot.php -text ecrire/action/editer_rubrique.php -text ecrire/action/editer_signatures.php -text ecrire/action/editer_site.php -text +ecrire/action/export_all.php -text ecrire/action/ical.php -text ecrire/action/iconifier.php -text ecrire/action/instituer_article.php -text diff --git a/ecrire/action/export_all.php b/ecrire/action/export_all.php new file mode 100644 index 0000000000000000000000000000000000000000..b7e0ffba8bac563b2a87a266e94963710cf89b3d --- /dev/null +++ b/ecrire/action/export_all.php @@ -0,0 +1,66 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2007 * + * 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; + +include_spip('inc/export'); +include_spip('inc/actions'); +include_spip('inc/minipres'); + +function action_export_all_dist() +{ + global $gz, $connect_toutes_rubriques ; + + $securiser_action = charger_fonction('securiser_action', 'inc'); + $arg = $securiser_action(); + + // determine upload va aussi initialiser connect_toutes_rubrique + $dir = determine_upload(); + if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP)) + $dir = _DIR_DUMP; + + $file = $dir . $arg; + spip_log("actionexp $file"); + $f = ($gz) ? gzopen($file, "ab") : fopen($file, "ab"); + $_fputs = ($gz) ? gzputs : fputs; + $_fputs($f, export_entete()); + + if ($GLOBALS['flag_ob_flush']) ob_flush(); + flush(); + + $files = ramasse_parties($file, $gz, $file . ".part"); + + $_fputs ($f, build_end_tag("SPIP")."\n"); + if ($gz) gzclose($f); else fclose($f); + + effacer_meta("status_dump"); + ecrire_metas(); + + $n = _T('taille_octets', + array('taille' => number_format(filesize($file), 0, ' ', ' '))); + $n = _T('info_sauvegarde_reussi_02', + array('archive' => ':<br /><b>'.joli_repertoire($file)."</b> ($n)")); + + echo install_debut_html(_T('info_sauvegarde')); + // ne pas effrayer inutilement: il peut y avoir moins de fichiers + // qu'annonce' si certains etaient vides +# echo "<ul><li>", join('</li><li>', $files), '</li></ul>'; + echo "<p style='text-align: left'>". + $n, + " <a href='" . _DIR_RESTREINT . "'>". + _T('info_sauvegarde_reussi_03') + . "</a> " + ._T('info_sauvegarde_reussi_04') + . "</p>\n"; + echo install_fin_html(); +} +?> \ No newline at end of file diff --git a/ecrire/exec/export_all.php b/ecrire/exec/export_all.php index 04239c7fa8e6ef03516bb85808f97f84380231e2..f09ff902689b8aa5a15b2681c846dce412871be5 100644 --- a/ecrire/exec/export_all.php +++ b/ecrire/exec/export_all.php @@ -13,8 +13,6 @@ if (!defined("_ECRIRE_INC_VERSION")) return; @ini_set("zlib.output_compression","0"); // pour permettre l'affichage au fur et a mesure -$GLOBALS['version_archive'] = '1.3'; - include_spip('base/serial'); include_spip('base/auxiliaires'); include_spip('inc/indexation'); // pour la fonction primary_index_table @@ -60,7 +58,7 @@ $GLOBALS['flag_ob_flush'] = function_exists('ob_flush'); // http://doc.spip.org/@exec_export_all_dist function exec_export_all_dist() { - global $archive, $debut_limit, $etape, $gz, $spip_version, $spip_version_affichee, $version_archive, $connect_login, $connect_toutes_rubriques; + global $archive, $etape, $gz, $connect_toutes_rubriques; if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP)) $dir = _DIR_DUMP; @@ -71,19 +69,18 @@ function exec_export_all_dist() $dir = preg_replace(",^" . _DIR_RACINE .",", '', $dir); redirige_par_entete(generer_url_action("test_dirs", "test_dir=$dir", true)); } - if (!$archive) - $archive = export_nom_fichier_dump($dir,$gz); + if (!$archive) $archive = export_nom_fichier_dump($dir,$gz); + $file = $dir . $archive; + $partfile = $file . ".part"; // utiliser une version fraiche des metas (ie pas le cache) include_spip('inc/meta'); lire_metas(); - $action = _T('info_exportation_base', array('archive' => $archive)); if (!isset($GLOBALS['meta']["status_dump"])){ - $start = true; - } - else{ + $start = true; + } else{ $status_dump = explode("::",$GLOBALS['meta']["status_dump"]); if (($status_dump[0]!=$gz)||($status_dump[1]!=$archive)) $start = true; @@ -91,54 +88,88 @@ function exec_export_all_dist() $start = ($status_dump[2]==0)&&($status_dump[3]==0); } - echo install_debut_html(_T('info_sauvegarde')); - - $file = $dir . $archive; - $partfile = $file . ".part"; - - //if (!$etape) echo "<p><blockquote><font size=2>"._T('info_sauvegarde_echouee')." <a href='" . generer_url_ecrire("export_all","reinstall=non&etape=1&gz=$gz") . "'>"._T('info_procedez_par_etape')."</a></font></blockquote><p>"; - - $_fputs = ($gz) ? gzputs : fputs; - if ($start){ $status_dump = "$gz::$archive::0::0"; ecrire_meta("status_dump", "$status_dump",'non'); $status_dump = explode("::",$status_dump); ecrire_metas(); - // un ramassage preventif au cas ou le dernier dump n'aurait pas ete acheve correctement - #ramasse_parties(_DIR_DUMP . $archive, $gz, _DIR_DUMP . $partfile); - // et au cas ou (le rammase_parties s'arrete si un fichier de la serie est absent) - // on ratisse large avec un preg_files - $liste = preg_files($file . ".part\.[0-9]*"); - foreach($liste as $dummy) + +// Au cas ou le dernier dump n'aurait pas ete acheve correctement + + foreach(preg_files($file . ".part\.[0-9]*") as $dummy) @unlink($dummy); - echo "<p>"._T("info_sauvegarde")."</p>\n"; - $f = ($gz) ? gzopen($file, "wb") : fopen($file, "wb"); - if (!$f) { - echo "<p>"._T('avis_erreur_sauvegarde', array('type'=>'.', 'id_objet'=>'. .'))."</p>\n"; - exit; - } + $reprise = ''; + } else $reprise = " (" . $status_dump[2] . ", " . $status_dump[3] . ")"; - $_fputs($f, "<"."?xml version=\"1.0\" encoding=\"".$GLOBALS['meta']['charset']."\"?".">\n<SPIP version=\"$spip_version_affichee\" version_base=\"$spip_version\" version_archive=\"$version_archive\">\n\n"); - if ($gz) gzclose($f); - else fclose($f); + echo install_debut_html(_T('info_sauvegarde')); + echo "<p>",_T("info_sauvegarde"), $reprise, "</p>\n"; + $f = ($gz) ? gzopen($file, "ab") : fopen($file, "ab"); + if (!$f) { + echo "<p>", + _T('avis_erreur_sauvegarde', + array('type'=>'.', 'id_objet'=>'. .')), + "</p>\n"; + exit; } - else{ // reprise - echo "<p>"._T("info_sauvegarde"). " (" . $status_dump[2] . ", " . $status_dump[3] . ")</p>\n"; - $f = ($gz) ? gzopen($file, "ab") : fopen($file, "ab"); - if (!$f) { - echo "<p>"._T('avis_erreur_sauvegarde', array('type'=>'.', 'id_objet'=>'. .'))."</p>\n"; - exit; + + $_fputs = ($gz) ? gzputs : fputs; + if ($gz) gzclose($f); else fclose($f); + + list($tables_for_dump, $tables_for_link) = export_all_list_tables(); + + if ($GLOBALS['flag_ob_flush']) ob_flush(); + flush(); + + $status_dump = explode("::",$GLOBALS['meta']["status_dump"]); + $etape = $status_dump[2]; + + if ($etape < count($tables_for_dump)){ + + if (!($timeout = ini_get('max_execution_time')*1000)); + $timeout = 30000; // parions sur une valeur tellement courante ... + if ($start) $timeout = round($timeout/2); + // script de rechargement auto sur timeout + echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".generer_url_ecrire("export_all","archive=$archive&gz=$gz",true)."\";',$timeout);</script>\n"); + $cpt = 0; + $paquets = 400; // nombre d'enregistrements dans chaque paquet + echo "<div style='text-align: left'>\n"; + foreach($tables_for_dump as $i=>$table){ + // par paquets + list($string,$status_dump)=export_objets($table, primary_index_table($table), $tables_for_link[$table],0, false, $i, _T("info_sauvegarde").", $table",$paquets); + while ($string!=''){ + + // on ecrit dans un fichier generique + ecrire_fichier ($partfile, $string); + // on le renomme avec un numero -> operation atomique en linux + rename($partfile,$partfile.".$cpt"); + $cpt ++; + ecrire_meta("status_dump", implode("::",$status_dump),'non'); + #lire_metas(); + list($string,$status_dump)=export_objets($table, primary_index_table($table), $tables_for_link[$table],0, false, $i, _T("info_sauvegarde").", $table",$paquets); + } + ecrire_meta("status_dump", implode("::",$status_dump),'non'); + #lire_metas(); } - if ($gz) gzclose($f); - else fclose($f); + echo "</div>\n"; } + + // Reunir les fichiers en un seul, mais dans l'espace public + // pour avoir les valeurs de _DIR_IMG etc relatif a lui + $href = generer_action_auteur("export_all",$archive,'',true); + + echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"$href\";',0);</script>\n"); + echo install_fin_html(); + +} + +// construction de la liste des tables pour le dump : +// toutes les tables principales +// + toutes les tables auxiliaires hors relations +// + les tables relations dont les deux tables liees sont dans la liste - // construction de la liste des tables pour le dump : - // toutes les tables principales - // + toutes les tables auxiliaires hors relations - // + les tables relations dont les deux tables liees sont dans la liste +function export_all_list_tables() +{ $tables_for_dump = array(); $tables_pointees = array(); global $EXPORT_tables_noexport; @@ -147,10 +178,10 @@ function exec_export_all_dist() global $table_des_tables; global $tables_jointures; - // on construit un index des tables de liens - // pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees +// on construit un index des tables de liens +// pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees $tables_for_link = array(); - foreach($tables_jointures as $table=>$liste_relations) + foreach($tables_jointures as $table => $liste_relations) if (is_array($liste_relations)) { $nom = $table; @@ -170,7 +201,7 @@ function exec_export_all_dist() $liste_tables = array_merge(array_keys($tables_principales),array_keys($tables_auxiliaires)); foreach($liste_tables as $table){ - $name = preg_replace("{^spip_}","",$table); + // $name = preg_replace("{^spip_}","",$table); if ( !isset($tables_pointees[$table]) && !in_array($table,$EXPORT_tables_noexport) && !isset($tables_for_link[$table])){ @@ -189,68 +220,8 @@ function exec_export_all_dist() # que des liens array_unshift($tables_for_dump,$link_table); } + return array($tables_for_dump, $tables_for_link); +} - if ($GLOBALS['flag_ob_flush']) ob_flush(); - flush(); - - $status_dump = explode("::",$GLOBALS['meta']["status_dump"]); - $etape = $status_dump[2]; - - if ($etape >= count($tables_for_dump)){ - echo "<ul>\n"; - foreach($tables_for_dump as $i=>$table){ - // appel simplement pour l'affichage. Rien n'est fait puisqu'on a fini - export_objets($table, primary_index_table($table), $tables_for_link[$table], 0, false, $i, _T("info_sauvegarde").", $table"); - } - echo "</ul>\n"; - - if ($GLOBALS['flag_ob_flush']) ob_flush(); - flush(); - ramasse_parties($file, $gz, $partfile); - - $f = ($gz) ? gzopen($file, "ab") : fopen($file, "ab"); - $_fputs ($f, build_end_tag("SPIP")."\n"); - if ($gz) gzclose($f); - else fclose($f); - - effacer_meta("status_dump"); - ecrire_metas(); - echo "<p><b>"._T('info_sauvegarde_reussi_01')."</b></p><p>"._T('info_sauvegarde_reussi_02', array('archive' => '<b>'.joli_repertoire($file).'</b>'))." <a href='./'>"._T('info_sauvegarde_reussi_03')."</a> "._T('info_sauvegarde_reussi_04')."</p>\n"; - } - else{ - if (!($timeout = ini_get('max_execution_time')*1000)); - $timeout = 30000; // parions sur une valeur tellement courante ... - if ($start) $timeout = round($timeout/2); - // script de rechargement auto sur timeout - echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".generer_url_ecrire("export_all","archive=$archive&gz=$gz",true)."\";',$timeout);</script>\n"); - $cpt = 0; - $paquets = 400; // nombre d'enregistrements dans chaque paquet - echo "<ul>\n"; - foreach($tables_for_dump as $i=>$table){ - // par paquets - list($string,$status_dump)=export_objets($table, primary_index_table($table), $tables_for_link[$table],0, false, $i, _T("info_sauvegarde").", $table",$paquets); - while ($string!=''){ - if ($cpt == 0) - ramasse_parties($file, $gz, $partfile); - - // on ecrit dans un fichier generique - ecrire_fichier ($partfile, $string); - // on le renomme avec un numero -> operation atomique en linux - rename($partfile,$partfile.".$cpt"); - $cpt ++; - ecrire_meta("status_dump", implode("::",$status_dump),'non'); - #lire_metas(); - list($string,$status_dump)=export_objets($table, primary_index_table($table), $tables_for_link[$table],0, false, $i, _T("info_sauvegarde").", $table",$paquets); - } - ecrire_meta("status_dump", implode("::",$status_dump),'non'); - #lire_metas(); - } - echo "</ul>\n"; - // pour recharger la page tout de suite en finir le ramassage - echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".str_replace("&","&",generer_url_ecrire("export_all","archive=$archive&gz=$gz"))."\";',0);</script>\n"); - } - - echo install_fin_html(); -} ?> diff --git a/ecrire/inc/export.php b/ecrire/inc/export.php index e2a185c7a2fad0341a62a2bafc7a9de7acd9a5ea..cb6571564f4b5d3b558711f00c95875dc3f14a25 100644 --- a/ecrire/inc/export.php +++ b/ecrire/inc/export.php @@ -12,6 +12,8 @@ if (!defined("_ECRIRE_INC_VERSION")) return; +$GLOBALS['version_archive'] = '1.3'; + // http://doc.spip.org/@export_nom_fichier_dump function export_nom_fichier_dump($dir,$gz=true){ $archive = _SPIP_DUMP; @@ -29,6 +31,7 @@ function ramasse_parties($archive, $gz, $partfile){ // a ameliorer par un preg_file // si le rammassage est interrompu par un timeout, on perd des morceaux $cpt=0; + $files = array(); while(file_exists($f = $partfile.".$cpt")){ $contenu = ""; if (lire_fichier ($f, $contenu)) @@ -38,8 +41,10 @@ function ramasse_parties($archive, $gz, $partfile){ exit; } unlink($f); + $files[]=$f; $cpt++; } + return $files; } // @@ -61,13 +66,12 @@ function export_objets($table, $primary, $liens, $file = 0, $gz = false, $etape_ $row = spip_fetch_array($result,SPIP_NUM); $total = $row[0]; $debut = $pos_in_table; - if (!isset($etape_affichee[$etape_actuelle])){ - echo "<li><strong>$etape_actuelle-$nom_etape</strong>"; + if (!isset($etape_affichee[$etape_actuelle]) AND $total){ + echo "<br /><strong>$etape_actuelle-$nom_etape</strong>"; echo " : $total"; $etape_affichee[$etape_actuelle] = 1; - if ($limit<$total) echo "</li>"; } - if ($pos_in_table!=0) + if ($pos_in_table!=0 AND $total) echo "| ", $pos_in_table; if ($GLOBALS['flag_ob_flush']) ob_flush(); flush(); @@ -88,7 +92,7 @@ function export_objets($table, $primary, $liens, $file = 0, $gz = false, $etape_ if ($pos_in_table>=$total){ // etape suivante : - echo " ok"; + if ($total) echo " ok"; $status_dump[2] = $status_dump[2]+1; $status_dump[3] = 0; } @@ -101,8 +105,8 @@ function export_objets($table, $primary, $liens, $file = 0, $gz = false, $etape_ } spip_free_result($result); return array($string,$status_dump); - } - else if ($etape_actuelle < $etape_en_cours) { + } else { + if ($etape_actuelle < $etape_en_cours) { if (!isset($etape_affichee[$etape_actuelle])) echo "<li>", $etape_actuelle,'-',$nom_etape,"</li>"; if ($GLOBALS['flag_ob_flush']) ob_flush(); @@ -113,6 +117,7 @@ function export_objets($table, $primary, $liens, $file = 0, $gz = false, $etape_ if ($GLOBALS['flag_ob_flush']) ob_flush(); flush(); } + } return array($string,$status_dump); } @@ -166,4 +171,21 @@ function text_to_xml($string) { return str_replace('<', '<', str_replace('&', '&', $string)); } +// production de l'entete du fichier d'archive + +function export_entete() +{ + return +"<" . "?xml version=\"1.0\" encoding=\"". +$GLOBALS['meta']['charset']."\"?".">\n" . +"<SPIP + version=\"" . $GLOBALS['spip_version_affichee'] . "\" + version_base=\"" . $GLOBALS['spip_version'] . "\" + version_archive=\"" . $GLOBALS['version_archive'] . "\" + adresse_site=\"" . $GLOBALS['meta']["adresse_site"] . "\" + dir_img=\"" . _DIR_IMG . "\" + dir_logos=\"" . _DIR_LOGOS . "\" +>\n"; +} + ?>