Syntax Desktop PHP Cross Reference Web Portal Systems

Source: /admin/includes/php/adodb/drivers/adodb-oracle.inc.php - 338 lines - 9280 bytes - Summary - Text - Print

   1  <?php
   2  /*
   3  V4.98 13 Feb 2008  (c) 2000-2008 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  
   8    Latest version is available at http://adodb.sourceforge.net
   9    
  10    Oracle data driver. Requires Oracle client. Works on Windows and Unix and Oracle 7.
  11    
  12    If you are using Oracle 8 or later, use the oci8 driver which is much better and more reliable.
  13  */
  14  
  15  // security - hide paths
  16  if (!defined('ADODB_DIR')) die();
  17  
  18  class ADODB_oracle extends ADOConnection {
  19      var $databaseType = "oracle";
  20      var $replaceQuote = "''"; // string to use to replace quotes
  21      var $concat_operator='||';
  22      var $_curs;
  23      var $_initdate = true; // init date to YYYY-MM-DD
  24      var $metaTablesSQL = 'select table_name from cat';    
  25      var $metaColumnsSQL = "select cname,coltype,width from col where tname='%s' order by colno";
  26      var $sysDate = "TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD')";
  27      var $sysTimeStamp = 'SYSDATE';
  28      var $connectSID = true;
  29      
  30  	function ADODB_oracle() 
  31      {
  32      }
  33  
  34      // format and return date string in database date format
  35  	function DBDate($d)
  36      {
  37          if (is_string($d)) $d = ADORecordSet::UnixDate($d);
  38          return 'TO_DATE('.adodb_date($this->fmtDate,$d).",'YYYY-MM-DD')";
  39      }
  40      
  41      // format and return date string in database timestamp format
  42  	function DBTimeStamp($ts)
  43      {
  44  
  45          if (is_string($ts)) $d = ADORecordSet::UnixTimeStamp($ts);
  46          return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'RRRR-MM-DD, HH:MI:SS AM')";
  47      }
  48      
  49      
  50  	function BindDate($d)
  51      {
  52          $d = ADOConnection::DBDate($d);
  53          if (strncmp($d,"'",1)) return $d;
  54          
  55          return substr($d,1,strlen($d)-2);
  56      }
  57      
  58  	function BindTimeStamp($d)
  59      {
  60          $d = ADOConnection::DBTimeStamp($d);
  61          if (strncmp($d,"'",1)) return $d;
  62          
  63          return substr($d,1,strlen($d)-2);
  64      }
  65      
  66  
  67      
  68  	function BeginTrans()
  69      {      
  70           $this->autoCommit = false;
  71           ora_commitoff($this->_connectionID);
  72           return true;
  73      }
  74  
  75      
  76  	function CommitTrans($ok=true) 
  77      { 
  78             if (!$ok) return $this->RollbackTrans();
  79             $ret = ora_commit($this->_connectionID);
  80             ora_commiton($this->_connectionID);
  81             return $ret;
  82      }
  83  
  84      
  85  	function RollbackTrans()
  86      {
  87          $ret = ora_rollback($this->_connectionID);
  88          ora_commiton($this->_connectionID);
  89          return $ret;
  90      }
  91  
  92  
  93      /* there seems to be a bug in the oracle extension -- always returns ORA-00000 - no error */
  94  	function ErrorMsg() 
  95       {   
  96          if ($this->_errorMsg !== false) return $this->_errorMsg;
  97  
  98          if (is_resource($this->_curs)) $this->_errorMsg = @ora_error($this->_curs);
  99           if (empty($this->_errorMsg)) $this->_errorMsg = @ora_error($this->_connectionID);
 100          return $this->_errorMsg;
 101      }
 102  
 103   
 104  	function ErrorNo() 
 105      {
 106          if ($this->_errorCode !== false) return $this->_errorCode;
 107  
 108          if (is_resource($this->_curs)) $this->_errorCode = @ora_errorcode($this->_curs);
 109          if (empty($this->_errorCode)) $this->_errorCode = @ora_errorcode($this->_connectionID);
 110          return $this->_errorCode;
 111      }
 112  
 113      
 114  
 115          // returns true or false
 116  		function _connect($argHostname, $argUsername, $argPassword, $argDatabasename, $mode=0)
 117          {
 118              if (!function_exists('ora_plogon')) return null;
 119                  
 120              // <G. Giunta 2003/03/03/> Reset error messages before connecting
 121              $this->_errorMsg = false;
 122              $this->_errorCode = false;
 123          
 124              // G. Giunta 2003/08/13 - This looks danegrously suspicious: why should we want to set
 125              // the oracle home to the host name of remote DB?
 126  //            if ($argHostname) putenv("ORACLE_HOME=$argHostname");
 127  
 128              if($argHostname) { // code copied from version submitted for oci8 by Jorma Tuomainen <jorma.tuomainen@ppoy.fi>
 129                  if (empty($argDatabasename)) $argDatabasename = $argHostname;
 130                  else {
 131                      if(strpos($argHostname,":")) {
 132                          $argHostinfo=explode(":",$argHostname);
 133                          $argHostname=$argHostinfo[0];
 134                          $argHostport=$argHostinfo[1];
 135                      } else {
 136                          $argHostport="1521";
 137                      }
 138  
 139  
 140                      if ($this->connectSID) {
 141                          $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
 142                          .")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))";
 143                      } else
 144                          $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
 145                          .")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))";
 146                  }
 147  
 148              }
 149  
 150              if ($argDatabasename) $argUsername .= "@$argDatabasename";
 151  
 152          //if ($argHostname) print "<p>Connect: 1st argument should be left blank for $this->databaseType</p>";
 153              if ($mode == 1)
 154                  $this->_connectionID = ora_plogon($argUsername,$argPassword);
 155              else
 156                  $this->_connectionID = ora_logon($argUsername,$argPassword);
 157              if ($this->_connectionID === false) return false;
 158              if ($this->autoCommit) ora_commiton($this->_connectionID);
 159              if ($this->_initdate) {
 160                  $rs = $this->_query("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'");
 161                  if ($rs) ora_close($rs);
 162              }
 163  
 164              return true;
 165          }
 166  
 167  
 168          // returns true or false
 169  		function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
 170          {
 171              return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, 1);
 172          }
 173  
 174  
 175          // returns query ID if successful, otherwise false
 176  		function _query($sql,$inputarr=false)
 177          {
 178              // <G. Giunta 2003/03/03/> Reset error messages before executing
 179              $this->_errorMsg = false;
 180              $this->_errorCode = false;
 181  
 182              $curs = ora_open($this->_connectionID);
 183           
 184               if ($curs === false) return false;
 185              $this->_curs = $curs;
 186              if (!ora_parse($curs,$sql)) return false;
 187              if (ora_exec($curs)) return $curs;
 188              // <G. Giunta 2004/03/03> before we close the cursor, we have to store the error message
 189              // that we can obtain ONLY from the cursor (and not from the connection)
 190              $this->_errorCode = @ora_errorcode($curs);
 191              $this->_errorMsg = @ora_error($curs);
 192              // </G. Giunta 2004/03/03>            
 193               @ora_close($curs);
 194              return false;
 195          }
 196  
 197  
 198          // returns true or false
 199  		function _close()
 200          {
 201              return @ora_logoff($this->_connectionID);
 202          }
 203  
 204  
 205  
 206  }
 207  
 208  
 209  /*--------------------------------------------------------------------------------------
 210           Class Name: Recordset
 211  --------------------------------------------------------------------------------------*/
 212  
 213  class ADORecordset_oracle extends ADORecordSet {
 214  
 215      var $databaseType = "oracle";
 216      var $bind = false;
 217  
 218  	function ADORecordset_oracle($queryID,$mode=false)
 219      {
 220          
 221          if ($mode === false) { 
 222              global $ADODB_FETCH_MODE;
 223              $mode = $ADODB_FETCH_MODE;
 224          }
 225          $this->fetchMode = $mode;
 226          
 227          $this->_queryID = $queryID;
 228      
 229          $this->_inited = true;
 230          $this->fields = array();
 231          if ($queryID) {
 232              $this->_currentRow = 0;
 233              $this->EOF = !$this->_fetch();
 234              @$this->_initrs();
 235          } else {
 236              $this->_numOfRows = 0;
 237              $this->_numOfFields = 0;
 238              $this->EOF = true;
 239          }
 240          
 241          return $this->_queryID;
 242      }
 243  
 244  
 245  
 246         /*        Returns: an object containing field information.
 247                 Get column information in the Recordset object. fetchField() can be used in order to obtain information about
 248                 fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
 249                 fetchField() is retrieved.        */
 250  
 251         function &FetchField($fieldOffset = -1)
 252         {
 253              $fld = new ADOFieldObject;
 254              $fld->name = ora_columnname($this->_queryID, $fieldOffset);
 255              $fld->type = ora_columntype($this->_queryID, $fieldOffset);
 256              $fld->max_length = ora_columnsize($this->_queryID, $fieldOffset);
 257              return $fld;
 258         }
 259  
 260      /* Use associative array to get fields array */
 261  	function Fields($colname)
 262      {
 263          if (!$this->bind) {
 264              $this->bind = array();
 265              for ($i=0; $i < $this->_numOfFields; $i++) {
 266                  $o = $this->FetchField($i);
 267                  $this->bind[strtoupper($o->name)] = $i;
 268              }
 269          }
 270          
 271           return $this->fields[$this->bind[strtoupper($colname)]];
 272      }
 273      
 274     function _initrs()
 275     {
 276             $this->_numOfRows = -1;
 277             $this->_numOfFields = @ora_numcols($this->_queryID);
 278     }
 279  
 280  
 281     function _seek($row)
 282     {
 283             return false;
 284     }
 285  
 286     function _fetch($ignore_fields=false) {
 287  // should remove call by reference, but ora_fetch_into requires it in 4.0.3pl1
 288          if ($this->fetchMode & ADODB_FETCH_ASSOC)
 289              return @ora_fetch_into($this->_queryID,&$this->fields,ORA_FETCHINTO_NULLS|ORA_FETCHINTO_ASSOC);
 290             else 
 291              return @ora_fetch_into($this->_queryID,&$this->fields,ORA_FETCHINTO_NULLS);
 292     }
 293  
 294     /*        close() only needs to be called if you are worried about using too much memory while your script
 295             is running. All associated result memory for the specified result identifier will automatically be freed.        */
 296  
 297     function _close() 
 298  {
 299             return @ora_close($this->_queryID);
 300     }
 301  
 302  	function MetaType($t,$len=-1)
 303      {
 304          if (is_object($t)) {
 305              $fieldobj = $t;
 306              $t = $fieldobj->type;
 307              $len = $fieldobj->max_length;
 308          }
 309          
 310          switch (strtoupper($t)) {
 311          case 'VARCHAR':
 312          case 'VARCHAR2':
 313          case 'CHAR':
 314          case 'VARBINARY':
 315          case 'BINARY':
 316                  if ($len <= $this->blobSize) return 'C';
 317          case 'LONG':
 318          case 'LONG VARCHAR':
 319          case 'CLOB':
 320          return 'X';
 321          case 'LONG RAW':
 322          case 'LONG VARBINARY':
 323          case 'BLOB':
 324                  return 'B';
 325          
 326          case 'DATE': return 'D';
 327          
 328          //case 'T': return 'T';
 329          
 330          case 'BIT': return 'L';
 331          case 'INT': 
 332          case 'SMALLINT':
 333          case 'INTEGER': return 'I';
 334          default: return 'N';
 335          }
 336      }
 337  }
 338  ?>

title

Description

title

Description

title

Description

title

title

Body