123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- <?php
- /***************************************************************************\
- * SPIP, Systeme de publication pour l'internet *
- * *
- * Copyright (c) 2001-2014 *
- * 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;
- /**
- * Repertoire de sauvegarde
- *
- * @return string
- */
- function dump_repertoire() {
- $repertoire = _DIR_DUMP;
- if (!@file_exists($repertoire)
- AND !$repertoire = sous_repertoire(_DIR_DUMP,'',false,true)
- ) {
- $repertoire = preg_replace(','._DIR_TMP.',', '', _DIR_DUMP);
- $repertoire = sous_repertoire(_DIR_TMP, $repertoire);
- }
- return $repertoire;
- }
- /**
- * Nom du fichier de sauvegarde
- * la fourniture de l'extension permet de verifier que le nom n'existe pas deja
- *
- * @param string $dir
- * @param string $extension
- * @return string
- */
- function dump_nom_fichier($dir,$extension='sqlite'){
- include_spip('inc/texte');
- $site = isset($GLOBALS['meta']['nom_site'])
- ? preg_replace(array(",\W,is",",_(?=_),",",_$,"),array("_","",""), couper(translitteration(trim($GLOBALS['meta']['nom_site'])),30,""))
- : 'spip';
- $site .= '_' . date('Ymd');
- $nom = $site;
- $cpt=0;
- while (file_exists($dir. $nom . ".$extension")) {
- $nom = $site . sprintf('_%03d', ++$cpt);
- }
- return $nom.".$extension";
- }
- /**
- * Determine le type de serveur de sauvegarde
- * sqlite2 ou sqlite3
- *
- * @return string
- */
- function dump_type_serveur() {
- // chercher si sqlite2 ou 3 est disponible
- include_spip('req/sqlite3');
- if (spip_versions_sqlite3())
- return 'sqlite3';
- include_spip('req/sqlite2');
- if (spip_versions_sqlite2())
- return 'sqlite2';
- return '';
- }
- /**
- * Conteneur pour les arguments de la connexion
- * si on passe $args, les arguments de la connexion sont memorises
- * renvoie toujours les derniers arguments memorises
- *
- * @staticvar array $connect_args
- * @param array $connect
- * @return array
- */
- function dump_serveur($args=null) {
- static $connect_args = null;
- if ($args)
- $connect_args = $args;
- return $connect_args;
- }
- function dump_connect_args($archive) {
- if (!$type_serveur = dump_type_serveur())
- return null;
- return array(dirname($archive), '', '', '', basename($archive,".sqlite"), $type_serveur, 'spip');
- }
- /**
- * Initialiser un dump
- * @param string $status_file
- * @param string $archive
- * @param array $tables
- * @param array $where
- * @return bool/string
- */
- function dump_init($status_file, $archive, $tables=null, $where=array(),$action='sauvegarde'){
- $status_file = _DIR_TMP.basename($status_file).".txt";
- if (lire_fichier($status_file, $status)
- AND $status = unserialize($status)
- AND $status['etape']!=='fini'
- AND filemtime($status_file)>=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
- * @param <type> $courant
- * @param <type> $total
- * @param <type> $table
- */
- function dump_afficher_progres($courant,$total,$table) {
- static $etape = 1;
- if (unique($table)) {
- if ($total<0 OR !is_numeric($total))
- echo "<br /><strong>".$etape. '. '."</strong>$table ";
- else
- echo "<br /><strong>".$etape. '. '."$table</strong> ".($courant?" <i>($courant)</i> ":"");
- $etape++;
- }
- if (is_numeric($total) AND $total>=0)
- echo ". ";
- else
- echo "(". (-intval($total)).")";
- flush();
- }
- /**
- * Ecrire le js pour relancer la procedure de dump
- * @param string $redirect
- * @return string
- */
- function dump_relance($redirect){
- // si Javascript est dispo, anticiper le Time-out
- return "<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"$redirect\";',300);</script>\n";
- }
- /**
- * Marquer la procedure de dump comme finie
- * @param string $status_file
- * @return <type>
- */
- 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');
- 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
- * @param string $tri
- * @param string $extension
- * @param int $limit
- * @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;
- }
- 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;
- }
- function dump_verifie_sauvegarde_finie($status_file) {
- if (!$status=dump_lire_status($status_file)
- OR $status['etape']!=='fini')
- return '';
- return ' ';
- }
- function dump_nom_sauvegarde($status_file) {
- if (!$status=dump_lire_status($status_file)
- OR !file_exists($f=$status['archive'].".sqlite"))
- return '';
- return $f;
- }
- function dump_taille_sauvegarde($status_file) {
- if (!$f=dump_nom_sauvegarde($status_file)
- OR !$s = filesize($f))
- return '';
- return $s;
- }
- function dump_date_sauvegarde($status_file) {
- if (!$f=dump_nom_sauvegarde($status_file)
- OR !$d = filemtime($f))
- return '';
- return date('Y-m-d',$d);
- }
- ?>
|