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

Last change on this file since 747 was 747, checked in by mabarracus, 5 years ago
  • Add stats processing by release and flavour, improved stats page view
File size: 6.8 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               
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                    }
124                }
125                return json_encode($obj);
126        }
127        function get_current_chart($version='',$sabor=''){
128            $date1=$this->dates['first_this_month'];
129            $date2=$this->dates['today'];
130            if ($version != '' and $sabor != ''){
131                $where_a="where version $version and sabor $sabor";
132                $where_b="and version $version and sabor $sabor";
133            }else{
134                $where_a='';
135                $where_b='';
136            }
137            $sql = "select app,sum(count) as count from (SELECT app,count from packages $where_a UNION ALL SELECT app,count from historico where fecha BETWEEN '$date1' and '$date2' $where_b) tabla group by app order by count DESC LIMIT 30";
138                if ($result=$this->dbconn->query($sql)){
139                        $obj2=[];
140                        $nobj=0;
141                        while($row=$result->fetch_array(MYSQLI_ASSOC)){
142                                if (array_key_exists($row['app'],$this->alias)){
143                                        if (! empty($this->alias[$row['app']])){
144                                                if ($nobj < 10)
145                                                        $obj2[$this->alias[$row['app']]]=$row['count'];
146                                                $nobj++;
147                                        }
148                                }else{
149                                        if ($nobj < 10)
150                                                $obj2[$row['app']]=$row['count'];
151                                        $nobj++;
152                                }
153                        }
154                        return $obj2;
155                }
156                return false;
157        }
158        function get_old_chart($version='',$sabor=''){
159        $date1=$this->dates['first_one_month_ago'];
160        $date2=$this->dates['last_one_month_ago'];
161        if ($version != '' and $sabor != ''){
162                $where_a="and version $version and sabor $sabor";
163        }else{
164                $where_a='';
165        }
166        $sql="SELECT app,count,fecha from historico where fecha BETWEEN '$date1' and '$date2' $where_a order by count DESC LIMIT 30";
167                if ($result=$this->dbconn->query($sql)){
168                        $obj2=[];
169                        $nobj=0;
170                        while($row=$result->fetch_array(MYSQLI_ASSOC)){
171                                if (array_key_exists($row['app'],$this->alias)){
172                                        if (! empty($this->alias[$row['app']])){
173                                                if ($nobj < 10)
174                                                        $obj2[$this->alias[$row['app']]]=$row['count'];
175                                                $nobj++;
176                                        }
177                                }else{
178                                        if ($nobj < 10)
179                                                $obj2[$row['app']]=$row['count'];
180                                        $nobj++;
181                                }
182                        }
183                        return $obj2;
184                }
185                return false;
186        }
187        function get_very_old_chart($version='',$sabor=''){
188        $date1=$this->dates['first_two_month_ago'];
189        $date2=$this->dates['last_two_month_ago'];
190        if ($version != '' and $sabor != ''){
191                $where_a="and version $version and sabor $sabor";
192        }else{
193                $where_a='';
194        }
195        $sql="SELECT app,count,fecha from historico where fecha BETWEEN '$date1' and '$date2' $where_a order by count DESC LIMIT 30";
196                if ($result=$this->dbconn->query($sql)){
197                        $obj2=[];
198                        $nobj=0;
199                        while($row=$result->fetch_array(MYSQLI_ASSOC)){
200                                if (array_key_exists($row['app'],$this->alias)){
201                                        if (! empty($this->alias[$row['app']])){
202                                                if ($nobj < 10)
203                                                        $obj2[$this->alias[$row['app']]]=$row['count'];
204                                                $nobj++;
205                                        }
206                                }else{
207                                        if ($nobj < 10)
208                                                $obj2[$row['app']]=$row['count'];
209                                        $nobj++;
210                                }
211                        }
212                        return $obj2;
213                }
214                return false;
215
216        }
217} 
218
219?>
Note: See TracBrowser for help on using the repository browser.