| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 | <?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]// +----------------------------------------------------------------------// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: liu21st <liu21st@gmail.com>// +----------------------------------------------------------------------namespace Think\Db\Driver;use Think\Db\Driver;/** * Oracle数据库驱动 */class Oracle extends Driver{    private     $table        = '';    protected   $selectSql    = 'SELECT * FROM (SELECT thinkphp.*, rownum AS numrow FROM (SELECT  %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%) thinkphp ) %LIMIT%%COMMENT%';    /**     * 解析pdo连接的dsn信息     * @access public     * @param array $config 连接信息     * @return string     */    protected function parseDsn($config){        $dsn  =   'oci:dbname=//'.$config['hostname'].($config['hostport']?':'.$config['hostport']:'').'/'.$config['database'];        if(!empty($config['charset'])) {            $dsn  .= ';charset='.$config['charset'];        }        return $dsn;    }    /**     * 执行语句     * @access public     * @param string $str  sql指令     * @param boolean $fetchSql  不执行只是获取SQL          * @return integer     */    public function execute($str,$fetchSql=false) {        $this->initConnect(true);        if ( !$this->_linkID ) return false;        $this->queryStr = $str;        if(!empty($this->bind)){            $that   =   $this;            $this->queryStr =   strtr($this->queryStr,array_map(function($val) use($that){ return '\''.$that->escapeString($val).'\''; },$this->bind));        }        if($fetchSql){            return $this->queryStr;        }        $flag = false;        if(preg_match("/^\s*(INSERT\s+INTO)\s+(\w+)\s+/i", $str, $match)) {            $this->table = C("DB_SEQUENCE_PREFIX").str_ireplace(C("DB_PREFIX"), "", $match[2]);            $flag = (boolean)$this->query("SELECT * FROM user_sequences WHERE sequence_name='" . strtoupper($this->table) . "'");        }        //释放前次的查询结果        if ( !empty($this->PDOStatement) ) $this->free();        $this->executeTimes++;        N('db_write',1); // 兼容代码                // 记录开始执行时间        $this->debug(true);        $this->PDOStatement	=	$this->_linkID->prepare($str);        if(false === $this->PDOStatement) {            $this->error();            return false;        }        foreach ($this->bind as $key => $val) {            if(is_array($val)){                $this->PDOStatement->bindValue($key, $val[0], $val[1]);            }else{                $this->PDOStatement->bindValue($key, $val);            }        }        $this->bind =   array();                $result	=	$this->PDOStatement->execute();        $this->debug(false);        if ( false === $result) {            $this->error();            return false;        } else {            $this->numRows = $this->PDOStatement->rowCount();            if($flag || preg_match("/^\s*(INSERT\s+INTO|REPLACE\s+INTO)\s+/i", $str)) {                $this->lastInsID = $this->_linkID->lastInsertId();            }            return $this->numRows;        }    }    /**     * 取得数据表的字段信息     * @access public     */     public function getFields($tableName) {        list($tableName) = explode(' ', $tableName);        $result = $this->query("select a.column_name,data_type,decode(nullable,'Y',0,1) notnull,data_default,decode(a.column_name,b.column_name,1,0) pk "                  ."from user_tab_columns a,(select column_name from user_constraints c,user_cons_columns col "          ."where c.constraint_name=col.constraint_name and c.constraint_type='P'and c.table_name='".strtoupper($tableName)          ."') b where table_name='".strtoupper($tableName)."' and a.column_name=b.column_name(+)");        $info   =   array();        if($result) {            foreach ($result as $key => $val) {                $info[strtolower($val['column_name'])] = array(                    'name'    => strtolower($val['column_name']),                    'type'    => strtolower($val['data_type']),                    'notnull' => $val['notnull'],                    'default' => $val['data_default'],                    'primary' => $val['pk'],                    'autoinc' => $val['pk'],                );            }        }        return $info;    }    /**     * 取得数据库的表信息(暂时实现取得用户表信息)     * @access public     */    public function getTables($dbName='') {        $result = $this->query("select table_name from user_tables");        $info   =   array();        foreach ($result as $key => $val) {            $info[$key] = current($val);        }        return $info;    }    /**     * SQL指令安全过滤     * @access public     * @param string $str  SQL指令     * @return string     */    public function escapeString($str) {        return str_ireplace("'", "''", $str);    }    /**     * limit     * @access public     * @return string     */	public function parseLimit($limit) {        $limitStr    = '';        if(!empty($limit)) {            $limit	=	explode(',',$limit);            if(count($limit)>1)                $limitStr = "(numrow>" . $limit[0] . ") AND (numrow<=" . ($limit[0]+$limit[1]) . ")";            else                $limitStr = "(numrow>0 AND numrow<=".$limit[0].")";        }        return $limitStr?' WHERE '.$limitStr:'';    }    /**     * 设置锁机制     * @access protected     * @return string     */    protected function parseLock($lock=false) {        if(!$lock) return '';        return ' FOR UPDATE NOWAIT ';    }}
 |