Subversion Repositories svnkaklik

Rev

Blame | Last modification | View Log | Download

<?php


/*
V4.80 8 Mar 2006  (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
  Released under both BSD license and Lesser GPL library license. 
  Whenever there is any discrepancy between the two licenses, 
  the BSD license will take precedence.
  Set tabs to 8.
 
*/ 

class ADODB_pdo_mysql extends ADODB_pdo {
        var $metaTablesSQL = "SHOW TABLES";     
        var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
        var $_bindInputArray = false;
        var $sysDate = 'CURDATE()';
        var $sysTimeStamp = 'NOW()';
        
        function _init($parentDriver)
        {
        
                $parentDriver->hasTransactions = false;
                $parentDriver->_bindInputArray = true;
                $parentDriver->hasInsertID = true;
                $parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
        }
        
        function ServerInfo()
        {
                $arr['description'] = ADOConnection::GetOne("select version()");
                $arr['version'] = ADOConnection::_findvers($arr['description']);
                return $arr;
        }
        
        function &MetaTables($ttype=false,$showSchema=false,$mask=false) 
        {       
                $save = $this->metaTablesSQL;
                if ($showSchema && is_string($showSchema)) {
                        $this->metaTablesSQL .= " from $showSchema";
                }
                
                if ($mask) {
                        $mask = $this->qstr($mask);
                        $this->metaTablesSQL .= " like $mask";
                }
                $ret =& ADOConnection::MetaTables($ttype,$showSchema);
                
                $this->metaTablesSQL = $save;
                return $ret;
        }
        
        function &MetaColumns($table) 
        {
                $this->_findschema($table,$schema);
                if ($schema) {
                        $dbName = $this->database;
                        $this->SelectDB($schema);
                }
                global $ADODB_FETCH_MODE;
                $save = $ADODB_FETCH_MODE;
                $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
                
                if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
                $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
                
                if ($schema) {
                        $this->SelectDB($dbName);
                }
                
                if (isset($savem)) $this->SetFetchMode($savem);
                $ADODB_FETCH_MODE = $save;
                if (!is_object($rs)) {
                        $false = false;
                        return $false;
                }
                        
                $retarr = array();
                while (!$rs->EOF){
                        $fld = new ADOFieldObject();
                        $fld->name = $rs->fields[0];
                        $type = $rs->fields[1];
                        
                        // split type into type(length):
                        $fld->scale = null;
                        if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
                                $fld->type = $query_array[1];
                                $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
                                $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
                        } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
                                $fld->type = $query_array[1];
                                $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
                        } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
                                $fld->type = $query_array[1];
                                $arr = explode(",",$query_array[2]);
                                $fld->enums = $arr;
                                $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
                                $fld->max_length = ($zlen > 0) ? $zlen : 1;
                        } else {
                                $fld->type = $type;
                                $fld->max_length = -1;
                        }
                        $fld->not_null = ($rs->fields[2] != 'YES');
                        $fld->primary_key = ($rs->fields[3] == 'PRI');
                        $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
                        $fld->binary = (strpos($type,'blob') !== false);
                        $fld->unsigned = (strpos($type,'unsigned') !== false);
                                
                        if (!$fld->binary) {
                                $d = $rs->fields[4];
                                if ($d != '' && $d != 'NULL') {
                                        $fld->has_default = true;
                                        $fld->default_value = $d;
                                } else {
                                        $fld->has_default = false;
                                }
                        }
                        
                        if ($save == ADODB_FETCH_NUM) {
                                $retarr[] = $fld;
                        } else {
                                $retarr[strtoupper($fld->name)] = $fld;
                        }
                                $rs->MoveNext();
                        }
                
                        $rs->Close();
                        return $retarr; 
        }
                
        
        // parameters use PostgreSQL convention, not MySQL
        function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
        {
                $offsetStr =($offset>=0) ? "$offset," : '';
                // jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
                if ($nrows < 0) $nrows = '18446744073709551615'; 
                
                if ($secs)
                        $rs =& $this->CacheExecute($secs,$sql." LIMIT $offsetStr$nrows",$inputarr);
                else
                        $rs =& $this->Execute($sql." LIMIT $offsetStr$nrows",$inputarr);
                return $rs;
        }
}
?>