]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/adodb/drivers/adodb-db2oci.inc.php
Upgrade adodb
[SourceForge/phpwiki.git] / lib / WikiDB / adodb / drivers / adodb-db2oci.inc.php
1 <?php
2 /* 
3 V5.18 3 Sep 2012  (c) 2000-2012 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 Set tabs to 4 for best viewing.
8   
9   Latest version is available at http://adodb.sourceforge.net
10   
11   Microsoft Visual FoxPro data driver. Requires ODBC. Works only on MS Windows.
12 */
13
14 // security - hide paths
15 if (!defined('ADODB_DIR')) die();
16 include(ADODB_DIR."/drivers/adodb-db2.inc.php");
17
18
19 if (!defined('ADODB_DB2OCI')){
20 define('ADODB_DB2OCI',1);
21
22 /*
23 // regex code for smart remapping of :0, :1 bind vars to ? ?
24 function _colontrack($p)
25 {
26 global $_COLONARR,$_COLONSZ;
27         $v = (integer) substr($p,1);
28         if ($v > $_COLONSZ) return $p;
29         $_COLONARR[] = $v;
30         return '?';
31 }
32
33 // smart remapping of :0, :1 bind vars to ? ?
34 function _colonscope($sql,$arr)
35 {
36 global $_COLONARR,$_COLONSZ;
37
38         $_COLONARR = array();
39         $_COLONSZ = sizeof($arr);
40         
41         $sql2 = preg_replace("/(:[0-9]+)/e","_colontrack('\\1')",$sql);
42         
43         if (empty($_COLONARR)) return array($sql,$arr);
44         
45         foreach($_COLONARR as $k => $v) {
46                 $arr2[] = $arr[$v]; 
47         }
48         
49         return array($sql2,$arr2);
50 }
51 */
52
53 /*
54         Smart remapping of :0, :1 bind vars to ? ?
55         
56         Handles colons in comments -- and / * * / and in quoted strings.
57 */
58
59 function _colonparser($sql,$arr)
60 {
61         $lensql = strlen($sql);
62         $arrsize = sizeof($arr);
63         $state = 'NORM';
64         $at = 1;
65         $ch = $sql[0]; 
66         $ch2 = @$sql[1];
67         $sql2 = '';
68         $arr2 = array();
69         $nprev = 0;
70         
71         
72         while (strlen($ch)) {
73         
74                 switch($ch) {
75                 case '/':
76                         if ($state == 'NORM' && $ch2 == '*') {
77                                 $state = 'COMMENT';
78                                 
79                                 $at += 1;
80                                 $ch = $ch2;
81                                 $ch2 = $at < $lensql ? $sql[$at] : '';
82                         }
83                         break;
84                         
85                 case '*':
86                         if ($state == 'COMMENT' && $ch2 == '/') {
87                                 $state = 'NORM';
88                                 
89                                 $at += 1;
90                                 $ch = $ch2;
91                                 $ch2 = $at < $lensql ? $sql[$at] : '';
92                         }
93                         break;
94                 
95                 case "\n":
96                 case "\r":
97                         if ($state == 'COMMENT2') $state = 'NORM';
98                         break;
99                 
100                 case "'":
101                         do {
102                                 $at += 1;
103                                 $ch = $ch2;
104                                 $ch2 = $at < $lensql ? $sql[$at] : '';
105                         } while ($ch !== "'");
106                         break;
107                         
108                 case ':':
109                         if ($state == 'COMMENT' || $state == 'COMMENT2') break;
110                         
111                         //echo "$at=$ch $ch2, ";
112                         if ('0' <= $ch2 && $ch2 <= '9') {
113                                 $n = '';
114                                 $nat = $at;
115                                 do {
116                                         $at += 1;
117                                         $ch = $ch2;
118                                         $n .= $ch;
119                                         $ch2 = $at < $lensql ? $sql[$at] : '';
120                                 } while ('0' <= $ch && $ch <= '9');
121                                 #echo "$n $arrsize ] ";
122                                 $n = (integer) $n;
123                                 if ($n < $arrsize) {
124                                         $sql2 .= substr($sql,$nprev,$nat-$nprev-1).'?';
125                                         $nprev = $at-1;
126                                         $arr2[] = $arr[$n];
127                                 }
128                         }
129                         break;
130                         
131                 case '-':
132                         if ($state == 'NORM') {
133                                 if ($ch2 == '-') $state = 'COMMENT2';
134                                 $at += 1;
135                                 $ch = $ch2;
136                                 $ch2 = $at < $lensql ? $sql[$at] : '';
137                         }
138                         break;
139                 }
140                 
141                 $at += 1;
142                 $ch = $ch2;
143                 $ch2 = $at < $lensql ? $sql[$at] : '';
144         }
145         
146         if ($nprev == 0) {
147                 $sql2 = $sql;
148         } else {
149                 $sql2 .= substr($sql,$nprev);
150         }
151         
152         return array($sql2,$arr2);
153 }
154
155 class ADODB_db2oci extends ADODB_db2 {
156         var $databaseType = "db2oci";   
157         var $sysTimeStamp = 'sysdate';
158         var $sysDate = 'trunc(sysdate)';
159         var $_bindInputArray = true;
160         
161         function ADODB_db2oci()
162         {
163                 parent::ADODB_db2();
164         }
165         
166         function Param($name,$type='C')
167         {
168                 return ':'.$name;
169         }
170         
171         
172         function MetaTables($ttype=false,$schema=false)
173         {
174         global $ADODB_FETCH_MODE;
175         
176                 $savem = $ADODB_FETCH_MODE;
177                 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
178                 $qid = db2_tables($this->_connectionID);
179                 
180                 $rs = new ADORecordSet_db2($qid);
181                 
182                 $ADODB_FETCH_MODE = $savem;
183                 if (!$rs) {
184                         $false = false;
185                         return $false;
186                 }
187                 
188                 $arr = $rs->GetArray();
189                 $rs->Close();
190                 $arr2 = array();
191         //      adodb_pr($arr);
192                 if ($ttype) {
193                         $isview = strncmp($ttype,'V',1) === 0;
194                 }
195                 for ($i=0; $i < sizeof($arr); $i++) {
196                         if (!$arr[$i][2]) continue;
197                         $type = $arr[$i][3];
198                         $schemaval = ($schema) ? $arr[$i][1].'.' : '';
199                         $name = $schemaval.$arr[$i][2];
200                         $owner = $arr[$i][1];
201                         if (substr($name,0,8) == 'EXPLAIN_') continue;
202                         if ($ttype) { 
203                                 if ($isview) {
204                                         if (strncmp($type,'V',1) === 0) $arr2[] = $name;
205                                 } else if (strncmp($type,'T',1) === 0 && strncmp($owner,'SYS',3) !== 0) $arr2[] = $name;
206                         } else if (strncmp($type,'T',1) === 0 && strncmp($owner,'SYS',3) !== 0) $arr2[] = $name;
207                 }
208                 return $arr2;
209         }
210         
211         function _Execute($sql, $inputarr=false )
212         {
213                 if ($inputarr) list($sql,$inputarr) = _colonparser($sql, $inputarr);
214                 return parent::_Execute($sql, $inputarr);
215         }
216 };
217  
218
219 class  ADORecordSet_db2oci extends ADORecordSet_db2 {   
220         
221         var $databaseType = "db2oci";           
222         
223         function ADORecordSet_db2oci($id,$mode=false)
224         {
225                 return $this->ADORecordSet_db2($id,$mode);
226         }
227 }
228
229 } //define
230 ?>