]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/adodb/drivers/adodb-oci8po.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-oci8po.inc.php
1 <?php\r
2 /*\r
3 V4.22 15 Apr 2004  (c) 2000-2004 John Lim. 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   Portable version of oci8 driver, to make it more similar to other database drivers.\r
11   The main differences are\r
12 \r
13    1. that the OCI_ASSOC names are in lowercase instead of uppercase.\r
14    2. bind variables are mapped using ? instead of :<bindvar>\r
15 \r
16    Should some emulation of RecordCount() be implemented?\r
17   \r
18 */\r
19 \r
20 include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php');\r
21 \r
22 class ADODB_oci8po extends ADODB_oci8 {\r
23         var $databaseType = 'oci8po';\r
24         var $dataProvider = 'oci8';\r
25         var $metaColumnsSQL = "select lower(cname),coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net\r
26         var $metaTablesSQL = "select lower(table_name),table_type from cat where table_type in ('TABLE','VIEW')";\r
27         \r
28         function ADODB_oci8po()\r
29         {\r
30                 $this->ADODB_oci8();\r
31         }\r
32         \r
33         function Param($name)\r
34         {\r
35                 return '?';\r
36         }\r
37         \r
38         function Prepare($sql,$cursor=false)\r
39         {\r
40                 $sqlarr = explode('?',$sql);\r
41                 $sql = $sqlarr[0];\r
42                 for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {\r
43                         $sql .=  ':'.($i-1) . $sqlarr[$i];\r
44                 } \r
45                 return ADODB_oci8::Prepare($sql,$cursor);\r
46         }\r
47         \r
48         // emulate handling of parameters ? ?, replacing with :bind0 :bind1\r
49         function _query($sql,$inputarr)\r
50         {\r
51                 if (is_array($inputarr)) {\r
52                         $i = 0;\r
53                         if (is_array($sql)) {\r
54                                 foreach($inputarr as $v) {\r
55                                         $arr['bind'.$i++] = $v;\r
56                                 } \r
57                         } else {\r
58                                 $sqlarr = explode('?',$sql);\r
59                                 $sql = $sqlarr[0];\r
60                                 foreach($inputarr as $k => $v) {\r
61                                         $sql .=  ":$k" . $sqlarr[++$i];\r
62                                 }\r
63                         }\r
64                 }\r
65                 return ADODB_oci8::_query($sql,$inputarr);\r
66         }\r
67 }\r
68 \r
69 /*--------------------------------------------------------------------------------------\r
70                  Class Name: Recordset\r
71 --------------------------------------------------------------------------------------*/\r
72 \r
73 class ADORecordset_oci8po extends ADORecordset_oci8 {\r
74 \r
75         var $databaseType = 'oci8po';\r
76         \r
77                 function ADORecordset_oci8po($queryID,$mode=false)\r
78                 {\r
79                         $this->ADORecordset_oci8($queryID,$mode);\r
80                 }\r
81 \r
82                 function Fields($colname)\r
83                 {\r
84                         if ($this->fetchMode & OCI_ASSOC) return $this->fields[$colname];\r
85                         \r
86                         if (!$this->bind) {\r
87                                 $this->bind = array();\r
88                                 for ($i=0; $i < $this->_numOfFields; $i++) {\r
89                                         $o = $this->FetchField($i);\r
90                                         $this->bind[strtoupper($o->name)] = $i;\r
91                                 }\r
92                         }\r
93                          return $this->fields[$this->bind[strtoupper($colname)]];\r
94                 }\r
95                 \r
96                 // lowercase field names...\r
97                 function &_FetchField($fieldOffset = -1)\r
98                 {\r
99                                  $fld = new ADOFieldObject;\r
100                                  $fieldOffset += 1;\r
101                                  $fld->name = strtolower(OCIcolumnname($this->_queryID, $fieldOffset));\r
102                                  $fld->type = OCIcolumntype($this->_queryID, $fieldOffset);\r
103                                  $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset);\r
104                                  if ($fld->type == 'NUMBER') {\r
105                                         //$p = OCIColumnPrecision($this->_queryID, $fieldOffset);\r
106                                         $sc = OCIColumnScale($this->_queryID, $fieldOffset);\r
107                                         if ($sc == 0) $fld->type = 'INT';\r
108                                  }\r
109                                  return $fld;\r
110                 }\r
111 \r
112         // 10% speedup to move MoveNext to child class\r
113         function MoveNext() \r
114         {\r
115         \r
116                 if (!$this->EOF) {              \r
117                         $this->_currentRow++;\r
118                         if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {\r
119                         global $ADODB_ANSI_PADDING_OFF;\r
120         \r
121                                 if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();\r
122                                 if (!empty($ADODB_ANSI_PADDING_OFF)) {\r
123                                         foreach($this->fields as $k => $v) {\r
124                                                 if (is_string($v)) $this->fields[$k] = rtrim($v);\r
125                                         }\r
126                                 }\r
127                                 return true;\r
128                         }\r
129                         $this->EOF = true;\r
130                 }\r
131                 return false;\r
132         }       \r
133         \r
134         /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */\r
135         function &GetArrayLimit($nrows,$offset=-1) \r
136         {\r
137                 if ($offset <= 0) return $this->GetArray($nrows);\r
138                 for ($i=1; $i < $offset; $i++) \r
139                         if (!@OCIFetch($this->_queryID)) return array();\r
140                         \r
141                 if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) return array();\r
142                 if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();\r
143                 $results = array();\r
144                 $cnt = 0;\r
145                 while (!$this->EOF && $nrows != $cnt) {\r
146                         $results[$cnt++] = $this->fields;\r
147                         $this->MoveNext();\r
148                 }\r
149                 \r
150                 return $results;\r
151         }\r
152 \r
153         // Create associative array\r
154         function _updatefields()\r
155         {\r
156                 if (ADODB_ASSOC_CASE == 2) return; // native\r
157         \r
158                 $arr = array();\r
159                 $lowercase = (ADODB_ASSOC_CASE == 0);\r
160                 \r
161                 foreach($this->fields as $k => $v) {\r
162                         if (is_integer($k)) $arr[$k] = $v;\r
163                         else {\r
164                                 if ($lowercase)\r
165                                         $arr[strtolower($k)] = $v;\r
166                                 else\r
167                                         $arr[strtoupper($k)] = $v;\r
168                         }\r
169                 }\r
170                 $this->fields = $arr;\r
171         }\r
172         \r
173         function _fetch() \r
174         {\r
175                 $ret = @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode);\r
176                 if ($ret) {\r
177                 global $ADODB_ANSI_PADDING_OFF;\r
178         \r
179                                 if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();\r
180                                 if (!empty($ADODB_ANSI_PADDING_OFF)) {\r
181                                         foreach($this->fields as $k => $v) {\r
182                                                 if (is_string($v)) $this->fields[$k] = rtrim($v);\r
183                                         }\r
184                                 }\r
185                 }\r
186                 return $ret;\r
187         }\r
188         \r
189 }\r
190 ?>