Documentation TYPO3 par Ameos |
00001 <?php 00002 /* 00003 V4.80 8 Mar 2006 (c) 2000-2006 John Lim. 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 Informix port by Mitchell T. Young (mitch@youngfamily.org) 00012 00013 Further mods by "Samuel CARRIERE" <samuel_carriere@hotmail.com> 00014 00015 */ 00016 00017 // security - hide paths 00018 if (!defined('ADODB_DIR')) die(); 00019 00020 if (!defined('IFX_SCROLL')) define('IFX_SCROLL',1); 00021 00022 class ADODB_informix72 extends ADOConnection { 00023 var $databaseType = "informix72"; 00024 var $dataProvider = "informix"; 00025 var $replaceQuote = "''"; // string to use to replace quotes 00026 var $fmtDate = "'Y-m-d'"; 00027 var $fmtTimeStamp = "'Y-m-d H:i:s'"; 00028 var $hasInsertID = true; 00029 var $hasAffectedRows = true; 00030 var $substr = 'substr'; 00031 var $metaTablesSQL="select tabname,tabtype from systables where tabtype in ('T','V') and owner!='informix'"; //Don't get informix tables and pseudo-tables 00032 00033 00034 var $metaColumnsSQL = 00035 "select c.colname, c.coltype, c.collength, d.default,c.colno 00036 from syscolumns c, systables t,outer sysdefaults d 00037 where c.tabid=t.tabid and d.tabid=t.tabid and d.colno=c.colno 00038 and tabname='%s' order by c.colno"; 00039 00040 var $metaPrimaryKeySQL = 00041 "select part1,part2,part3,part4,part5,part6,part7,part8 from 00042 systables t,sysconstraints s,sysindexes i where t.tabname='%s' 00043 and s.tabid=t.tabid and s.constrtype='P' 00044 and i.idxname=s.idxname"; 00045 00046 var $concat_operator = '||'; 00047 00048 var $lastQuery = false; 00049 var $has_insertid = true; 00050 00051 var $_autocommit = true; 00052 var $_bindInputArray = true; // set to true if ADOConnection.Execute() permits binding of array parameters. 00053 var $sysDate = 'TODAY'; 00054 var $sysTimeStamp = 'CURRENT'; 00055 var $cursorType = IFX_SCROLL; // IFX_SCROLL or IFX_HOLD or 0 00056 00057 function ADODB_informix72() 00058 { 00059 // alternatively, use older method: 00060 //putenv("DBDATE=Y4MD-"); 00061 00062 // force ISO date format 00063 putenv('GL_DATE=%Y-%m-%d'); 00064 00065 if (function_exists('ifx_byteasvarchar')) { 00066 ifx_byteasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content. 00067 ifx_textasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content. 00068 ifx_blobinfile_mode(0); // Mode "0" means save Byte-Blobs in memory, and mode "1" means save Byte-Blobs in a file. 00069 } 00070 } 00071 00072 function ServerInfo() 00073 { 00074 if (isset($this->version)) return $this->version; 00075 00076 $arr['description'] = $this->GetOne("select DBINFO('version','full') from systables where tabid = 1"); 00077 $arr['version'] = $this->GetOne("select DBINFO('version','major') || DBINFO('version','minor') from systables where tabid = 1"); 00078 $this->version = $arr; 00079 return $arr; 00080 } 00081 00082 00083 00084 function _insertid() 00085 { 00086 $sqlca =ifx_getsqlca($this->lastQuery); 00087 return @$sqlca["sqlerrd1"]; 00088 } 00089 00090 function _affectedrows() 00091 { 00092 if ($this->lastQuery) { 00093 return @ifx_affected_rows ($this->lastQuery); 00094 } 00095 return 0; 00096 } 00097 00098 function BeginTrans() 00099 { 00100 if ($this->transOff) return true; 00101 $this->transCnt += 1; 00102 $this->Execute('BEGIN'); 00103 $this->_autocommit = false; 00104 return true; 00105 } 00106 00107 function CommitTrans($ok=true) 00108 { 00109 if (!$ok) return $this->RollbackTrans(); 00110 if ($this->transOff) return true; 00111 if ($this->transCnt) $this->transCnt -= 1; 00112 $this->Execute('COMMIT'); 00113 $this->_autocommit = true; 00114 return true; 00115 } 00116 00117 function RollbackTrans() 00118 { 00119 if ($this->transOff) return true; 00120 if ($this->transCnt) $this->transCnt -= 1; 00121 $this->Execute('ROLLBACK'); 00122 $this->_autocommit = true; 00123 return true; 00124 } 00125 00126 function RowLock($tables,$where,$flds='1 as ignore') 00127 { 00128 if ($this->_autocommit) $this->BeginTrans(); 00129 return $this->GetOne("select $flds from $tables where $where for update"); 00130 } 00131 00132 /* Returns: the last error message from previous database operation 00133 Note: This function is NOT available for Microsoft SQL Server. */ 00134 00135 function ErrorMsg() 00136 { 00137 if (!empty($this->_logsql)) return $this->_errorMsg; 00138 $this->_errorMsg = ifx_errormsg(); 00139 return $this->_errorMsg; 00140 } 00141 00142 function ErrorNo() 00143 { 00144 preg_match("/.*SQLCODE=([^\]]*)/",ifx_error(),$parse); 00145 if (is_array($parse) && isset($parse[1])) return (int)$parse[1]; 00146 return 0; 00147 } 00148 00149 00150 function &MetaColumns($table) 00151 { 00152 global $ADODB_FETCH_MODE; 00153 00154 $false = false; 00155 if (!empty($this->metaColumnsSQL)) { 00156 $save = $ADODB_FETCH_MODE; 00157 $ADODB_FETCH_MODE = ADODB_FETCH_NUM; 00158 if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); 00159 $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); 00160 if (isset($savem)) $this->SetFetchMode($savem); 00161 $ADODB_FETCH_MODE = $save; 00162 if ($rs === false) return $false; 00163 $rspkey = $this->Execute(sprintf($this->metaPrimaryKeySQL,$table)); //Added to get primary key colno items 00164 00165 $retarr = array(); 00166 while (!$rs->EOF) { //print_r($rs->fields); 00167 $fld = new ADOFieldObject(); 00168 $fld->name = $rs->fields[0]; 00169 /* //!eos. 00170 $rs->fields[1] is not the correct adodb type 00171 $rs->fields[2] is not correct max_length, because can include not-null bit 00172 00173 $fld->type = $rs->fields[1]; 00174 $fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields); //Added to set primary key flag 00175 $fld->max_length = $rs->fields[2];*/ 00176 $pr=ifx_props($rs->fields[1],$rs->fields[2]); 00177 $fld->type = $pr[0] ; 00178 $fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields); 00179 $fld->max_length = $pr[1]; 00180 $fld->precision = $pr[2] ; 00181 $fld->not_null = $pr[3]=="N"; 00182 00183 if (trim($rs->fields[3]) != "AAAAAA 0") { 00184 $fld->has_default = 1; 00185 $fld->default_value = $rs->fields[3]; 00186 } else { 00187 $fld->has_default = 0; 00188 } 00189 00190 $retarr[strtolower($fld->name)] = $fld; 00191 $rs->MoveNext(); 00192 } 00193 00194 $rs->Close(); 00195 $rspKey->Close(); 00196 return $retarr; 00197 } 00198 00199 return $false; 00200 } 00201 00202 function &xMetaColumns($table) 00203 { 00204 return ADOConnection::MetaColumns($table,false); 00205 } 00206 00207 function MetaForeignKeys($table, $owner=false, $upper=false) 00208 { 00209 $sql = " 00210 select tr.tabname,updrule,delrule, 00211 i.part1 o1,i2.part1 d1,i.part2 o2,i2.part2 d2,i.part3 o3,i2.part3 d3,i.part4 o4,i2.part4 d4, 00212 i.part5 o5,i2.part5 d5,i.part6 o6,i2.part6 d6,i.part7 o7,i2.part7 d7,i.part8 o8,i2.part8 d8 00213 from systables t,sysconstraints s,sysindexes i, 00214 sysreferences r,systables tr,sysconstraints s2,sysindexes i2 00215 where t.tabname='$table' 00216 and s.tabid=t.tabid and s.constrtype='R' and r.constrid=s.constrid 00217 and i.idxname=s.idxname and tr.tabid=r.ptabid 00218 and s2.constrid=r.primary and i2.idxname=s2.idxname"; 00219 00220 $rs = $this->Execute($sql); 00221 if (!$rs || $rs->EOF) return false; 00222 $arr =& $rs->GetArray(); 00223 $a = array(); 00224 foreach($arr as $v) { 00225 $coldest=$this->metaColumnNames($v["tabname"]); 00226 $colorig=$this->metaColumnNames($table); 00227 $colnames=array(); 00228 for($i=1;$i<=8 && $v["o$i"] ;$i++) { 00229 $colnames[]=$coldest[$v["d$i"]-1]."=".$colorig[$v["o$i"]-1]; 00230 } 00231 if($upper) 00232 $a[strtoupper($v["tabname"])] = $colnames; 00233 else 00234 $a[$v["tabname"]] = $colnames; 00235 } 00236 return $a; 00237 } 00238 00239 function UpdateBlob($table, $column, $val, $where, $blobtype = 'BLOB') 00240 { 00241 $type = ($blobtype == 'TEXT') ? 1 : 0; 00242 $blobid = ifx_create_blob($type,0,$val); 00243 return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blobid)); 00244 } 00245 00246 function BlobDecode($blobid) 00247 { 00248 return function_exists('ifx_byteasvarchar') ? $blobid : @ifx_get_blob($blobid); 00249 } 00250 00251 // returns true or false 00252 function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) 00253 { 00254 if (!function_exists('ifx_connect')) return null; 00255 00256 $dbs = $argDatabasename . "@" . $argHostname; 00257 if ($argHostname) putenv("INFORMIXSERVER=$argHostname"); 00258 putenv("INFORMIXSERVER=".trim($argHostname)); 00259 $this->_connectionID = ifx_connect($dbs,$argUsername,$argPassword); 00260 if ($this->_connectionID === false) return false; 00261 #if ($argDatabasename) return $this->SelectDB($argDatabasename); 00262 return true; 00263 } 00264 00265 // returns true or false 00266 function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) 00267 { 00268 if (!function_exists('ifx_connect')) return null; 00269 00270 $dbs = $argDatabasename . "@" . $argHostname; 00271 putenv("INFORMIXSERVER=".trim($argHostname)); 00272 $this->_connectionID = ifx_pconnect($dbs,$argUsername,$argPassword); 00273 if ($this->_connectionID === false) return false; 00274 #if ($argDatabasename) return $this->SelectDB($argDatabasename); 00275 return true; 00276 } 00277 /* 00278 // ifx_do does not accept bind parameters - weird ??? 00279 function Prepare($sql) 00280 { 00281 $stmt = ifx_prepare($sql); 00282 if (!$stmt) return $sql; 00283 else return array($sql,$stmt); 00284 } 00285 */ 00286 // returns query ID if successful, otherwise false 00287 function _query($sql,$inputarr) 00288 { 00289 global $ADODB_COUNTRECS; 00290 00291 // String parameters have to be converted using ifx_create_char 00292 if ($inputarr) { 00293 foreach($inputarr as $v) { 00294 if (gettype($v) == 'string') { 00295 $tab[] = ifx_create_char($v); 00296 } 00297 else { 00298 $tab[] = $v; 00299 } 00300 } 00301 } 00302 00303 // In case of select statement, we use a scroll cursor in order 00304 // to be able to call "move", or "movefirst" statements 00305 if (!$ADODB_COUNTRECS && preg_match("/^\s*select/is", $sql)) { 00306 if ($inputarr) { 00307 $this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType, $tab); 00308 } 00309 else { 00310 $this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType); 00311 } 00312 } 00313 else { 00314 if ($inputarr) { 00315 $this->lastQuery = ifx_query($sql,$this->_connectionID, $tab); 00316 } 00317 else { 00318 $this->lastQuery = ifx_query($sql,$this->_connectionID); 00319 } 00320 } 00321 00322 // Following line have been commented because autocommit mode is 00323 // not supported by informix SE 7.2 00324 00325 //if ($this->_autocommit) ifx_query('COMMIT',$this->_connectionID); 00326 00327 return $this->lastQuery; 00328 } 00329 00330 // returns true or false 00331 function _close() 00332 { 00333 $this->lastQuery = false; 00334 return ifx_close($this->_connectionID); 00335 } 00336 } 00337 00338 00339 /*-------------------------------------------------------------------------------------- 00340 Class Name: Recordset 00341 --------------------------------------------------------------------------------------*/ 00342 00343 class ADORecordset_informix72 extends ADORecordSet { 00344 00345 var $databaseType = "informix72"; 00346 var $canSeek = true; 00347 var $_fieldprops = false; 00348 00349 function ADORecordset_informix72($id,$mode=false) 00350 { 00351 if ($mode === false) { 00352 global $ADODB_FETCH_MODE; 00353 $mode = $ADODB_FETCH_MODE; 00354 } 00355 $this->fetchMode = $mode; 00356 return $this->ADORecordSet($id); 00357 } 00358 00359 00360 00361 /* Returns: an object containing field information. 00362 Get column information in the Recordset object. fetchField() can be used in order to obtain information about 00363 fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by 00364 fetchField() is retrieved. */ 00365 function &FetchField($fieldOffset = -1) 00366 { 00367 if (empty($this->_fieldprops)) { 00368 $fp = ifx_fieldproperties($this->_queryID); 00369 foreach($fp as $k => $v) { 00370 $o = new ADOFieldObject; 00371 $o->name = $k; 00372 $arr = split(';',$v); //"SQLTYPE;length;precision;scale;ISNULLABLE" 00373 $o->type = $arr[0]; 00374 $o->max_length = $arr[1]; 00375 $this->_fieldprops[] = $o; 00376 $o->not_null = $arr[4]=="N"; 00377 } 00378 } 00379 $ret = $this->_fieldprops[$fieldOffset]; 00380 return $ret; 00381 } 00382 00383 function _initrs() 00384 { 00385 $this->_numOfRows = -1; // ifx_affected_rows not reliable, only returns estimate -- ($ADODB_COUNTRECS)? ifx_affected_rows($this->_queryID):-1; 00386 $this->_numOfFields = ifx_num_fields($this->_queryID); 00387 } 00388 00389 function _seek($row) 00390 { 00391 return @ifx_fetch_row($this->_queryID, (int) $row); 00392 } 00393 00394 function MoveLast() 00395 { 00396 $this->fields = @ifx_fetch_row($this->_queryID, "LAST"); 00397 if ($this->fields) $this->EOF = false; 00398 $this->_currentRow = -1; 00399 00400 if ($this->fetchMode == ADODB_FETCH_NUM) { 00401 foreach($this->fields as $v) { 00402 $arr[] = $v; 00403 } 00404 $this->fields = $arr; 00405 } 00406 00407 return true; 00408 } 00409 00410 function MoveFirst() 00411 { 00412 $this->fields = @ifx_fetch_row($this->_queryID, "FIRST"); 00413 if ($this->fields) $this->EOF = false; 00414 $this->_currentRow = 0; 00415 00416 if ($this->fetchMode == ADODB_FETCH_NUM) { 00417 foreach($this->fields as $v) { 00418 $arr[] = $v; 00419 } 00420 $this->fields = $arr; 00421 } 00422 00423 return true; 00424 } 00425 00426 function _fetch($ignore_fields=false) 00427 { 00428 00429 $this->fields = @ifx_fetch_row($this->_queryID); 00430 00431 if (!is_array($this->fields)) return false; 00432 00433 if ($this->fetchMode == ADODB_FETCH_NUM) { 00434 foreach($this->fields as $v) { 00435 $arr[] = $v; 00436 } 00437 $this->fields = $arr; 00438 } 00439 return true; 00440 } 00441 00442 /* close() only needs to be called if you are worried about using too much memory while your script 00443 is running. All associated result memory for the specified result identifier will automatically be freed. */ 00444 function _close() 00445 { 00446 return ifx_free_result($this->_queryID); 00447 } 00448 00449 } 00454 function ifx_props($coltype,$collength){ 00455 $itype=fmod($coltype+1,256); 00456 $nullable=floor(($coltype+1) /256) ?"N":"Y"; 00457 $mtype=substr(" CIIFFNNDN TBXCC ",$itype,1); 00458 switch ($itype){ 00459 case 2: 00460 $length=4; 00461 case 6: 00462 case 9: 00463 case 14: 00464 $length=floor($collength/256); 00465 $precision=fmod($collength,256); 00466 break; 00467 default: 00468 $precision=0; 00469 $length=$collength; 00470 } 00471 return array($mtype,$length,$precision,$nullable); 00472 } 00473 00474 00475 ?>