<?php
namespace imcat;

//数据库-缓存类
class glbDBCache extends glbDBObj{

    public 
$cache NULL// 缓存对象

    
function __construct($config=array()){
        
parent::__construct($config); 
    }

    
//执行原生sql语句,如果sql是查询语句,返回二维数组
    
function query($sql,$func=''){ 
        if(empty(
$sql)) return false;
        
$this->sql $sql;
        
//判断当前的sql是否是查询语句
        
if($func){
            return 
parent::query($sql,$func);
        }elseif(
strpos(trim(strtolower($sql)),'select')===0){ 
            
//读取缓存
            
$data $this->_dcGet();
            if(!empty(
$data)){ return $data; }
            
//没有缓存,则查询数据库
            
$this->runTimer();
            
$data $this->db->arr($this->sql);
            
$this->runTimer('qSelect');
            
$this->_dcPut($data);//写入缓存
            
return $data;
        }else{ 
//不是查询条件,执行之后,直接返回
            
return parent::query($sql,$func);
        }
    }

    
//统计行数
    
function count(){ // SELECT $func($field) AS $field FROM $tab WHERE kid='$job'
        
$table $this->opts['table'];//当前表
        
$field 'count(*)';//查询的字段
        
$where $this->_parseCond();//条件
        
$this->sql "SELECT $field FROM $table $where";
        
//读取缓存
        
$re $this->_dcGet();
        if(!empty(
$re)){ return $re; }
        
$this->runTimer();
        
$re $this->db->val($this->sql);
        
$this->runTimer('count');
        
$this->_dcPut($re);//写入缓存
        
return $re;
    }

    
//只查询一条信息,返回一维数组    
    
function find(){
        
$table $this->opts['table'];//当前表
        
$field $this->opts['field'];//查询的字段
        
$this->opts['limit']=1;//限制只查询一条数据
        
$where $this->_parseCond();//条件
        
$this->opts['field'] = '*';//设置下一次查询时,字段的默认值
        
$this->sql "SELECT $field FROM $table $where";
        
//读取缓存
        
$data $this->_dcGet();
        if(!empty(
$data)){ return $data; }
        
$this->runTimer();
        
$data $this->db->row($this->sql);
        
$this->runTimer('find');
        
$this->_dcPut($data);//写入缓存
        
return $data;
     }

    
//查询多条信息,返回数组
    
function select(){
        
$table $this->opts['table'];//当前表
        
$field $this->opts['field'];//查询的字段
        
$where $this->_parseCond();//条件
        
$this->opts['field'] = '*';//设置下一次查询时,字段的默认值
        
$this->sql "SELECT $field FROM $table $where";
        
//读取缓存
        
$data $this->_dcGet();
        if(!empty(
$data)){ return $data; }
        
//没有缓存,则查询数据库
        
$this->runTimer();
        
$data $this->db->arr($this->sql);
        
$this->runTimer('select');
        
$this->_dcPut($data);//写入缓存
        
return $data;
     }
    
    
//初始化缓存类,如果开启缓存,则加载缓存类并实例化
    
function _dcInit(){
        if(
is_object($this->cache)){
            return 
true;
        }elseif(
$this->config['dc_on']){
            
$config = array();
            foreach (
$this->config as $key => $val) {
                if(
$key=='dc_on') continue;
                
$pre substr($key,0,3);
                if(
$pre=='dc_'$config[substr($key,3)] = $val;
            }
            
$this->cache = new extCache($config);
            return 
true;
        }else{
            return 
false;
        }
    }
    
//读取缓存
    
function _dcGet(){
        
$key $this->_dcKey();
        unset(
$this->opts['cache']);
        
$data $key $this->cache->get($key) : '';
        if(!empty(
$data)){
            return 
$data;
        }else{
            return 
"";
        }

    }
    
//写入缓存
    
private function _dcPut($data){
        
$key $this->_dcKey(0);
        unset(
$this->opts['cache']);
        if(
$key){
            
$exp $this->_dcKey('(exp)');
            return 
$this->cache->set($key[0],$data,$key[1]);
        }
        return 
false;
    }
    private function 
_dcKey($resql=1){
        
$expire = isset($this->opts['cache']) ? $this->opts['cache'] : $this->config['dc_exp'];
        if(empty(
$expire)) return false// 缓存时间为0,不读取缓存
        
if(!$this->_dcInit()){
            return 
false;
        }
        
$arr1 = array(
            
'SELECT ','FROM ','WHERE ','AND ','OR ',
            
'INSERT INTO ','UPDATE ','DELETE ','REPLACE INTO '
            
'GROUP BY ','HAVING ','ORDER BY ','LIMIT ',
            
'LEFT JOIN','RIGHT JOIN','INNER JOIN',
            
' ',
        );
        
$arr2 = array(
            
'[s]','[f]','[w]','[a]','[o]',
            
'[i]','[u]','[d]','[r]',
            
'[gby]','[hav]','[oby]','[lmt]',
            
'[lj]','[rj]','[ij]',
            
'',
        );
        
$sql str_replace($arr1,$arr2,$this->sql);
        return 
$resql $sql : array($sql,$expire);
    }
    
//删除数据库缓存
    
function clear(){
        if(
$this->config['dc_on'])
            return 
$this->cache->clear();
        return 
false;
    }
}