Ignore:
Timestamp:
Jul 19, 2017, 12:05:17 PM (3 years ago)
Author:
mabarracus
Message:

Complete code rewrite
New database model
Improved performance & optimization
Extended information about clients
Fixed older bugs
New testing framework
Fix postinst exit code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/db.php

    r5128 r5560  
    1919                $this->alias=array();
    2020                $this->info_distro=json_decode($distros,true);
     21                if ($this->info_distro == NULL){
     22                    die('Error: Wrong json in Config.php');
     23                }
    2124                $this->init_dates();
     25                $this->times=0;
    2226        }
    2327        function init_dates(){
    2428                $this->dates=array();
    2529                $this->dates['today']=date("Y-m-d");
    26                 $this->dates['tomorrow']=date("Y-m-d",strtotime('tomorrow'));
    27                 $this->dates['first_this_month']=date("Y-m-").'01';
    28                 $this->dates['last_one_month_ago']=date("Y-m-d",strtotime($this->dates['first_this_month']." -1 days"));
    29                 $this->dates['first_one_month_ago']=date("Y-m-d",strtotime($this->dates['first_this_month']." -1 months"));
    30                 $this->dates['last_two_month_ago']=date("Y-m-d",strtotime($this->dates['first_one_month_ago']." -1 days"));
    31                 $this->dates['first_two_month_ago']=date("Y-m-d",strtotime($this->dates['first_one_month_ago']." -1 months"));
     30                $this->dates['first_current']=date("Y-m-").'01';
     31                $this->dates['last_old']=date("Y-m-d",strtotime($this->dates['first_current']." -1 days"));
     32                $this->dates['first_old']=date("Y-m-",strtotime($this->dates['today']. "-1 months")).'01';
     33                $this->dates['last_very_old']=date("Y-m-d",strtotime($this->dates['first_old']." -1 days"));
     34                $this->dates['first_very_old']=date("Y-m-",strtotime($this->dates['first_old']." -1 days")).'01';
     35                $this->dates['date_current']="(date between '".$this->dates['first_current']."' and '".$this->dates['today']."')";
     36                $this->dates['date_old']="(date between '".$this->dates['first_old']."' and '".$this->dates['last_old']."')";
     37                $this->dates['date_very_old']="(date between '".$this->dates['first_very_old']."' and '".$this->dates['last_very_old']."')";
     38                $this->dates['date_range_last_three_months']="(date between '".$this->dates['first_very_old']."' and '".$this->dates['today']."')";
    3239
    3340        }
     
    3542                $this->dbconn=new mysqli($this->dbhost, $this->dbuser , $this->dbpass, $this->dbname);
    3643                if ($this->dbconn->connect_error) {
    37                 die('Connect Error:'. $this->dbconn->connect_error);
     44                    die('Connect Error:'. $this->dbconn->connect_error);
    3845                }
    3946        }
     
    4552                $this->dbconn->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
    4653        }
    47         function insert_data($user,$date,$version,$sabor){
    48                 $sql = "INSERT INTO clients (user,lastlogin,version,sabor) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE lastlogin = VALUES(lastlogin)";
    49                 $query=$this->dbconn->prepare($sql);
    50                 if (! $query)
    51                         throw new Exception($this->dbconn->error);
    52                 $query->bind_param("ssss",$user,$date,$version,$sabor);
    53                 $query->execute();
    54                 if ( $query->affected_rows < 0 ){
    55                         throw new Exception($this->dbconn->error);
    56                 }else{
    57                         $id=$this->dbconn->insert_id;
    58                         $query->close();
    59                         return $id;
    60                 }
    61                 return false;
    62         }
    63         function update_data($data='',$version='',$sabor=''){
    64                 $sql="INSERT INTO packages (app,count,version,sabor) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE count = count + ?";
    65                 $query=$this->dbconn->prepare($sql);
    66                 $query->bind_param("sssss",$k,$v,$version,$sabor,$v);
    67                 if (! $query)
    68                         throw new Exception($this->dbconn->error);
    69                 foreach ($data as $k => $v){
    70                         $noerr=$query->execute();
    71                         if (! $noerr){
    72                                 throw new Exception($this->dbconn->error);
    73                         }
    74                 }
    75                 $query->close();
    76         }
     54
     55        function send_data($user,$version,$sabor,$apps,$date=''){
     56            if ($date == ''){
     57                $sql="INSERT INTO tmp_clients(user,version,sabor,status) values ('$user','$version','$sabor',0)";
     58            }else{
     59                $sql="INSERT INTO tmp_clients(user,version,sabor,status,date) values ('$user','$version','$sabor',0,'$date')";
     60            }
     61            $retry=1;
     62            $done=false;
     63            $cli_id=false;
     64            while (! $done and $retry < 4){
     65                $res=$this->dbconn->query($sql);
     66                if ($res){
     67                    $cli_id=$this->dbconn->insert_id;
     68                    $done=true;
     69                }else{
     70                    $retry+=1;
     71                    sleep($retry);
     72                }
     73            }
     74            if ($retry == 4 or $cli_id == false)
     75                    throw new Exception('Error sending client data: '.$this->dbconn->error);
     76            $err_apps=false;
     77            $err_exception=false;
     78            if (count($apps) != 0){
     79                if ($date == ''){
     80                    $sql="insert into tmp_packages(client,app,value) values";
     81                }else{
     82                    $sql="insert into tmp_packages(client,app,value,date) values";
     83                }
     84                $values=array();
     85                foreach ($apps as $app => $value){
     86                    if (trim($app) == '' or trim($value) == ''){
     87                        $err_apps=true;
     88                        $err_exception=new Exception('Wrong application values');
     89                        continue;
     90                    }
     91                    if ($date == ''){
     92                        $values[]="($cli_id,'$app',$value)";
     93                    }else{
     94                        $values[]="($cli_id,'$app',$value,'$date')";
     95                    }
     96                }
     97                if (count($values) > 0){
     98                    $sql.=implode(',',$values);
     99                    $done=false;
     100                    $retry=1;
     101                    while (! $done and $retry < 4){
     102                        $res=$this->dbconn->query($sql);
     103                        if ($res){
     104                            $done=true;
     105                        }else{
     106                            $retry += 1;
     107                            sleep($retry);
     108                        }
     109                    }
     110                    if ($retry == 4 or ! $done){
     111                        $err_apps=true;
     112                        $err_exception=new Exception('Error sending client app data: '.$this->dbconn->error.' QUERY='.$sql);
     113                    }
     114                }
     115            }
     116            //End operations
     117            $sql = "Update tmp_clients set status=1 where id = $cli_id and status=0";
     118            $retry=1;
     119            $done=false;
     120            while (! $done and $retry < 4){
     121                $res=$this->dbconn->query($sql);
     122                if ($res){
     123                    $done=true;
     124                }else{
     125                    $retry+=1;
     126                    sleep($retry);
     127                }
     128            }
     129            if ($retry == 4 or $cli_id == false){
     130                throw new Exception('Error commiting client data: '.$this->dbconn->error);
     131            }
     132            if ($err_apps){
     133                throw $err_exception;
     134            }
     135        }
     136
    77137        private function load_alias(){
    78                 $sql="SELECT name,alias from alias";
     138                $sql="SELECT name,alias from Alias";
    79139                $result=$this->dbconn->query($sql);
    80140                while($row=$result->fetch_array(MYSQLI_ASSOC)){
     
    82142                }
    83143        }
    84         function rotate(){
    85                 $sql="select max(fecha) from historico;";
    86                 $thismonth=intval(date("Ym"));
    87                 $lastmonth=$thismonth;
    88                 if ($result=$this->dbconn->query($sql)){
    89                         while($row=$result->fetch_row()){
    90                                 if(empty($row[0])){
    91                                         $sql="insert into historico(app,count,fecha,version,sabor) values (?,?,?,?,?)";
    92                                         $query=$this->dbconn->prepare($sql);
    93                                         $name='dummy'; $value=0; $today=date("Y-m-d");
    94                                         $query->bind_param('sdsss',$name,$value,$today,$name,$name);
    95                                         $query->execute();
    96                                         $query->close();
    97                                 }else{
    98                                         $lastmonth=intval(explode('-',$row[0])[0].explode('-',$row[0])[1]);
    99                                 }
    100                         }
    101                 }
    102                 if ($thismonth > $lastmonth){
    103                         $dummy_new_date=$this->dates['first_this_month'];
    104                         $sql="update historico set fecha ='$dummy_new_date' where app = 'dummy'";
    105                         $this->dbconn->query($sql);
    106                         $date_to_history=$this->dates['last_one_month_ago'];
    107                         $sql="insert into historico(app,count,fecha,version,sabor) select app,count,'$date_to_history',version,sabor from packages";
    108                         $this->dbconn->query($sql);
    109                         $sql="truncate packages;";
    110                         $this->dbconn->query($sql);
    111                         $delete_before=$this->dates['first_two_month_ago'];
    112                         $sql="delete from historico where app != 'dummy' and fecha < '$delete_before'";
    113                         $this->dbconn->query($sql);
    114 
    115                         $sql=$this->prepare_rotate_clients();
    116                         foreach ($this->info_distro['distros'] as $distro) {
    117                                 $dname=$distro['name'];
    118                                 foreach ($distro['sabor'] as $sabor) {
    119                                         $sname=$sabor['name'];
    120                                         foreach (array('insert','delete') as $op) {
    121                                                 $this->dbconn->query($sql[$dname][$sname][$op]);
    122                                         }
    123                                 }
    124                                 foreach (array('insert','delete') as $op) {
    125                                         $this->dbconn->query($sql[$dname]['others'][$op]);
    126                                 }
    127                         }
    128                 }
    129         }
    130         function prepare_rotate_clients(){
    131                 $date_clients='BETWEEN \''.$this->dates['first_one_month_ago'].'\' and \''.$this->dates['first_this_month'].'\'';
    132                 foreach ($this->info_distro['distros'] as $distro) {
    133                         $dname=$distro['name'];
    134                         $dlike=$distro['like'];
    135                         $sql_clients[$dname]=array();
    136                         $sql_where_other_clients=array();
    137                         $version_in_history='';
    138                         if ($dname == '15')
    139                                 $version_in_history='15.05';
    140                         else
    141                                 $version_in_history='16';
    142                         $date_to_history=$this->dates['last_one_month_ago'];
    143 
    144                         foreach ($distro['sabor'] as $sabor) {
    145                                 $sname=$sabor['name'];
    146                                 $slike=$sabor['like'];
    147                                 $sql_where_other_clients[]='( sabor '.$slike.')';
    148                                 $where_select="lastlogin $date_clients and version $dlike and (sabor $slike)";
    149                                 $sql_clients[$dname][$sname]['delete']="delete from clients where $where_select ;";
    150                                 $sql_clients[$dname][$sname]['insert']="insert into historico_clients(version,sabor,fecha,nclients) (select '$version_in_history','$sname','$date_to_history',count(id) from clients where $where_select );";
    151                         }
    152                         //others
    153                         $sql_sabor_where_other_clients=implode(' or ',$sql_where_other_clients);
    154                         $where_other_clients="lastlogin $date_clients and version $dlike and not ($sql_sabor_where_other_clients)";
    155                         $sql_clients[$dname]['others']['insert']="insert into historico_clients(version,sabor,fecha,nclients) (select '$version_in_history','others','$date_to_history',count(id) from clients where  $where_other_clients);";
    156                         $sql_clients[$dname]['others']['delete']="delete from clients where $where_other_clients;";
    157                 }
    158                 return $sql_clients;
    159         }
     144        function get_extended_data($app){
     145            $today=date("Y-m-d");
     146            $min_date=date("Y-m",strtotime($today." -1 year")).'-01';
     147            $this->times=0;
     148            // CLIENTS DISTRIBUTION PER RELEASE/FLAVOUR
     149            $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";
     150            $stime=microtime(true);
     151            $result=$this->dbconn->query($sql);
     152            if ($result){
     153                $this->times+=microtime(true)-$stime;
     154                $clients_month=[];
     155                $tmp=[];
     156                while($row=$result->fetch_array(MYSQLI_ASSOC)){
     157                    $date=$row['year'].'_'.$row['month'];
     158                    $tmp[$date][$row['Releases_name']][$row['Flavours_name']]=intval($row['num_hosts']);
     159                }
     160                foreach ($tmp as $date){
     161                    $clients_month[]=$date;
     162                }
     163            }else{
     164                $clients_month=$this->dbconn->error;
     165            }
     166            // CLIENT UPDATES
     167            $sql="select year,month,count(*) as nclients,sum(cnt)-count(*) as nclients_updated from (select Client_uid,count(Client_uid) as cnt,year(date) as year,month(date) as month from Client_Versions where date >= '$min_date' GROUP by Client_uid,year,month having count(Client_uid) >= 1 ) t group by year,month order by year desc,month desc";
     168            $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";
     169            $stime=microtime(true);
     170            $result=$this->dbconn->query($sql);
     171            if ($result){
     172                $this->times+=microtime(true)-$stime;
     173                $i=0;
     174                $tmp=[];
     175                while($row=$result->fetch_array(MYSQLI_ASSOC)){
     176                    $date=$row['year'].'_'.$row['month'];
     177                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['nclients_updated']);
     178                }
     179                foreach($tmp as $date){
     180                    $num_updates_month[]=$date;
     181                }
     182            }else{
     183                $num_updates_month=$this->dbconn->error;
     184            }
     185            // CLIENT CHANGE RELEASE
     186            $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";
     187            $stime=microtime(true);
     188            $result=$this->dbconn->query($sql);
     189            if ($result){
     190                $this->times+=microtime(true)-$stime;
     191                $change_releases=[0,0,0,0,0,0,0,0,0,0,0,0];
     192                $i=0;
     193                while($row=$result->fetch_array(MYSQLI_ASSOC)){
     194                    $change_releases[$i++]=intval($row['upgrades_en_mes']);
     195                }
     196            }else{
     197                $change_releases=$this->dbconn->error;
     198            }
     199            // CLIENT CHANGE FLAVOUR
     200            $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";
     201            $stime=microtime(true);
     202            $result=$this->dbconn->query($sql);
     203            if ($result){
     204                $this->times+=microtime(true)-$stime;
     205                $i=0;
     206                $change_flavour=[0,0,0,0,0,0,0,0,0,0,0,0];
     207                while($row=$result->fetch_array(MYSQLI_ASSOC)){
     208                    $change_flavour[$i++]=intval($row['cambio_sabor_en_mes']);
     209                }
     210            }else{
     211                $change_flavour=$this->dbconn->error;
     212            }
     213           
     214            //sanitize input
     215            if ($app != NULL){
     216                $app=preg_grep('/^[a-zA-Z0-9\-_]+$/',array($app));
     217                if ($app != NULL and isset($app[0])){
     218                    $app=$this->dbconn->real_escape_string($app[0]);
     219                    $stats['apps']=[];
     220                    $stats['apps']['app']=$app;
     221                    $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";
     222                    $stime=microtime(true);
     223                    $result=$this->dbconn->query($sql);
     224                    if ($result){
     225                        $this->times+=microtime(true)-$stime;
     226                        $tmp=[];
     227                        while($row=$result->fetch_array(MYSQLI_ASSOC)){
     228                            $date=$row['year'].'_'.$row['month'];
     229                            $tmp[$date][$row['rel']][$row['fla']]=intval($row['count']);
     230                        }
     231                        foreach($tmp as $date){
     232                            $app_use[]=$date;
     233                        }
     234                        $stats['apps']['app_use']=$app_use;
     235                    }else{
     236                        $app_use=$this->dbconn->error;
     237                    }
     238                }
     239            }
     240            // FINALIZATION & WRITE STRUCTURE
     241            if (isset($clients_month)){
     242                $stats['clients']['clients_per_month']=$clients_month;
     243            }
     244            if (isset($num_updates_month)){
     245                $stats['clients']['freq_updates_per_month']=$num_updates_month;
     246            }
     247            if (isset($change_releases)){
     248                $stats['clients']['change_releases']=$change_releases;
     249            }
     250            if (isset($change_flavour)){
     251                $stats['clients']['change_flavours']=$change_flavour;
     252            }
     253            $stats['debug_query_time']=strval(number_format($this->times,5));
     254            return json_encode($stats);
     255        }
     256
    160257        function get_historic_data(){
    161                 $this->rotate();
    162258                $this->load_alias();
    163                 //echo $today.' '.$first_this_month.' '.$first_one_month_ago.' '.$last_one_month_ago.' '.$first_two_month_ago.' '.$last_two_month_ago.' EOL';
    164259                $obj=[];
    165                 //4 Debugging only
    166                 //$dbg_obj=[];
    167                 $other_sql=array();
     260                $this->times=0;
    168261                foreach ($this->info_distro['distros'] as $distro){
    169262                        $dname=$distro['name'];
    170263                        $dlike=$distro['like'];
    171264                        $obj[$dname]=array();
    172                         //4 Debugging only
    173                         //$dbg_obj[$dname]=array();
    174265                        foreach ($distro['sabor'] as $sabor){
    175266                                $sname=$sabor['name'];
    176267                                $slike=$sabor['like'];
    177                                 $obj[$dname][$sname][]=$this->get_current_chart($dlike,$slike);
    178                                 $obj[$dname][$sname][]=$this->get_old_chart($dlike,$slike);
    179                                 $obj[$dname][$sname][]=$this->get_very_old_chart($dlike,$slike);
    180                                 $other_sql[]=$this->get_current_chart($dlike,$slike,'yes');
    181                                 $other_sql[]=$this->get_old_chart($dlike,$slike,'yes');
    182                                 $other_sql[]=$this->get_very_old_chart($dlike,$slike,'yes');
    183                                
    184                                 //4 Debugging only
    185                                 //$dbg_obj[$dname][$sname][]=$this->get_current_chart($dlike,$slike,'yes');
    186                                 //$dbg_obj[$dname][$sname][]=$this->get_old_chart($dlike,$slike,'yes');
    187                                 //$dbg_obj[$dname][$sname][]=$this->get_very_old_chart($dlike,$slike,'yes');
     268                                $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'current');
     269                                $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'old');
     270                                $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'very_old');
    188271                        }
    189272                }
    190                 //4 Debugging only
    191                 //file_put_contents('/tmp/graph_sql',str_replace('\\','',var_export($dbg_obj,true)));
    192                 //file_put_contents('/tmp/other_sql',str_replace('\\','',var_export($this->gen_other($other_sql),true)));
    193                 $sql_other_sentences=$this->gen_other($other_sql);
    194                 //4 Debugging only
    195                 //file_put_contents('/tmp/rotate_sql',str_replace('\\','',var_export($this->prepare_rotate_clients(),true)));
    196                
    197                 $obj['other']['other'][]=array($this->get_result_from_sql($sql_other_sentences['current']),$this->get_clients_from_sql($sql_other_sentences['current_clients']));
    198                 $obj['other']['other'][]=array($this->get_result_from_sql($sql_other_sentences['old']),$this->get_clients_from_sql($sql_other_sentences['old_clients']));
    199                 $obj['other']['other'][]=array($this->get_result_from_sql($sql_other_sentences['very_old']),$this->get_clients_from_sql($sql_other_sentences['very_old_clients']));
     273                $obj['debug_query_time']=strval(number_format($this->times,3));
    200274                return json_encode($obj);
    201275        }
    202         function gen_other($other_data){
    203             $sql=array('current' =>'','old'=>'', 'very_old'=>'', 'current_clients' => '', 'old_clients' => '', 'very_old_clients' => '');
    204 
    205             $sql['current']="select app,sum(count) as count from (select app,count from packages where (app,version,sabor) not in ( select app,version,sabor from packages where (";
    206             $sql['old']="select app,sum(count) as count,fecha from historico where";
    207             $sql['very_old']="select app,sum(count) as count,fecha from historico where";
    208             $where_current=array();
    209             $where_old=array();
    210             $where_very_old=array();
    211             foreach($other_data as $odata){
    212                 switch($odata['type']){
    213                     case 'current':
    214                         $date_current=$odata['date'];
    215                         $where_current[]=$odata['where'];
    216                     break;
    217                     case 'old':
    218                         $date_old=$odata['date'];
    219                         $where_old[]=$odata['where'];
    220                     break;
    221                     case 'very_old':
    222                         $date_very_old=$odata['date'];
    223                         $where_very_old[]=$odata['where'];
    224                     break;
    225                 }
    226             }
    227             $sql['current'].=implode(' or ',$where_current);
    228             $sql['current'].=")) UNION ALL select app,count from historico where app in ( select app from historico where ";
    229             $sql['current'].="fecha ".$date_current.  " and not (";
    230             $sql['current'].=implode(' or ',$where_current);
    231             $sql['current'].=")) and app not like 'dummy' ) tabla group by app order by count DESC LIMIT 30";
    232             $sql['old'].=' fecha '.$date_old." and not (";
    233             $sql['old'].=implode(' or ',$where_old);
    234             $sql['old'].=") group by app order by sum(count) DESC LIMIT 30";
    235             $sql['very_old'].=' fecha '.$date_very_old." and not(";
    236             $sql['very_old'].=implode(' or ',$where_very_old);
    237             $sql['very_old'].=") group by app order by sum(count) DESC LIMIT 30";
    238            
    239             $sql['current_clients'].="select coalesce(sum(suma_parcial),0) as count from (";
    240             $sql['current_clients'].="select count(id) as suma_parcial from clients where lastlogin $date_current and not ( ".implode(' or ',$where_current);
    241             $sql['current_clients'].=") UNION ALL select nclients as suma_parcial from historico_clients where fecha $date_current and not ( ".implode(' or ',$where_current);
    242             $sql['current_clients'].=") ) tabla";
    243 
    244             $sql['old_clients'].="select coalesce(sum(nclients),0) as count from historico_clients where fecha $date_old and not(";
    245             $sql['old_clients'].=implode(' or ',$where_old). ')';
    246 
    247             $sql['very_old_clients'].="select coalesce(sum(nclients),0) as count from historico_clients where fecha $date_very_old and not(";
    248             $sql['very_old_clients'].=implode(' or ',$where_very_old). ')';
    249             return $sql;
    250         }
    251         function get_current_chart($version='',$sabor='',$dumpsql='no'){
    252                 $date1=$this->dates['first_this_month'];
    253                 $date2=$this->dates['tomorrow'];
    254                 if ($version != '' and $sabor != ''){
    255                         $where="version $version and sabor $sabor";
    256                 }else{
    257                         $where='';
    258                 }
    259                 $range_dates="BETWEEN '$date1' and '$date2' ";
    260                 $sql="select app,sum(count) as count from (SELECT app,count from packages where $where UNION ALL SELECT app,count from historico where fecha $range_dates and $where) tabla group by app order by count DESC LIMIT 30";
    261                 $sql_clients = "select count(user) as count from clients where (lastlogin $range_dates) and $where";
    262                 if($dumpsql == "yes")
    263                         return array('type'=>'current','date' => "$range_dates",'where' => '('.$where.')','clients'=>"$sql_clients",'sql'=>$sql);
    264                
     276        function get_chart($version='',$sabor='',$type='current'){
     277                if ($version != ''){
     278                    $version = " and Releases_name = '$version' ";
     279                }
     280                if ($sabor != ''){
     281                    $sabor = " and Flavours_name = '$sabor' ";
     282                }
     283                $order=" order by count desc limit 10 ";
     284                $group=" group by app ";
     285               
     286                $where=$this->dates['date_'.$type]." $version $sabor ";
     287                $where_clients=$this->dates['date_'.$type]." $version $sabor ";
     288
     289                $sql="SELECT string as app,sum(count) as count from RecvPackages where $where $group $order";
     290                $sql_clients = "select count(distinct Client_uid) as count from Client_Versions where $where_clients $order";
     291
    265292                return array($this->get_result_from_sql($sql),$this->get_clients_from_sql($sql_clients));
    266293        }
    267294        function get_clients_from_sql($sql){
     295                $stime=microtime(true);
    268296                if ($result=$this->dbconn->query($sql)){
     297                        $etime=microtime(true);
     298                        $this->times+=($etime-$stime);
    269299                        while($row=$result->fetch_array(MYSQLI_ASSOC)){
    270300                                if (isset($row['count'])){
     
    274304                        return array('nclients'=>'not available');
    275305                }else{
    276                         return array('nclients'=>'Query error');
    277                 }
     306                        return array('nclients'=>$this->dbconn->error);
     307                }
     308               
    278309        }
    279310        function get_result_from_sql($sql){
     311                $stime=microtime(true);
    280312                if ($result=$this->dbconn->query($sql)){
     313                        $etime=microtime(true);
     314                        $this->times+=($etime-$stime);
    281315                        $obj2=[];
    282316                        $nobj=0;
     
    295329                        }
    296330                        return $obj2;
    297                 }
    298                 return false;
    299         }
    300         function get_old_chart($version='',$sabor='',$dumpsql='no'){
    301                 $date1=$this->dates['first_one_month_ago'];
    302                 $date2=$this->dates['last_one_month_ago'];
    303                 if ($version != '' and $sabor != ''){
    304                         $where_a="version $version and sabor $sabor";
    305331                }else{
    306                         $where_a='';
    307                 }
    308                 $range_dates="BETWEEN '$date1' and '$date2'";
    309                 $sql="SELECT app,sum(count) as count,fecha from historico where fecha $range_dates and $where_a group by app order by sum(count) DESC LIMIT 30";
    310                 $sql_clients = "select nclients as count from historico_clients where (fecha $range_dates) and $where_a";
    311                 if($dumpsql == "yes")
    312                         return array('type'=>'old','date'=> "$range_dates",'where'=>'('.$where_a.')','clients'=>"$sql_clients",'sql'=>$sql);
    313                 return array($this->get_result_from_sql($sql),$this->get_clients_from_sql($sql_clients));
    314         }
    315         function get_very_old_chart($version='',$sabor='',$dumpsql='no'){
    316                 $date1=$this->dates['first_two_month_ago'];
    317                 $date2=$this->dates['last_two_month_ago'];
    318                 if ($version != '' and $sabor != ''){
    319                         $where_a="version $version and sabor $sabor";
    320                 }else{
    321                         $where_a='';
    322                 }
    323                 $range_dates="BETWEEN '$date1' and '$date2'";
    324                 $sql="SELECT app,sum(count) as count,fecha from historico where fecha $range_dates and $where_a group by app order by sum(count) DESC LIMIT 30";
    325                 $sql_clients = "select nclients as count from historico_clients where (fecha $range_dates) and $where_a";
    326                 if($dumpsql == "yes")
    327                         return array('type'=>'very_old','date' => "$range_dates",'where' => '('.$where_a.')','clients'=>"$sql_clients",'sql'=>$sql);
    328                
    329                 return array($this->get_result_from_sql($sql),$this->get_clients_from_sql($sql_clients));
    330         }
     332                    return $this->dbconn->error;
     333                }
     334        }
     335
    331336}
    332337
Note: See TracChangeset for help on using the changeset viewer.