00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 if (!defined('ADODB_DIR')) die();
00028
00029 class ADODB_ibase extends ADOConnection {
00030 var $databaseType = "ibase";
00031 var $dataProvider = "ibase";
00032 var $replaceQuote = "''";
00033 var $ibase_datefmt = '%Y-%m-%d';
00034 var $fmtDate = "'Y-m-d'";
00035 var $ibase_timestampfmt = "%Y-%m-%d %H:%M:%S";
00036 var $ibase_timefmt = "%H:%M:%S";
00037 var $fmtTimeStamp = "'Y-m-d, H:i:s'";
00038 var $concat_operator='||';
00039 var $_transactionID;
00040 var $metaTablesSQL = "select rdb\$relation_name from rdb\$relations where rdb\$relation_name not like 'RDB\$%'";
00041
00042 var $metaColumnsSQL = "select a.rdb\$field_name, a.rdb\$null_flag, a.rdb\$default_source, b.rdb\$field_length, b.rdb\$field_scale, b.rdb\$field_sub_type, b.rdb\$field_precision, b.rdb\$field_type from rdb\$relation_fields a, rdb\$fields b where a.rdb\$field_source = b.rdb\$field_name and a.rdb\$relation_name = '%s' order by a.rdb\$field_position asc";
00043
00044 var $ibasetrans;
00045 var $hasGenID = true;
00046 var $_bindInputArray = true;
00047 var $buffers = 0;
00048 var $dialect = 1;
00049 var $sysDate = "cast('TODAY' as timestamp)";
00050 var $sysTimeStamp = "CURRENT_TIMESTAMP";
00051 var $ansiOuter = true;
00052 var $hasAffectedRows = false;
00053 var $poorAffectedRows = true;
00054 var $blobEncodeType = 'C';
00055 var $role = false;
00056
00057 function ADODB_ibase()
00058 {
00059 if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT;
00060 }
00061
00062
00063
00064 function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$persist=false)
00065 {
00066 if (!function_exists('ibase_pconnect')) return null;
00067 if ($argDatabasename) $argHostname .= ':'.$argDatabasename;
00068 $fn = ($persist) ? 'ibase_pconnect':'ibase_connect';
00069 if ($this->role)
00070 $this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
00071 $this->charSet,$this->buffers,$this->dialect,$this->role);
00072 else
00073 $this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
00074 $this->charSet,$this->buffers,$this->dialect);
00075
00076 if ($this->dialect != 1) {
00077 $this->replaceQuote = "''";
00078 }
00079 if ($this->_connectionID === false) {
00080 $this->_handleerror();
00081 return false;
00082 }
00083
00084
00085 if (function_exists('ibase_timefmt')) {
00086 ibase_timefmt($this->ibase_datefmt,IBASE_DATE );
00087 if ($this->dialect == 1) ibase_timefmt($this->ibase_datefmt,IBASE_TIMESTAMP );
00088 else ibase_timefmt($this->ibase_timestampfmt,IBASE_TIMESTAMP );
00089 ibase_timefmt($this->ibase_timefmt,IBASE_TIME );
00090
00091 } else {
00092 ini_set("ibase.timestampformat", $this->ibase_timestampfmt);
00093 ini_set("ibase.dateformat", $this->ibase_datefmt);
00094 ini_set("ibase.timeformat", $this->ibase_timefmt);
00095 }
00096 return true;
00097 }
00098
00099 function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
00100 {
00101 return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,true);
00102 }
00103
00104
00105 function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false)
00106 {
00107 if ($internalKey) return array('RDB$DB_KEY');
00108
00109 $table = strtoupper($table);
00110
00111 $sql = 'SELECT S.RDB$FIELD_NAME AFIELDNAME
00112 FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON I.RDB$INDEX_NAME=S.RDB$INDEX_NAME
00113 WHERE I.RDB$RELATION_NAME=\''.$table.'\' and I.RDB$INDEX_NAME like \'RDB$PRIMARY%\'
00114 ORDER BY I.RDB$INDEX_NAME,S.RDB$FIELD_POSITION';
00115
00116 $a = $this->GetCol($sql,false,true);
00117 if ($a && sizeof($a)>0) return $a;
00118 return false;
00119 }
00120
00121 function ServerInfo()
00122 {
00123 $arr['dialect'] = $this->dialect;
00124 switch($arr['dialect']) {
00125 case '':
00126 case '1': $s = 'Interbase 5.5 or earlier'; break;
00127 case '2': $s = 'Interbase 5.6'; break;
00128 default:
00129 case '3': $s = 'Interbase 6.0'; break;
00130 }
00131 $arr['version'] = ADOConnection::_findvers($s);
00132 $arr['description'] = $s;
00133 return $arr;
00134 }
00135
00136 function BeginTrans()
00137 {
00138 if ($this->transOff) return true;
00139 $this->transCnt += 1;
00140 $this->autoCommit = false;
00141 $this->_transactionID = $this->_connectionID;
00142 return $this->_transactionID;
00143 }
00144
00145 function CommitTrans($ok=true)
00146 {
00147 if (!$ok) return $this->RollbackTrans();
00148 if ($this->transOff) return true;
00149 if ($this->transCnt) $this->transCnt -= 1;
00150 $ret = false;
00151 $this->autoCommit = true;
00152 if ($this->_transactionID) {
00153
00154 $ret = ibase_commit($this->_transactionID);
00155 }
00156 $this->_transactionID = false;
00157 return $ret;
00158 }
00159
00160
00161
00162 function &_Execute($sql,$inputarr=false)
00163 {
00164 global $ADODB_COUNTRECS;
00165
00166 if ($this->_logsql) {
00167 $savecrecs = $ADODB_COUNTRECS;
00168 $ADODB_COUNTRECS = true;
00169 $ret =& ADOConnection::_Execute($sql,$inputarr);
00170 $ADODB_COUNTRECS = $savecrecs;
00171 } else {
00172 $ret =& ADOConnection::_Execute($sql,$inputarr);
00173 }
00174 return $ret;
00175 }
00176
00177 function RollbackTrans()
00178 {
00179 if ($this->transOff) return true;
00180 if ($this->transCnt) $this->transCnt -= 1;
00181 $ret = false;
00182 $this->autoCommit = true;
00183 if ($this->_transactionID)
00184 $ret = ibase_rollback($this->_transactionID);
00185 $this->_transactionID = false;
00186
00187 return $ret;
00188 }
00189
00190 function &MetaIndexes ($table, $primary = FALSE, $owner=false)
00191 {
00192
00193 global $ADODB_FETCH_MODE;
00194 $false = false;
00195 $save = $ADODB_FETCH_MODE;
00196 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00197 if ($this->fetchMode !== FALSE) {
00198 $savem = $this->SetFetchMode(FALSE);
00199 }
00200 $table = strtoupper($table);
00201 $sql = "SELECT * FROM RDB\$INDICES WHERE RDB\$RELATION_NAME = '".$table."'";
00202 if (!$primary) {
00203 $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$%'";
00204 } else {
00205 $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$FOREIGN%'";
00206 }
00207
00208 $rs = $this->Execute($sql);
00209 if (!is_object($rs)) {
00210
00211 if (isset($savem)) {
00212 $this->SetFetchMode($savem);
00213 }
00214 $ADODB_FETCH_MODE = $save;
00215 return $false;
00216 }
00217
00218 $indexes = array();
00219 while ($row = $rs->FetchRow()) {
00220 $index = $row[0];
00221 if (!isset($indexes[$index])) {
00222 if (is_null($row[3])) {$row[3] = 0;}
00223 $indexes[$index] = array(
00224 'unique' => ($row[3] == 1),
00225 'columns' => array()
00226 );
00227 }
00228 $sql = "SELECT * FROM RDB\$INDEX_SEGMENTS WHERE RDB\$INDEX_NAME = '".$index."' ORDER BY RDB\$FIELD_POSITION ASC";
00229 $rs1 = $this->Execute($sql);
00230 while ($row1 = $rs1->FetchRow()) {
00231 $indexes[$index]['columns'][$row1[2]] = $row1[1];
00232 }
00233 }
00234
00235 if (isset($savem)) {
00236 $this->SetFetchMode($savem);
00237 }
00238 $ADODB_FETCH_MODE = $save;
00239
00240 return $indexes;
00241 }
00242
00243
00244
00245 function RowLock($tables,$where,$col)
00246 {
00247 if ($this->autoCommit) $this->BeginTrans();
00248 $this->Execute("UPDATE $table SET $col=$col WHERE $where ");
00249 return 1;
00250 }
00251
00252
00253 function CreateSequence($seqname,$startID=1)
00254 {
00255 $ok = $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" ));
00256 if (!$ok) return false;
00257 return $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
00258 }
00259
00260 function DropSequence($seqname)
00261 {
00262 $seqname = strtoupper($seqname);
00263 $this->Execute("delete from RDB\$GENERATORS where RDB\$GENERATOR_NAME='$seqname'");
00264 }
00265
00266 function GenID($seqname='adodbseq',$startID=1)
00267 {
00268 $getnext = ("SELECT Gen_ID($seqname,1) FROM RDB\$DATABASE");
00269 $rs = @$this->Execute($getnext);
00270 if (!$rs) {
00271 $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" ));
00272 $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
00273 $rs = $this->Execute($getnext);
00274 }
00275 if ($rs && !$rs->EOF) $this->genID = (integer) reset($rs->fields);
00276 else $this->genID = 0;
00277
00278 if ($rs) $rs->Close();
00279
00280 return $this->genID;
00281 }
00282
00283 function SelectDB($dbName)
00284 {
00285 return false;
00286 }
00287
00288 function _handleerror()
00289 {
00290 $this->_errorMsg = ibase_errmsg();
00291 }
00292
00293 function ErrorNo()
00294 {
00295 if (preg_match('/error code = ([\-0-9]*)/i', $this->_errorMsg,$arr)) return (integer) $arr[1];
00296 else return 0;
00297 }
00298
00299 function ErrorMsg()
00300 {
00301 return $this->_errorMsg;
00302 }
00303
00304 function Prepare($sql)
00305 {
00306 $stmt = ibase_prepare($this->_connectionID,$sql);
00307 if (!$stmt) return false;
00308 return array($sql,$stmt);
00309 }
00310
00311
00312
00313 function _query($sql,$iarr=false)
00314 {
00315
00316 if (!$this->autoCommit && $this->_transactionID) {
00317 $conn = $this->_transactionID;
00318 $docommit = false;
00319 } else {
00320 $conn = $this->_connectionID;
00321 $docommit = true;
00322 }
00323 if (is_array($sql)) {
00324 $fn = 'ibase_execute';
00325 $sql = $sql[1];
00326 if (is_array($iarr)) {
00327 if (ADODB_PHPVER >= 0x4050) {
00328 if ( !isset($iarr[0]) ) $iarr[0] = '';
00329 $fnarr =& array_merge( array($sql) , $iarr);
00330 $ret = call_user_func_array($fn,$fnarr);
00331 } else {
00332 switch(sizeof($iarr)) {
00333 case 1: $ret = $fn($sql,$iarr[0]); break;
00334 case 2: $ret = $fn($sql,$iarr[0],$iarr[1]); break;
00335 case 3: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2]); break;
00336 case 4: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break;
00337 case 5: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break;
00338 case 6: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break;
00339 case 7: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break;
00340 default: ADOConnection::outp( "Too many parameters to ibase query $sql");
00341 case 8: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break;
00342 }
00343 }
00344 } else $ret = $fn($sql);
00345 } else {
00346 $fn = 'ibase_query';
00347
00348 if (is_array($iarr)) {
00349 if (ADODB_PHPVER >= 0x4050) {
00350 if (sizeof($iarr) == 0) $iarr[0] = '';
00351 $fnarr =& array_merge( array($conn,$sql) , $iarr);
00352 $ret = call_user_func_array($fn,$fnarr);
00353 } else {
00354 switch(sizeof($iarr)) {
00355 case 1: $ret = $fn($conn,$sql,$iarr[0]); break;
00356 case 2: $ret = $fn($conn,$sql,$iarr[0],$iarr[1]); break;
00357 case 3: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2]); break;
00358 case 4: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break;
00359 case 5: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break;
00360 case 6: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break;
00361 case 7: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break;
00362 default: ADOConnection::outp( "Too many parameters to ibase query $sql");
00363 case 8: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break;
00364 }
00365 }
00366 } else $ret = $fn($conn,$sql);
00367 }
00368 if ($docommit && $ret === true) ibase_commit($this->_connectionID);
00369
00370 $this->_handleerror();
00371 return $ret;
00372 }
00373
00374
00375 function _close()
00376 {
00377 if (!$this->autoCommit) @ibase_rollback($this->_connectionID);
00378 return @ibase_close($this->_connectionID);
00379 }
00380
00381
00382 function _ConvertFieldType(&$fld, $ftype, $flen, $fscale, $fsubtype, $fprecision, $dialect3)
00383 {
00384 $fscale = abs($fscale);
00385 $fld->max_length = $flen;
00386 $fld->scale = null;
00387 switch($ftype){
00388 case 7:
00389 case 8:
00390 if ($dialect3) {
00391 switch($fsubtype){
00392 case 0:
00393 $fld->type = ($ftype == 7 ? 'smallint' : 'integer');
00394 break;
00395 case 1:
00396 $fld->type = 'numeric';
00397 $fld->max_length = $fprecision;
00398 $fld->scale = $fscale;
00399 break;
00400 case 2:
00401 $fld->type = 'decimal';
00402 $fld->max_length = $fprecision;
00403 $fld->scale = $fscale;
00404 break;
00405 }
00406 } else {
00407 if ($fscale !=0) {
00408 $fld->type = 'decimal';
00409 $fld->scale = $fscale;
00410 $fld->max_length = ($ftype == 7 ? 4 : 9);
00411 } else {
00412 $fld->type = ($ftype == 7 ? 'smallint' : 'integer');
00413 }
00414 }
00415 break;
00416 case 16:
00417 if ($dialect3) {
00418 switch($fsubtype){
00419 case 0:
00420 $fld->type = 'decimal';
00421 $fld->max_length = 18;
00422 $fld->scale = 0;
00423 break;
00424 case 1:
00425 $fld->type = 'numeric';
00426 $fld->max_length = $fprecision;
00427 $fld->scale = $fscale;
00428 break;
00429 case 2:
00430 $fld->type = 'decimal';
00431 $fld->max_length = $fprecision;
00432 $fld->scale = $fscale;
00433 break;
00434 }
00435 }
00436 break;
00437 case 10:
00438 $fld->type = 'float';
00439 break;
00440 case 14:
00441 $fld->type = 'char';
00442 break;
00443 case 27:
00444 if ($fscale !=0) {
00445 $fld->type = 'decimal';
00446 $fld->max_length = 15;
00447 $fld->scale = 5;
00448 } else {
00449 $fld->type = 'double';
00450 }
00451 break;
00452 case 35:
00453 if ($dialect3) {
00454 $fld->type = 'timestamp';
00455 } else {
00456 $fld->type = 'date';
00457 }
00458 break;
00459 case 12:
00460 $fld->type = 'date';
00461 break;
00462 case 13:
00463 $fld->type = 'time';
00464 break;
00465 case 37:
00466 $fld->type = 'varchar';
00467 break;
00468 case 40:
00469 $fld->type = 'cstring';
00470 break;
00471 case 261:
00472 $fld->type = 'blob';
00473 $fld->max_length = -1;
00474 break;
00475 }
00476 }
00477
00478
00479 function &MetaColumns($table)
00480 {
00481 global $ADODB_FETCH_MODE;
00482
00483 $save = $ADODB_FETCH_MODE;
00484 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00485
00486 $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
00487
00488 $ADODB_FETCH_MODE = $save;
00489 $false = false;
00490 if ($rs === false) {
00491 return $false;
00492 }
00493
00494 $retarr = array();
00495
00496 $dialect3 = ($this->dialect==3 ? true : false);
00497
00498 while (!$rs->EOF) {
00499 $fld = new ADOFieldObject();
00500 $fld->name = trim($rs->fields[0]);
00501
00502 $this->_ConvertFieldType($fld, $rs->fields[7], $rs->fields[3], $rs->fields[4], $rs->fields[5], $rs->fields[6], $dialect3);
00503 if (isset($rs->fields[1]) && $rs->fields[1]) {
00504 $fld->not_null = true;
00505 }
00506 if (isset($rs->fields[2])) {
00507
00508 $fld->has_default = true;
00509 $d = substr($rs->fields[2],strlen('default '));
00510 switch ($fld->type)
00511 {
00512 case 'smallint':
00513 case 'integer': $fld->default_value = (int) $d; break;
00514 case 'char':
00515 case 'blob':
00516 case 'text':
00517 case 'varchar': $fld->default_value = (string) substr($d,1,strlen($d)-2); break;
00518 case 'double':
00519 case 'float': $fld->default_value = (float) $d; break;
00520 default: $fld->default_value = $d; break;
00521 }
00522
00523 }
00524 if ((isset($rs->fields[5])) && ($fld->type == 'blob')) {
00525 $fld->sub_type = $rs->fields[5];
00526 } else {
00527 $fld->sub_type = null;
00528 }
00529
00530 if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
00531 else $retarr[strtoupper($fld->name)] = $fld;
00532
00533 $rs->MoveNext();
00534 }
00535 $rs->Close();
00536 if ( empty($retarr)) return $false;
00537 else return $retarr;
00538 }
00539
00540 function BlobEncode( $blob )
00541 {
00542 $blobid = ibase_blob_create( $this->_connectionID);
00543 ibase_blob_add( $blobid, $blob );
00544 return ibase_blob_close( $blobid );
00545 }
00546
00547
00548
00549 function BlobDecode($blob)
00550 {
00551 return $blob;
00552 }
00553
00554
00555
00556
00557
00558
00559 function _BlobDecode_old( $blob )
00560 {
00561 $blobid = ibase_blob_open($this->_connectionID, $blob );
00562 $realblob = ibase_blob_get( $blobid,$this->maxblobsize);
00563 while($string = ibase_blob_get($blobid, 8192)){
00564 $realblob .= $string;
00565 }
00566 ibase_blob_close( $blobid );
00567
00568 return( $realblob );
00569 }
00570
00571 function _BlobDecode( $blob )
00572 {
00573 if (ADODB_PHPVER >= 0x5000) {
00574 $blob_data = ibase_blob_info($this->_connectionID, $blob );
00575 $blobid = ibase_blob_open($this->_connectionID, $blob );
00576 } else {
00577
00578 $blob_data = ibase_blob_info( $blob );
00579 $blobid = ibase_blob_open( $blob );
00580 }
00581
00582 if( $blob_data[0] > $this->maxblobsize ) {
00583
00584 $realblob = ibase_blob_get($blobid, $this->maxblobsize);
00585
00586 while($string = ibase_blob_get($blobid, 8192)){
00587 $realblob .= $string;
00588 }
00589 } else {
00590 $realblob = ibase_blob_get($blobid, $blob_data[0]);
00591 }
00592
00593 ibase_blob_close( $blobid );
00594 return( $realblob );
00595 }
00596
00597 function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB')
00598 {
00599 $fd = fopen($path,'rb');
00600 if ($fd === false) return false;
00601 $blob_id = ibase_blob_create($this->_connectionID);
00602
00603
00604
00605 while ($val = fread($fd,32768)){
00606 ibase_blob_add($blob_id, $val);
00607 }
00608
00609
00610 $blob_id_str = ibase_blob_close($blob_id);
00611
00612 fclose($fd);
00613 return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
00614 }
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625 function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
00626 {
00627 $blob_id = ibase_blob_create($this->_connectionID);
00628
00629
00630
00631
00632
00633
00634 $len = strlen($val);
00635 $chunk_size = 32768;
00636 $tail_size = $len % $chunk_size;
00637 $n_chunks = ($len - $tail_size) / $chunk_size;
00638
00639 for ($n = 0; $n < $n_chunks; $n++) {
00640 $start = $n * $chunk_size;
00641 $data = substr($val, $start, $chunk_size);
00642 ibase_blob_add($blob_id, $data);
00643 }
00644
00645 if ($tail_size) {
00646 $start = $n_chunks * $chunk_size;
00647 $data = substr($val, $start, $tail_size);
00648 ibase_blob_add($blob_id, $data);
00649 }
00650
00651
00652 $blob_id_str = ibase_blob_close($blob_id);
00653
00654 return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
00655
00656 }
00657
00658
00659 function OldUpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
00660 {
00661 $blob_id = ibase_blob_create($this->_connectionID);
00662 ibase_blob_add($blob_id, $val);
00663 $blob_id_str = ibase_blob_close($blob_id);
00664 return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
00665 }
00666
00667
00668
00669
00670 function SQLDate($fmt, $col=false)
00671 {
00672 if (!$col) $col = $this->sysDate;
00673 $s = '';
00674
00675 $len = strlen($fmt);
00676 for ($i=0; $i < $len; $i++) {
00677 if ($s) $s .= '||';
00678 $ch = $fmt[$i];
00679 switch($ch) {
00680 case 'Y':
00681 case 'y':
00682 $s .= "extract(year from $col)";
00683 break;
00684 case 'M':
00685 case 'm':
00686 $s .= "extract(month from $col)";
00687 break;
00688 case 'Q':
00689 case 'q':
00690 $s .= "cast(((extract(month from $col)+2) / 3) as integer)";
00691 break;
00692 case 'D':
00693 case 'd':
00694 $s .= "(extract(day from $col))";
00695 break;
00696 case 'H':
00697 case 'h':
00698 $s .= "(extract(hour from $col))";
00699 break;
00700 case 'I':
00701 case 'i':
00702 $s .= "(extract(minute from $col))";
00703 break;
00704 case 'S':
00705 case 's':
00706 $s .= "CAST((extract(second from $col)) AS INTEGER)";
00707 break;
00708
00709 default:
00710 if ($ch == '\\') {
00711 $i++;
00712 $ch = substr($fmt,$i,1);
00713 }
00714 $s .= $this->qstr($ch);
00715 break;
00716 }
00717 }
00718 return $s;
00719 }
00720 }
00721
00722
00723
00724
00725
00726 class ADORecordset_ibase extends ADORecordSet
00727 {
00728
00729 var $databaseType = "ibase";
00730 var $bind=false;
00731 var $_cacheType;
00732
00733 function ADORecordset_ibase($id,$mode=false)
00734 {
00735 global $ADODB_FETCH_MODE;
00736
00737 $this->fetchMode = ($mode === false) ? $ADODB_FETCH_MODE : $mode;
00738 $this->ADORecordSet($id);
00739 }
00740
00741
00742
00743
00744
00745
00746 function &FetchField($fieldOffset = -1)
00747 {
00748 $fld = new ADOFieldObject;
00749 $ibf = ibase_field_info($this->_queryID,$fieldOffset);
00750 switch (ADODB_ASSOC_CASE) {
00751 case 2:
00752 $fld->name = ($ibf['alias']);
00753 if (empty($fld->name)) $fld->name = ($ibf['name']);
00754 break;
00755 case 0:
00756 $fld->name = strtoupper($ibf['alias']);
00757 if (empty($fld->name)) $fld->name = strtoupper($ibf['name']);
00758 break;
00759 case 1:
00760 $fld->name = strtolower($ibf['alias']);
00761 if (empty($fld->name)) $fld->name = strtolower($ibf['name']);
00762 break;
00763 }
00764
00765 $fld->type = $ibf['type'];
00766 $fld->max_length = $ibf['length'];
00767
00768
00769 $fld->not_null = false;
00770 $fld->has_default = false;
00771 $fld->default_value = 'null';
00772 return $fld;
00773 }
00774
00775 function _initrs()
00776 {
00777 $this->_numOfRows = -1;
00778 $this->_numOfFields = @ibase_num_fields($this->_queryID);
00779
00780
00781 for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) {
00782 $f1 = $this->FetchField($i);
00783 $this->_cacheType[] = $f1->type;
00784 }
00785 }
00786
00787 function _seek($row)
00788 {
00789 return false;
00790 }
00791
00792 function _fetch()
00793 {
00794 $f = @ibase_fetch_row($this->_queryID);
00795 if ($f === false) {
00796 $this->fields = false;
00797 return false;
00798 }
00799
00800
00801
00802 global $ADODB_ANSI_PADDING_OFF;
00803
00804 $rtrim = !empty($ADODB_ANSI_PADDING_OFF);
00805
00806 for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) {
00807 if ($this->_cacheType[$i]=="BLOB") {
00808 if (isset($f[$i])) {
00809 $f[$i] = $this->connection->_BlobDecode($f[$i]);
00810 } else {
00811 $f[$i] = null;
00812 }
00813 } else {
00814 if (!isset($f[$i])) {
00815 $f[$i] = null;
00816 } else if ($rtrim && is_string($f[$i])) {
00817 $f[$i] = rtrim($f[$i]);
00818 }
00819 }
00820 }
00821
00822
00823 $this->fields = $f;
00824 if ($this->fetchMode == ADODB_FETCH_ASSOC) {
00825 $this->fields = &$this->GetRowAssoc(ADODB_ASSOC_CASE);
00826 } else if ($this->fetchMode == ADODB_FETCH_BOTH) {
00827 $this->fields =& array_merge($this->fields,$this->GetRowAssoc(ADODB_ASSOC_CASE));
00828 }
00829 return true;
00830 }
00831
00832
00833 function Fields($colname)
00834 {
00835 if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
00836 if (!$this->bind) {
00837 $this->bind = array();
00838 for ($i=0; $i < $this->_numOfFields; $i++) {
00839 $o = $this->FetchField($i);
00840 $this->bind[strtoupper($o->name)] = $i;
00841 }
00842 }
00843
00844 return $this->fields[$this->bind[strtoupper($colname)]];
00845
00846 }
00847
00848
00849 function _close()
00850 {
00851 return @ibase_free_result($this->_queryID);
00852 }
00853
00854 function MetaType($t,$len=-1,$fieldobj=false)
00855 {
00856 if (is_object($t)) {
00857 $fieldobj = $t;
00858 $t = $fieldobj->type;
00859 $len = $fieldobj->max_length;
00860 }
00861 switch (strtoupper($t)) {
00862 case 'CHAR':
00863 return 'C';
00864
00865 case 'TEXT':
00866 case 'VARCHAR':
00867 case 'VARYING':
00868 if ($len <= $this->blobSize) return 'C';
00869 return 'X';
00870 case 'BLOB':
00871 return 'B';
00872
00873 case 'TIMESTAMP':
00874 case 'DATE': return 'D';
00875 case 'TIME': return 'T';
00876
00877
00878
00879 case 'INT':
00880 case 'SHORT':
00881 case 'INTEGER': return 'I';
00882 default: return 'N';
00883 }
00884 }
00885
00886 }
00887 ?>