source: pmb4.1/trunk/fuentes/pmb/classes/consolidation.class.php @ 478

Last change on this file since 478 was 478, checked in by mabarracus, 4 years ago

copy trusty code 4.1

  • Property svn:executable set to *
File size: 13.9 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: consolidation.class.php,v 1.7.6.1 2014-10-28 08:37:34 mbertin Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9
10require_once ($class_path . "/parse_format.class.php");
11
12if(!defined('DEFAULT_CONSO')) define('DEFAULT_CONSO',1);
13if(!defined('INTERVAL_CONSO')) define('INTERVAL_CONSO',2);
14if(!defined('ECHEANCE_CONSO')) define('ECHEANCE_CONSO',3);
15
16class consolidation {
17       
18        var $mode=1;
19        var $date_debut='';
20        var $date_fin='';
21        var $echeance='';
22        var $list_idview = array();
23        var $remove_data=0;
24        var $flag = false;
25        var $cols_vue=array();
26       
27        var $nom_vue='';
28        var $date_consolidation='0000-00-00 00:00:00';
29        var $date_debut_log='0000-00-00 00:00:00';
30        var $date_fin_log='0000-00-00 00:00:00';
31       
32       
33        function consolidation($mode=1,$date_debut='',$date_fin='',$echeance='',$list_ck='',$remove_data=0){
34                global $pmb_set_time_limit;
35                $this->mode = $mode;
36                $this->date_debut = $date_debut;
37                $this->date_fin = $date_fin;
38                $this->echeance = $echeance;
39                $this->list_idview = $list_ck;
40                $this->remove_data = $remove_data;
41                //Gestion du timeout au niveau de mysql pour ne pas perdre la connection
42                //Ne peux pas être fait dans consolider car les fonctions de calculent peuvent aussi prendre du temps
43                if($pmb_set_time_limit){
44                        $res=mysql_query("SHOW SESSION VARIABLES like 'wait_timeout'");
45                        $timeout_default=0;
46                        if($res && mysql_num_rows($res)){
47                                $timeout_default=mysql_result($res,0,1);
48                        }
49                        mysql_query("SET SESSION wait_timeout=".($timeout_default+(($pmb_set_time_limit)*1)));
50                }else{
51                        //Si pmb_set_time_limit vaut 0 alors c'est illimité -> Dans ce cas je prends 12h
52                        mysql_query("SET SESSION wait_timeout=43200");
53                }
54        }
55
56       
57        function make_consolidation(){
58
59                global $dbh;
60               
61                foreach($this->list_idview as $id_vue){
62                       
63                        $req_vue=mysql_query('select * from statopac_vues where id_vue='.$id_vue.' ',$dbh);
64                        if (mysql_num_rows($req_vue)) {
65                                $row = mysql_fetch_object($req_vue);
66                                $this->nom_vue = $row->nom_vue;
67                                $this->date_debut_log = $row->date_debut_log;
68                                $this->date_fin_log = $row->date_fin_log;
69                                $this->date_consolidation = $row->date_consolidation;
70                        } else {
71                                continue;
72                        }
73                       
74                       
75                        switch($this->mode){
76                               
77                                case INTERVAL_CONSO:
78                                        $this->check_structure($id_vue);
79                                        $this->calculer_sur_periode($id_vue, $this->date_debut,$this->date_fin);
80                                        $this->consolider($id_vue);
81                                        break;
82                               
83                                case ECHEANCE_CONSO:
84                                        $this->check_structure($id_vue);
85                                        $this->calculer_until($id_vue, $this->echeance);
86                                        $this->consolider($id_vue);
87                                        break;
88                                       
89                                default:
90                                        $this->check_structure($id_vue);
91                                        $this->calculer_since_last($id_vue);
92                                        $this->consolider($id_vue);
93                                        break;                 
94                               
95                        }
96                }
97        }
98
99       
100        /**
101         * Fonction qui permet d'extraire un lot de log entre des dates précises
102         */
103        function calculer_sur_periode($id_vue, $date_deb, $date_fin){
104                global $dbh;           
105               
106                $req = "create temporary table logs_filtre_$id_vue select * from statopac where date_log between '".addslashes($date_deb)."' and '".addslashes($date_fin)."'";
107                mysql_query($req,$dbh);
108                if ($this->flag || $this->remove_data) {
109                        $this->set_dates_log($id_vue);
110                } else {
111                        $this->set_dates_log($id_vue,true);
112                }
113        }
114
115       
116        /**
117         * Fonction qui permet d'extraire un lot de log depuis le début des enregistrements jusqu'à l'échéance fixée
118         */
119        function calculer_until($id_vue, $echeance){
120                global $dbh;
121                if ($this->flag || $this->remove_data || $this->date_fin_log=='0000-00-00 00:00:00') {
122                        $req = "create temporary table logs_filtre_$id_vue select * from statopac where date_log <='".addslashes($echeance)."'";
123                        mysql_query($req,$dbh);
124                        $this->set_dates_log($id_vue);
125                } else {
126                        $req = "create temporary table logs_filtre_$id_vue select * from statopac where date_log > '".$this->date_fin_log."' and  date_log <= '".addslashes($echeance)."' ";
127                        mysql_query($req,$dbh);
128                        $this->set_dates_log($id_vue,true);
129                }
130        }
131
132       
133        /**
134         * Fonction qui permet d'extraire un lot de log depuis la date de dernière consolidation
135         */     
136        function calculer_since_last($id_vue){
137                global $dbh;
138
139                //$req_vue = "select date_consolidation from statopac_vues where id_vue='".addslashes($id_vue)."'";
140                //$res_vue = mysql_query($req_vue,$dbh);
141                if ($this->flag || $this->remove_data || $this->date_fin_log=='0000-00-00 00:00:00') {
142                        $req = "create temporary table logs_filtre_$id_vue select * from statopac where date_log <= now()";
143                        mysql_query($req,$dbh);
144                        $this->set_dates_log($id_vue);
145                } else {
146                        $req = "create temporary table logs_filtre_$id_vue select * from statopac where date_log > '".$this->date_fin_log."' ";
147                        //Si on prend date_consolidation on risque de perdre des informations
148                        mysql_query($req,$dbh);
149                        $this->set_dates_log($id_vue,true);
150                }
151        }
152
153
154        /**
155         * Calcul des dates de debut et de fin de log
156         */
157        function set_dates_log($id_vue,$only_last=false) {
158                global $dbh;
159                if (!$id_vue) return;
160                $q = 'select min(date_log) as min_date, max(date_log) as max_date from logs_filtre_'.$id_vue;
161                $r = mysql_query($q, $dbh);
162                if (mysql_num_rows($r)) {
163                        $row = mysql_fetch_object($r);
164                        if(!$this->date_debut_log || $this->date_debut_log === "0000-00-00 00:00:00"){
165                                $this->date_debut_log = $row->min_date;
166                        }else{
167                                //On regarde quel date on doit garder
168                                $res=mysql_query("SELECT DATEDIFF('".$this->date_debut_log."','".$row->min_date."')");
169                                if(mysql_num_rows($res)){
170                                        if((mysql_result($res,0,0))*1 > 1){
171                                                $this->date_debut_log=$row->min_date;
172                                        }else{
173                                                //La date de début est déjà entérieur aux logs que l'on va ajouter
174                                        }
175                                }
176                        }                               
177                        if(!$this->date_fin_log || $this->date_fin_log === "0000-00-00 00:00:00"){
178                                $this->date_fin_log = $row->max_date;
179                        }else{
180                                //On regarde quel date on doit garder
181                                $res=mysql_query("SELECT DATEDIFF('".$this->date_fin_log."','".$row->max_date."')");
182                                if(mysql_num_rows($res)){
183                                        if((mysql_result($res,0,0))*1 > 1){
184                                                //La date de fin est déjà suppérieur aux logs que l'on va ajouter
185                                        }else{
186                                                $this->date_fin_log=$row->max_date;
187                                               
188                                        }
189                                }
190                        }
191                }
192        }
193       
194       
195        /**
196         * Fonction qui vérifie que la structure des tables de vues n'a pas été modifiée
197         */
198        function check_structure($id_vue) {
199               
200                global $dbh;
201               
202                //Test pour savoir si la structure des colonnes a été modifiée
203                $rqt_sum="select sum(maj_flag) from statopac_vues_col where num_vue=$id_vue";
204                $res_sum=mysql_query($rqt_sum);
205                $this->flag = mysql_result($res_sum,0,0);
206               
207                //On supprime la table dynamique si la structure a été modifiée
208                if($this->flag) {
209                        $rqt_trunc = "DROP TABLE statopac_vue_".addslashes($id_vue);
210                        @mysql_query($rqt_trunc, $dbh);
211                }
212                $rqt_create = "CREATE TABLE IF NOT EXISTS statopac_vue_".addslashes($id_vue)." (id_ligne INT( 8 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY)";
213                mysql_query($rqt_create, $dbh); 
214               
215                //On supprime les données si demandé
216                if($this->remove_data) {
217                        $rqt_trunc = "TRUNCATE TABLE  statopac_vue_".addslashes($id_vue);
218                        @mysql_query($rqt_trunc, $dbh);
219                }
220               
221                // création des colonnes de la table de la vue
222                $rqt_col = "select id_col, nom_col, expression, filtre, datatype from statopac_vues_col where num_vue='".addslashes($id_vue)."'";
223                $res_col=mysql_query($rqt_col, $dbh);
224                $this->cols_vue=array();
225                while(($col=mysql_fetch_object($res_col))){                     
226                        //On ajoute les champs (indicateurs)
227                        $this->cols_vue[]=$col;
228                        if($col->datatype == 'small_text')
229                                $type_col = 'varchar(255)';
230                        else $type_col = $col->datatype; 
231                        $rqt_addfield = "ALTER TABLE statopac_vue_".addslashes($id_vue)." ADD ".addslashes(trim($col->nom_col))." ".addslashes($type_col)." NOT NULL";
232                        mysql_query($rqt_addfield);
233                }
234        }
235       
236       
237        /**
238         * Fonction qui créée les tables dynamiques consolidées
239         */
240        function consolider($id_vue){
241                global $dbh, $tab_val, $liste_tabfiltre, $pmb_set_time_limit;
242                //Gestion du timeout au niveau de php pour ne pas perdre la connection
243                set_time_limit($pmb_set_time_limit);
244                $q_ins='';
245                $champ='';
246
247                $rqt_tempo="SELECT * from logs_filtre_$id_vue";
248                $res_tempo=mysql_query($rqt_tempo, $dbh);
249                $n_total=mysql_num_rows($res_tempo);
250                               
251                $tab_val =array();
252                $liste_tabfiltre = array();
253                $n=0;
254               
255                $s_ins=mysql_num_rows($res_tempo);
256                if ($s_ins) {
257
258                        $this->show_progress_bar();
259                        $this->set_progress_text(' '.$this->nom_vue.' : ');
260                        $this->set_progress_percent(0);
261                       
262                        $print_format=new parse_format('consolidation.inc.php');
263                        $percent_conserve='0';
264                       
265                        while( ($ligne=mysql_fetch_array($res_tempo))){
266                               
267                                $percent=round(($n/$n_total)*100);
268                                if ($percent_conserve!=$percent) { // $percent%5==0 &&
269                                        $this->set_progress_percent($percent);
270                                        $percent_conserve=$percent;
271                                }
272                                $n++;
273                               
274                                $resultat =array();
275                               
276                                foreach ($this->cols_vue as $col) {                     
277                                       
278                                        // si filtre, pour chaque ligne de log :
279                                        if($col->filtre){
280                                                $rqt_create = "CREATE TEMPORARY TABLE  filtre_".$ligne[0]."_".$col->id_col." (
281                                                        `id_log` int( 8 ) unsigned NOT NULL AUTO_INCREMENT ,
282                                                        `date_log` timestamp NOT NULL default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
283                                                        `url_demandee` varchar( 255 ) NOT NULL default '',
284                                                        `url_referente` varchar( 255 ) NOT NULL default '',
285                                                        `get_log` blob NOT NULL ,
286                                                        `post_log` blob NOT NULL ,
287                                                        `num_session` varchar( 255 ) NOT NULL default '',
288                                                        `server_log` blob NOT NULL ,
289                                                        `empr_carac` blob NOT NULL ,
290                                                        `empr_doc` blob NOT NULL ,
291                                                        `empr_expl` blob NOT NULL ,
292                                                        `nb_result` blob NOT NULL ,
293                                                         `gen_stat` blob NOT NULL ,
294                                                        PRIMARY KEY ( `id_log` )
295                                                )";
296                                                mysql_query($rqt_create, $dbh);
297                                                $parser->cmd = $col->filtre ;
298                                                $parser->environnement['tempo']="logs_filtre_$id_vue";
299                                                $parser->environnement['num_ligne']=$ligne[0];
300                                                $print_format->environnement['ligne']=$ligne;
301                                                $val_filtre = $parser->exec_cmd_conso();
302                                                $filtre_tab = $this->creer_filtre($col->filtre,$val_filtre,$id_vue,$ligne[0],"filtre_".$ligne[0]."_".$col->id_col);
303                                        }       
304                                       
305                                        $print_format->cmd = $col->expression;
306                                        $print_format->environnement['tempo']="logs_filtre_$id_vue";
307                                        $print_format->environnement['num_ligne']=$ligne[0];
308                                        $print_format->environnement['ligne']=$ligne;
309                                        if($col->filtre)$print_format->environnement['filtre']= $filtre_tab;
310                                        $resultat[$col->nom_col] = $print_format->exec_cmd_conso();
311                                       
312                                }
313                                $values='';     
314                                if(!$champ) $champ = implode(',',array_keys($resultat));
315                                foreach($resultat as $valeur){
316                                        $values .= ($values ? ',\''.addslashes($valeur).'\'' : '\''.addslashes($valeur).'\'');
317                                }
318                                if (strlen($q_ins)>=1000000) {
319                                        mysql_query($q_ins, $dbh);     
320                                        unset($q_ins);$q_ins='';
321                                }
322                                $q_ins.= ($q_ins)?',('.$values.')' : 'insert into  statopac_vue_'.addslashes($id_vue).' ('.$champ.') values ('.$values.')';
323       
324                        }
325                       
326                        mysql_query($q_ins, $dbh);     
327                        unset($q_ins);
328                        //On supprime les tables de filtres
329                        foreach ($liste_tabfiltre as $key=>$val){
330                                mysql_query("DROP TABLE ".$val);
331                        }
332                        mysql_query("drop table logs_filtre_$id_vue",$dbh);
333                       
334                        //mise à jour des dates
335                        $q = "UPDATE statopac_vues SET date_consolidation=now(), date_debut_log='".$this->date_debut_log."', date_fin_log='".$this->date_fin_log."' WHERE id_vue='".addslashes($id_vue)."'";
336                        mysql_query($q,$dbh);
337                        if($this->flag) mysql_query("UPDATE statopac_vues_col SET maj_flag=0 WHERE num_vue='".addslashes($id_vue)."'");
338                }
339        }
340
341       
342        /**
343         * Fonction qui permet de créer un filtre de résultat par rapport à une valeur
344         */
345        function creer_filtre($filtre,$valeur_filtre,$id_vue,$ligne_repere,$table){
346                global $dbh,$tab_val, $liste_tabfiltre;
347               
348                $table_filtre ="";
349                foreach($tab_val as $key=>$val){
350                        if($filtre == $val['filtre']){ 
351                                if($valeur_filtre == $val['valeur_filtre']){
352                                        $table_filtre = $val['table_filtre'];
353                                         mysql_query("DROP TABLE ".$table);
354                                        break;
355                                } else {
356                                        mysql_query("DROP TABLE ".$val['table_filtre']);
357                                        $ind=array_search($val['table_filtre'],$liste_tabfiltre) ;
358                                        if($ind != false)
359                                                unset($liste_tabfiltre[$ind]); 
360                                        unset($tab_val[$key]);
361                                }
362                        }                               
363                }
364                if(!$table_filtre){
365                        $liste_tabfiltre[] = $table;
366                        $rqt="SELECT * from logs_filtre_$id_vue";
367                        $res=mysql_query($rqt, $dbh);
368               
369                        while($ligne_log=mysql_fetch_object($res)) {
370                       
371                                $format=new parse_format('consolidation.inc.php');     
372                                $format->environnement['tempo']="logs_filtre_$id_vue";
373                                $format->environnement['num_ligne']=$ligne_log->id_log;                                                                 
374                                $format->cmd = $filtre;
375                                $val_filtre_courant = $format->exec_cmd_conso();
376                                if($val_filtre_courant == $valeur_filtre){                             
377                                        $rqt="insert ignore into ".$table."  select * from logs_filtre_$id_vue where id_log='".addslashes($ligne_log->id_log)."'";
378                                        mysql_query($rqt,$dbh);                         
379                                }
380                        }                               
381                }
382                if(!$valeur_filtre) 
383                        $valeur_filtre="no_value";
384                if(!$table_filtre)
385                        $tab_val[] = array('valeur_filtre' => $valeur_filtre, 'filtre' => $filtre, 'table_filtre' => $table);   
386                       
387                return ($table_filtre ? $table_filtre : $table);
388        }
389       
390        function show_progress_bar(){
391                print "<div class='row' style='text-align:center; width:80%; border: 1px solid #000000; padding: 4px;'>
392                        <div style='text-align:left; width:100%; height:16px;'>
393                                <img id='progress' src='images/jauge.png' style='width:1px; height:16px'/>
394                        </div>
395                        <div style='text-align:center'>
396                                <span id='progress_text'></span>&nbsp;
397                                <span id='progress_percent'></span>
398                        </div>
399                </div>";
400                flush();
401        }
402       
403        function init_progress_bar() {
404                print "<script>document.getElementById('progress').src='images/jauge.png'</script>";
405                flush();
406        }
407       
408        function set_progress_percent($percent) {
409                print "<script>document.getElementById('progress').style.width='$percent%';
410                                document.getElementById('progress_percent').innerHTML='$percent%';
411                </script>";
412                flush();
413        }
414       
415        function set_progress_text($text){
416                global $charset;
417                print "<script>document.getElementById('progress_text').innerHTML='".htmlentities($text,ENT_QUOTES,$charset)."';</script>";
418                flush();
419        }
420}
421?>
Note: See TracBrowser for help on using the repository browser.