<?php
namespace KIF\Dao;

use KIF\Exception\ParamsException;
use KIF\Verify;

/*
 * Sql助手类
 * @author gaoxiaogang@yoka.com
 */
class SqlHelper {
    /**
     * 转义数据
     * @param mixed $data
     * @param boolean $isQuote 字符串值是否用引号引起来。默认不括起来。
     * @return mixed
     */
    static public function escape($data, $isQuote = false) {
        if (is_int($data)) {
            return strval($data);
        } elseif (is_float($data)) {
            return strval($data);
        } elseif (is_string($data)) {
        	if ($isQuote) {
        		# 判断值是否需要 quote 起来
        		if (self::isWrapperNoQuote($data)) {
        			return addslashes(self::UnwrapperNoQuote($data));
        		} else {
        			return "'" . addslashes($data) . "'";
        		}
        	} else {
        		return addslashes($data);
        	}
        } elseif (is_bool($data)) {
            return strval(intval($data));
        } elseif (empty($data)) {
            if ($isQuote) {
                return "''";
            } else {
                return '';
            }
        } elseif (is_array($data)) {
            foreach ($data as &$val) {
                $val = self::escape($val, $isQuote);
            }
            return $data;
        } else {
            return false;
        }
    }

    /**
     * 判断给定的值是否是有效的自增主键值
     * @param mixid $pk
     * @return boolean
     */
    static public function isValidPK($pk) {
    	# 对开心用户id的处理有大bug,时间上来不及,先通过所有验证
    	return true;

    	if (!Verify::unsignedInt($pk)) {
            return false;
        }
        return true;
    }

    /**
     * 判断给定数组的某个key的值,是否是有效的自增主键值
     * @param array $arr
     * @param mixid $key
     * @return boolean
     */
    static public function isValidPKWithArray(array $arr, $key) {
        if (empty($arr)) {
            return false;
        }
        if (!array_key_exists($key, $arr)) {
            return false;
        }
        return self::isValidPK($arr[$key]);
    }

    /**
     *
     * 对值 $str 做包装,表示该值不需要 引(quote) 起来
     * @param string $str
     * @return string
     */
    static public function wrapperNoQuote($str) {
    	if (empty($str)) {
    		return $str;
    	}
    	return "NOQUOTE{$str}NOQUOTE";
    }

    /**
     *
     * 是否对值 $str 做了不需要 引(quote) 起来的包装
     * @param string $str
     * @return Boolean
     */
    static public function isWrapperNoQuote($str) {
		if (strpos($str, 'NOQUOTE') !== 0) {
			return false;
		}

		if (strrpos($str, 'NOQUOTE') !== (strlen($str) - strlen('NOQUOTE'))) {
			return false;
		}

		return true;
    }

    /**
     *
     * 去除不 引(quote) 起来的包装
     * @param string $str
     * @return string
     */
    static public function UnwrapperNoQuote($str) {
    	return str_replace('NOQUOTE', '', $str);
    }

    /**
     *
     * 将sql里的比较操作符添加到 $val里
     * DBAbstract::parseCondition 方法,会调用 SqlHelper::explodeCompareOperator 方法来拆解值与比较操作符
     * @param string $operator 比较操作符。如: >= 、 < 、!=
     * @param scalar $val 标题数据
     * @throws ParamsException '参数val必须是标量scalar类型'
     * @return string
     */
    static public function addCompareOperator($operator, $val) {
		if (!is_scalar($val)) {
			throw new ParamsException("参数val必须是标量scalar类型");
		}
    	$val = "COMPARE{$operator}COMPARE    {$val}";
    	return $val;
    }

    /**
     *
     * 拆解 $val 里的 比较操作符 与 数据。
     * 如果含比较操作符,则认为比较操作符是 =
     * @param string $val
     * @return string
     */
    static public function explodeCompareOperator($val) {
    	$pattern = '#^(\'?)COMPARE(.+?)COMPARE\s{4}#';
    	if (!preg_match($pattern, $val, $match)) {
			return "  =  {$val}  ";
    	}
    	$compareOperator = $match[2];
    	$val = preg_replace($pattern, '$1', $val);
    	return "  {$compareOperator}  {$val}  ";
    }
}