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