[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / plugins-dist / dump / inc / dump.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
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 \***************************************************************************/
12
13 if (!defined("_ECRIRE_INC_VERSION")) return;
14
15
16 /**
17 * Repertoire de sauvegarde
18 *
19 * @return string
20 */
21 function dump_repertoire() {
22 $repertoire = _DIR_DUMP;
23 if (!@file_exists($repertoire)
24 AND !$repertoire = sous_repertoire(_DIR_DUMP,'',false,true)
25 ) {
26 $repertoire = preg_replace(','._DIR_TMP.',', '', _DIR_DUMP);
27 $repertoire = sous_repertoire(_DIR_TMP, $repertoire);
28 }
29 return $repertoire;
30 }
31
32
33 /**
34 * Nom du fichier de sauvegarde
35 * la fourniture de l'extension permet de verifier que le nom n'existe pas deja
36 *
37 * @param string $dir
38 * @param string $extension
39 * @return string
40 */
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,""))
45 : 'spip';
46
47 $site .= '_' . date('Ymd');
48
49 $nom = $site;
50 $cpt=0;
51 while (file_exists($dir. $nom . ".$extension")) {
52 $nom = $site . sprintf('_%03d', ++$cpt);
53 }
54 return $nom.".$extension";
55 }
56
57 /**
58 * Determine le type de serveur de sauvegarde
59 * sqlite2 ou sqlite3
60 *
61 * @return string
62 */
63 function dump_type_serveur() {
64
65 // chercher si sqlite2 ou 3 est disponible
66 include_spip('req/sqlite3');
67 if (spip_versions_sqlite3())
68 return 'sqlite3';
69
70 include_spip('req/sqlite2');
71 if (spip_versions_sqlite2())
72 return 'sqlite2';
73
74 return '';
75 }
76
77 /**
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
81 *
82 * @staticvar array $connect_args
83 * @param array $connect
84 * @return array
85 */
86 function dump_serveur($args=null) {
87 static $connect_args = null;
88 if ($args)
89 $connect_args = $args;
90
91 return $connect_args;
92 }
93
94 function dump_connect_args($archive) {
95 if (!$type_serveur = dump_type_serveur())
96 return null;
97 return array(dirname($archive), '', '', '', basename($archive,".sqlite"), $type_serveur, 'spip');
98 }
99
100 /**
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
107 */
108 function dump_init($status_file, $archive, $tables=null, $where=array(),$action='sauvegarde'){
109 $status_file = _DIR_TMP.basename($status_file).".txt";
110
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");
116
117 if (!$type_serveur = dump_type_serveur())
118 return _T('dump:erreur_sqlite_indisponible');
119
120 if (!$tables)
121 list($tables,) = base_liste_table_for_dump(lister_tables_noexport());
122 $status = array('tables'=>$tables,'where'=>$where,'archive'=>$archive);
123
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');
128
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'));
133
134 $status['etape'] = 'init';
135
136 if (!ecrire_fichier($status_file, serialize($status)))
137 return _T('dump:avis_probleme_ecriture_fichier',array('fichier'=>$status_file));
138
139 return true;
140 }
141
142 /**
143 * Afficher l'avancement de la copie
144 * @staticvar int $etape
145 * @param <type> $courant
146 * @param <type> $total
147 * @param <type> $table
148 */
149 function dump_afficher_progres($courant,$total,$table) {
150 static $etape = 1;
151 if (unique($table)) {
152 if ($total<0 OR !is_numeric($total))
153 echo "<br /><strong>".$etape. '. '."</strong>$table ";
154 else
155 echo "<br /><strong>".$etape. '. '."$table</strong> ".($courant?" <i>($courant)</i> ":"");
156 $etape++;
157 }
158 if (is_numeric($total) AND $total>=0)
159 echo ". ";
160 else
161 echo "(". (-intval($total)).")";
162 flush();
163 }
164
165 /**
166 * Ecrire le js pour relancer la procedure de dump
167 * @param string $redirect
168 * @return string
169 */
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";
173 }
174
175
176 /**
177 * Marquer la procedure de dump comme finie
178 * @param string $status_file
179 * @return <type>
180 */
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))
185 return;
186
187 switch($action) {
188 case 'restaurer':
189 // supprimer la structure qui etait stockee dans le dump
190 sql_delete('spip_meta',"nom='dump_structure_temp'");
191 break;
192 case 'sauvegarder':
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');
201 break;
202 }
203
204 $status['etape'] = 'fini';
205 ecrire_fichier($status_file, serialize($status));
206 }
207
208 /**
209 * Lister les fichiers de sauvegarde existant dans un repertoire
210 * trie par nom, date ou taille
211 *
212 * @param string $dir
213 * @param string $tri
214 * @param string $extension
215 * @param int $limit
216 * @return array
217 */
218 function dump_lister_sauvegardes($dir,$tri='nom',$extension="sqlite",$limit = 100) {
219 $liste_dump = preg_files($dir,'\.'.$extension.'$',$limit,false);
220
221 $n = strlen($dir);
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);
228 $td[] = $d;
229 $tt[] = $t;
230 $tn[] = $fichier;
231 }
232 if ($tri == 'taille')
233 array_multisort($tt, SORT_ASC, $tl);
234 elseif ($tri == 'date')
235 array_multisort($td, SORT_ASC, $tl);
236 else
237 array_multisort($tn, SORT_ASC, $tl);
238 return $tl;
239 }
240
241
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))
246 return '';
247
248 return $status;
249 }
250
251 function dump_verifie_sauvegarde_finie($status_file) {
252 if (!$status=dump_lire_status($status_file)
253 OR $status['etape']!=='fini')
254 return '';
255 return ' ';
256 }
257
258 function dump_nom_sauvegarde($status_file) {
259 if (!$status=dump_lire_status($status_file)
260 OR !file_exists($f=$status['archive'].".sqlite"))
261 return '';
262
263 return $f;
264 }
265
266 function dump_taille_sauvegarde($status_file) {
267 if (!$f=dump_nom_sauvegarde($status_file)
268 OR !$s = filesize($f))
269 return '';
270
271 return $s;
272 }
273
274 function dump_date_sauvegarde($status_file) {
275 if (!$f=dump_nom_sauvegarde($status_file)
276 OR !$d = filemtime($f))
277 return '';
278
279 return date('Y-m-d',$d);
280 }
281
282 ?>