diff --git a/ecrire/action/export_all.php b/ecrire/action/export_all.php index 25cbcbb6d95d4ca22f7e47d5bdb6008aa1bd5ee0..4a4af12a980953f68ce04aeb057ea28a07be242c 100644 --- a/ecrire/action/export_all.php +++ b/ecrire/action/export_all.php @@ -20,7 +20,7 @@ include_spip('inc/minipres'); function action_export_all_dist() { global $connect_toutes_rubriques ; - + $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); @@ -29,31 +29,28 @@ function action_export_all_dist() if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP)) $dir = _DIR_DUMP; - list($archive, $action) = split('/', $arg); + list($quoi, $gz, $archive) = split(',', $arg); -# var_dump($file); -# var_dump($action); $file = $dir . $archive; -# var_dump($file); -#die(); + spip_log("action $arg $file"); include_spip('inc/meta'); - if ($action=='start'){ - // ecrire le debut du fichier + if ($quoi =='start'){ + // creer l'en tete du fichier et retourner dans l'espace prive include_spip('inc/export'); - ecrire_fichier($file, export_entete(),false); - - lire_metas(); - $status_dump = explode("::",$GLOBALS['meta']["status_dump"]); - $gz = $statut_dump[0]; - // ca demarre - ecrire_meta("status_dump", "$gz::$archive::1::0",'non'); - ecrire_metas(); + if (ecrire_fichier($file, export_entete(),false)) { - // retour a la case depart pour vraiment faire le dump - include_spip('inc/headers'); - redirige_par_entete(_request('redirect')); - } - elseif($action=='end'){ + ecrire_meta("status_dump", "$gz::$archive::1::0",'non'); + ecrire_metas(); + include_spip('inc/headers'); + redirige_par_entete(generer_url_ecrire('export_all')); + } else { + echo "<p>", + _T('avis_erreur_sauvegarde', + array('type'=>'.', 'id_objet'=>'. .')), + "</p>\n"; + exit; + } + }elseif ($quoi=='end'){ effacer_meta("status_dump"); ecrire_metas(); diff --git a/ecrire/exec/export_all.php b/ecrire/exec/export_all.php index 73bba2faff39f860693f6b99622674958807b272..09e63cca5f0bf8d218064cb5e2d15d2092d79a84 100644 --- a/ecrire/exec/export_all.php +++ b/ecrire/exec/export_all.php @@ -59,8 +59,6 @@ $GLOBALS['flag_ob_flush'] = function_exists('ob_flush'); function exec_export_all_dist() { global $connect_toutes_rubriques; - $gz = _request('gz'); - $redirect = generer_url_ecrire("export_all","gz=$gz",true); if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP)) $dir = _DIR_DUMP; @@ -71,74 +69,49 @@ function exec_export_all_dist() $dir = preg_replace(",^" . _DIR_RACINE .",", '', $dir); redirige_par_entete(generer_url_action("test_dirs", "test_dir=$dir", true)); } - + // utiliser une version fraiche des metas (ie pas le cache) include_spip('inc/meta'); lire_metas(); - if (!isset($GLOBALS['meta']["status_dump"])){ - $start = true; - } else{ - $status_dump = explode("::",$GLOBALS['meta']["status_dump"]); - $start = ($status_dump[2]==0)&&($status_dump[3]==0); - $gz = $status_dump[0]; - $archive = $status_dump[1]; - } - $file = $dir . $archive; - - if ($start){ + if (!isset($GLOBALS['meta']["status_dump"])) { + $gz = _request('gz'); $archive = export_nom_fichier_dump($dir,$gz); - $status_dump = "$gz::$archive::0::0"; - ecrire_meta("status_dump", "$status_dump",'non'); - $status_dump = explode("::",$status_dump); - ecrire_metas(); - - // Au cas ou le dernier dump n'aurait pas ete acheve correctement - foreach(preg_files($file . ".part_[0-9]+_[0-9]+") as $dummy) - @unlink($dummy); - $reprise = ''; - // (provisoire) creer l'en tete du fichier + // creer l'en tete du fichier a partir de l'espace public include_spip('inc/headers'); - redirige_par_entete(generer_action_auteur("export_all","$archive/start",$redirect,true)); - //ecrire_fichier($dir.$archive, export_entete(),false,false); + redirige_par_entete(generer_action_auteur("export_all", "start,$gz,$archive", '', true)); } - else - $reprise = " (" . $status_dump[2] . ", " . $status_dump[3] . ")"; + + list($gz, $archive, $etape_actuelle, $sous_etape) = + explode("::",$GLOBALS['meta']["status_dump"]); + + $file = $dir . $archive; + $redirect = generer_url_ecrire("export_all"); + + if (!$etape_actuelle AND !$sous_etape) { + $l = preg_files($file . ".part_[0-9]+_[0-9]+"); + if ($l) { + spip_log("menage d'une sauvegarde inachevee: " . join(',', $l)); + foreach($l as $dummy)@unlink($dummy); + } + } list($tables_for_dump, $tables_for_link) = export_all_list_tables(); - $status_dump = explode("::",$GLOBALS['meta']["status_dump"]); - $etape_actuelle = $status_dump[2]; - $sous_etape = $status_dump[3]; $all = count($tables_for_dump); - // Pour avoir les valeurs de _DIR_IMG etc relatives a l'espace public - // la phase finale de reunion des fichiers en un seul est faite la-bas - - ramasse_parties($dir.$archive, $dir.$archive); + // concatenation des fichiers crees a l'appel precedent + ramasse_parties($file, $file); - if ($etape_actuelle > $all){ // au timeout - ecrire_fichier($dir.$archive, export_enpied(),false,false); + if ($etape_actuelle > $all){ + // l'appel precedent avait fini le boulot. mettre l'en-pied. + ecrire_fichier($file, export_enpied(),false,false); include_spip('inc/headers'); - redirige_par_entete(generer_action_auteur("export_all","$archive/end",'',true)); + redirige_par_entete(generer_action_auteur("export_all","end,$gz,$archive",'',true)); } echo install_debut_html(_T('info_sauvegarde') . " ($all)"); - $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); - - if ($GLOBALS['flag_ob_flush']) ob_flush(); - flush(); if (!($timeout = ini_get('max_execution_time')*1000)); $timeout = 30000; // parions sur une valeur tellement courante ... @@ -146,14 +119,17 @@ function exec_export_all_dist() // script de rechargement auto sur timeout echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".$redirect."\";',$timeout);</script>\n"); + if ($GLOBALS['flag_ob_flush']) ob_flush(); + flush(); + echo "<div style='text-align: left'>\n"; $etape = 1; // Instancier une fois pour toutes, car on va boucler un max. if (isset($GLOBALS['EXPORT_logos']) && $GLOBALS['EXPORT_logos']==true) $GLOBALS['chercher_logo'] = charger_fonction('chercher_logo', 'inc',true); - else - $GLOBALS['chercher_logo'] = false; + else $GLOBALS['chercher_logo'] = false; + foreach($tables_for_dump as $table){ if ($etape_actuelle <= $etape) { $r = spip_query("SELECT COUNT(*) FROM $table"); @@ -167,7 +143,11 @@ function exec_export_all_dist() flush(); $sous_etape = 0; } - $etape++; + $etape++; + $status_dump = "$gz::$archive::" . $etape . "::0"; + // on se contente d'une ecriture en base pour aller plus vite + // a la relecture on en profitera pour mettre le cache a jour + ecrire_meta("status_dump", $status_dump,'non'); } echo "</div>\n"; // si Javascript est dispo, anticiper le Time-out diff --git a/ecrire/inc/export.php b/ecrire/inc/export.php index 67311df955c2c32c7ac8019901fe7f7ce40c3c70..2a7ef7473268e57a4bf37a127ddb06e38ac2ad9b 100644 --- a/ecrire/inc/export.php +++ b/ecrire/inc/export.php @@ -74,6 +74,10 @@ function export_objets($table, $etape, $cpt, $dir, $archive, $gz, $total) { while (1){ // on ne connait pas le nb de paquets d'avance $string = build_while($debut, $table, $prim); + $cpt++; + $debut += _EXPORT_TRANCHES_LIMITE; + $status_dump = "$gz::$archive::$etape::$cpt"; + // attention $string vide ne suffit pas a sortir // car les admins restreints peuvent parcourir // une portion de table vide pour eux. @@ -81,33 +85,23 @@ function export_objets($table, $etape, $cpt, $dir, $archive, $gz, $total) { // on ecrit dans un fichier generique // puis on le renomme pour avoir une operation atomique ecrire_fichier ($temp = $filetable . '.temp' . _EXTENSION_PARTIES, $string); - // le fichier destination peut deja exister si on sort d'un timeout entre le rename et le ecrire_meta + // le fichier destination peut deja exister + // si on sort d'un timeout entre le rename et le ecrire_meta if (file_exists($f = $filetable . sprintf('_%04d',$cpt) . _EXTENSION_PARTIES)) @unlink($f); rename($temp, $f); } - $cpt++; - $status_dump = "$gz::$archive::$etape::$cpt"; // on se contente d'une ecriture en base pour aller plus vite // a la relecture on en profitera pour mettre le cache a jour ecrire_meta("status_dump", $status_dump,'non'); - - $debut = $cpt * _EXPORT_TRANCHES_LIMITE; if ($debut >= $total) {break;} echo " $debut"; - } echo " $total."; # on prefere ne pas faire le ramassage ici de peur d'etre interrompu par le timeout au mauvais moment # le ramassage aura lieu en debut de hit suivant, et ne sera normalement pas interrompu car le temps pour ramasser # est plus court que le temps pour creer les parties - # ramasse_parties($dir.$archive, $dir.$archive); - - $status_dump = "$gz::$archive::" . ($etape+1) . "::0"; - // on se contente d'une ecriture en base pour aller plus vite - // a la relecture on en profitera pour mettre le cache a jour - ecrire_meta("status_dump", $status_dump,'non'); - + // ramasse_parties($dir.$archive, $dir.$archive); } // Construit la version xml des champs d'une table