[ Index ]
 

Code source de Mantis 1.1.0rc3

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/core/adodb/drivers/ -> adodb-pdo.inc.php (source)

   1  <?php
   2  /* 
   3  V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
   4    Released under both BSD license and Lesser GPL library license. 
   5    Whenever there is any discrepancy between the two licenses, 
   6    the BSD license will take precedence. 
   7  Set tabs to 4 for best viewing.
   8    
   9    Latest version is available at http://adodb.sourceforge.net
  10    
  11    Requires ODBC. Works on Windows and Unix.
  12  
  13      Problems: 
  14          Where is float/decimal type in pdo_param_type
  15          LOB handling for CLOB/BLOB differs significantly
  16  */
  17  // security - hide paths
  18  if (!defined('ADODB_DIR')) die();
  19  
  20  
  21  /*
  22  enum pdo_param_type {
  23  PDO::PARAM_NULL, 0
  24  
  25  /* int as in long (the php native int type).
  26   * If you mark a column as an int, PDO expects get_col to return
  27   * a pointer to a long 
  28  PDO::PARAM_INT, 1
  29  
  30  /* get_col ptr should point to start of the string buffer 
  31  PDO::PARAM_STR, 2
  32  
  33  /* get_col: when len is 0 ptr should point to a php_stream *,
  34   * otherwise it should behave like a string. Indicate a NULL field
  35   * value by setting the ptr to NULL 
  36  PDO::PARAM_LOB, 3
  37  
  38  /* get_col: will expect the ptr to point to a new PDOStatement object handle,
  39   * but this isn't wired up yet 
  40  PDO::PARAM_STMT, 4 /* hierarchical result set 
  41  
  42  /* get_col ptr should point to a zend_bool 
  43  PDO::PARAM_BOOL, 5
  44  
  45  
  46  /* magic flag to denote a parameter as being input/output 
  47  PDO::PARAM_INPUT_OUTPUT = 0x80000000
  48  };
  49  */
  50      
  51  function adodb_pdo_type($t)
  52  {
  53      switch($t) {
  54      case 2: return 'VARCHAR';
  55      case 3: return 'BLOB';
  56      default: return 'NUMERIC';
  57      }
  58  }
  59       
  60  /*--------------------------------------------------------------------------------------
  61  --------------------------------------------------------------------------------------*/
  62  
  63  ////////////////////////////////////////////////
  64  
  65  
  66  
  67  class ADODB_pdo_base extends ADODB_pdo {
  68  
  69      var $sysDate = "'?'";
  70      var $sysTimeStamp = "'?'";
  71      
  72  
  73  	function _init($parentDriver)
  74      {
  75          $parentDriver->_bindInputArray = true;
  76          #$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
  77      }
  78      
  79  	function ServerInfo()
  80      {
  81          return ADOConnection::ServerInfo();
  82      }
  83      
  84  	function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
  85      {
  86          $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
  87          return $ret;
  88      }
  89      
  90  	function MetaTables()
  91      {
  92          return false;
  93      }
  94      
  95  	function MetaColumns()
  96      {
  97          return false;
  98      }
  99  }
 100  
 101  
 102  class ADODB_pdo extends ADOConnection {
 103      var $databaseType = "pdo";    
 104      var $dataProvider = "pdo";
 105      var $fmtDate = "'Y-m-d'";
 106      var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
 107      var $replaceQuote = "''"; // string to use to replace quotes
 108      var $hasAffectedRows = true;
 109      var $_bindInputArray = true;    
 110      var $_genSeqSQL = "create table %s (id integer)";
 111      var $_autocommit = true;
 112      var $_haserrorfunctions = true;
 113      var $_lastAffectedRows = 0;
 114      
 115      var $_errormsg = false;
 116      var $_errorno = false;
 117      
 118      var $dsnType = '';
 119      var $stmt = false;
 120      
 121  	function ADODB_pdo()
 122      {
 123      }
 124      
 125  	function _UpdatePDO()
 126      {
 127          $d = &$this->_driver;
 128          $this->fmtDate = $d->fmtDate;
 129          $this->fmtTimeStamp = $d->fmtTimeStamp;
 130          $this->replaceQuote = $d->replaceQuote;
 131          $this->sysDate = $d->sysDate;
 132          $this->sysTimeStamp = $d->sysTimeStamp;
 133          $this->random = $d->random;
 134          $this->concat_operator = $d->concat_operator;
 135          $this->nameQuote = $d->nameQuote;
 136                  
 137          $this->hasGenID = $d->hasGenID;
 138          $this->_genIDSQL = $d->_genIDSQL;
 139          $this->_genSeqSQL = $d->_genSeqSQL;
 140          $this->_dropSeqSQL = $d->_dropSeqSQL;
 141  
 142          $d->_init($this);
 143      }
 144      
 145  	function Time()
 146      {
 147          if (!empty($this->_driver->_hasdual)) $sql = "select $this->sysTimeStamp from dual";
 148          else $sql = "select $this->sysTimeStamp";
 149          
 150          $rs =& $this->_Execute($sql);
 151          if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
 152          
 153          return false;
 154      }
 155      
 156      // returns true or false
 157  	function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false)
 158      {
 159          $at = strpos($argDSN,':');
 160          $this->dsnType = substr($argDSN,0,$at);
 161  
 162          if ($argDatabasename) {
 163              $argDSN .= ';dbname='.$argDatabasename;
 164          }
 165          try {
 166              $this->_connectionID = new PDO($argDSN, $argUsername, $argPassword);
 167          } catch (Exception $e) {
 168              $this->_connectionID = false;
 169              $this->_errorno = -1;
 170              //var_dump($e);
 171              $this->_errormsg = 'Connection attempt failed: '.$e->getMessage();
 172              return false;
 173          }
 174          
 175          if ($this->_connectionID) {
 176              switch(ADODB_ASSOC_CASE){
 177              case 0: $m = PDO::CASE_LOWER; break;
 178              case 1: $m = PDO::CASE_UPPER; break;
 179              default:
 180              case 2: $m = PDO::CASE_NATURAL; break;
 181              }
 182              
 183              //$this->_connectionID->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT );
 184              $this->_connectionID->setAttribute(PDO::ATTR_CASE,$m);
 185              
 186              $class = 'ADODB_pdo_'.$this->dsnType;
 187              //$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
 188              switch($this->dsnType) {
 189              case 'oci':
 190              case 'mysql':
 191              case 'pgsql':
 192              case 'mssql':
 193                  include_once(ADODB_DIR.'/drivers/adodb-pdo_'.$this->dsnType.'.inc.php');
 194                  break;
 195              }
 196              if (class_exists($class))
 197                  $this->_driver = new $class();
 198              else
 199                  $this->_driver = new ADODB_pdo_base();
 200              
 201              $this->_driver->_connectionID = $this->_connectionID;
 202              $this->_UpdatePDO();
 203              return true;
 204          }
 205          $this->_driver = new ADODB_pdo_base();
 206          return false;
 207      }
 208      
 209      // returns true or false
 210  	function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
 211      {
 212          return $this->_connect($argDSN, $argUsername, $argPassword, $argDatabasename, true);
 213      }
 214      
 215      /*------------------------------------------------------------------------------*/
 216      
 217      
 218  	function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) 
 219      {    
 220          $save = $this->_driver->fetchMode;
 221          $this->_driver->fetchMode = $this->fetchMode;
 222           $this->_driver->debug = $this->debug;
 223          $ret = $this->_driver->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
 224          $this->_driver->fetchMode = $save;
 225          return $ret;
 226      }
 227      
 228      
 229  	function ServerInfo()
 230      {
 231          return $this->_driver->ServerInfo();
 232      }
 233      
 234  	function MetaTables($ttype=false,$showSchema=false,$mask=false)
 235      {
 236          return $this->_driver->MetaTables($ttype,$showSchema,$mask);
 237      }
 238      
 239  	function MetaColumns($table,$normalize=true)
 240      {
 241          return $this->_driver->MetaColumns($table,$normalize);
 242      }
 243      
 244  	function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
 245      {
 246          $obj = $stmt[1];
 247          if ($type) $obj->bindParam($name,$var,$type,$maxLen);
 248          else $obj->bindParam($name, $var);
 249      }
 250      
 251      
 252  	function ErrorMsg()
 253      {
 254          if ($this->_errormsg !== false) return $this->_errormsg;
 255          if (!empty($this->_stmt)) $arr = $this->_stmt->errorInfo();
 256          else if (!empty($this->_connectionID)) $arr = $this->_connectionID->errorInfo();
 257          else return 'No Connection Established';
 258          
 259          
 260          if ($arr) {
 261               if (sizeof($arr)<2) return '';
 262              if ((integer)$arr[1]) return $arr[2];
 263              else return '';
 264          } else return '-1';
 265      }
 266      
 267  
 268  	function ErrorNo()
 269      {
 270          if ($this->_errorno !== false) return $this->_errorno;
 271          if (!empty($this->_stmt)) $err = $this->_stmt->errorCode();
 272          else if (!empty($this->_connectionID)) {
 273              $arr = $this->_connectionID->errorInfo();
 274              if (isset($arr[0])) $err = $arr[0];
 275              else $err = -1;
 276          } else
 277              return 0;
 278              
 279          if ($err == '00000') return 0; // allows empty check
 280          return $err;
 281      }
 282  
 283  	function BeginTrans()
 284      {    
 285          if (!$this->hasTransactions) return false;
 286          if ($this->transOff) return true; 
 287          $this->transCnt += 1;
 288          $this->_autocommit = false;
 289          $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,false);
 290          return $this->_connectionID->beginTransaction();
 291      }
 292      
 293  	function CommitTrans($ok=true) 
 294      { 
 295          if (!$this->hasTransactions) return false;
 296          if ($this->transOff) return true; 
 297          if (!$ok) return $this->RollbackTrans();
 298          if ($this->transCnt) $this->transCnt -= 1;
 299          $this->_autocommit = true;
 300          
 301          $ret = $this->_connectionID->commit();
 302          $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
 303          return $ret;
 304      }
 305      
 306  	function RollbackTrans()
 307      {
 308          if (!$this->hasTransactions) return false;
 309          if ($this->transOff) return true; 
 310          if ($this->transCnt) $this->transCnt -= 1;
 311          $this->_autocommit = true;
 312          
 313          $ret = $this->_connectionID->rollback();
 314          $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
 315          return $ret;
 316      }
 317      
 318  	function Prepare($sql)
 319      {
 320          $this->_stmt = $this->_connectionID->prepare($sql);
 321          if ($this->_stmt) return array($sql,$this->_stmt);
 322          
 323          return false;
 324      }
 325      
 326  	function PrepareStmt($sql)
 327      {
 328          $stmt = $this->_connectionID->prepare($sql);
 329          if (!$stmt) return false;
 330          $obj = new ADOPDOStatement($stmt,$this);
 331          return $obj;
 332      }
 333      
 334      
 335      /* returns queryID or false */
 336  	function _query($sql,$inputarr=false) 
 337      {
 338          if (is_array($sql)) {
 339              $stmt = $sql[1];
 340          } else {
 341              $stmt = $this->_connectionID->prepare($sql);
 342          }
 343          #adodb_backtrace();
 344          #var_dump($this->_bindInputArray);
 345          if ($stmt) {
 346              $this->_driver->debug = $this->debug;
 347              if ($inputarr) $ok = $stmt->execute($inputarr);
 348              else $ok = $stmt->execute();
 349          } 
 350          
 351          
 352          $this->_errormsg = false;
 353          $this->_errorno = false;
 354              
 355          if ($ok) {
 356              $this->_stmt = $stmt;
 357              return $stmt;
 358          }
 359          
 360          if ($stmt) {
 361              
 362              $arr = $stmt->errorinfo();
 363              if ((integer)$arr[1]) {
 364                  $this->_errormsg = $arr[2];
 365                  $this->_errorno = $arr[1];
 366              }
 367  
 368          } else {
 369              $this->_errormsg = false;
 370              $this->_errorno = false;
 371          }
 372          return false;
 373      }
 374  
 375      // returns true or false
 376  	function _close()
 377      {
 378          $this->_stmt = false;
 379          return true;
 380      }
 381  
 382  	function _affectedrows()
 383      {
 384          return ($this->_stmt) ? $this->_stmt->rowCount() : 0;
 385      }
 386      
 387  	function _insertid()
 388      {
 389          return ($this->_connectionID) ? $this->_connectionID->lastInsertId() : 0;
 390      }
 391  }
 392  
 393  class ADOPDOStatement {
 394  
 395      var $databaseType = "pdo";        
 396      var $dataProvider = "pdo";
 397      var $_stmt;
 398      var $_connectionID;
 399      
 400  	function ADOPDOStatement($stmt,$connection)
 401      {
 402          $this->_stmt = $stmt;
 403          $this->_connectionID = $connection;
 404      }
 405      
 406  	function Execute($inputArr=false)
 407      {
 408          $savestmt = $this->_connectionID->_stmt;
 409          $rs = $this->_connectionID->Execute(array(false,$this->_stmt),$inputArr);
 410          $this->_connectionID->_stmt = $savestmt;
 411          return $rs;
 412      }
 413      
 414  	function InParameter(&$var,$name,$maxLen=4000,$type=false)
 415      {
 416  
 417          if ($type) $this->_stmt->bindParam($name,$var,$type,$maxLen);
 418          else $this->_stmt->bindParam($name, $var);
 419      }
 420      
 421  	function Affected_Rows()
 422      {
 423          return ($this->_stmt) ? $this->_stmt->rowCount() : 0;
 424      }
 425      
 426  	function ErrorMsg()
 427      {
 428          if ($this->_stmt) $arr = $this->_stmt->errorInfo();
 429          else $arr = $this->_connectionID->errorInfo();
 430  
 431          if (is_array($arr)) {
 432              if ((integer) $arr[0] && isset($arr[2])) return $arr[2];
 433              else return '';
 434          } else return '-1';
 435      }
 436      
 437  	function NumCols()
 438      {
 439          return ($this->_stmt) ? $this->_stmt->columnCount() : 0;
 440      }
 441      
 442  	function ErrorNo()
 443      {
 444          if ($this->_stmt) return $this->_stmt->errorCode();
 445          else return $this->_connectionID->errorInfo();
 446      }
 447  }
 448  
 449  /*--------------------------------------------------------------------------------------
 450       Class Name: Recordset
 451  --------------------------------------------------------------------------------------*/
 452  
 453  class ADORecordSet_pdo extends ADORecordSet {    
 454      
 455      var $bind = false;
 456      var $databaseType = "pdo";        
 457      var $dataProvider = "pdo";
 458      
 459  	function ADORecordSet_pdo($id,$mode=false)
 460      {
 461          if ($mode === false) {  
 462              global $ADODB_FETCH_MODE;
 463              $mode = $ADODB_FETCH_MODE;
 464          }
 465          $this->adodbFetchMode = $mode;
 466          switch($mode) {
 467          case ADODB_FETCH_NUM: $mode = PDO::FETCH_NUM; break;
 468          case ADODB_FETCH_ASSOC:  $mode = PDO::FETCH_ASSOC; break;
 469          
 470          case ADODB_FETCH_BOTH: 
 471          default: $mode = PDO::FETCH_BOTH; break;
 472          }
 473          $this->fetchMode = $mode;
 474          
 475          $this->_queryID = $id;
 476          $this->ADORecordSet($id);
 477      }
 478  
 479      
 480  	function Init()
 481      {
 482          if ($this->_inited) return;
 483          $this->_inited = true;
 484          if ($this->_queryID) @$this->_initrs();
 485          else {
 486              $this->_numOfRows = 0;
 487              $this->_numOfFields = 0;
 488          }
 489          if ($this->_numOfRows != 0 && $this->_currentRow == -1) {
 490              $this->_currentRow = 0;
 491              if ($this->EOF = ($this->_fetch() === false)) {
 492                  $this->_numOfRows = 0; // _numOfRows could be -1
 493              }
 494          } else {
 495              $this->EOF = true;
 496          }
 497      }
 498      
 499  	function _initrs()
 500      {
 501      global $ADODB_COUNTRECS;
 502      
 503          $this->_numOfRows = ($ADODB_COUNTRECS) ? @$this->_queryID->rowCount() : -1;
 504          if (!$this->_numOfRows) $this->_numOfRows = -1;
 505          $this->_numOfFields = $this->_queryID->columnCount();
 506      }
 507  
 508      // returns the field object
 509      function &FetchField($fieldOffset = -1) 
 510      {
 511          $off=$fieldOffset+1; // offsets begin at 1
 512          
 513          $o= new ADOFieldObject();
 514          $arr = @$this->_queryID->getColumnMeta($fieldOffset);
 515          if (!$arr) {
 516              $o->name = 'bad getColumnMeta()';
 517              $o->max_length = -1;
 518              $o->type = 'VARCHAR';
 519              $o->precision = 0;
 520      #        $false = false;
 521              return $o;
 522          }
 523          //adodb_pr($arr);
 524          $o->name = $arr['name'];
 525          if (isset($arr['native_type']) && $arr['native_type'] <> "null") $o->type = $arr['native_type'];
 526          else $o->type = adodb_pdo_type($arr['pdo_type']);
 527          $o->max_length = $arr['len'];
 528          $o->precision = $arr['precision'];
 529          
 530          if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
 531          else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
 532          return $o;
 533      }
 534      
 535  	function _seek($row)
 536      {
 537          return false;
 538      }
 539      
 540  	function _fetch()
 541      {
 542          if (!$this->_queryID) return false;
 543          
 544          $this->fields = $this->_queryID->fetch($this->fetchMode);
 545          return !empty($this->fields);
 546      }
 547      
 548  	function _close() 
 549      {
 550          $this->_queryID = false;
 551      }
 552      
 553  	function Fields($colname)
 554      {
 555          if ($this->adodbFetchMode != ADODB_FETCH_NUM) return @$this->fields[$colname];
 556          
 557          if (!$this->bind) {
 558              $this->bind = array();
 559              for ($i=0; $i < $this->_numOfFields; $i++) {
 560                  $o = $this->FetchField($i);
 561                  $this->bind[strtoupper($o->name)] = $i;
 562              }
 563          }
 564           return $this->fields[$this->bind[strtoupper($colname)]];
 565      }
 566  
 567  }
 568  
 569  ?>


Généré le : Thu Nov 29 09:42:17 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics