C:/lib/adodb/drivers/adodb-oracle.inc.php Quellcode

adodb-oracle.inc.php
gehe zur Dokumentation dieser Datei
1 <?php
2 /*
3 V5.19dev ??-???-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 <jorma.tuomainen@ppoy.fi>
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 }
342 ?>




Korrekturen, Hinweise und Ergänzungen

Bitte scheuen Sie sich nicht und melden Sie, was auf dieser Seite sachlich falsch oder irreführend ist, was ergänzt werden sollte, was fehlt usw. Dazu bitte oben aus dem Menü Seite den Eintrag Support Forum wählen. Es ist eine kostenlose Anmeldung erforderlich, um Anmerkungen zu posten. Unpassende Postings, Spam usw. werden kommentarlos entfernt.