<?php
namespace imcat;

// basSql类
class basSql{    
    
    
// *** 过滤注释
    
static function filNotes($str){
        
$str str_replace('---<split>---''###<split>###'$str);
        
$str preg_replace('/\/\*(.*?)\*\//is'''$str);
        
$str preg_replace('/\-\-([^\'\r\n]{0,}(\'[^\'\r\n]{0,}\'){0,1}[^\'\r\n]{0,}){0,}/is'''$str);
        
$str str_replace('###<split>###''---<split>---'$str);
        return 
$str
    }

    
// type=a/e; $re='arr/str'; ip=''
    
static function logData($type='a'$ip=''$time=0$user=''){ 
        global 
$_cbase;
        
$run $_cbase['run'];
        
$cfg = array(
            
$type.'ip' => $ip $ip $run['userip'],
            
$type.'time' => $run['stamp'],
            
$type.'user' => empty($run['uname']) ? '(Guest)' $run['uname'],
        );
        return 
$cfg;
    }
    
    
// 2013-12-31; 5(天)
    
static function whrDate($key$val$op$cfg='isdate'){
        
//'fmextra' => 'datetm'
        
$val preg_replace('/[^0-9A-Za-z,\.\-\ \:]/','',$val);
        if( 
in_array($key,array('atime','etime')) || @$cfg=='isdate' || @$cfg['f'][$key]['mfextra']=='datetm' ){
            if(
is_numeric($val)){
                
$valbase strtotime(date('Y-m-d',$_SERVER["REQUEST_TIME"]));
                
$val $valbase $val*86400;
            }else{ 
                
$val strtotime($val); 
            }
            if(
$op=='<' && strstr($val,':')) $val += 86401;    
        } 
        
$sql " AND $key$op='$val'"
        return 
$sql;
    }
    
    
/**
     * 地图中参照物周边的查询子串
     * @param int $x,$y         参照目标的坐标
     * @param int $diff            指定范围,单位为km或度
     * @param int $mode         计算模式,0按度数,1按实际距离//???
     * @param string $fname        查询的字段名(包含表别名前缀)
     * m.didu_0>=22.456 AND m.didu_0<=52.456 AND m.didu_1>=50.33 AND m.didu_1<=150.33
     */
    
static function whrMap($x$y$diff$mode$fname){        
        if(!
$diff) return '';
        
$mode = empty($mode) ? 1;
        
$x floatval($x);
        
$y floatval($y);
        
$dfx $dfy $diff abs(floatval($diff));
        if(
$mode == 1){
            
$radius 6371;//km
            
$dfx $diff / ($radius M_PI) * 360;
            
$dfy $diff / ($radius M_PI cos(deg2rad($x))) * 360;
        }
        
$re $fname.'_x>='.($x $dfx).' AND '.$fname.'_x<='.($x $dfx);
        
$re .= " AND {$fname}_y>=".($y $dfy)." AND {$fname}_y<=".($y $dfy)."";
        return 
$re;
        
//$dmin = $y - $dfy; $dmax = $y + $dfy; // $dmin<-180 // $dmax>180 // $dfx>30 || $dfy>60
    
}
    
    
// 栏目,类别系的子类别
    
static function whrTree($items$key$val){
        
$ids comTypes::getSubs($items,$val); 
        
$ids array_keys($ids); $ids[] = $val;
        if(
in_array($key,array('(arr)','(crc32)'))){
            if(
$key=='(arr)') return $ids
            
$rea = array();
            foreach (
$ids as $kv) {
                
$rea[] = crc32($kv);
            }
            return 
$rea;
        } 
        
$sql " AND $key IN('".implode("','",$ids)."')";  
        return 
$sql;
    }
    
    
// 单选/多选/单选按钮:可用用文字搜索
    
static function whrScbr($cfgs$sfid$sfkw){
        
$cfg $cfgs[$sfid]; 
        
$arr basElm::text2arr($cfg); 
        if(isset(
$arr[$sfkw])){
            
$sql " AND $sfid='$sfkw' ";
        }else{
            
$keys = array();
            foreach(
$arr as $k=>$v){
                
similar_text($v,$sfkw,$per); 
                if(
$per>60){
                    
$keys[] = $k;
                }
            }
            if(!empty(
$keys)){
                
$sql " AND $sfid IN('".implode("','",$keys)."')";
            }else{
                
$sql " AND $sfid='((.null.))'";
            }
        } 
        return 
$sql;
    }
    
    
// ids : array, id1,id2...
    
static function whrInids($ids$sp=','){
        
$arr is_array($ids) ? $ids explode($sp,$ids);
        
$arr array_unique(array_filter($arr));
        
$arr str_replace("'"""$arr);
        
$str = empty($arr) ? '' "'".implode("','",$arr)."'";
        return 
$str;
    }
    
    
// 格式化sql        
    
static function fmtShow($sql){
        
$arr = array("INNER JOIN","WHERE","ORDER BY","GROUP BY","LIMIT","FORCE INDEX",);
        
$sql basStr::filTrim($sql); 
        foreach(
$arr as $v$sql str_replace($v"\n$v"$sql);    
        
$sql str_replace(") AND"") \n AND"$sql); 
        return 
$sql;
    }
    static function 
fmtCount($str$field='_rec_count_'){
        return 
$str preg_match('/^(.+?)\s+GROUP\s+BY(.+)$/is',$str,$arr) ? "SELECT COUNT(DISTINCT $arr[2]) ".stristr($arr[1],'FROM') : ("SELECT COUNT(*) AS $field ".stristr($str,'FROM')) : '';
    }
    
    
/**
     * 处理搜索关键字,处理后:可搜索%_特殊字符,
     * demo: AND (a.subject ".fmtKeyWD($keyword).")";
     *
     * @param  string $keyword 要转换的字符串
     * @param  string $multi =1时,*,空格当成通配符处理
     * @return string $sqlstr 返回sql子字符串,包含 LIKE
     */
    
static function fmtKeyWD($keyword$multi=1){
        if(
is_array($keyword)){
            die(
'Error:'.var_export($keyword,1));
        }
        
$keyword addcslashes($keyword'%_');
        
$multi && $keyword str_replace(array(' ','*'), '%'$keyword);
        return 
" LIKE '%$keyword%' ";
    }
    

    
/**
     * mysql(ctreate_table)转sqlite语句
     * @author anrip[mail@anrip.com]
     * @version 2.1, 2013-01-18 17:02
     * @link http://www.anrip.com/?arkplus
     */
    
static function sqlite_tabcreate($sql) {
        
$expr = array(
            
'/`(\w+)`\s/' => '[$1] ',
            
'/\s+UNSIGNED/i' => '',
            
'/\s+[A-Z]*INT(\([0-9]+\))/i' => ' INTEGER$1',
            
'/\s+INTEGER\(\d+\)(.+AUTO_INCREMENT)/i' => ' INTEGER$1',
            
'/\s+AUTO_INCREMENT(?!=)/i' => ' PRIMARY KEY AUTOINCREMENT',
            
'/\s+ENUM\([^)]+\)/i' => ' VARCHAR(255)',
            
'/\s+ON\s+UPDATE\s+[^,]*/i' => ' ',
            
'/\s+COMMENT\s+(["\']).+\1/iU' => ' ',
            
'/[\r\n]+\s+PRIMARY\s+KEY\s+[^\r\n]+/i' => '',
            
'/[\r\n]+\s+UNIQUE\s+KEY\s+[^\r\n]+/i' => '',
            
'/[\r\n]+\s+KEY\s+[^\r\n]+/i' => '',
            
'/,([\s\r\n])+\)/i' => '$1)',
            
'/\s+ENGINE\s*=\s*\w+/i' => ' ',
            
'/\s+CHARSET\s*=\s*\w+/i' => ' ',
            
'/\s+AUTO_INCREMENT\s*=\s*\d+/i' => ' ',
            
'/\s+DEFAULT\s+;/i' => ';',
            
'/\)([\s\r\n])+;/i' => ');',
        );
        
$sql preg_replace(array_keys($expr), array_values($expr), $sql);
        return 
$sql === null '{table_mysql2sqlite_error}' $sql;
    }

    static function 
sqlite_insbatch($data) {
        
$data basElm::line2arr($data,0); 
        
$re $head ""
        foreach (
$data as $val) {
            if(
strlen($val)<12) continue;
            if(
strstr($val,'INSERT INTO `')){
                
$head $val;
            }elseif(
strstr($val,"','") && (strpos($val,'),') || strpos($val,');'))>0){
                
$val substr($val0strlen($val)-1);
                
$re .= "$head $val;\n";
            }
        }
        return 
$re;
    }



}