3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
13 if (!defined("_ECRIRE_INC_VERSION")) return;
17 * Repertoire de sauvegarde
21 function dump_repertoire() {
22 $repertoire = _DIR_DUMP
;
23 if (!@file_exists
($repertoire)
24 AND !$repertoire = sous_repertoire(_DIR_DUMP
,'',false,true)
26 $repertoire = preg_replace(','._DIR_TMP
.',', '', _DIR_DUMP
);
27 $repertoire = sous_repertoire(_DIR_TMP
, $repertoire);
34 * Nom du fichier de sauvegarde
35 * la fourniture de l'extension permet de verifier que le nom n'existe pas deja
38 * @param string $extension
41 function dump_nom_fichier($dir,$extension='sqlite'){
42 include_spip('inc/texte');
43 $site = isset($GLOBALS['meta']['nom_site'])
44 ?
preg_replace(array(",\W,is",",_(?=_),",",_$,"),array("_","",""), couper(translitteration(trim($GLOBALS['meta']['nom_site'])),30,""))
47 $site .= '_' . date('Ymd');
51 while (file_exists($dir. $nom . ".$extension")) {
52 $nom = $site . sprintf('_%03d', ++
$cpt);
54 return $nom.".$extension";
58 * Determine le type de serveur de sauvegarde
63 function dump_type_serveur() {
65 // chercher si sqlite2 ou 3 est disponible
66 include_spip('req/sqlite3');
67 if (spip_versions_sqlite3())
70 include_spip('req/sqlite2');
71 if (spip_versions_sqlite2())
78 * Conteneur pour les arguments de la connexion
79 * si on passe $args, les arguments de la connexion sont memorises
80 * renvoie toujours les derniers arguments memorises
82 * @staticvar array $connect_args
83 * @param array $connect
86 function dump_serveur($args=null) {
87 static $connect_args = null;
89 $connect_args = $args;
94 function dump_connect_args($archive) {
95 if (!$type_serveur = dump_type_serveur())
97 return array(dirname($archive), '', '', '', basename($archive,".sqlite"), $type_serveur, 'spip');
101 * Initialiser un dump
102 * @param string $status_file
103 * @param string $archive
104 * @param array $tables
105 * @param array $where
106 * @return bool/string
108 function dump_init($status_file, $archive, $tables=null, $where=array(),$action='sauvegarde'){
109 $status_file = _DIR_TMP
.basename($status_file).".txt";
111 if (lire_fichier($status_file, $status)
112 AND $status = unserialize($status)
113 AND $status['etape']!=='fini'
114 AND filemtime($status_file)>=time()-120) // si le fichier status est trop vieux c'est un abandon
115 return _T("dump:erreur_".$action."_deja_en_cours");
117 if (!$type_serveur = dump_type_serveur())
118 return _T('dump:erreur_sqlite_indisponible');
121 list($tables,) = base_liste_table_for_dump(lister_tables_noexport());
122 $status = array('tables'=>$tables,'where'=>$where,'archive'=>$archive);
124 $status['connect'] = dump_connect_args($archive);
125 dump_serveur($status['connect']);
126 if (!spip_connect('dump'))
127 return _T('dump:erreur_creation_base_sqlite');
129 // la constante sert a verifier qu'on utilise bien le connect/dump du plugin,
130 // et pas une base externe homonyme
131 if (!defined('_DUMP_SERVEUR_OK'))
132 return _T('erreur_connect_dump', array('dump' => 'dump'));
134 $status['etape'] = 'init';
136 if (!ecrire_fichier($status_file, serialize($status)))
137 return _T('dump:avis_probleme_ecriture_fichier',array('fichier'=>$status_file));
143 * Afficher l'avancement de la copie
144 * @staticvar int $etape
145 * @param <type> $courant
146 * @param <type> $total
147 * @param <type> $table
149 function dump_afficher_progres($courant,$total,$table) {
151 if (unique($table)) {
152 if ($total<0 OR !is_numeric($total))
153 echo "<br /><strong>".$etape. '. '."</strong>$table ";
155 echo "<br /><strong>".$etape. '. '."$table</strong> ".($courant?
" <i>($courant)</i> ":"");
158 if (is_numeric($total) AND $total>=0)
161 echo "(". (-intval($total)).")";
166 * Ecrire le js pour relancer la procedure de dump
167 * @param string $redirect
170 function dump_relance($redirect){
171 // si Javascript est dispo, anticiper le Time-out
172 return "<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"$redirect\";',300);</script>\n";
177 * Marquer la procedure de dump comme finie
178 * @param string $status_file
181 function dump_end($status_file, $action=''){
182 $status_file = _DIR_TMP
.basename($status_file).".txt";
183 if (!lire_fichier($status_file, $status)
184 OR !$status = unserialize($status))
189 // supprimer la structure qui etait stockee dans le dump
190 sql_delete('spip_meta',"nom='dump_structure_temp'");
193 // stocker dans le dump la structure de la base source
194 $structure = array();
195 foreach($status['tables_copiees'] as $t=>$n)
196 $structure[$t] = sql_showtable($t,true);
197 dump_serveur($status['connect']);
198 spip_connect('dump');
199 sql_delete('spip_meta',"nom='dump_structure_temp'",'dump'); #enlever une vieille structure deja la, au cas ou
200 sql_insertq('spip_meta',array('nom'=>'dump_structure_temp','valeur'=>serialize($structure),'impt'=>'non'),array(),'dump');
204 $status['etape'] = 'fini';
205 ecrire_fichier($status_file, serialize($status));
209 * Lister les fichiers de sauvegarde existant dans un repertoire
210 * trie par nom, date ou taille
214 * @param string $extension
218 function dump_lister_sauvegardes($dir,$tri='nom',$extension="sqlite",$limit = 100) {
219 $liste_dump = preg_files($dir,'\.'.$extension.'$',$limit,false);
222 $tn = $tl = $tt = $td = array();
223 foreach($liste_dump as $fichier){
224 $d = filemtime($fichier);
225 $t = filesize($fichier);
226 $fichier = substr($fichier, $n);
227 $tl[]= array('fichier'=>$fichier,'taille'=>$t,'date'=>$d);
232 if ($tri == 'taille')
233 array_multisort($tt, SORT_ASC
, $tl);
234 elseif ($tri == 'date')
235 array_multisort($td, SORT_ASC
, $tl);
237 array_multisort($tn, SORT_ASC
, $tl);
242 function dump_lire_status($status_file) {
243 $status_file = _DIR_TMP
.basename($status_file).".txt";
244 if (!lire_fichier($status_file, $status)
245 OR !$status = unserialize($status))
251 function dump_verifie_sauvegarde_finie($status_file) {
252 if (!$status=dump_lire_status($status_file)
253 OR $status['etape']!=='fini')
258 function dump_nom_sauvegarde($status_file) {
259 if (!$status=dump_lire_status($status_file)
260 OR !file_exists($f=$status['archive'].".sqlite"))
266 function dump_taille_sauvegarde($status_file) {
267 if (!$f=dump_nom_sauvegarde($status_file)
268 OR !$s = filesize($f))
274 function dump_date_sauvegarde($status_file) {
275 if (!$f=dump_nom_sauvegarde($status_file)
276 OR !$d = filemtime($f))
279 return date('Y-m-d',$d);