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