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

Last change on this file since 938 was 938, checked in by mabarracus, 5 years ago

Added support to view "other" data

File size: 8.6 KB
Line 
1<?php
2class DB{
3
4        private $dbhost;
5        private $dbname;
6        private $dbuser;
7        private $dbpass;
8        private $alias;
9        public $dbconn;
10
11        function DB(){
12                require_once('config.php');
13                global $dbhost,$dbname,$dbpass,$dbuser,$distros;
14               
15                $this->dbhost=$dbhost;
16                $this->dbname=$dbname;
17                $this->dbpass=$dbpass;
18                $this->dbuser=$dbuser;
19                $this->alias=array();
20                $this->info_distro=json_decode($distros,true);
21                $this->init_dates();
22        }
23        function init_dates(){
24                $this->dates=array();
25                $this->dates['today']=date("Y-m-d");
26                $this->dates['first_this_month']=date("Y-m-").'01';
27                $this->dates['last_one_month_ago']=date("Y-m-d",strtotime($this->dates['first_this_month']." -1 days"));
28                $this->dates['first_one_month_ago']=date("Y-m-d",strtotime($this->dates['first_this_month']." -1 months"));
29                $this->dates['last_two_month_ago']=date("Y-m-d",strtotime($this->dates['first_one_month_ago']." -1 days"));
30                $this->dates['first_two_month_ago']=date("Y-m-d",strtotime($this->dates['first_one_month_ago']." -1 months"));
31
32        }
33        function connect(){
34                $this->dbconn=new mysqli($this->dbhost, $this->dbuser , $this->dbpass, $this->dbname);
35                if ($this->dbconn->connect_error) {
36                die('Connect Error:'. $this->dbconn->connect_error);
37                }
38        }
39        function disconnect(){
40                $this->dbconn->close();
41        }
42        function init_trans(){
43                $this->dbconn->autocommit(FALSE);
44                $this->dbconn->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
45        }
46        function insert_data($user,$date,$version,$sabor){
47                $sql = "INSERT INTO clients (user,lastlogin,version,sabor) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE lastlogin = VALUES(lastlogin)";
48                $query=$this->dbconn->prepare($sql);
49                if (! $query)
50                        throw new Exception($this->dbconn->error);
51                $query->bind_param("ssss",$user,$date,$version,$sabor);
52                $query->execute();
53                if ( $query->affected_rows < 0 ){
54                        throw new Exception($query->mysqli_error());
55                }else{
56                        $id=$this->dbconn->insert_id;
57                        $query->close();
58                        return $id;
59                }
60                return false;
61        }
62        function update_data($data='',$version='',$sabor=''){
63                $sql="INSERT INTO packages (app,count,version,sabor) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE count = count + ?";
64                $query=$this->dbconn->prepare($sql);
65                $query->bind_param("sssss",$k,$v,$version,$sabor,$v);
66                if (! $query)
67                        throw new Exception($this->dbconn->error);
68                foreach ($data as $k => $v){
69                        $noerr=$query->execute();
70                        if (! $noerr){
71                                throw new Exception($query->mysqli_error());
72                        }
73                }
74                $query->close();
75        }
76        private function load_alias(){
77                $sql="SELECT name,alias from alias";
78                $result=$this->dbconn->query($sql);
79                while($row=$result->fetch_array(MYSQLI_ASSOC)){
80                        $this->alias[$row['name']]=$row['alias'];
81                }
82        }
83        function rotate(){
84            $sql="select max(fecha) from historico;";
85            $thismonth=intval(date("Ym"));
86            $lastmonth=$thismonth;
87            if ($result=$this->dbconn->query($sql)){
88                while($row=$result->fetch_row()){
89                    if(empty($row[0])){
90                        $sql="insert into historico(app,count,fecha,version,sabor) values (?,?,?,?,?)";
91                        $query=$this->dbconn->prepare($sql);
92                        $name='dummy'; $value=0; $today=date("Y-m-d");
93                        $query->bind_param('sdsss',$name,$value,$today,$name,$name);
94                        $query->execute();
95                        $query->close();
96                    }else{
97                        $lastmonth=intval(explode('-',$row[0])[0].explode('-',$row[0])[1]);
98                    }
99                }
100            }
101            if ($thismonth > $lastmonth){
102                $sql="insert into historico(app,count,fecha,version,sabor) (select app,count,DATE(NOW()) as fecha,version,sabor from packages);";
103                $this->dbconn->query($sql);
104                $sql="truncate packages;";
105                $this->dbconn->query($sql);
106            }
107        }
108        function get_historic_data(){
109                $this->load_alias();
110                //echo $today.' '.$first_this_month.' '.$first_one_month_ago.' '.$last_one_month_ago.' '.$first_two_month_ago.' '.$last_two_month_ago.' EOL';
111                $obj=[];
112                $other_sql=array();
113                foreach ($this->info_distro['distros'] as $distro){
114                    $dname=$distro['name'];
115                    $dlike=$distro['like'];
116                    $obj[$dname]=array();
117                    foreach ($distro['sabor'] as $sabor){
118                        $sname=$sabor['name'];
119                        $slike=$sabor['like'];
120                        $obj[$dname][$sname][]=$this->get_current_chart($dlike,$slike);
121                        $obj[$dname][$sname][]=$this->get_old_chart($dlike,$slike);
122                        $obj[$dname][$sname][]=$this->get_very_old_chart($dlike,$slike);
123                        $other_sql[]=$this->get_current_chart($dlike,$slike,'yes');
124                        $other_sql[]=$this->get_old_chart($dlike,$slike,'yes');
125                        $other_sql[]=$this->get_very_old_chart($dlike,$slike,'yes');
126                    }
127                }
128                //file_put_contents('/tmp/other_sql',var_export($this->gen_other($other_sql),true));
129                $sql_other_sentences=$this->gen_other($other_sql);
130               
131                $obj['other']['other'][]=$this->get_result_from_sql($sql_other_sentences['current']);
132                $obj['other']['other'][]=$this->get_result_from_sql($sql_other_sentences['old']);
133                $obj['other']['other'][]=$this->get_result_from_sql($sql_other_sentences['very_old']);
134                return json_encode($obj);
135        }
136        function gen_other($other_data){
137            $sql=array('current' =>'','old'=>'', 'very_old'=>'');
138
139            $sql['current']="select app,sum(count) as count from (select app,count from packages where app not in ( select app from packages where (";
140            $sql['old']="select app,count,fecha from historico where";
141            $sql['very_old']="select app,count,fecha from historico where";
142            $where_current=array();
143            $where_old=array();
144            $where_very_old=array();
145            foreach($other_data as $odata){
146                switch($odata['type']){
147                    case 'current':
148                        $date_current=$odata['date'];
149                        $where_current[]=$odata['where'];
150                    break;
151                    case 'old':
152                        $date_old=$odata['date'];
153                        $where_old[]=$odata['where'];
154                    break;
155                    case 'very_old':
156                        $date_very_old=$odata['date'];
157                        $where_very_old[]=$odata['where'];
158                    break;
159                }
160            }
161            $sql['current'].=implode(' or ',$where_current);
162            $sql['current'].=")) UNION ALL select app,count from historico where app not in ( select app from historico where ";
163            $sql['current'].=$date_current.  " and (";
164            $sql['current'].=implode(' or ',$where_current);
165            $sql['current'].=")) and app not like 'dummy' ) tabla group by app order by count DESC LIMIT 30";
166            $sql['old'].=' '.$date_old." and (";
167            $sql['old'].=implode(' or ',$where_old);
168            $sql['old'].=") group by app order by count DESC LIMIT 30";
169            $sql['very_old'].=' '.$date_very_old." and (";
170            $sql['very_old'].=implode(' or ',$where_very_old);
171            $sql['very_old'].=") group by app order by count DESC LIMIT 30";
172           
173            return $sql;
174        }
175        function get_current_chart($version='',$sabor='',$dumpsql='no'){
176            $date1=$this->dates['first_this_month'];
177            $date2=$this->dates['today'];
178            if ($version != '' and $sabor != ''){
179                $where="version $version and sabor $sabor";
180            }else{
181                $where='';
182            }
183            $sql = "select app,sum(count) as count from (SELECT app,count from packages where $where UNION ALL SELECT app,count from historico where fecha BETWEEN '$date1' and '$date2' and $where) tabla group by app order by count DESC LIMIT 30";
184            if($dumpsql == "yes")
185                return array('type'=>'current','date' => "fecha BETWEEN '$date1' and '$date2'",'where' => '('.$where.')');
186            return $this->get_result_from_sql($sql);
187        }
188        function get_result_from_sql($sql){
189                if ($result=$this->dbconn->query($sql)){
190                        $obj2=[];
191                        $nobj=0;
192                        while($row=$result->fetch_array(MYSQLI_ASSOC)){
193                                if (array_key_exists($row['app'],$this->alias)){
194                                        if (! empty($this->alias[$row['app']])){
195                                                if ($nobj < 10)
196                                                        $obj2[$this->alias[$row['app']]]=$row['count'];
197                                                $nobj++;
198                                        }
199                                }else{
200                                        if ($nobj < 10)
201                                                $obj2[$row['app']]=$row['count'];
202                                        $nobj++;
203                                }
204                        }
205                        return $obj2;
206                }
207                return false;
208        }
209        function get_old_chart($version='',$sabor='',$dumpsql='no'){
210        $date1=$this->dates['first_one_month_ago'];
211        $date2=$this->dates['last_one_month_ago'];
212        if ($version != '' and $sabor != ''){
213                $where_a="version $version and sabor $sabor";
214        }else{
215                $where_a='';
216        }
217        $sql="SELECT app,count,fecha from historico where fecha BETWEEN '$date1' and '$date2' and $where_a order by count DESC LIMIT 30";
218        if($dumpsql == "yes")
219                return array('type'=>'old','date'=> "fecha BETWEEN '$date1' and '$date2'",'where'=>'('.$where_a.')');
220        return $this->get_result_from_sql($sql);
221        }
222        function get_very_old_chart($version='',$sabor='',$dumpsql='no'){
223        $date1=$this->dates['first_two_month_ago'];
224        $date2=$this->dates['last_two_month_ago'];
225        if ($version != '' and $sabor != ''){
226                $where_a="version $version and sabor $sabor";
227        }else{
228                $where_a='';
229        }
230        $sql="SELECT app,count,fecha from historico where fecha BETWEEN '$date1' and '$date2' and $where_a order by count DESC LIMIT 30";
231        if($dumpsql == "yes")
232                return array('type'=>'very_old','date' => "fecha BETWEEN '$date1' and '$date2'",'where' => '('.$where_a.')');
233        return $this->get_result_from_sql($sql);
234        }
235} 
236
237?>
Note: See TracBrowser for help on using the repository browser.