source: lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/db.php @ 7157

Last change on this file since 7157 was 7157, checked in by mabarracus, 23 months ago

Optimized queries

File size: 39.2 KB
Line 
1<?php
2$USE_CACHE = true;
3class Cache{
4    private $cache_file;
5    private $cache_dir;
6    private $data_file;
7    private $data;
8    private $cache_timeout=3600;
9
10    function Cache(){
11        $this->cache_dir = sys_get_temp_dir();
12        $this->cache_file = "cache_analytics.db.tmp";
13        $this->datafile=$this->cache_dir.'/'.$this->cache_file;
14        $this->data = array();
15    }
16    function readFile(){
17        if (is_file($this->datafile) and is_writable($this->datafile)){
18            $this->filecontents = file_get_contents($this->datafile);
19        }else{
20            // do nothing or throw error
21            return false;
22        }
23        return true;
24    }
25    function newFile($data=array()){
26        // create new file
27        $obj=$data;
28        $json='';
29        try{
30            $json=json_encode($obj);
31        }catch(Exception $e){
32            return false;
33        }
34        file_put_contents($this->datafile,$json);
35    }
36    function parseJson(){
37        try{
38            $json=json_decode($this->filecontents,true);
39            $this->data=$json;
40        }catch(Exception $e){
41            return false;
42        }
43        return true;
44    }
45    function process(){
46        $continue = false;
47        if ($this->readFile()){
48            $continue = true;
49        }else{
50            $this->newFile();
51            if ($this->readFile()){
52                $continue=true;
53            }
54        }
55        if (! $continue){
56            return false;
57        }
58        if (! $this->parseJson()){
59            return false;
60        }
61        return true;
62    }
63    function get($key){
64        global $USE_CACHE;
65        if (! $USE_CACHE){
66            return false;
67        }
68        if (! $this->process()){
69            return false;
70        }
71        try{
72            $data=$this->data;
73            if ($data == null or ! is_array($data) or ! array_key_exists($key,$data))
74                return false;
75            $data=$data[$key];
76            if (time() - (int)$data['timestamp'] > $this->cache_timeout){
77                return false; //'invalid';
78            }else{
79                return $data['value'];
80            }
81        }catch(Exception $e){
82            return false;
83        }
84    }
85    function store($obj,$key){
86        if (! $this->process()){
87            return false;
88        }
89        try{
90            $this->data[$key]=['timestamp'=>time(),'value'=>$obj];
91            return $this->newFile($this->data);
92        }catch(Exception $e){
93            return false;
94        }
95    }
96}
97
98class DB{
99
100     private $dbhost;
101     private $dbname;
102     private $dbuser;
103     private $dbpass;
104     private $ka_file='/var/run/analyticsd.keepalive';
105     private $alias;
106     public $dbconn;
107
108     function DB(){
109         require_once('config.php');
110         global $dbhost,$dbname,$dbpass,$dbuser,$distros;
111
112         $this->dbhost=$dbhost;
113         $this->dbname=$dbname;
114         $this->dbpass=$dbpass;
115         $this->dbuser=$dbuser;
116         $this->alias=array();
117         $this->info_distro=json_decode($distros,true);
118         if ($this->info_distro == NULL){
119             die('Error: Wrong json in Config.php');
120         }
121         $this->init_dates();
122         $this->times=0;
123     }
124     function init_dates(){
125         $this->dates=array();
126         $this->dates['today']=date("Y-m-d");
127         $this->dates['first_current']=date("Y-m-").'01';
128         $this->dates['last_old']=date("Y-m-d",strtotime($this->dates['first_current']." -1 days"));
129         $this->dates['first_old']=date("Y-m-",strtotime($this->dates['today']. "-1 months")).'01';
130         $this->dates['last_very_old']=date("Y-m-d",strtotime($this->dates['first_old']." -1 days"));
131         $this->dates['first_very_old']=date("Y-m-",strtotime($this->dates['first_old']." -1 days")).'01';
132         $this->dates['date_current']="(date between '".$this->dates['first_current']."' and '".$this->dates['today']."')";
133         $this->dates['date_old']="(date between '".$this->dates['first_old']."' and '".$this->dates['last_old']."')";
134         $this->dates['date_very_old']="(date between '".$this->dates['first_very_old']."' and '".$this->dates['last_very_old']."')";
135         $this->dates['date_range_last_three_months']="(date between '".$this->dates['first_very_old']."' and '".$this->dates['today']."')";
136     }
137     function connect(){
138        $this->dbconn=new mysqli($this->dbhost, $this->dbuser , $this->dbpass, $this->dbname);
139        if ($this->dbconn->connect_error) {
140            die('Connect Error:'. $this->dbconn->connect_error);
141        }
142     }
143     function disconnect(){
144         $this->dbconn->close();
145     }
146     function init_trans(){
147         $this->dbconn->autocommit(FALSE);
148         $this->dbconn->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
149     }
150
151    function send_data($user,$version,$sabor,$apps,$specs,$date=''){
152        $spec_sql_names = '';
153        $spec_sql_values = '';
154
155        $ltsp_sql_names = '';
156        $ltsp_sql_values = '';
157
158        $use_data=array();
159        $use_name=array();
160        if ($specs != false){
161            if (array_key_exists('arch',$specs)){
162                $arch = $specs['arch'];
163                $use_data[]="'$arch'";
164                $use_name[]='arch';
165            }
166            if (array_key_exists('mem',$specs)){
167                $mem = $specs['mem'];
168                if (is_numeric($mem)){
169                    $mem=(int)$mem;
170                }
171                $use_data[]=$mem;
172                $use_name[]='mem';
173            }
174            if (array_key_exists('vga',$specs)){
175                $vga = substr($specs['vga'],0,80);
176                $use_name[]='vga';
177                $use_data[]="'$vga'";
178            }
179            if (array_key_exists('cpu',$specs)){
180                if (array_key_exists('model',$specs['cpu'])){
181                    $cpu = substr($specs['cpu']['model'],0,80);
182                    $use_name[]='cpu';
183                    $use_data[]="'$cpu'";
184                }
185                if (array_key_exists('ncpus',$specs['cpu'])){
186                    $ncpu = $specs['cpu']['ncpus'];
187                    if (is_numeric($ncpu)){
188                        $ncpu=(int)$ncpu;
189                    }
190                    $use_name[]='ncpu';
191                    $use_data[]=$ncpu;
192                }
193            }
194            if (count($use_data) > 0){
195                $spec_sql_names = ',';
196                $spec_sql_names .= implode(',',$use_name);
197                $spec_sql_values = ',';
198                $spec_sql_values .= implode(',',$use_data);
199            }else{
200                $spec_sql_names = '';
201                $spec_sql_values = '';
202            }
203            $use_data=array();
204            $use_name=array();
205            if (array_key_exists('subtype',$specs)){
206                if (array_key_exists('LTSP',$specs['subtype'])){
207                    $ltsp = $specs['subtype']['LTSP'];
208                    if ($ltsp){
209                        $ltsp='TRUE';
210                    }else{
211                        $ltsp='FALSE';
212                    }
213                    $use_name[]='ltsp';
214                    $use_data[]=$ltsp;
215                }
216                if (array_key_exists('MODE',$specs['subtype'])){
217                    $ltsp_mode = $specs['subtype']['MODE'];
218                    $ltsp_mode = substr($ltsp_mode,0,4);
219                    if (strtolower($ltsp_mode) != 'null'){
220                        $use_name[]='mode';
221                        $use_data[]="'$ltsp_mode'";
222                    }
223                }
224            }
225            if (count($use_name) > 0){
226                $ltsp_sql_names = ',';
227                $ltsp_sql_names .= implode(',',$use_name);
228                $ltsp_sql_values = ',';
229                $ltsp_sql_values .= implode(',',$use_data);
230            }else{
231                $ltsp_sql_names = '';
232                $ltsp_sql_values = "";
233            }
234        }
235        if ($date == ''){
236            $sql="INSERT INTO tmp_clients(user,version,sabor,status $spec_sql_names $ltsp_sql_names) values ('$user','$version','$sabor',0 $spec_sql_values $ltsp_sql_values)";
237        }else{
238            $sql="INSERT INTO tmp_clients(user,version,sabor,status,date $spec_sql_names $ltsp_sql_names) values ('$user','$version','$sabor',0,'$date' $spec_sql_values $ltsp_sql_values)";
239        }
240        $retry=1;
241        $done=false;
242        $cli_id=false;
243        while (! $done and $retry < 4){
244            $res=$this->dbconn->query($sql);
245            if ($res){
246                $cli_id=$this->dbconn->insert_id; 
247                $done=true;
248            }else{
249                $retry+=1;
250                sleep($retry);
251            }
252        }
253        if ($retry == 4 or $cli_id == false)
254            throw new Exception('Error sending client data: '.$this->dbconn->error);
255        $err_apps=false;
256        $err_exception=false;
257        if (count($apps) != 0){
258            if ($date == ''){
259                $sql="insert into tmp_packages(client,app,value) values";
260            }else{
261                $sql="insert into tmp_packages(client,app,value,date) values";
262            }
263            $values=array();
264            // Prevent DoS attack
265            $i = 1000;
266            foreach ($apps as $app => $value){
267                // Max 1000 apps
268                if ( $i > 0 ){
269                    $i = $i - 1;
270                }else{
271                    throw new Exception('*** DoS detected, aborting more processing on this request ***');
272                } 
273
274                if (trim($app) == '' or trim($value) == ''){
275                    $err_apps=true;
276                    $err_exception=new Exception('Wrong application values');
277                    continue;
278                }
279                if ($date == ''){
280                    $values[]="($cli_id,'$app',$value)";
281                }else{
282                    $values[]="($cli_id,'$app',$value,'$date')";
283                }
284            }
285            if (count($values) > 0){
286                $sql.=implode(',',$values);
287                $done=false;
288                $retry=1;
289                while (! $done and $retry < 4){
290                    $res=$this->dbconn->query($sql);
291                    if ($res){
292                        $done=true;
293                    }else{
294                        $retry += 1;
295                        sleep($retry);
296                    }
297                }
298                if ($retry == 4 or ! $done){
299                    $err_apps=true;
300                    $err_exception=new Exception('Error sending client app data: '.$this->dbconn->error.' QUERY='.$sql);
301                }
302            }
303        }
304        //End operations
305        $sql = "Update tmp_clients set status=1 where id = $cli_id and status=0";
306        $retry=1;
307        $done=false;
308        while (! $done and $retry < 4){
309            $res=$this->dbconn->query($sql);
310            if ($res){
311                $done=true;
312            }else{
313                $retry+=1;
314                sleep($retry);
315            }
316        }
317        if ($retry == 4 or $cli_id == false){
318            throw new Exception('Error commiting client data: '.$this->dbconn->error);
319        }
320        if ($err_apps){
321            throw $err_exception;
322        }
323    }
324
325     private function load_alias(){
326         $sql="SELECT name,alias from Alias";
327         $result=$this->dbconn->query($sql);
328         while($row=$result->fetch_array(MYSQLI_ASSOC)){
329             $this->alias[$row['name']]=$row['alias'];
330         }
331     }
332        function get_system_data(){
333            $sql="select * from Config";
334            $result=$this->dbconn->query($sql);
335            if ($result){
336                $tmp=[];
337                while ($row=$result->fetch_array(MYSQLI_ASSOC)){
338                    $tmp[$row['name']]=$row['value'];
339                }
340                return json_encode($tmp);
341            }
342        }
343     function get_extended_data($app){
344         $today=date("Y-m-d");
345         $min_date=date("Y-m",strtotime($today." -1 year")).'-01';
346         $this->times=0;
347         // CLIENTS DISTRIBUTION PER RELEASE/FLAVOUR
348         $sql="select year(date) as year,month(date) as month,Releases_name,Flavours_name,count(*) as num_hosts from (select distinct Client_uid,date,Releases_name,Flavours_name from Client_Versions where date >= '$min_date' )t group by year,month,Releases_name,Flavours_name order by year Desc,month desc,Releases_name asc,num_hosts desc";
349
350            $cache = new Cache;
351            $cache_key='extended_1';
352            $data = $cache->get($cache_key);
353            $stime=microtime(true);
354            if ($data != false){
355                $clients_month=$data;
356            }else{
357             $result=$this->dbconn->query($sql);
358                if ($result){
359                 $this->times+=microtime(true)-$stime;
360                 $clients_month=[];
361                 $tmp=[];
362                 while($row=$result->fetch_array(MYSQLI_ASSOC)){
363                     $date=$row['year'].'_'.$row['month'];
364                     $tmp[$date][$row['Releases_name']][$row['Flavours_name']]=intval($row['num_hosts']);
365                 }
366                 foreach ($tmp as $date){
367                     $clients_month[]=$date;
368                 }
369                    $cache->store($clients_month,$cache_key);
370             }else{
371                 $clients_month=$this->dbconn->error;
372             }
373            }
374        // architecture
375        $sql="select year(date) as year, month(date) as month, Releases_name, count(arch) as count, arch from Client_Versions group by Releases_name,year,month,arch order by year desc,month desc,Releases_name asc,arch asc;";
376        $cache_key='extended_arch';
377        $data = $cache->get($cache_key);
378        $stime=microtime(true);
379        if ($data != false){
380            $clients_arch=$data;
381        }else{
382            $result=$this->dbconn->query($sql);
383            if ($result){
384                $this->times+=microtime(true)-$stime;
385                $clients_arch=[];
386                $tmp=[];
387                while($row=$result->fetch_array(MYSQLI_ASSOC)){
388                    $date=$row['year'].'_'.$row['month'];
389                    $tmp[$date][$row['Releases_name']][$row['arch']]=intval($row['count']);
390                }
391                foreach ($tmp as $date){
392                    $clients_arch[]=$date;
393                }
394                $cache->store($clients_arch,$cache_key);
395            }else{
396                $clients_arch=$this->dbconn->error;
397            }
398        }
399        // memory
400        $sql_2g = "select year(date) as year,month(date) as month,Releases_name as rel,count(uuid) as count from Client_Versions where mem < 2048000 and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,rel order by year  desc,month desc,rel asc";
401        $cache_key='extended_memory_2G';
402        $data = $cache->get($cache_key);
403        $stime=microtime(true);
404        if ($data != false){
405            $clients_2G=$data;
406        }else{
407            $result=$this->dbconn->query($sql_2G);
408            if ($result){
409                $this->times+=microtime(true)-$stime;
410                $clients_2G=[];
411                $tmp=[];
412                while($row=$result->fetch_array(MYSQLI_ASSOC)){
413                    $date=$row['year'].'_'.$row['month'];
414                    $tmp[$date][$row['rel']]=intval($row['count']);
415                }
416                foreach ($tmp as $date){
417                    $clients_2G[]=$date;
418                }
419                $cache->store($clients_2G,$cache_key);
420            }else{
421                $clients_2G=$this->dbconn->error;
422            }
423        }
424        $sql_4G = "select year(date) as year,month(date) as month,Releases_name as rel,count(uuid) as count from Client_Versions where mem > 2048000  and mem < 4096000 and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,rel order by year  desc,month desc,rel asc";
425        $cache_key='extended_memory_4G';
426        $data = $cache->get($cache_key);
427        $stime=microtime(true);
428        if ($data != false){
429            $clients_4G=$data;
430        }else{
431            $result=$this->dbconn->query($sql_4G);
432            if ($result){
433                $this->times+=microtime(true)-$stime;
434                $clients_4G=[];
435                $tmp=[];
436                while($row=$result->fetch_array(MYSQLI_ASSOC)){
437                    $date=$row['year'].'_'.$row['month'];
438                    $tmp[$date][$row['rel']]=intval($row['count']);
439                }
440                foreach ($tmp as $date){
441                    $clients_4G[]=$date;
442                }
443                $cache->store($clients_4G,$cache_key);
444            }else{
445                $clients_4G=$this->dbconn->error;
446            }
447        }
448        $sql_8G = "select year(date) as year,month(date) as month,Releases_name as rel,count(uuid) as count from Client_Versions where mem > 4096000 and date >= DATE_SUB(NOW(),interval 1 year) group by year,month,rel order by year  desc,month desc,rel asc";
449        $cache_key='extended_memory_8G';
450        $data = $cache->get($cache_key);
451        $stime=microtime(true);
452        if ($data != false){
453            $clients_8G=$data;
454        }else{
455            $result=$this->dbconn->query($sql_8G);
456            if ($result){
457                $this->times+=microtime(true)-$stime;
458                $clients_8G=[];
459                $tmp=[];
460                while($row=$result->fetch_array(MYSQLI_ASSOC)){
461                    $date=$row['year'].'_'.$row['month'];
462                    $tmp[$date][$row['rel']]=intval($row['count']);
463                }
464                foreach ($tmp as $date){
465                    $clients_8G[]=$date;
466                }
467                $cache->store($clients_8G,$cache_key);
468            }else{
469                $clients_8G=$this->dbconn->error;
470            }
471        }
472        // cpu
473        $sql_mono= "select compact.year,compact.month,compact.rel,ifnull(total,0) as total from (select year,month,rel from (select year,month from (select year(now()) as year union all select year(date_sub(now(),interval 1 year))) anyos inner join (select 1 as month union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 union all select 10 union all select 11 union all select 12) months where STR_TO_DATE(concat(year,'-',month,'-01'),'%Y-%m-%d') >= date_sub(now(),interval 1 year) and now() >= STR_TO_DATE(concat(year,'-',month,'-01'),'%Y-%m-%d') order by year desc, month desc) dates inner join (select '15' as rel union all select '16') releases) compact left join (select year(date) as year, month(date) as month, Releases_name as rel, count(uuid) as total from Client_Versions where date >= date_sub(now(),interval 1 year) and ncpu = 1 group by year,month,rel) ct on compact.year = ct.year and compact.month = ct.month and compact.rel = ct.rel";
474        $cache_key='extended_memory_cpu_mono';
475        $data = $cache->get($cache_key);
476        $stime=microtime(true);
477        if ($data != false){
478            $clients_mono=$data;
479        }else{
480            $result=$this->dbconn->query($sql_mono);
481            if ($result){
482                $this->times+=microtime(true)-$stime;
483                $clients_mono=[];
484                $tmp=[];
485                while($row=$result->fetch_array(MYSQLI_ASSOC)){
486                    $date=$row['year'].'_'.$row['month'];
487                    $tmp[$date][$row['rel']]=intval($row['total']);
488                }
489                foreach ($tmp as $date){
490                    $clients_mono[]=$date;
491                }
492                $cache->store($clients_mono,$cache_key);
493            }else{
494                $clients_mono=$this->dbconn->error;
495            }
496        }
497        $sql_dualquad = "select compact.year,compact.month,compact.rel,ifnull(total,0) as total from (select year,month,rel from (select year,month from (select year(now()) as year union all select year(date_sub(now(),interval 1 year))) anyos inner join (select 1 as month union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 union all select 10 union all select 11 union all select 12) months where STR_TO_DATE(concat(year,'-',month,'-01'),'%Y-%m-%d') >= date_sub(now(),interval 1 year) and now() >= STR_TO_DATE(concat(year,'-',month,'-01'),'%Y-%m-%d') order by year desc, month desc) dates inner join (select '15' as rel union all select '16') releases) compact left join (select year(date) as year, month(date) as month, Releases_name as rel, count(uuid) as total from Client_Versions where date >= date_sub(now(),interval 1 year) and ncpu > 1 and ncpu < 5 group by year,month,rel) ct on compact.year = ct.year and compact.month = ct.month and compact.rel = ct.rel";
498        $cache_key='extended_memory_cpu_dualquad';
499        $data = $cache->get($cache_key);
500        $stime=microtime(true);
501        if ($data != false){
502            $clients_dualquad=$data;
503        }else{
504            $result=$this->dbconn->query($sql_dualquad);
505            if ($result){
506                $this->times+=microtime(true)-$stime;
507                $clients_dualquad=[];
508                $tmp=[];
509                while($row=$result->fetch_array(MYSQLI_ASSOC)){
510                    $date=$row['year'].'_'.$row['month'];
511                    $tmp[$date][$row['rel']]=intval($row['total']);
512                }
513                foreach ($tmp as $date){
514                    $clients_dualquad[]=$date;
515                }
516                $cache->store($clients_dualquad,$cache_key);
517            }else{
518                $clients_dualquad=$this->dbconn->error;
519            }
520        }
521        $sql_more = "select compact.year,compact.month,compact.rel,ifnull(total,0) as total from (select year,month,rel from (select year,month from (select year(now()) as year union all select year(date_sub(now(),interval 1 year))) anyos inner join (select 1 as month union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 union all select 10 union all select 11 union all select 12) months where STR_TO_DATE(concat(year,'-',month,'-01'),'%Y-%m-%d') >= date_sub(now(),interval 1 year) and now() >= STR_TO_DATE(concat(year,'-',month,'-01'),'%Y-%m-%d') order by year desc, month desc) dates inner join (select '15' as rel union all select '16') releases) compact left join (select year(date) as year, month(date) as month, Releases_name as rel, count(uuid) as total from Client_Versions where date >= date_sub(now(),interval 1 year) and ncpu > 4 group by year,month,rel) ct on compact.year = ct.year and compact.month = ct.month and compact.rel = ct.rel";
522        $cache_key='extended_memory_cpu_other';
523        $data = $cache->get($cache_key);
524        $stime=microtime(true);
525        if ($data != false){
526            $clients_more=$data;
527        }else{
528            $result=$this->dbconn->query($sql_more);
529            if ($result){
530                $this->times+=microtime(true)-$stime;
531                $clients_more=[];
532                $tmp=[];
533                while($row=$result->fetch_array(MYSQLI_ASSOC)){
534                    $date=$row['year'].'_'.$row['month'];
535                    $tmp[$date][$row['rel']]=intval($row['total']);
536                }
537                foreach ($tmp as $date){
538                    $clients_more[]=$date;
539                }
540                $cache->store($clients_more,$cache_key);
541            }else{
542                $clients_more=$this->dbconn->error;
543            }
544        }
545         // CLIENT UPDATES
546         $sql="select year,month,count(*) as nclients,sum(cnt)-count(*) as nclients_updated,Releases_name as rel,Flavours_name as fla from (select Client_uid,count(Client_uid) as cnt,year(date) as year,month(date) as month,Releases_name,Flavours_name from Client_Versions where date >= '$min_date' GROUP by Client_uid,year,month,Releases_name,Flavours_name having count(Client_uid) >= 1 ) t group by year,month,Releases_name,Flavours_name order by year desc,month desc";
547
548            $cache_key='extended_2';
549            $data = $cache->get($cache_key);
550            $stime=microtime(true);
551            if ($data != false){
552                $num_updates_month=$data;
553            }else{
554                $result=$this->dbconn->query($sql);
555
556             if ($result){
557                 $this->times+=microtime(true)-$stime;
558                 $i=0;
559             $tmp=[];
560                 while($row=$result->fetch_array(MYSQLI_ASSOC)){
561                     $date=$row['year'].'_'.$row['month'];
562                 $tmp[$date][$row['rel']][$row['fla']]=intval($row['nclients_updated']);
563                 }
564             foreach($tmp as $date){
565                 $num_updates_month[]=$date;
566             }
567                    $cache->store($num_updates_month,$cache_key);
568             }else{
569                 $num_updates_month=$this->dbconn->error;
570             }
571            }
572
573
574         // CLIENT CHANGE RELEASE
575         $sql="select year,month,count(*) as upgrades_en_mes from (select year,month,Client_uid as cliente_upgradeado from (select Client_uid,year(date) as year,month(date) as month from Client_Versions where date >= '$min_date' GROUP by Client_uid,Releases_name,year,month)t group by month,year,Client_uid having(count(*))>1)t group by year,month order by year desc,month desc limit 12";
576
577
578            $cache_key='extended_3';
579            $data = $cache->get($cache_key);
580            $stime=microtime(true);
581            if ($data != false){
582                $change_releases=$data;
583            }else{
584                $result=$this->dbconn->query($sql);
585
586                if ($result){
587                 $this->times+=microtime(true)-$stime;
588                 $change_releases=[0,0,0,0,0,0,0,0,0,0,0,0];
589                 $i=0;
590                 while($row=$result->fetch_array(MYSQLI_ASSOC)){
591                     $change_releases[$i++]=intval($row['upgrades_en_mes']);
592                 }
593                    $cache->store($change_releases,$cache_key);
594             }else{
595                 $change_releases=$this->dbconn->error;
596             }
597            }
598
599         // CLIENT CHANGE FLAVOUR
600         $sql="select year,month,count(*) as cambio_sabor_en_mes from (select year,month,Client_uid as cliente_upgradeado from (select Client_uid,year(date) as year,month(date) as month from Client_Versions where date >= '$min_date' GROUP by Client_uid,Flavours_name,year,month)t group by month,year,Client_uid having(count(*))>1)t group by year,month order by year desc,month desc limit 12";
601
602            $cache_key='extended_4';
603            $data = $cache->get($cache_key);
604            $stime=microtime(true);
605            if ($data != false){
606                $change_flavour=$data;
607            }else{
608                $result=$this->dbconn->query($sql);
609
610             if ($result){
611                 $this->times+=microtime(true)-$stime;
612                 $i=0;
613                 $change_flavour=[0,0,0,0,0,0,0,0,0,0,0,0];
614                 while($row=$result->fetch_array(MYSQLI_ASSOC)){
615                     $change_flavour[$i++]=intval($row['cambio_sabor_en_mes']);
616                 }
617                    $cache->store($change_flavour,$cache_key);
618             }else{
619                 $change_flavour=$this->dbconn->error;
620             }
621            }
622
623
624         $sql="select compact.year as year,compact.month as month,if(compact.type='NONE',null,compact.type) as type,ifnull(results.total,0) as total from (select * from
625( SELECT * FROM ( SELECT * FROM ( SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 ) t INNER JOIN ( SELECT YEAR(NOW()) AS year UNION ALL SELECT YEAR( DATE_SUB(NOW(), INTERVAL 1 YEAR)) ) t2 ) dates WHERE str_to_date(concat(year,'-',month,'-01'),'%Y-%m-%d') >= DATE_SUB(NOW(),INTERVAL 1 YEAR) and str_to_date(concat(year,'-',month,'-01'),'%Y-%m-%d') <= now() GROUP BY YEAR, MONTH ORDER BY YEAR DESC, MONTH DESC ) last_times inner join (select 'NONE' as type union all select 0 union all select 1) types) compact left join (select month(date) as month,year(date) as year,ifnull(ltsp,'NONE') as type,count(ifnull(ltsp,1)) as total from Client_Versions where Flavours_name = 'client' group by year(date),month(date),ltsp order by year(date) desc ,month(date) desc, ltsp desc ) results on compact.month = results.month and compact.year = results.year and compact.type = results.type";
626         $count_ltsp=array();
627         $cache_key='extended_5';
628         $data=$cache->get($cache_key);
629         $stime=microtime(true);
630         if ($data != false){
631            $count_ltsp=$data;
632         }else{
633            $result=$this->dbconn->query($sql);
634            if ($result){
635                $this->times+=microtime(true)-$stime;
636                while($row=$result->fetch_array(MYSQLI_ASSOC)){
637                    if (isset($row['type']) and $row['type'] != NULL){
638                        $count_ltsp[]=array($row['type'],$row['total']);
639                    }
640                }
641                $cache->store($count_ltsp,$cache_key);
642            }else{
643                $count_ltsp=$this->dbconn->error;
644            }
645         }
646         $cache_key='extended_6';
647         $sql= "select compact.year as year,compact.month as month,if(compact.mode='NONE',null,compact.mode) as mode,ifnull(results.total,0) as total from (select * from ( SELECT * FROM ( SELECT * FROM ( SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 ) t INNER JOIN ( SELECT YEAR(NOW()) AS year UNION ALL SELECT YEAR( DATE_SUB(NOW(), INTERVAL 1 YEAR)) ) t2 ) dates WHERE str_to_date(concat(year,'-',month,'-01'),'%Y-%m-%d') >= DATE_SUB(NOW(),INTERVAL 1 YEAR) and str_to_date(concat(year,'-',month,'-01'),'%Y-%m-%d') <= now() GROUP BY YEAR, MONTH ORDER BY YEAR DESC, MONTH DESC ) last_times inner join (select 'NONE' as mode union all select 'THIN' union all select 'SEMI' union all select 'FAT') types) compact left join (select month(date) as month,year(date) as year,ifnull(mode,'NONE') as mode,count(ifnull(mode,1)) as total from Client_Versions where Flavours_name = 'client' group by year(date),month(date),mode order by year(date) desc ,month(date) desc, mode desc ) results on compact.month = results.month and compact.year = results.year and compact.mode = results.mode";
648         $data= $cache->get($cache_key);
649         $stime=microtime(true);
650         $count_mode=array();
651         if ($data != false){
652            $count_mode=$data;
653         }else{
654            $result=$this->dbconn->query($sql);
655            if ($result){
656                $this->times+=microtime(true)-$stime;
657                while($row=$result->fetch_array(MYSQLI_ASSOC)){
658                    if (isset($row['mode']) and $row['mode'] != NULL){
659                        $count_mode[]=array(strtolower($row['mode']),$row['total']);
660                    }
661                }
662                $cache->store($count_mode,$cache_key);
663            }else{
664                $count_mode=$this->dbconn->error;
665            }
666         }
667
668         //sanitize input
669         if ($app != NULL){
670             $app=preg_grep('/^[a-zA-Z0-9\-_]+$/',array($app));
671             if ($app != NULL and isset($app[0])){
672                 $app=$this->dbconn->real_escape_string($app[0]);
673                 $stats['apps']=[];
674                 $stats['apps']['app']=$app;
675                 $sql="select year(date) as year,month(date) as month,string,Releases_name as rel,Flavours_name as fla,sum(count) as count from RecvPackages where string='$app' and date >= '$min_date' group by year,month,Releases_name,Flavours_name order by year desc,month desc,sum(count) desc";
676
677                    $cache_key="extended_app_$app";
678                    $data = $cache->get($cache_key);
679                    $stime=microtime(true);
680                    if ($data != false){
681                        $app_use=$data;
682                        $stats['apps']['app_use']=$app_use;
683                    }else{
684                        $result=$this->dbconn->query($sql);
685                        if ($result){
686                         $this->times+=microtime(true)-$stime;
687                         $tmp=[];
688                         while($row=$result->fetch_array(MYSQLI_ASSOC)){
689                             $date=$row['year'].'_'.$row['month'];
690                         $tmp[$date][$row['rel']][$row['fla']]=intval($row['count']);
691                         }
692                     foreach($tmp as $date){
693                         $app_use[]=$date;
694                     }
695                            $cache->store($app_use,$cache_key);
696                         $stats['apps']['app_use']=$app_use;
697                     }else{
698                         $app_use=$this->dbconn->error;
699                     }
700                    }
701
702             }
703         }
704         // FINALIZATION & WRITE STRUCTURE
705         if (isset($clients_month)){
706             $stats['clients']['clients_per_month']=$clients_month;
707         }
708         if (isset($num_updates_month)){
709             $stats['clients']['freq_updates_per_month']=$num_updates_month;
710         }
711         if (isset($change_releases)){
712             $stats['clients']['change_releases']=$change_releases;
713         }
714         if (isset($change_flavour)){
715             $stats['clients']['change_flavours']=$change_flavour;
716         }
717         if (isset($clients_arch)){
718             $stats['clients']['architectures']=$clients_arch;
719         }
720         if (isset($clients_2G)){
721             $stats['clients']['mem']['2G']=$clients_2G;
722         }
723         if (isset($clients_4G)){
724             $stats['clients']['mem']['4G']=$clients_4G;
725         }
726         if (isset($clients_8G)){
727             $stats['clients']['mem']['8G']=$clients_8G;
728         }
729         if (isset($clients_mono)){
730             $stats['clients']['cpu']['mono']=$clients_mono;
731         }
732         if (isset($clients_dualquad)){
733             $stats['clients']['cpu']['dualquad']=$clients_dualquad;
734         }
735         if (isset($clients_more)){
736             $stats['clients']['cpu']['more']=$clients_more;
737         }
738         if (isset($count_ltsp)){
739             $stats['clients']['count_ltsp']=$count_ltsp;
740         }
741         if (isset($count_mode)){
742             $stats['clients']['count_mode']=$count_mode;
743         }
744         $stats['debug_query_time']=strval(number_format($this->times,5));
745         if (file_exists($this->ka_file)){
746             $stats['debug_keep_alive']=date('Y-m-d H:i',file_get_contents($this->ka_file));
747         }
748         return json_encode($stats);
749     }
750
751     function get_historic_data($typechart=''){
752         $this->load_alias();
753         $obj=[];
754         $this->times=0;
755         foreach ($this->info_distro['distros'] as $distro){
756             $dname=$distro['name'];
757             $dlike=$distro['like'];
758             $obj[$dname]=array();
759             foreach ($distro['sabor'] as $sabor){
760                 $sname=$sabor['name'];
761                 $slike=$sabor['like'];
762                 $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'current',$typechart);
763                 $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'old',$typechart);
764                 $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'very_old',$typechart);
765             }
766         }
767         $obj['debug_query_time']=strval(number_format($this->times,3));
768         
769         if (file_exists($this->ka_file)){
770             $obj['debug_keep_alive']=date('Y-m-d H:i',file_get_contents($this->ka_file));
771         }
772         return json_encode($obj);
773     }
774   
775    function get_chart($version='',$sabor='',$type='current',$typechart=''){
776        if ($typechart == ''){
777            $cache_key="$version"."_"."$sabor"."_"."$type";
778            $limit = "limit 10";
779            $sql_limit=10;
780            $and = "";
781        }else{
782            $cache_key="$version"."_"."$sabor"."_"."$type"."_"."$typechart";
783            $limit = "";
784            $sql_limit=1000;
785            $and = "and string in ( select `name` from `PackagesWhitelist` where status = '1' )";
786        }
787        if ($version != ''){
788            $version = " and Releases_name = '$version' ";
789        }
790        if ($sabor != ''){
791            $sabor = " and Flavours_name = '$sabor' ";
792        }
793        $order=" order by count desc $limit ";
794        $group=" group by app ";
795
796        $where=$this->dates['date_'.$type]." $version $sabor ";
797        $where_clients=$this->dates['date_'.$type]." $version $sabor ";
798
799        $sql="SELECT string as app,sum(count) as count from RecvPackages where $where $and $group $order";
800        $sql_clients = "select count(distinct Client_uid) as count from Client_Versions where $where_clients $order";
801        $cache = new Cache;
802        $data = $cache->get($cache_key);
803        if ($data != false){
804            return $data;
805        }else{
806            $data=array($this->get_result_from_sql($sql,$sql_limit),$this->get_clients_from_sql($sql_clients));
807            $cache->store($data,$cache_key);
808            return $data;
809        }
810     }
811     function get_clients_from_sql($sql){
812             $stime=microtime(true);
813         if ($result=$this->dbconn->query($sql)){
814                 $etime=microtime(true);
815                 $this->times+=($etime-$stime);
816             while($row=$result->fetch_array(MYSQLI_ASSOC)){
817                 if (isset($row['count'])){
818                     return array('nclients'=>$row['count']);
819                 }
820             }
821             return array('nclients'=>'not available');
822         }else{
823             return array('nclients'=>$this->dbconn->error);
824         }
825
826     }
827     function get_result_from_sql($sql,$limit){
828             $stime=microtime(true);
829         if ($result=$this->dbconn->query($sql)){
830                 $etime=microtime(true);
831                 $this->times+=($etime-$stime);
832             $obj2=[];
833             $nobj=0;
834             while($row=$result->fetch_array(MYSQLI_ASSOC)){
835                 if (array_key_exists($row['app'],$this->alias)){
836                     if (! empty($this->alias[$row['app']])){
837                         if ($nobj < $limit)
838                             $obj2[$this->alias[$row['app']]]=$row['count'];
839                         $nobj++;
840                     }
841                 }else{
842                     if ($nobj < $limit)
843                         $obj2[$row['app']]=$row['count'];
844                     $nobj++;
845                 }
846             }
847             return $obj2;
848         }else{
849             return $this->dbconn->error;
850         }
851     }
852    function get_whitelist_form(){
853        $sql = "select distinct `string` from `RecvPackages` order by `string` asc";
854        $sql2 = "select `name`,`status` from `PackagesWhitelist`";
855        $result=$this->dbconn->query($sql);
856        $all_items=array();
857        if ($result){
858            while($row=$result->fetch_array(MYSQLI_ASSOC)){
859                $all_items[]=$row;
860            }
861        }
862        $whitelist=array();
863        $result = $this->dbconn->query($sql2);
864        if ($result){
865            while($row=$result->fetch_array(MYSQLI_ASSOC)){
866                $whitelist[] = $row;
867            }
868        }
869        if (count($all_items) == 0){
870            return false;
871        }
872        $classify = ['in'=> array(), 'out'=>array(), 'unk' => array()];
873        $clasified = array();
874        foreach ($whitelist as $tmp){
875            if ($tmp['status'] == '0'){
876                $classify['out'][]=$tmp['name'];
877                $clasified[] = $tmp['name'];
878            }else if($tmp['status'] == '1'){
879                $classify['in'][]=$tmp['name'];
880                $clasified[] = $tmp['name'];
881            }
882        }
883        foreach ($all_items as $tmp){
884            if (! in_array($tmp['string'],$clasified)){
885                $classify['unk'][] = $tmp['string']; 
886            }
887        }
888        return $classify;
889    }
890} 
891
892?>
Note: See TracBrowser for help on using the repository browser.