= time() - 120 ) { // si le fichier status est trop vieux c'est un abandon return _T('dump:erreur_' . $action . '_deja_en_cours'); } if (!$type_serveur = dump_type_serveur()) { return _T('dump:erreur_sqlite_indisponible'); } if (!$tables) { list($tables, ) = base_liste_table_for_dump(lister_tables_noexport()); } $status = array('tables' => $tables, 'where' => $where, 'archive' => $archive); $status['connect'] = dump_connect_args($archive); dump_serveur($status['connect']); if (!spip_connect('dump')) { return _T('dump:erreur_creation_base_sqlite'); } // la constante sert a verifier qu'on utilise bien le connect/dump du plugin, // et pas une base externe homonyme if (!defined('_DUMP_SERVEUR_OK')) { return _T('erreur_connect_dump', array('dump' => 'dump')); } $status['etape'] = 'init'; if (!ecrire_fichier($status_file, serialize($status))) { return _T('dump:avis_probleme_ecriture_fichier', array('fichier' => $status_file)); } return true; } /** * Afficher l'avancement de la copie * * @staticvar int $etape Nombre de fois ou on est passe dans cette foncion * @param $courant Flag pour indiquer si c'est la table sur laquelle on travaille actuellement * @param $total Nombre total de tables * @param $table Nom de la table */ function dump_afficher_progres($courant, $total, $table) { static $etape = 1; if (unique($table)) { if ($total < 0 or !is_numeric($total)) { echo '
' . $etape . '. ' . "$table "; } else { echo '
' . $etape . '. ' . "$table " . ($courant ? " ($courant) " : ''); } $etape++; } if (is_numeric($total) and $total >= 0) { echo '. '; } else { echo '(' . (-intval($total)) . ')'; } flush(); } /** * Écrire le js pour relancer la procédure de dump * * @param string $redirect URL de la prochaine etape du dump * @return string Code HTML de redirection */ function dump_relance($redirect) { // si Javascript est dispo, anticiper le Time-out return "\n"; } /** * Marquer la procédure de dump comme finie * * @param string $status_file * Fichier qui mémorise les infos utiles concernant la sauvegarde en cours * @param string $action * Type d'action supplémentaire à réaliser : * * - restaurer : supprimer la structure qui était stockée dans le dump * - 'auvegarder : stocker dans le dump la structure de la base source */ function dump_end($status_file, $action = '') { $status_file = _DIR_TMP . basename($status_file) . '.txt'; if (!lire_fichier($status_file, $status) or !$status = unserialize($status) ) { return; } switch ($action) { case 'restaurer': // supprimer la structure qui etait stockee dans le dump sql_delete('spip_meta', "nom='dump_structure_temp'"); break; case 'sauvegarder': // stocker dans le dump la structure de la base source $structure = array(); foreach ($status['tables_copiees'] as $t => $n) { $structure[$t] = sql_showtable($t, true); } dump_serveur($status['connect']); spip_connect('dump'); // si spip_meta n'a pas ete backup elle n'est pas dans le dump, il faut la creer pour y stocker cette meta if (!sql_showtable('spip_meta', true, 'dump')) { $desc = sql_showtable('spip_meta', true); sql_create('spip_meta', $desc['field'], $desc['key'], false, false, 'dump'); } sql_delete('spip_meta', "nom='dump_structure_temp'", 'dump'); #enlever une vieille structure deja la, au cas ou sql_insertq( 'spip_meta', array('nom' => 'dump_structure_temp', 'valeur' => serialize($structure), 'impt' => 'non'), array(), 'dump' ); break; } $status['etape'] = 'fini'; ecrire_fichier($status_file, serialize($status)); } /** * Lister les fichiers de sauvegarde existant dans un repertoire * trie par nom, date ou taille * * @param string $dir Repertoire de sauvegarde * @param string $tri Tri pour recuperer les fichiers * @param string $extension Extension des fichiers de sauvegarde * @param int $limit Nombre max de fichiers listes * @return array */ function dump_lister_sauvegardes($dir, $tri = 'nom', $extension = 'sqlite', $limit = 100) { $liste_dump = preg_files($dir, '\.' . $extension . '$', $limit, false); $n = strlen($dir); $tn = $tl = $tt = $td = array(); foreach ($liste_dump as $fichier) { $d = filemtime($fichier); $t = filesize($fichier); $fichier = substr($fichier, $n); $tl[] = array('fichier' => $fichier, 'taille' => $t, 'date' => $d); $td[] = $d; $tt[] = $t; $tn[] = $fichier; } if ($tri == 'taille') { array_multisort($tt, SORT_ASC, $tl); } elseif ($tri == 'date') { array_multisort($td, SORT_ASC, $tl); } else { array_multisort($tn, SORT_ASC, $tl); } return $tl; } /** * Extraire le statut contenu dans un fichier * * @param $status_file Nom du fichier stocke dans _DIR_TMP * @return array */ function dump_lire_status($status_file) { $status_file = _DIR_TMP . basename($status_file) . '.txt'; if (!lire_fichier($status_file, $status) or !$status = unserialize($status) ) { return ''; } return $status; } /** * Verifier qu'un sauvegarde est finie * * @param $status_file Nom du fichier stocke dans _DIR_TMP * @return string Chaine non vide s'il reste des choses a faire */ function dump_verifie_sauvegarde_finie($status_file) { if (!$status = dump_lire_status($status_file) or $status['etape'] !== 'fini' ) { return ''; } return ' '; } /** * Recuperer le nom du fichier d'archivage qui est memorise dans le fichier de statut * * @param $status_file Nom du fichier stocke dans _DIR_TMP * @return string Nom ou chaine vide si on a un probleme */ function dump_nom_sauvegarde($status_file) { if (!$status = dump_lire_status($status_file) or !file_exists($f = $status['archive'] . '.sqlite') ) { return ''; } return $f; } /** * Recuperer la taille du fichier de sauvegarde * * @param $status_file Nom du fichier stocke dans _DIR_TMP * @return string/int Taille ou Chaine vide en cas de probleme */ function dump_taille_sauvegarde($status_file) { if (!$f = dump_nom_sauvegarde($status_file) or !$s = filesize($f) ) { return ''; } return $s; } /** * Recuperer la date de derniere modification du fichier de sauvegarde * * @param $status_file Nom du fichier stocke dans _DIR_TMP * @return string/int Date ou Chaine vide en cas de probleme */ function dump_date_sauvegarde($status_file) { if (!$f = dump_nom_sauvegarde($status_file) or !$d = filemtime($f) ) { return ''; } return date('Y-m-d', $d); }