[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/lib/adodb/drivers/ -> adodb-oracle.inc.php (source)

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


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1