Skip to content
Extraits de code Groupes Projets
Valider 821285bf rédigé par esj's avatar esj
Parcourir les fichiers

La sauvegarde pour admin restreint faisait mauvais ménage avec la sauvegarde...

La sauvegarde pour admin restreint faisait mauvais ménage avec la sauvegarde par tranche (ca remonte à loin): si jamais toute une tranche ne concernait pas cet admin, la table était abandonnée et pire encore, les tables suivantes n'étaient explorées qu'à partir de ce numéro de tranche!
parent 5ba2e065
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -16,7 +16,6 @@ include_spip('inc/export'); ...@@ -16,7 +16,6 @@ include_spip('inc/export');
include_spip('inc/actions'); include_spip('inc/actions');
include_spip('inc/minipres'); include_spip('inc/minipres');
// http://doc.spip.org/@action_export_all_dist
function action_export_all_dist() function action_export_all_dist()
{ {
global $gz, $connect_toutes_rubriques ; global $gz, $connect_toutes_rubriques ;
...@@ -30,17 +29,15 @@ function action_export_all_dist() ...@@ -30,17 +29,15 @@ function action_export_all_dist()
$dir = _DIR_DUMP; $dir = _DIR_DUMP;
$file = $dir . $arg; $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(); if ($GLOBALS['flag_ob_flush']) ob_flush();
flush(); flush();
$f = ($gz) ? gzopen($file, "ab") : fopen($file, "ab");
$_fputs = ($gz) ? gzputs : fputs;
$_fputs($f, export_entete());
$files = ramasse_parties($file, $gz, $file . ".part"); $files = ramasse_parties($file, $gz, $file . ".part");
$_fputs($f, export_enpied());
$_fputs ($f, build_end_tag("SPIP")."\n");
if ($gz) gzclose($f); else fclose($f); if ($gz) gzclose($f); else fclose($f);
effacer_meta("status_dump"); effacer_meta("status_dump");
......
...@@ -15,7 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return; ...@@ -15,7 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('base/serial'); include_spip('base/serial');
include_spip('base/auxiliaires'); include_spip('base/auxiliaires');
include_spip('inc/indexation'); // pour la fonction primary_index_table include_spip('public/interfaces'); // pour table_des_tables
include_spip('inc/flock'); include_spip('inc/flock');
include_spip('inc/actions'); include_spip('inc/actions');
include_spip('inc/export'); include_spip('inc/export');
...@@ -102,6 +102,20 @@ function exec_export_all_dist() ...@@ -102,6 +102,20 @@ function exec_export_all_dist()
$reprise = ''; $reprise = '';
} else $reprise = " (" . $status_dump[2] . ", " . $status_dump[3] . ")"; } else $reprise = " (" . $status_dump[2] . ", " . $status_dump[3] . ")";
list($tables_for_dump, $tables_for_link) = export_all_list_tables();
$status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
$etape = $status_dump[2];
// 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
$href = generer_action_auteur("export_all",$archive,'',true);
if ($etape >= count($tables_for_dump)){ // au timeout
include_spip('inc/headers');
redirige_par_entete($href);
}
echo install_debut_html(_T('info_sauvegarde')); echo install_debut_html(_T('info_sauvegarde'));
echo "<p>",_T("info_sauvegarde"), $reprise, "</p>\n"; echo "<p>",_T("info_sauvegarde"), $reprise, "</p>\n";
$f = ($gz) ? gzopen($file, "ab") : fopen($file, "ab"); $f = ($gz) ? gzopen($file, "ab") : fopen($file, "ab");
...@@ -116,51 +130,43 @@ function exec_export_all_dist() ...@@ -116,51 +130,43 @@ function exec_export_all_dist()
$_fputs = ($gz) ? gzputs : fputs; $_fputs = ($gz) ? gzputs : fputs;
if ($gz) gzclose($f); else fclose($f); 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(); if ($GLOBALS['flag_ob_flush']) ob_flush();
flush(); flush();
$status_dump = explode("::",$GLOBALS['meta']["status_dump"]); if (!($timeout = ini_get('max_execution_time')*1000));
$etape = $status_dump[2]; $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){
if ($etape < count($tables_for_dump)){ while (1){ // on ne connait pas le nb de paquets d'avance
if (!($timeout = ini_get('max_execution_time')*1000)); list($string,$status_dump)=export_objets($table, $tables_for_link[$table],0, false, $i, _T("info_sauvegarde").", $table",$paquets);
$timeout = 30000; // parions sur une valeur tellement courante ...
if ($start) $timeout = round($timeout/2); if ($string) {
// script de rechargement auto sur timeout // on ecrit dans un fichier generique
echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".generer_url_ecrire("export_all","archive=$archive&gz=$gz",true)."\";',$timeout);</script>\n"); // puis on le renomme pour avoir une operation atomique
$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); ecrire_fichier ($partfile, $string);
// on le renomme avec un numero -> operation atomique en linux
rename($partfile,$partfile.".$cpt"); rename($partfile,$partfile.".$cpt");
$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);
} }
// 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", implode("::",$status_dump),'non'); ecrire_meta("status_dump", implode("::",$status_dump),'non');
#lire_metas(); // attention $string vide ne suffit pas a sortir
// car les admins restreints peuvent parcourir
// une portion de table vide pour eux.
if (!$status_dump[3]) break;
} }
echo "</div>\n";
} }
echo "</div>\n";
// Reunir les fichiers en un seul, mais dans l'espace public // si Javascript est dispo, anticiper le Time-out
// 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 ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"$href\";',0);</script>\n");
echo install_fin_html(); echo install_fin_html();
} }
// construction de la liste des tables pour le dump : // construction de la liste des tables pour le dump :
...@@ -168,7 +174,6 @@ function exec_export_all_dist() ...@@ -168,7 +174,6 @@ function exec_export_all_dist()
// + toutes les tables auxiliaires hors relations // + toutes les tables auxiliaires hors relations
// + les tables relations dont les deux tables liees sont dans la liste // + les tables relations dont les deux tables liees sont dans la liste
// http://doc.spip.org/@export_all_list_tables
function export_all_list_tables() function export_all_list_tables()
{ {
$tables_for_dump = array(); $tables_for_dump = array();
...@@ -217,7 +222,8 @@ function export_all_list_tables() ...@@ -217,7 +222,8 @@ function export_all_list_tables()
$connecte = false; $connecte = false;
if ($connecte) if ($connecte)
# on ajoute les liaisons en premier # on ajoute les liaisons en premier
# si une restauration est interrompue, cela se verra mieux si il manque des objets # si une restauration est interrompue,
# cela se verra mieux si il manque des objets
# que des liens # que des liens
array_unshift($tables_for_dump,$link_table); array_unshift($tables_for_dump,$link_table);
} }
......
...@@ -51,72 +51,57 @@ function ramasse_parties($archive, $gz, $partfile){ ...@@ -51,72 +51,57 @@ function ramasse_parties($archive, $gz, $partfile){
// Exportation generique d'objets (fichier ou retour de fonction) // Exportation generique d'objets (fichier ou retour de fonction)
// //
// http://doc.spip.org/@export_objets // http://doc.spip.org/@export_objets
function export_objets($table, $primary, $liens, $file = 0, $gz = false, $etape_actuelle="", $nom_etape="",$limit=0) { function export_objets($table, $liens, $file = 0, $gz = false, $etape_actuelle="", $nom_etape="",$limit=0) {
static $etape_affichee=array(); static $etape_affichee=array();
static $table_fields=array();
$string='';
$string='';
$status_dump = explode("::",$GLOBALS['meta']["status_dump"]); $status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
$etape_en_cours = $status_dump[2]; $etape_en_cours = $status_dump[2];
$pos_in_table = $status_dump[3]; $pos_in_table = $status_dump[3];
if ($etape_en_cours < 1 OR $etape_en_cours == $etape_actuelle){ if ($etape_en_cours < 1 OR $etape_en_cours == $etape_actuelle){
// on calcule ca autant de fois qu'il y a de paquets!
// on devrait plutot le faire dans l'appelant
// et le memoriser dans status_dump
$result = spip_query("SELECT COUNT(*) FROM $table"); $result = spip_query("SELECT COUNT(*) FROM $table");
$row = spip_fetch_array($result,SPIP_NUM); $row = spip_fetch_array($result,SPIP_NUM);
$total = $row[0]; $total = $row[0];
$debut = $pos_in_table;
if (!isset($etape_affichee[$etape_actuelle]) AND $total){ if (!isset($etape_affichee[$etape_actuelle]) AND $total){
echo "<br /><strong>$etape_actuelle-$nom_etape</strong>"; echo "\n<br /><strong>$etape_actuelle-$nom_etape</strong>";
echo " : $total";
$etape_affichee[$etape_actuelle] = 1; $etape_affichee[$etape_actuelle] = 1;
} }
if ($pos_in_table!=0 AND $total) if ($pos_in_table!=0 AND $total)
echo "| ", $pos_in_table; echo " ", $pos_in_table;
if ($GLOBALS['flag_ob_flush']) ob_flush(); if ($GLOBALS['flag_ob_flush']) ob_flush();
flush(); flush();
if ($limit == 0) $limit = $total;
if ($limit == 0) $limit=$total; $string = build_while($pos_in_table, $limit, $table);
$result = spip_query("SELECT * FROM $table LIMIT $debut,$limit");
#" LIMIT $limit OFFSET $debut" # PG
if (!isset($table_fields[$table])){
$nfields = mysql_num_fields($result);
// Recuperer les noms des champs
for ($i = 0; $i < $nfields; ++$i) $table_fields[$table][$i] = mysql_field_name($result, $i);
}
else
$nfields = count($table_fields[$table]);
$string = build_while($file,$gz, $nfields, $pos_in_table, $result, $status_dump, $table, $table_fields[$table]);
if ($pos_in_table>=$total){ if ($pos_in_table>=$total){
// etape suivante :
if ($total) echo " ok"; if ($total) echo " ok";
$status_dump[2] = $status_dump[2]+1; $status_dump[2] = $status_dump[2]+1;
$status_dump[3] = 0; $status_dump[3] = 0;
} } else $status_dump[3] = $pos_in_table;
if ($file) { if ($file) {
// on se contente d'une ecriture en base pour aller plus vite $_fputs = ($gz) ? gzputs : fputs;
// a la relecture on en profitera pour mettre le cache a jour $_fputs($file, $string);
fflush($file);
ecrire_meta("status_dump", implode("::",$status_dump),'non'); ecrire_meta("status_dump", implode("::",$status_dump),'non');
#lire_metas(); $string='';
#ecrire_metas();
} }
spip_free_result($result); } else { // ca ne sert plus il me semble
return array($string,$status_dump); if ($etape_actuelle < $etape_en_cours) {
} else {
if ($etape_actuelle < $etape_en_cours) {
if (!isset($etape_affichee[$etape_actuelle])) if (!isset($etape_affichee[$etape_actuelle]))
echo "<li>", $etape_actuelle,'-',$nom_etape,"</li>"; echo "\n<li>", $etape_actuelle,'-',$nom_etape,"</li>";
if ($GLOBALS['flag_ob_flush']) ob_flush(); } else {
flush();
} else {
if (!isset($etape_affichee[$etape_actuelle])) if (!isset($etape_affichee[$etape_actuelle]))
echo "<li> <span style='color: #999999'>",$etape_actuelle,'-',$nom_etape,'</span></li>'; echo "\n<li> <span style='color: #999999'>",$etape_actuelle,'-',$nom_etape,'</span></li>';
if ($GLOBALS['flag_ob_flush']) ob_flush(); }
flush(); if ($GLOBALS['flag_ob_flush']) ob_flush();
} flush();
} }
return array($string,$status_dump); return array($string,$status_dump);
} }
...@@ -124,47 +109,41 @@ function export_objets($table, $primary, $liens, $file = 0, $gz = false, $etape_ ...@@ -124,47 +109,41 @@ function export_objets($table, $primary, $liens, $file = 0, $gz = false, $etape_
// Exporter les champs de la table // Exporter les champs de la table
// http://doc.spip.org/@build_while // http://doc.spip.org/@build_while
function build_while($file,$gz, $nfields, &$pos_in_table, $result, &$status_dump, $table, $fields) { function build_while(&$pos_in_table, $limit, $table) {
global $connect_toutes_rubriques ; global $connect_toutes_rubriques ;
global $tables_principales;
static $table_fields=array();
$result = spip_query("SELECT * FROM $table LIMIT " . intval($pos_in_table) .',' . intval($limit));
// Recuperer les noms des champs
// Ces infos sont donnees par le abstract_showtable
// les instructions natives mysql ne devraient pas apparaitre ici
if (!isset($table_fields[$table])){
$nfields = mysql_num_fields($result);
for ($i = 0; $i < $nfields; ++$i)
$table_fields[$table][$i] = mysql_field_name($result, $i);
} else $nfields = count($table_fields[$table]);
$string = ''; $string = '';
$begin = build_begin_tag($table); $all = $connect_toutes_rubriques
$end = build_end_tag($table); ||(!in_array('id_rubrique',$table_fields[$table]));
$all = $connect_toutes_rubriques || (!in_array('id_rubrique',$fields));
while ($row = spip_fetch_array($result,SPIP_ASSOC)) { while ($row = spip_fetch_array($result,SPIP_ASSOC)) {
$item = ''; if ((!isset($row['impt']) OR $row['impt']=='oui')
if (!isset($row['impt']) OR $row['impt']=='oui'){ AND ($all OR autoriser('publierdans','rubrique',$row['id_rubrique']))) {
$string .= "<$table>\n";
for ($i = 0; $i < $nfields; ++$i) { for ($i = 0; $i < $nfields; ++$i) {
$k = $fields[$i]; $k = $table_fields[$table][$i];
$item .= "<$k>" . text_to_xml($row[$k]) . "</$k>\n"; $string .= "<$k>" . text_to_xml($row[$k]) . "</$k>\n";
} }
if ($all OR autoriser('publierdans','rubrique',$row['id_rubrique'])) $string .= "</$table>\n\n";
$string .= "$begin$item$end";
} }
$status_dump[3] = $pos_in_table = $pos_in_table +1; $pos_in_table++;
}
if ($file) {
$_fputs = ($gz) ? gzputs : fputs;
$_fputs($file, $string);
fflush($file);
// 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", implode("::",$status_dump),'non');
$string = '';
} }
spip_free_result($result);
return $string; return $string;
} }
// http://doc.spip.org/@build_begin_tag
function build_begin_tag($tag) {
return "<$tag>\n";
}
// http://doc.spip.org/@build_end_tag
function build_end_tag($tag) {
return "</$tag>\n\n";
}
// Conversion texte -> xml (ajout d'entites) // Conversion texte -> xml (ajout d'entites)
// http://doc.spip.org/@text_to_xml // http://doc.spip.org/@text_to_xml
function text_to_xml($string) { function text_to_xml($string) {
...@@ -173,7 +152,6 @@ function text_to_xml($string) { ...@@ -173,7 +152,6 @@ function text_to_xml($string) {
// production de l'entete du fichier d'archive // production de l'entete du fichier d'archive
// http://doc.spip.org/@export_entete
function export_entete() function export_entete()
{ {
return return
...@@ -189,4 +167,6 @@ $GLOBALS['meta']['charset']."\"?".">\n" . ...@@ -189,4 +167,6 @@ $GLOBALS['meta']['charset']."\"?".">\n" .
>\n"; >\n";
} }
function export_enpied () { return "</SPIP>\n";}
?> ?>
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