Вход Регистрация
Файл: include/adodb/drivers/adodb-pdo.inc.php
Строк: 654
<?php
/**
    @version   v5.20.12  30-Mar-2018
    @copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.
    @copyright (c) 2014      Damien Regad, Mark Newnham and the ADOdb community

    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 4 for best viewing.

    Latest version is available at http://adodb.sourceforge.net

    Requires ODBC. Works on Windows and Unix.

    Problems:
        Where is float/decimal type in pdo_param_type
        LOB handling for CLOB/BLOB differs significantly
*/

// security - hide paths
if (!defined('ADODB_DIR')) die();


/*
enum pdo_param_type {
PDO::PARAM_NULL, 0

/* int as in long (the php native int type).
 * If you mark a column as an int, PDO expects get_col to return
 * a pointer to a long
PDO::PARAM_INT, 1

/* get_col ptr should point to start of the string buffer
PDO::PARAM_STR, 2

/* get_col: when len is 0 ptr should point to a php_stream *,
 * otherwise it should behave like a string. Indicate a NULL field
 * value by setting the ptr to NULL
PDO::PARAM_LOB, 3

/* get_col: will expect the ptr to point to a new PDOStatement object handle,
 * but this isn't wired up yet
PDO::PARAM_STMT, 4 /* hierarchical result set

/* get_col ptr should point to a zend_bool
PDO::PARAM_BOOL, 5


/* magic flag to denote a parameter as being input/output
PDO::PARAM_INPUT_OUTPUT = 0x80000000
};
*/

function adodb_pdo_type($t)
{
    switch(
$t) {
    case 
2: return 'VARCHAR';
    case 
3: return 'BLOB';
    default: return 
'NUMERIC';
    }
}

/*----------------------------------------------------------------------------*/


class ADODB_pdo extends ADOConnection {
    var 
$databaseType = "pdo";
    var 
$dataProvider = "pdo";
    var 
$fmtDate = "'Y-m-d'";
    var 
$fmtTimeStamp = "'Y-m-d, h:i:sA'";
    var 
$replaceQuote = "''"; // string to use to replace quotes
    
var $hasAffectedRows = true;
    var 
$_bindInputArray = true;
    var 
$_genIDSQL;
    var 
$_genSeqSQL = "create table %s (id integer)";
    var 
$_dropSeqSQL;
    var 
$_autocommit = true;
    var 
$_haserrorfunctions = true;
    var 
$_lastAffectedRows = 0;

    var 
$_errormsg = false;
    var 
$_errorno = false;

    var 
$dsnType = '';
    var 
$stmt = false;
    var 
$_driver;

    function 
__construct()
    {
    }

    function 
_UpdatePDO()
    {
        
$d = $this->_driver;
        
$this->fmtDate = $d->fmtDate;
        
$this->fmtTimeStamp = $d->fmtTimeStamp;
        
$this->replaceQuote = $d->replaceQuote;
        
$this->sysDate = $d->sysDate;
        
$this->sysTimeStamp = $d->sysTimeStamp;
        
$this->random = $d->random;
        
$this->concat_operator = $d->concat_operator;
        
$this->nameQuote = $d->nameQuote;

        
$this->hasGenID = $d->hasGenID;
        
$this->_genIDSQL = $d->_genIDSQL;
        
$this->_genSeqSQL = $d->_genSeqSQL;
        
$this->_dropSeqSQL = $d->_dropSeqSQL;

        
$d->_init($this);
    }

    function 
Time()
    {
        if (!empty(
$this->_driver->_hasdual)) {
            
$sql = "select $this->sysTimeStamp from dual";
        }
        else {
            
$sql = "select $this->sysTimeStamp";
        }

        
$rs = $this->_Execute($sql);
        if (
$rs && !$rs->EOF) {
            return 
$this->UnixTimeStamp(reset($rs->fields));
        }

        return 
false;
    }

    
// returns true or false
    
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false)
    {
        
$at = strpos($argDSN,':');
        
$this->dsnType = substr($argDSN,0,$at);

        if (
$argDatabasename) {
            switch(
$this->dsnType){
                case 
'sqlsrv':
                    
$argDSN .= ';database='.$argDatabasename;
                    break;
                case 
'mssql':
                case 
'mysql':
                case 
'oci':
                case 
'pgsql':
                case 
'sqlite':
                default:
                    
$argDSN .= ';dbname='.$argDatabasename;
            }
        }
        try {
            
$this->_connectionID = new PDO($argDSN, $argUsername, $argPassword);
        } catch (
Exception $e) {
            
$this->_connectionID = false;
            
$this->_errorno = -1;
            
//var_dump($e);
            
$this->_errormsg = 'Connection attempt failed: '.$e->getMessage();
            return 
false;
        }

        if (
$this->_connectionID) {
            switch(
ADODB_ASSOC_CASE){
                case 
ADODB_ASSOC_CASE_LOWER:
                    
$m = PDO::CASE_LOWER;
                    break;
                case 
ADODB_ASSOC_CASE_UPPER:
                    
$m = PDO::CASE_UPPER;
                    break;
                default:
                case 
ADODB_ASSOC_CASE_NATIVE:
                    
$m = PDO::CASE_NATURAL;
                    break;
            }

            
//$this->_connectionID->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT );
            
$this->_connectionID->setAttribute(PDO::ATTR_CASE,$m);

            
$class = 'ADODB_pdo_'.$this->dsnType;
            
//$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
            
switch($this->dsnType) {
                case 
'mssql':
                case 
'mysql':
                case 
'oci':
                case 
'pgsql':
                case 
'sqlite':
                case 
'sqlsrv':
                    include_once(
ADODB_DIR.'/drivers/adodb-pdo_'.$this->dsnType.'.inc.php');
                    break;
            }
            if (
class_exists($class)) {
                
$this->_driver = new $class();
            }
            else {
                
$this->_driver = new ADODB_pdo_base();
            }

            
$this->_driver->_connectionID = $this->_connectionID;
            
$this->_UpdatePDO();
            
$this->_driver->database = $this->database;
            return 
true;
        }
        
$this->_driver = new ADODB_pdo_base();
        return 
false;
    }

    function 
Concat()
    {
        
$args = func_get_args();
        if(
method_exists($this->_driver, 'Concat')) {
            return 
call_user_func_array(array($this->_driver, 'Concat'), $args);
        }

        if (
PHP_VERSION >= 5.3) {
            return 
call_user_func_array('parent::Concat', $args);
        }
        return 
call_user_func_array(array($this,'parent::Concat'), $args);
    }

    
// returns true or false
    
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
    {
        return 
$this->_connect($argDSN, $argUsername, $argPassword, $argDatabasename, true);
    }

    
/*------------------------------------------------------------------------------*/


    
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
    {
        
$save = $this->_driver->fetchMode;
        
$this->_driver->fetchMode = $this->fetchMode;
        
$this->_driver->debug = $this->debug;
        
$ret = $this->_driver->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
        
$this->_driver->fetchMode = $save;
        return 
$ret;
    }


    function 
ServerInfo()
    {
        return 
$this->_driver->ServerInfo();
    }

    function 
MetaTables($ttype=false,$showSchema=false,$mask=false)
    {
        return 
$this->_driver->MetaTables($ttype,$showSchema,$mask);
    }

    function 
MetaColumns($table,$normalize=true)
    {
        return 
$this->_driver->MetaColumns($table,$normalize);
    }

    function 
InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
    {
        
$obj = $stmt[1];
        if (
$type) {
            
$obj->bindParam($name, $var, $type, $maxLen);
        }
        else {
            
$obj->bindParam($name, $var);
        }
    }

    function 
OffsetDate($dayFraction,$date=false)
    {
        return 
$this->_driver->OffsetDate($dayFraction,$date);
    }

    function 
SelectDB($dbName)
    {
        return 
$this->_driver->SelectDB($dbName);
    }

    function 
SQLDate($fmt, $col=false)
    {
        return 
$this->_driver->SQLDate($fmt, $col);
    }

    function 
ErrorMsg()
    {
        if (
$this->_errormsg !== false) {
            return 
$this->_errormsg;
        }
        if (!empty(
$this->_stmt)) {
            
$arr = $this->_stmt->errorInfo();
        }
        else if (!empty(
$this->_connectionID)) {
            
$arr = $this->_connectionID->errorInfo();
        }
        else {
            return 
'No Connection Established';
        }

        if (
$arr) {
            if (
sizeof($arr)<2) {
                return 
'';
            }
            if ((integer)
$arr[0]) {
                return 
$arr[2];
            }
            else {
                return 
'';
            }
        }
        else {
            return 
'-1';
        }
    }


    function 
ErrorNo()
    {
        if (
$this->_errorno !== false) {
            return 
$this->_errorno;
        }
        if (!empty(
$this->_stmt)) {
            
$err = $this->_stmt->errorCode();
        }
        else if (!empty(
$this->_connectionID)) {
            
$arr = $this->_connectionID->errorInfo();
            if (isset(
$arr[0])) {
                
$err = $arr[0];
            }
            else {
                
$err = -1;
            }
        } else {
            return 
0;
        }

        if (
$err == '00000') {
            return 
0; // allows empty check
        
}
        return 
$err;
    }

    
/**
     * @param bool $auto_commit
     * @return void
     */
    
function SetAutoCommit($auto_commit)
    {
        if(
method_exists($this->_driver, 'SetAutoCommit')) {
            
$this->_driver->SetAutoCommit($auto_commit);
        }
    }

    function 
SetTransactionMode($transaction_mode)
    {
        if(
method_exists($this->_driver, 'SetTransactionMode')) {
            return 
$this->_driver->SetTransactionMode($transaction_mode);
        }

        return 
parent::SetTransactionMode($seqname);
    }

    function 
BeginTrans()
    {
        if(
method_exists($this->_driver, 'BeginTrans')) {
            return 
$this->_driver->BeginTrans();
        }

        if (!
$this->hasTransactions) {
            return 
false;
        }
        if (
$this->transOff) {
            return 
true;
        }
        
$this->transCnt += 1;
        
$this->_autocommit = false;
        
$this->SetAutoCommit(false);

        return 
$this->_connectionID->beginTransaction();
    }

    function 
CommitTrans($ok=true)
    {
        if(
method_exists($this->_driver, 'CommitTrans')) {
            return 
$this->_driver->CommitTrans($ok);
        }

        if (!
$this->hasTransactions) {
            return 
false;
        }
        if (
$this->transOff) {
            return 
true;
        }
        if (!
$ok) {
            return 
$this->RollbackTrans();
        }
        if (
$this->transCnt) {
            
$this->transCnt -= 1;
        }
        
$this->_autocommit = true;

        
$ret = $this->_connectionID->commit();
        
$this->SetAutoCommit(true);
        return 
$ret;
    }

    function 
RollbackTrans()
    {
        if(
method_exists($this->_driver, 'RollbackTrans')) {
            return 
$this->_driver->RollbackTrans();
        }

        if (!
$this->hasTransactions) {
            return 
false;
        }
        if (
$this->transOff) {
            return 
true;
        }
        if (
$this->transCnt) {
            
$this->transCnt -= 1;
        }
        
$this->_autocommit = true;

        
$ret = $this->_connectionID->rollback();
        
$this->SetAutoCommit(true);
        return 
$ret;
    }

    function 
Prepare($sql)
    {
        
$this->_stmt = $this->_connectionID->prepare($sql);
        if (
$this->_stmt) {
            return array(
$sql,$this->_stmt);
        }

        return 
false;
    }

    function 
PrepareStmt($sql)
    {
        
$stmt = $this->_connectionID->prepare($sql);
        if (!
$stmt) {
            return 
false;
        }
        
$obj = new ADOPDOStatement($stmt,$this);
        return 
$obj;
    }

    function 
CreateSequence($seqname='adodbseq',$startID=1)
    {
        if(
method_exists($this->_driver, 'CreateSequence')) {
            return 
$this->_driver->CreateSequence($seqname, $startID);
        }

        return 
parent::CreateSequence($seqname, $startID);
    }

    function 
DropSequence($seqname='adodbseq')
    {
        if(
method_exists($this->_driver, 'DropSequence')) {
            return 
$this->_driver->DropSequence($seqname);
        }

        return 
parent::DropSequence($seqname);
    }

    function 
GenID($seqname='adodbseq',$startID=1)
    {
        if(
method_exists($this->_driver, 'GenID')) {
            return 
$this->_driver->GenID($seqname, $startID);
        }

        return 
parent::GenID($seqname, $startID);
    }


    
/* returns queryID or false */
    
function _query($sql,$inputarr=false)
    {
        if (
is_array($sql)) {
            
$stmt = $sql[1];
        } else {
            
$stmt = $this->_connectionID->prepare($sql);
        }
        
#adodb_backtrace();
        #var_dump($this->_bindInputArray);
        
if ($stmt) {
            
$this->_driver->debug = $this->debug;
            if (
$inputarr) {
                
$ok = $stmt->execute($inputarr);
            }
            else {
                
$ok = $stmt->execute();
            }
        }


        
$this->_errormsg = false;
        
$this->_errorno = false;

        if (
$ok) {
            
$this->_stmt = $stmt;
            return 
$stmt;
        }

        if (
$stmt) {

            
$arr = $stmt->errorinfo();
            if ((integer)
$arr[1]) {
                
$this->_errormsg = $arr[2];
                
$this->_errorno = $arr[1];
            }

        } else {
            
$this->_errormsg = false;
            
$this->_errorno = false;
        }
        return 
false;
    }

    
// returns true or false
    
function _close()
    {
        
$this->_stmt = false;
        return 
true;
    }

    function 
_affectedrows()
    {
        return (
$this->_stmt) ? $this->_stmt->rowCount() : 0;
    }

    function 
_insertid()
    {
        return (
$this->_connectionID) ? $this->_connectionID->lastInsertId() : 0;
    }

    
/**
     * Quotes a string to be sent to the database.
     * If we have an active connection, delegates quoting to the underlying
     * PDO object. Otherwise, replace "'" by the value of $replaceQuote (same
     * behavior as mysqli driver)
     * @param string  $s            The string to quote
     * @param boolean $magic_quotes If false, use PDO::quote().
     * @return string Quoted string
     */
    
function qstr($s, $magic_quotes = false)
    {
        if (!
$magic_quotes) {
            if (
$this->_connectionID) {
                return 
$this->_connectionID->quote($s);
            }
            return 
"'" . str_replace("'", $this->replaceQuote, $s) . "'";
        }

        
// undo magic quotes for "
        
$s = str_replace('\"', '"', $s);
        return 
"'$s'";
    }

}

class 
ADODB_pdo_base extends ADODB_pdo {

    var 
$sysDate = "'?'";
    var 
$sysTimeStamp = "'?'";


    function 
_init($parentDriver)
    {
        
$parentDriver->_bindInputArray = true;
        
#$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
    
}

    function 
ServerInfo()
    {
        return 
ADOConnection::ServerInfo();
    }

    function 
SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
    {
        
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
        return 
$ret;
    }

    function 
MetaTables($ttype=false,$showSchema=false,$mask=false)
    {
        return 
false;
    }

    function 
MetaColumns($table,$normalize=true)
    {
        return 
false;
    }
}

class 
ADOPDOStatement {

    var 
$databaseType = "pdo";
    var 
$dataProvider = "pdo";
    var 
$_stmt;
    var 
$_connectionID;

    function 
__construct($stmt,$connection)
    {
        
$this->_stmt = $stmt;
        
$this->_connectionID = $connection;
    }

    function 
Execute($inputArr=false)
    {
        
$savestmt = $this->_connectionID->_stmt;
        
$rs = $this->_connectionID->Execute(array(false,$this->_stmt),$inputArr);
        
$this->_connectionID->_stmt = $savestmt;
        return 
$rs;
    }

    function 
InParameter(&$var,$name,$maxLen=4000,$type=false)
    {

        if (
$type) {
            
$this->_stmt->bindParam($name,$var,$type,$maxLen);
        }
        else {
            
$this->_stmt->bindParam($name, $var);
        }
    }

    function 
Affected_Rows()
    {
        return (
$this->_stmt) ? $this->_stmt->rowCount() : 0;
    }

    function 
ErrorMsg()
    {
        if (
$this->_stmt) {
            
$arr = $this->_stmt->errorInfo();
        }
        else {
            
$arr = $this->_connectionID->errorInfo();
        }

        if (
is_array($arr)) {
            if ((integer) 
$arr[0] && isset($arr[2])) {
                return 
$arr[2];
            }
            else {
                return 
'';
            }
        } else {
            return 
'-1';
        }
    }

    function 
NumCols()
    {
        return (
$this->_stmt) ? $this->_stmt->columnCount() : 0;
    }

    function 
ErrorNo()
    {
        if (
$this->_stmt) {
            return 
$this->_stmt->errorCode();
        }
        else {
            return 
$this->_connectionID->errorInfo();
        }
    }
}

/*--------------------------------------------------------------------------------------
    Class Name: Recordset
--------------------------------------------------------------------------------------*/

class ADORecordSet_pdo extends ADORecordSet {

    var 
$bind = false;
    var 
$databaseType = "pdo";
    var 
$dataProvider = "pdo";

    function 
__construct($id,$mode=false)
    {
        if (
$mode === false) {
            global 
$ADODB_FETCH_MODE;
            
$mode = $ADODB_FETCH_MODE;
        }
        
$this->adodbFetchMode = $mode;
        switch(
$mode) {
        case 
ADODB_FETCH_NUM: $mode = PDO::FETCH_NUM; break;
        case 
ADODB_FETCH_ASSOC:  $mode = PDO::FETCH_ASSOC; break;

        case 
ADODB_FETCH_BOTH:
        default: 
$mode = PDO::FETCH_BOTH; break;
        }
        
$this->fetchMode = $mode;

        
$this->_queryID = $id;
        
parent::__construct($id);
    }


    function 
Init()
    {
        if (
$this->_inited) {
            return;
        }
        
$this->_inited = true;
        if (
$this->_queryID) {
            @
$this->_initrs();
        }
        else {
            
$this->_numOfRows = 0;
            
$this->_numOfFields = 0;
        }
        if (
$this->_numOfRows != 0 && $this->_currentRow == -1) {
            
$this->_currentRow = 0;
            if (
$this->EOF = ($this->_fetch() === false)) {
                
$this->_numOfRows = 0; // _numOfRows could be -1
            
}
        } else {
            
$this->EOF = true;
        }
    }

    function 
_initrs()
    {
    global 
$ADODB_COUNTRECS;

        
$this->_numOfRows = ($ADODB_COUNTRECS) ? @$this->_queryID->rowCount() : -1;
        if (!
$this->_numOfRows) {
            
$this->_numOfRows = -1;
        }
        
$this->_numOfFields = $this->_queryID->columnCount();
    }

    
// returns the field object
    
function FetchField($fieldOffset = -1)
    {
        
$off=$fieldOffset+1; // offsets begin at 1

        
$o= new ADOFieldObject();
        
$arr = @$this->_queryID->getColumnMeta($fieldOffset);
        if (!
$arr) {
            
$o->name = 'bad getColumnMeta()';
            
$o->max_length = -1;
            
$o->type = 'VARCHAR';
            
$o->precision = 0;
    
#        $false = false;
            
return $o;
        }
        
//adodb_pr($arr);
        
$o->name = $arr['name'];
        if (isset(
$arr['sqlsrv:decl_type']) && $arr['sqlsrv:decl_type'] <> "null") 
        {
            
/*
            * If the database is SQL server, use the native built-ins
            */
            
$o->type = $arr['sqlsrv:decl_type'];
        }
        elseif (isset(
$arr['native_type']) && $arr['native_type'] <> "null") 
        {
            
$o->type = $arr['native_type'];
        }
        else 
        {
             
$o->type = adodb_pdo_type($arr['pdo_type']);
        }
        
        
$o->max_length = $arr['len'];
        
$o->precision = $arr['precision'];

        switch(
ADODB_ASSOC_CASE) {
            case 
ADODB_ASSOC_CASE_LOWER:
                
$o->name = strtolower($o->name);
                break;
            case 
ADODB_ASSOC_CASE_UPPER:
                
$o->name = strtoupper($o->name);
                break;
        }
        return 
$o;
    }

    function 
_seek($row)
    {
        return 
false;
    }

    function 
_fetch()
    {
        if (!
$this->_queryID) {
            return 
false;
        }

        
$this->fields = $this->_queryID->fetch($this->fetchMode);
        return !empty(
$this->fields);
    }

    function 
_close()
    {
        
$this->_queryID = false;
    }

    function 
Fields($colname)
    {
        if (
$this->adodbFetchMode != ADODB_FETCH_NUM) {
            return @
$this->fields[$colname];
        }

        if (!
$this->bind) {
            
$this->bind = array();
            for (
$i=0; $i < $this->_numOfFields; $i++) {
                
$o = $this->FetchField($i);
                
$this->bind[strtoupper($o->name)] = $i;
            }
        }
        return 
$this->fields[$this->bind[strtoupper($colname)]];
    }

}
Онлайн: 2
Реклама