aa65109eb4eafc788ed62ed06ecc6f9b907d20f5
[mw_sourceml] / app / data / modules / share / sml_data_sources_cache.php
1 <?php
2
3   class sml_data_sources_cache extends mw_data{
4
5     /*
6      * retourne le contenu XML dont l'URL d'origine est $url
7      *
8      * si le contenu n'est pas dans le cache, cette fonction
9      * ira le lire et l'ajoutera dans le cache
10      *
11      * si le contenu est dans cache mais que sa date de validite
12      * est depassee, le contenu sera mis a jour
13      *
14      * $url : l'URL d'origine du fichier XML
15      *
16      * $IGNORE_UPDATE : si VRAI et qu'un contenu correspondant est
17      * dans le cache, c'est ce contenu qui sera fourni, meme si
18      * sa date de validite est depassee
19      *
20      */
21     function get_source_xml_from_cache($url, $IGNORE_UPDATE = false){
22       $env = $this->env();
23       $sgbd = $this->sgbd();
24       if(($cache_infos = $this->source_cache_infos_db($url)) !== false){
25         if($cache_infos){
26           if(!($this->buffer = @file_get_contents($env->path("content")."cache/sources/".$cache_infos["id_source"].".xml"))){
27             return false;
28           }
29           if($env->config("cache_maj_auto")){
30             if(($need_update = $this->cache_need_update($cache_infos["last_update"], $env->config("cache_time") * 60 * 60)) !== false){
31               if(!$IGNORE_UPDATE && $need_update){
32                 if($this->buffer =  @file_get_contents($url)){
33                   if($this->parse_source_xml($this->buffer)){
34                     if($this->del_source_cache($cache_infos["id"], $cache_infos["id_source"])){
35                       if($this->add_source_cache($url, $this->buffer)) return $this->buffer;
36                       return false;
37                     }
38                     else return false;
39                   }
40                   else return -1;
41                 }
42                 else return -1;
43               }
44               else return $this->buffer;
45             }
46             else return $this->buffer;
47           }
48           else return $this->buffer;
49         }
50         else{
51           if($this->buffer =  @file_get_contents($url)){
52             if($this->parse_source_xml($this->buffer)){
53               if(!$this->add_source_cache($url, $this->buffer)) return false;
54             }
55             return $this->buffer;
56           }
57         }
58       }
59       return false;
60     }
61
62     /*
63      * retourne 1 si $last_update + $cache_time est
64      * superieur ou egal a la date courante, 0 sinon
65      *
66      * retourne FAUX si le formta de $last_update ou
67      * de $cache_time est incorrect
68      *
69      * $last_update : date au format Y-m-d H:i:s
70      *
71      * $cache_time : duree, en secondes
72      *
73      */
74     function cache_need_update($last_update, $cache_time)
75     { $v_last_update = explode(" ", $last_update);
76       if(count($v_last_update) == 2)
77       { $v_date = explode("-", $v_last_update[0]);
78         if(count($v_date) == 3)
79         { $v_time = explode(":", $v_last_update[1]);
80           if(count($v_time) == 3)
81           { if
82             (    preg_match("/^[0-9]+$/", $v_date[0])
83               && preg_match("/^[0-9]+$/", $v_date[1])
84               && preg_match("/^[0-9]+$/", $v_date[2])
85               && preg_match("/^[0-9]+$/", $v_time[0])
86               && preg_match("/^[0-9]+$/", $v_time[1])
87               && preg_match("/^[0-9]+$/", $v_time[2])
88               && preg_match("/^[0-9]+$/", $cache_time)
89             )
90             { return (time() - mktime($v_time[0], $v_time[1], $v_time[2], $v_date[1], $v_date[2], $v_date[0])) < $cache_time ? 0 : 1;
91             }
92           }
93         }
94       }
95       return false;
96     }
97
98     /*
99      * ajoute un contenu xml dans le cache
100      *
101      * $url : l'URL du fichier XML d'origine
102      *
103      * $xml_content : le contenu du fichier XML
104      *
105      */
106     function add_source_cache($url, $xml_content){
107       $env = $this->env();
108       $sgbd = $this->sgbd();
109       if(($cache_index = $this->inc_sources_cache_index()) !== false){
110         if($fh = @fopen($env->path("content")."cache/sources/".$cache_index.".xml", "w+")){
111           $res = false;
112           if(@fwrite($fh, $this->buffer)){
113             @fclose($fh);
114             $res = $this->add_source_cache_db($url, $cache_index);
115           }
116           @fclose($fh);
117           return $res;
118         }
119       }
120       return false;
121     }
122
123     /*
124      * met a jour le cache pour le fichier XML dont l'URL d'origine est $url
125      *
126      * retourne :
127      *
128      *   VRAI si tout se passe bien
129      *   -1 si l'URL est introuvable
130      *   -2 si le contenu a cette URL n'est pas un fichier XML de source
131      *   FAUX si le cache n'a pas pu etre mis a jour avec les nouvelles infos
132      *
133      */
134     function maj_source_cache($url)
135     { if($this->buffer =  @file_get_contents($url))
136       { if($this->parse_source_xml($this->buffer))
137         { if(($cache_infos = $this->source_cache_infos_db($url)) !== false)
138           { if($cache_infos)
139             { if($this->del_source_cache($cache_infos["id"], $cache_infos["id_source"]))
140               { if($this->add_source_cache($url, $this->buffer)) return true;
141               }
142             }
143             else
144             { if($this->add_source_cache($url, $this->buffer)) return true;
145             }
146           }
147           return false;
148         }
149         else return -2;
150       }
151       else return -1;
152     }
153
154     /*
155      * vide le cache
156      *
157      */
158     function empty_source_cache(){
159       $OK = true;
160       if(($cache = $this->source_cache_db()) !== false){
161         foreach($cache as $id_cache => $cache_infos){
162           if(!$this->del_source_cache($id_cache, $cache_infos["id_source"])){
163             $OK = false;
164             $break;
165           }
166         }
167       }
168       else $OK = false;
169       return $OK;
170     }
171
172     /*
173      * efface un contenu XML du cache
174      *
175      * $id_cache_data : l'index des informations de cache
176      * dans le dossier data
177      *
178      * $id_xml_cache : l'index du contenu XML dans le cache
179      *
180      */
181     function del_source_cache($id_cache_data, $id_xml_cache)
182     { $env = $this->env();
183       if($this->del_source_cache_db($id_cache_data))
184       { if(@unlink($env->path("content")."cache/sources/".$id_xml_cache.".xml")) return true;
185       }
186       return false;
187     }
188
189     /*
190      * initialise le cache
191      * cette fonction verifie que les dossiers du cache existent
192      * et les cree sinon
193      *
194      */
195     function init_sources_cache()
196     { $env = $this->env();
197       if(!is_dir($env->path("content")."cache")) @mkdir($env->path("content")."cache");
198       if(is_dir($env->path("content")."cache"))
199       { if(!is_dir($env->path("content")."cache/sources")) @mkdir($env->path("content")."cache/sources");
200         if(is_dir($env->path("content")."cache/sources"))
201         { return true;
202         }
203       }
204       return "impossible d'initialiser le cache";
205     }
206
207     /*
208      * incremente l'index du cache et retourne le nouvel index
209      *
210      */
211     function inc_sources_cache_index(){
212       clearstatcache();
213       $env = $this->env();
214       $cache_index = false;
215       $cache_dir = $env->path("content")."cache";
216       if(!is_dir($cache_dir)) @mkdir($cache_dir);
217       if(!is_dir($cache_dir)) return false;
218       $cache_dir .= "/sources/";
219       if(!is_dir($cache_dir)) @mkdir($cache_dir);
220       if(!is_dir($cache_dir)) return false;
221       if(is_dir($cache_dir) && is_writable($cache_dir)){
222         if(!file_exists($cache_dir.".index")){
223           if($fh = @fopen($cache_dir.".index", "w+")){
224             if(@fwrite($fh, "0")) $cache_index = 0;
225             @fclose($fh);
226           }
227         }
228         else{
229           if(($cache_index = @file_get_contents($cache_dir.".index")) !== false){
230             if(preg_match("/^[0-9]+$/", $cache_index)){
231               $cache_index = (int)$cache_index;
232             }
233             else $cache_index = false;
234           }
235         }
236       }
237       if($cache_index !== false){
238         $cache_index++;
239         if($fh = @fopen($cache_dir.".index", "w+")){
240           if(!@fwrite($fh, (string)$cache_index)) $cache_index = false;
241           @fclose($fh);
242         }
243         else $cache_index = false;
244       }
245       return $cache_index;
246     }
247
248   }
249
250 ?>