|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 /* 00003 V5.14 8 Sept 2011 (c) 2000-2011 John Lim (jlim#natsoft.com). All rights reserved. 00004 Released under both BSD license and Lesser GPL library license. 00005 Whenever there is any discrepancy between the two licenses, 00006 the BSD license will take precedence. 00007 Set tabs to 4 for best viewing. 00008 00009 Latest version is available at http://adodb.sourceforge.net 00010 00011 Microsoft Visual FoxPro data driver. Requires ODBC. Works only on MS Windows. 00012 */ 00013 00014 // security - hide paths 00015 if (!defined('ADODB_DIR')) die(); 00016 include(ADODB_DIR."/drivers/adodb-db2.inc.php"); 00017 00018 00019 if (!defined('ADODB_DB2OCI')){ 00020 define('ADODB_DB2OCI',1); 00021 00022 /* 00023 // regex code for smart remapping of :0, :1 bind vars to ? ? 00024 function _colontrack($p) 00025 { 00026 global $_COLONARR,$_COLONSZ; 00027 $v = (integer) substr($p,1); 00028 if ($v > $_COLONSZ) return $p; 00029 $_COLONARR[] = $v; 00030 return '?'; 00031 } 00032 00033 // smart remapping of :0, :1 bind vars to ? ? 00034 function _colonscope($sql,$arr) 00035 { 00036 global $_COLONARR,$_COLONSZ; 00037 00038 $_COLONARR = array(); 00039 $_COLONSZ = sizeof($arr); 00040 00041 $sql2 = preg_replace("/(:[0-9]+)/e","_colontrack('\\1')",$sql); 00042 00043 if (empty($_COLONARR)) return array($sql,$arr); 00044 00045 foreach($_COLONARR as $k => $v) { 00046 $arr2[] = $arr[$v]; 00047 } 00048 00049 return array($sql2,$arr2); 00050 } 00051 */ 00052 00053 /* 00054 Smart remapping of :0, :1 bind vars to ? ? 00055 00056 Handles colons in comments -- and / * * / and in quoted strings. 00057 */ 00058 00059 function _colonparser($sql,$arr) 00060 { 00061 $lensql = strlen($sql); 00062 $arrsize = sizeof($arr); 00063 $state = 'NORM'; 00064 $at = 1; 00065 $ch = $sql[0]; 00066 $ch2 = @$sql[1]; 00067 $sql2 = ''; 00068 $arr2 = array(); 00069 $nprev = 0; 00070 00071 00072 while (strlen($ch)) { 00073 00074 switch($ch) { 00075 case '/': 00076 if ($state == 'NORM' && $ch2 == '*') { 00077 $state = 'COMMENT'; 00078 00079 $at += 1; 00080 $ch = $ch2; 00081 $ch2 = $at < $lensql ? $sql[$at] : ''; 00082 } 00083 break; 00084 00085 case '*': 00086 if ($state == 'COMMENT' && $ch2 == '/') { 00087 $state = 'NORM'; 00088 00089 $at += 1; 00090 $ch = $ch2; 00091 $ch2 = $at < $lensql ? $sql[$at] : ''; 00092 } 00093 break; 00094 00095 case "\n": 00096 case "\r": 00097 if ($state == 'COMMENT2') $state = 'NORM'; 00098 break; 00099 00100 case "'": 00101 do { 00102 $at += 1; 00103 $ch = $ch2; 00104 $ch2 = $at < $lensql ? $sql[$at] : ''; 00105 } while ($ch !== "'"); 00106 break; 00107 00108 case ':': 00109 if ($state == 'COMMENT' || $state == 'COMMENT2') break; 00110 00111 //echo "$at=$ch $ch2, "; 00112 if ('0' <= $ch2 && $ch2 <= '9') { 00113 $n = ''; 00114 $nat = $at; 00115 do { 00116 $at += 1; 00117 $ch = $ch2; 00118 $n .= $ch; 00119 $ch2 = $at < $lensql ? $sql[$at] : ''; 00120 } while ('0' <= $ch && $ch <= '9'); 00121 #echo "$n $arrsize ] "; 00122 $n = (integer) $n; 00123 if ($n < $arrsize) { 00124 $sql2 .= substr($sql,$nprev,$nat-$nprev-1).'?'; 00125 $nprev = $at-1; 00126 $arr2[] = $arr[$n]; 00127 } 00128 } 00129 break; 00130 00131 case '-': 00132 if ($state == 'NORM') { 00133 if ($ch2 == '-') $state = 'COMMENT2'; 00134 $at += 1; 00135 $ch = $ch2; 00136 $ch2 = $at < $lensql ? $sql[$at] : ''; 00137 } 00138 break; 00139 } 00140 00141 $at += 1; 00142 $ch = $ch2; 00143 $ch2 = $at < $lensql ? $sql[$at] : ''; 00144 } 00145 00146 if ($nprev == 0) { 00147 $sql2 = $sql; 00148 } else { 00149 $sql2 .= substr($sql,$nprev); 00150 } 00151 00152 return array($sql2,$arr2); 00153 } 00154 00155 class ADODB_db2oci extends ADODB_db2 { 00156 var $databaseType = "db2oci"; 00157 var $sysTimeStamp = 'sysdate'; 00158 var $sysDate = 'trunc(sysdate)'; 00159 var $_bindInputArray = true; 00160 00161 function ADODB_db2oci() 00162 { 00163 parent::ADODB_db2(); 00164 } 00165 00166 function Param($name,$type=false) 00167 { 00168 return ':'.$name; 00169 } 00170 00171 00172 function MetaTables($ttype=false,$schema=false) 00173 { 00174 global $ADODB_FETCH_MODE; 00175 00176 $savem = $ADODB_FETCH_MODE; 00177 $ADODB_FETCH_MODE = ADODB_FETCH_NUM; 00178 $qid = db2_tables($this->_connectionID); 00179 00180 $rs = new ADORecordSet_db2($qid); 00181 00182 $ADODB_FETCH_MODE = $savem; 00183 if (!$rs) { 00184 $false = false; 00185 return $false; 00186 } 00187 00188 $arr = $rs->GetArray(); 00189 $rs->Close(); 00190 $arr2 = array(); 00191 // adodb_pr($arr); 00192 if ($ttype) { 00193 $isview = strncmp($ttype,'V',1) === 0; 00194 } 00195 for ($i=0; $i < sizeof($arr); $i++) { 00196 if (!$arr[$i][2]) continue; 00197 $type = $arr[$i][3]; 00198 $schemaval = ($schema) ? $arr[$i][1].'.' : ''; 00199 $name = $schemaval.$arr[$i][2]; 00200 $owner = $arr[$i][1]; 00201 if (substr($name,0,8) == 'EXPLAIN_') continue; 00202 if ($ttype) { 00203 if ($isview) { 00204 if (strncmp($type,'V',1) === 0) $arr2[] = $name; 00205 } else if (strncmp($type,'T',1) === 0 && strncmp($owner,'SYS',3) !== 0) $arr2[] = $name; 00206 } else if (strncmp($type,'T',1) === 0 && strncmp($owner,'SYS',3) !== 0) $arr2[] = $name; 00207 } 00208 return $arr2; 00209 } 00210 00211 function _Execute($sql, $inputarr=false ) 00212 { 00213 if ($inputarr) list($sql,$inputarr) = _colonparser($sql, $inputarr); 00214 return parent::_Execute($sql, $inputarr); 00215 } 00216 }; 00217 00218 00219 class ADORecordSet_db2oci extends ADORecordSet_db2 { 00220 00221 var $databaseType = "db2oci"; 00222 00223 function ADORecordSet_db2oci($id,$mode=false) 00224 { 00225 return $this->ADORecordSet_db2($id,$mode); 00226 } 00227 } 00228 00229 } //define 00230 ?>