Skip to content
Extraits de code Groupes Projets
Valider 6d961d79 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

"retour du dump mixant toutes les contraintes (sauvegardes partielles des...

"retour du dump mixant toutes les contraintes (sauvegardes partielles des admin restreints, interruption/reprise en cours pour les grosses bases)
les parties sont en .gz par defaut, meme si le dump final est non comprimee
la sauvegarde des logos est desactivee par defaut, il suffit de mettre 
la globale $EXPORT_logos=true pour les sauvegarder
Cela meritera une checkbox, comme pour la restauration/fusion"
parent 9dc14f7c
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -21,43 +21,68 @@ function action_export_all_dist() ...@@ -21,43 +21,68 @@ function action_export_all_dist()
{ {
global $connect_toutes_rubriques ; global $connect_toutes_rubriques ;
$securiser_action = charger_fonction('securiser_action', 'inc'); $securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action(); $arg = $securiser_action();
// determine upload va aussi initialiser connect_toutes_rubrique // determine upload va aussi initialiser connect_toutes_rubrique
$dir = determine_upload(); $dir = determine_upload();
if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP)) if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP))
$dir = _DIR_DUMP; $dir = _DIR_DUMP;
list($file, $nb) = split('/', $arg); list($archive, $action) = split('/', $arg);
$file = $dir . $file;
//$files = ramasse_parties($file, $file, $nb, true);
effacer_meta("status_dump"); # var_dump($file);
ecrire_metas(); # var_dump($action);
$file = $dir . $archive;
$n = _T('taille_octets', # var_dump($file);
array('taille' => number_format(filesize($file), 0, ' ', ' '))); #die();
$n = _T('info_sauvegarde_reussi_02', include_spip('inc/meta');
array('archive' => ':<br /><b>'.joli_repertoire($file)."</b> ($n)")); if ($action=='start'){
// ecrire le debut du fichier
echo install_debut_html(_T('info_sauvegarde')); include_spip('inc/export');
if (!$files) { ecrire_fichier($file, export_entete(),false);
echo _T('avis_erreur_sauvegarde', array('type'=>'.', 'id_objet'=>'. .'));
lire_metas();
} else { $status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
// ne pas effrayer inutilement: il peut y avoir moins de fichiers $gz = $statut_dump[0];
// qu'annonce' si certains etaient vides // ca demarre
ecrire_meta("status_dump", "$gz::$archive::1::0",'non');
ecrire_metas();
// retour a la case depart pour vraiment faire le dump
include_spip('inc/headers');
redirige_par_entete(_request('redirect'));
}
elseif($action=='end'){
echo "<!--", join("\n", $files), '-->'; effacer_meta("status_dump");
echo "<p style='text-align: left'>". ecrire_metas();
$n,
" <a href='" . _DIR_RESTREINT . "'>". $size = 0;
_T('info_sauvegarde_reussi_03') if (file_exists($file))
. "</a> " $size = filesize($file);
._T('info_sauvegarde_reussi_04') $n = _T('taille_octets',
. "</p>\n"; array('taille' => number_format($size, 0, ' ', ' ')));
$n = _T('info_sauvegarde_reussi_02',
array('archive' => ':<br /><b>'.joli_repertoire($file)."</b> ($n)"));
echo install_debut_html(_T('info_sauvegarde'));
if (!$size) {
echo _T('avis_erreur_sauvegarde', array('type'=>'.', 'id_objet'=>'. .'));
} else {
// ne pas effrayer inutilement: il peut y avoir moins de fichiers
// qu'annonce' si certains etaient vides
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();
} }
echo install_fin_html();
} }
?> ?>
\ No newline at end of file
...@@ -58,7 +58,9 @@ $GLOBALS['flag_ob_flush'] = function_exists('ob_flush'); ...@@ -58,7 +58,9 @@ $GLOBALS['flag_ob_flush'] = function_exists('ob_flush');
// http://doc.spip.org/@exec_export_all_dist // http://doc.spip.org/@exec_export_all_dist
function exec_export_all_dist() function exec_export_all_dist()
{ {
global $archive, $gz, $connect_toutes_rubriques; 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)) if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP))
$dir = _DIR_DUMP; $dir = _DIR_DUMP;
...@@ -69,10 +71,7 @@ function exec_export_all_dist() ...@@ -69,10 +71,7 @@ function exec_export_all_dist()
$dir = preg_replace(",^" . _DIR_RACINE .",", '', $dir); $dir = preg_replace(",^" . _DIR_RACINE .",", '', $dir);
redirige_par_entete(generer_url_action("test_dirs", "test_dir=$dir", true)); redirige_par_entete(generer_url_action("test_dirs", "test_dir=$dir", true));
} }
if (!$archive) $archive = export_nom_fichier_dump($dir,$gz);
$file = $dir . $archive;
// utiliser une version fraiche des metas (ie pas le cache) // utiliser une version fraiche des metas (ie pas le cache)
include_spip('inc/meta'); include_spip('inc/meta');
lire_metas(); lire_metas();
...@@ -81,27 +80,28 @@ function exec_export_all_dist() ...@@ -81,27 +80,28 @@ function exec_export_all_dist()
$start = true; $start = true;
} else{ } else{
$status_dump = explode("::",$GLOBALS['meta']["status_dump"]); $status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
if (($status_dump[0]!=$gz)||($status_dump[1]!=$archive)) $start = ($status_dump[2]==0)&&($status_dump[3]==0);
$start = true; $gz = $status_dump[0];
else $archive = $status_dump[1];
$start = ($status_dump[2]==0)&&($status_dump[3]==0);
} }
$file = $dir . $archive;
if ($start){ if ($start){
$status_dump = "$gz::$archive::1::0"; $archive = export_nom_fichier_dump($dir,$gz);
$status_dump = "$gz::$archive::0::0";
ecrire_meta("status_dump", "$status_dump",'non'); ecrire_meta("status_dump", "$status_dump",'non');
$status_dump = explode("::",$status_dump); $status_dump = explode("::",$status_dump);
ecrire_metas(); ecrire_metas();
// Au cas ou le dernier dump n'aurait pas ete acheve correctement // Au cas ou le dernier dump n'aurait pas ete acheve correctement
foreach(preg_files($file . ".part_[0-9]+_[0-9]+") as $dummy)
foreach(preg_files($file . ".part\.[0-9]*") as $dummy)
@unlink($dummy); @unlink($dummy);
$reprise = ''; $reprise = '';
// creer l'en tete du fichier // (provisoire) creer l'en tete du fichier
ecrire_fichier($dir.$archive, export_entete(),false,false); include_spip('inc/headers');
redirige_par_entete(generer_action_auteur("export_all","$archive/start",$redirect,true));
//ecrire_fichier($dir.$archive, export_entete(),false,false);
} }
else else
$reprise = " (" . $status_dump[2] . ", " . $status_dump[3] . ")"; $reprise = " (" . $status_dump[2] . ", " . $status_dump[3] . ")";
...@@ -115,15 +115,13 @@ function exec_export_all_dist() ...@@ -115,15 +115,13 @@ function exec_export_all_dist()
// Pour avoir les valeurs de _DIR_IMG etc relatives a l'espace public // 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 // la phase finale de reunion des fichiers en un seul est faite la-bas
$href = generer_action_auteur("export_all","$archive/$all",'',true);
ramasse_parties($dir.$archive, $dir.$archive); ramasse_parties($dir.$archive, $dir.$archive);
if ($etape_actuelle > $all){ // au timeout if ($etape_actuelle > $all){ // au timeout
ecrire_fichier($dir.$archive, export_enpied(),false,false); ecrire_fichier($dir.$archive, export_enpied(),false,false);
include_spip('inc/headers'); include_spip('inc/headers');
redirige_par_entete($href); redirige_par_entete(generer_action_auteur("export_all","$archive/end",'',true));
} }
echo install_debut_html(_T('info_sauvegarde') . " ($all)"); echo install_debut_html(_T('info_sauvegarde') . " ($all)");
...@@ -146,13 +144,16 @@ function exec_export_all_dist() ...@@ -146,13 +144,16 @@ function exec_export_all_dist()
$timeout = 30000; // parions sur une valeur tellement courante ... $timeout = 30000; // parions sur une valeur tellement courante ...
if ($start) $timeout = round($timeout/2); if ($start) $timeout = round($timeout/2);
// script de rechargement auto sur timeout // 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"); echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".$redirect."\";',$timeout);</script>\n");
echo "<div style='text-align: left'>\n"; echo "<div style='text-align: left'>\n";
$etape = 1; $etape = 1;
// Instancier une fois pour toutes, car on va boucler un max. // Instancier une fois pour toutes, car on va boucler un max.
$GLOBALS['chercher_logo'] = charger_fonction('chercher_logo', 'inc',true); if (isset($GLOBALS['EXPORT_logos']) && $GLOBALS['EXPORT_logos']==true)
$GLOBALS['chercher_logo'] = charger_fonction('chercher_logo', 'inc',true);
else
$GLOBALS['chercher_logo'] = false;
foreach($tables_for_dump as $table){ foreach($tables_for_dump as $table){
if ($etape_actuelle <= $etape) { if ($etape_actuelle <= $etape) {
$r = spip_query("SELECT COUNT(*) FROM $table"); $r = spip_query("SELECT COUNT(*) FROM $table");
...@@ -160,10 +161,8 @@ function exec_export_all_dist() ...@@ -160,10 +161,8 @@ function exec_export_all_dist()
$r = $r[0]; $r = $r[0];
echo "\n<br /><strong>",$etape, '. ', $table,"</strong> "; echo "\n<br /><strong>",$etape, '. ', $table,"</strong> ";
if (!$r) echo _T('texte_vide'); if (!$r) echo _T('texte_vide');
else { else
$liens = $tables_for_link[$table]; export_objets($table, $etape, $sous_etape,$dir, $archive, $gz, $r);
export_objets($table, $liens, $etape, $sous_etape,$dir, $archive, $gz, $r);
}
if ($GLOBALS['flag_ob_flush']) ob_flush(); if ($GLOBALS['flag_ob_flush']) ob_flush();
flush(); flush();
$sous_etape = 0; $sous_etape = 0;
...@@ -172,7 +171,7 @@ function exec_export_all_dist() ...@@ -172,7 +171,7 @@ function exec_export_all_dist()
} }
echo "</div>\n"; echo "</div>\n";
// si Javascript est dispo, anticiper le Time-out // si Javascript est dispo, anticiper le Time-out
echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"$href\";',0);</script>\n"); echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"$redirect\";',0);</script>\n");
echo install_fin_html(); echo install_fin_html();
} }
......
...@@ -35,7 +35,7 @@ function ramasse_parties($archive, $partfile, $files = array()){ ...@@ -35,7 +35,7 @@ function ramasse_parties($archive, $partfile, $files = array()){
$files_o = array(); $files_o = array();
if (!count($files)) if (!count($files))
$files = preg_files(dirname($archive)."/",basename($partfile).".part_[0-9]+_[0-9]+"); $files = preg_files(dirname($archive)."/",basename($partfile).".part_[0-9]+_[0-9]+[.gz]?");
$ok = true; $ok = true;
foreach($files as $f) { foreach($files as $f) {
$contenu = ""; $contenu = "";
...@@ -46,14 +46,11 @@ function ramasse_parties($archive, $partfile, $files = array()){ ...@@ -46,14 +46,11 @@ function ramasse_parties($archive, $partfile, $files = array()){
unlink($f); unlink($f);
$files_o[]=$f; $files_o[]=$f;
} }
if ($fin AND $ok)
$ok = ecrire_fichier($archive, export_enpied(),false,false);
return $ok ? $files_o : false; return $ok ? $files_o : false;
} }
define('_EXPORT_TRANCHES_LIMITE', 400); define('_EXPORT_TRANCHES_LIMITE', 400);
define('_EXTENSION_PARTIES', '.gz');
// //
// Exportation de table SQL au format xml // Exportation de table SQL au format xml
...@@ -65,10 +62,10 @@ define('_EXPORT_TRANCHES_LIMITE', 400); ...@@ -65,10 +62,10 @@ define('_EXPORT_TRANCHES_LIMITE', 400);
// et on memorise dans le serveur qu'on va passer a la table suivante. // et on memorise dans le serveur qu'on va passer a la table suivante.
// http://doc.spip.org/@export_objets // http://doc.spip.org/@export_objets
function export_objets($table, $liens, $etape, $cpt, $dir, $archive, $gz, $total) { function export_objets($table, $etape, $cpt, $dir, $archive, $gz, $total) {
global $tables_principales; global $tables_principales;
$filetable = $dir . $archive . '.part_' . sprintf('%3d',$etape); $filetable = $dir . $archive . '.part_' . sprintf('%03d',$etape);
$prim = isset($tables_principales[$table]) $prim = isset($tables_principales[$table])
? $tables_principales[$table]['key']["PRIMARY KEY"] ? $tables_principales[$table]['key']["PRIMARY KEY"]
: ''; : '';
...@@ -83,24 +80,29 @@ function export_objets($table, $liens, $etape, $cpt, $dir, $archive, $gz, $total ...@@ -83,24 +80,29 @@ function export_objets($table, $liens, $etape, $cpt, $dir, $archive, $gz, $total
if ($string) { if ($string) {
// on ecrit dans un fichier generique // on ecrit dans un fichier generique
// puis on le renomme pour avoir une operation atomique // puis on le renomme pour avoir une operation atomique
ecrire_fichier ($filetable . '.temp', $string); 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('_%4d',$cpt))) @unlink($f); if (file_exists($f = $filetable . sprintf('_%04d',$cpt) . _EXTENSION_PARTIES)) @unlink($f);
rename($filetable . '.temp', $f); rename($temp, $f);
} }
$cpt++; $cpt++;
$status_dump = "$gz::$archive::$etape::$cpt"; $status_dump = "$gz::$archive::$etape::$cpt";
// on se contente d'une ecriture en base pour aller plus vite // on se contente d'une ecriture en base pour aller plus vite
// a la relecture on en profitera pour mettre le cache a jour // a la relecture on en profitera pour mettre le cache a jour
ecrire_meta("status_dump", $status_dump,'non'); ecrire_meta("status_dump", $status_dump,'non');
//die();
$debut = $cpt * _EXPORT_TRANCHES_LIMITE; $debut = $cpt * _EXPORT_TRANCHES_LIMITE;
if ($debut >= $total) {break;} if ($debut >= $total) {break;}
echo " $debut"; echo " $debut";
} }
echo " $total."; echo " $total.";
ramasse_parties($dir.$archive, $dir.$archive);
# 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"; $status_dump = "$gz::$archive::" . ($etape+1) . "::0";
// on se contente d'une ecriture en base pour aller plus vite // on se contente d'une ecriture en base pour aller plus vite
// a la relecture on en profitera pour mettre le cache a jour // a la relecture on en profitera pour mettre le cache a jour
......
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