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