Zikula 1.0.1
[ class tree: Zikula 1.0.1 ] [ index: Zikula 1.0.1 ] [ all elements ]

Source for file adodb-ibase.inc.php

Documentation is available at adodb-ibase.inc.php

  1. <?php
  2. /*
  3. V4.97 22 Jan 2008  (c) 2000-2008 John Lim (jlim#natsoft.com.my). 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.  
  8.   Latest version is available at http://adodb.sourceforge.net
  9.   
  10.   Interbase data driver. Requires interbase client. Works on Windows and Unix.
  11.  
  12.   3 Jan 2002 -- suggestions by Hans-Peter Oeri <kampfcaspar75@oeri.ch>
  13.       changed transaction handling and added experimental blob stuff
  14.   
  15.   Docs to interbase at the website
  16.    http://www.synectics.co.za/php3/tutorial/IB_PHP3_API.html
  17.    
  18.   To use gen_id(), see
  19.    http://www.volny.cz/iprenosil/interbase/ip_ib_code.htm#_code_creategen
  20.    
  21.    $rs = $conn->Execute('select gen_id(adodb,1) from rdb$database');
  22.    $id = $rs->fields[0];
  23.    $conn->Execute("insert into table (id, col1,...) values ($id, $val1,...)");
  24. */
  25.  
  26. // security - hide paths
  27. if (!defined('ADODB_DIR')) die();
  28.  
  29. class ADODB_ibase extends ADOConnection {
  30.     var $databaseType = "ibase";
  31.     var $dataProvider = "ibase";
  32.     var $replaceQuote = "''"// string to use to replace quotes
  33.     var $ibase_datefmt = '%Y-%m-%d'// For hours,mins,secs change to '%Y-%m-%d %H:%M:%S';
  34.     var $fmtDate = "'Y-m-d'";
  35.     var $ibase_timestampfmt = "%Y-%m-%d %H:%M:%S";
  36.     var $ibase_timefmt = "%H:%M:%S";
  37.     var $fmtTimeStamp = "'Y-m-d, H:i:s'";
  38.     var $concat_operator='||';
  39.     var $_transactionID;
  40.     var $metaTablesSQL = "select rdb\$relation_name from rdb\$relations where rdb\$relation_name not like 'RDB\$%'";
  41.     //OPN STUFF start
  42.     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";
  43.     //OPN STUFF end
  44.     var $ibasetrans;
  45.     var $hasGenID = true;
  46.     var $_bindInputArray = true;
  47.     var $buffers = 0;
  48.     var $dialect = 1;
  49.     var $sysDate = "cast('TODAY' as timestamp)";
  50.     var $sysTimeStamp = "CURRENT_TIMESTAMP"//"cast('NOW' as timestamp)";
  51.     var $ansiOuter = true;
  52.     var $hasAffectedRows = false;
  53.     var $poorAffectedRows = true;
  54.     var $blobEncodeType = 'C';
  55.     var $role = false;
  56.     
  57.     function ADODB_ibase(
  58.     {
  59.          if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT;
  60.       }
  61.     
  62.     
  63.        // returns true or false
  64.     function _connect($argHostname$argUsername$argPassword$argDatabasename,$persist=false)
  65.     {  
  66.         if (!function_exists('ibase_pconnect')) return null;
  67.         if ($argDatabasename$argHostname .= ':'.$argDatabasename;
  68.         $fn ($persist'ibase_pconnect':'ibase_connect';
  69.         if ($this->role)
  70.             $this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
  71.                     $this->charSet,$this->buffers,$this->dialect,$this->role);
  72.         else    
  73.             $this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
  74.                     $this->charSet,$this->buffers,$this->dialect);
  75.         
  76.         if ($this->dialect != 1// http://www.ibphoenix.com/ibp_60_del_id_ds.html
  77.             $this->replaceQuote = "''";
  78.         }
  79.         if ($this->_connectionID === false{
  80.             $this->_handleerror();
  81.             return false;
  82.         }
  83.         
  84.         // PHP5 change.
  85.         if (function_exists('ibase_timefmt')) {
  86.             ibase_timefmt($this->ibase_datefmt,IBASE_DATE );
  87.             if ($this->dialect == 1ibase_timefmt($this->ibase_datefmt,IBASE_TIMESTAMP );
  88.             else ibase_timefmt($this->ibase_timestampfmt,IBASE_TIMESTAMP );
  89.             ibase_timefmt($this->ibase_timefmt,IBASE_TIME );
  90.             
  91.         else {
  92.             ini_set("ibase.timestampformat"$this->ibase_timestampfmt);
  93.             ini_set("ibase.dateformat"$this->ibase_datefmt);
  94.             ini_set("ibase.timeformat"$this->ibase_timefmt);
  95.         }
  96.         return true;
  97.     }
  98.        // returns true or false
  99.     function _pconnect($argHostname$argUsername$argPassword$argDatabasename)
  100.     {
  101.         return $this->_connect($argHostname$argUsername$argPassword$argDatabasename,true);
  102.     }    
  103.     
  104.     
  105.     function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false)
  106.     {    
  107.         if ($internalKeyreturn array('RDB$DB_KEY');
  108.         
  109.         $table strtoupper($table);
  110.         
  111.         $sql 'SELECT S.RDB$FIELD_NAME AFIELDNAME
  112.     FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON I.RDB$INDEX_NAME=S.RDB$INDEX_NAME  
  113.     WHERE I.RDB$RELATION_NAME=\''.$table.'\' and I.RDB$INDEX_NAME like \'RDB$PRIMARY%\'
  114.     ORDER BY I.RDB$INDEX_NAME,S.RDB$FIELD_POSITION';
  115.  
  116.         $a $this->GetCol($sql,false,true);
  117.         if ($a && sizeof($a)>0return $a;
  118.         return false;      
  119.     }
  120.     
  121.     function ServerInfo()
  122.     {
  123.         $arr['dialect'$this->dialect;
  124.         switch($arr['dialect']{
  125.         case ''
  126.         case '1'$s 'Interbase 5.5 or earlier'break;
  127.         case '2'$s 'Interbase 5.6'break;
  128.         default:
  129.         case '3'$s 'Interbase 6.0'break;
  130.         }
  131.         $arr['version'ADOConnection::_findvers($s);
  132.         $arr['description'$s;
  133.         return $arr;
  134.     }
  135.  
  136.     function BeginTrans()
  137.     {     
  138.         if ($this->transOffreturn true;
  139.         $this->transCnt += 1;
  140.         $this->autoCommit = false;
  141.          $this->_transactionID = $this->_connectionID;//ibase_trans($this->ibasetrans, $this->_connectionID);
  142.         return $this->_transactionID;
  143.     }
  144.     
  145.     function CommitTrans($ok=true
  146.     
  147.         if (!$okreturn $this->RollbackTrans();
  148.         if ($this->transOffreturn true;
  149.         if ($this->transCnt$this->transCnt -= 1;
  150.         $ret false;
  151.         $this->autoCommit = true;
  152.         if ($this->_transactionID{
  153.                        //print ' commit ';
  154.             $ret ibase_commit($this->_transactionID);
  155.         }
  156.         $this->_transactionID = false;
  157.         return $ret;
  158.     }
  159.     
  160.     // there are some compat problems with ADODB_COUNTRECS=false and $this->_logsql currently.
  161.     // it appears that ibase extension cannot support multiple concurrent queryid's
  162.     function &_Execute($sql,$inputarr=false
  163.     {
  164.     global $ADODB_COUNTRECS;
  165.     
  166.         if ($this->_logsql{
  167.             $savecrecs $ADODB_COUNTRECS;
  168.             $ADODB_COUNTRECS true// force countrecs
  169.             $ret =ADOConnection::_Execute($sql,$inputarr);
  170.             $ADODB_COUNTRECS $savecrecs;
  171.         else {
  172.             $ret =ADOConnection::_Execute($sql,$inputarr);
  173.         }
  174.         return $ret;
  175.     }
  176.     
  177.     function RollbackTrans()
  178.     {
  179.         if ($this->transOffreturn true;
  180.         if ($this->transCnt$this->transCnt -= 1;
  181.         $ret false;
  182.         $this->autoCommit = true;
  183.         if ($this->_transactionID
  184.                   $ret ibase_rollback($this->_transactionID);
  185.         $this->_transactionID = false;   
  186.         
  187.         return $ret;
  188.     }
  189.     
  190.     function &MetaIndexes ($table$primary FALSE$owner=false)
  191.     {
  192.         // save old fetch mode
  193.         global $ADODB_FETCH_MODE;
  194.         $false false;
  195.         $save $ADODB_FETCH_MODE;
  196.         $ADODB_FETCH_MODE ADODB_FETCH_NUM;
  197.         if ($this->fetchMode !== FALSE{
  198.                $savem $this->SetFetchMode(FALSE);
  199.         }
  200.         $table strtoupper($table);
  201.         $sql "SELECT * FROM RDB\$INDICES WHERE RDB\$RELATION_NAME = '".$table."'";
  202.         if (!$primary{
  203.             $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$%'";
  204.         else {
  205.             $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$FOREIGN%'";
  206.         }
  207.         // get index details
  208.         $rs $this->Execute($sql);
  209.         if (!is_object($rs)) {
  210.             // restore fetchmode
  211.             if (isset($savem)) {
  212.                 $this->SetFetchMode($savem);
  213.             }
  214.             $ADODB_FETCH_MODE $save;
  215.             return $false;
  216.         }
  217.         
  218.         $indexes array();
  219.         while ($row $rs->FetchRow()) {
  220.             $index $row[0];
  221.              if (!isset($indexes[$index])) {
  222.                      if (is_null($row[3])) {$row[30;}
  223.                      $indexes[$indexarray(
  224.                              'unique' => ($row[3== 1),
  225.                              'columns' => array()
  226.                      );
  227.              }
  228.             $sql "SELECT * FROM RDB\$INDEX_SEGMENTS WHERE RDB\$INDEX_NAME = '".$index."' ORDER BY RDB\$FIELD_POSITION ASC";
  229.             $rs1 $this->Execute($sql);
  230.             while ($row1 $rs1->FetchRow()) {
  231.                  $indexes[$index]['columns'][$row1[2]] $row1[1];
  232.             }
  233.         }
  234.         // restore fetchmode
  235.         if (isset($savem)) {
  236.             $this->SetFetchMode($savem);
  237.         }
  238.         $ADODB_FETCH_MODE $save;
  239.         
  240.         return $indexes;
  241.     }
  242.  
  243.     
  244.     // See http://community.borland.com/article/0,1410,25844,00.html
  245.     function RowLock($tables,$where,$col)
  246.     {
  247.         if ($this->autoCommit$this->BeginTrans();
  248.         $this->Execute("UPDATE $table SET $col=$col WHERE $where ")// is this correct - jlim?
  249.         return 1;
  250.     }
  251.     
  252.     
  253.     function CreateSequence($seqname,$startID=1)
  254.     {
  255.         $ok $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))));
  256.         if (!$okreturn false;
  257.         return $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
  258.     }
  259.     
  260.     function DropSequence($seqname)
  261.     {
  262.         $seqname strtoupper($seqname);
  263.         $this->Execute("delete from RDB\$GENERATORS where RDB\$GENERATOR_NAME='$seqname'");
  264.     }
  265.     
  266.     function GenID($seqname='adodbseq',$startID=1)
  267.     {
  268.         $getnext ("SELECT Gen_ID($seqname,1) FROM RDB\$DATABASE");
  269.         $rs @$this->Execute($getnext);
  270.         if (!$rs{
  271.             $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))));
  272.             $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
  273.             $rs $this->Execute($getnext);
  274.         }
  275.         if ($rs && !$rs->EOF$this->genID = (integer) reset($rs->fields);
  276.         else $this->genID = 0// false
  277.         
  278.         if ($rs$rs->Close();
  279.         
  280.         return $this->genID;
  281.     }
  282.  
  283.     function SelectDB($dbName
  284.     {
  285.            return false;
  286.     }
  287.  
  288.     function _handleerror()
  289.     {
  290.         $this->_errorMsg = ibase_errmsg();
  291.     }
  292.  
  293.     function ErrorNo(
  294.     {
  295.         if (preg_match('/error code = ([\-0-9]*)/i'$this->_errorMsg,$arr)) return (integer) $arr[1];
  296.         else return 0;
  297.     }
  298.  
  299.     function ErrorMsg(
  300.     {
  301.             return $this->_errorMsg;
  302.     }
  303.  
  304.     function Prepare($sql)
  305.     {
  306.         $stmt ibase_prepare($this->_connectionID,$sql);
  307.         if (!$stmtreturn false;
  308.         return array($sql,$stmt);
  309.     }
  310.  
  311.        // returns query ID if successful, otherwise false
  312.        // there have been reports of problems with nested queries - the code is probably not re-entrant?
  313.     function _query($sql,$iarr=false)
  314.     
  315.  
  316.         if (!$this->autoCommit && $this->_transactionID{
  317.             $conn $this->_transactionID;
  318.             $docommit false;
  319.         else {
  320.             $conn $this->_connectionID;
  321.             $docommit true;
  322.         }
  323.         if (is_array($sql)) {
  324.             $fn 'ibase_execute';
  325.             $sql $sql[1];
  326.             if (is_array($iarr)) {
  327.                 if  (ADODB_PHPVER >= 0x4050// actually 4.0.4
  328.                     if !isset($iarr[0]) ) $iarr[0''// PHP5 compat hack
  329.                     $fnarr =array_mergearray($sql$iarr);
  330.                     $ret call_user_func_array($fn,$fnarr);
  331.                 else {
  332.                     switch(sizeof($iarr)) {
  333.                     case 1$ret $fn($sql,$iarr[0])break;
  334.                     case 2$ret $fn($sql,$iarr[0],$iarr[1])break;
  335.                     case 3$ret $fn($sql,$iarr[0],$iarr[1],$iarr[2])break;
  336.                     case 4$ret $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3])break;
  337.                     case 5$ret $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4])break;
  338.                     case 6$ret $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5])break;
  339.                     case 7$ret $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6])break;
  340.                     defaultADOConnection::outp"Too many parameters to ibase query $sql");
  341.                     case 8$ret $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7])break;
  342.                     }
  343.                 }
  344.             else $ret $fn($sql)
  345.         else {
  346.             $fn 'ibase_query';
  347.         
  348.             if (is_array($iarr)) {    
  349.                 if (ADODB_PHPVER >= 0x4050// actually 4.0.4
  350.                     if (sizeof($iarr== 0$iarr[0''// PHP5 compat hack
  351.                     $fnarr =array_mergearray($conn,$sql$iarr);
  352.                     $ret call_user_func_array($fn,$fnarr);
  353.                 else {
  354.                     switch(sizeof($iarr)) {
  355.                     case 1$ret $fn($conn,$sql,$iarr[0])break;
  356.                     case 2$ret $fn($conn,$sql,$iarr[0],$iarr[1])break;
  357.                     case 3$ret $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2])break;
  358.                     case 4$ret $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3])break;
  359.                     case 5$ret $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4])break;
  360.                     case 6$ret $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5])break;
  361.                     case 7$ret $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6])break;
  362.                     defaultADOConnection::outp"Too many parameters to ibase query $sql");
  363.                     case 8$ret $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7])break;
  364.                     }
  365.                 }
  366.             else $ret $fn($conn,$sql)
  367.         }
  368.         if ($docommit && $ret === trueibase_commit($this->_connectionID);
  369.  
  370.         $this->_handleerror();
  371.         return $ret;
  372.     }
  373.  
  374.      // returns true or false
  375.      function _close()
  376.      {       
  377.         if (!$this->autoCommit@ibase_rollback($this->_connectionID);
  378.         return @ibase_close($this->_connectionID);
  379.      }
  380.     
  381.     //OPN STUFF start
  382.     function _ConvertFieldType(&$fld$ftype$flen$fscale$fsubtype$fprecision$dialect3)
  383.     {
  384.         $fscale abs($fscale);
  385.         $fld->max_length $flen;
  386.         $fld->scale null;
  387.         switch($ftype){
  388.             case 7
  389.             case 8:
  390.                 if ($dialect3{
  391.                     switch($fsubtype){
  392.                         case 0
  393.                             $fld->type ($ftype == 'smallint' 'integer');
  394.                             break;
  395.                         case 1
  396.                             $fld->type 'numeric';
  397.                             $fld->max_length $fprecision;
  398.                             $fld->scale $fscale;
  399.                             break;
  400.                         case 2:
  401.                             $fld->type 'decimal';
  402.                             $fld->max_length $fprecision;
  403.                             $fld->scale $fscale;
  404.                             break;
  405.                     // switch
  406.                 else {
  407.                     if ($fscale !=0{
  408.                         $fld->type 'decimal';
  409.                         $fld->scale $fscale;
  410.                         $fld->max_length ($ftype == 9);
  411.                     else {
  412.                         $fld->type ($ftype == 'smallint' 'integer');
  413.                     }
  414.                 }
  415.                 break;
  416.             case 16
  417.                 if ($dialect3{
  418.                     switch($fsubtype){
  419.                         case 0
  420.                             $fld->type 'decimal';
  421.                             $fld->max_length 18;
  422.                             $fld->scale 0;
  423.                             break;
  424.                         case 1
  425.                             $fld->type 'numeric';
  426.                             $fld->max_length $fprecision;
  427.                             $fld->scale $fscale;
  428.                             break;
  429.                         case 2:
  430.                             $fld->type 'decimal';
  431.                             $fld->max_length $fprecision;
  432.                             $fld->scale $fscale;
  433.                             break;
  434.                     // switch
  435.                 }
  436.                 break;
  437.             case 10:
  438.                 $fld->type 'float';
  439.                 break;
  440.             case 14:
  441.                 $fld->type 'char';
  442.                 break;
  443.             case 27:
  444.                 if ($fscale !=0{
  445.                     $fld->type 'decimal';
  446.                     $fld->max_length 15;
  447.                     $fld->scale 5;
  448.                 else {
  449.                     $fld->type 'double';
  450.                 }
  451.                 break;
  452.             case 35:
  453.                 if ($dialect3{
  454.                     $fld->type 'timestamp';
  455.                 else {
  456.                     $fld->type 'date';
  457.                 }
  458.                 break;
  459.             case 12:
  460.                 $fld->type 'date';
  461.                 break;
  462.             case 13:
  463.                 $fld->type 'time';
  464.                 break;
  465.             case 37:
  466.                 $fld->type 'varchar';
  467.                 break;
  468.             case 40:
  469.                 $fld->type 'cstring';
  470.                 break;
  471.             case 261:
  472.                 $fld->type 'blob';
  473.                 $fld->max_length = -1;
  474.                 break;
  475.         // switch
  476.     }
  477.     //OPN STUFF end
  478.         // returns array of ADOFieldObjects for current table
  479.     function &MetaColumns($table
  480.     {
  481.     global $ADODB_FETCH_MODE;
  482.         
  483.         $save $ADODB_FETCH_MODE;
  484.         $ADODB_FETCH_MODE ADODB_FETCH_NUM;
  485.     
  486.         $rs $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
  487.     
  488.         $ADODB_FETCH_MODE $save;
  489.         $false false;
  490.         if ($rs === false{
  491.             return $false;
  492.         }
  493.         
  494.         $retarr array();
  495.         //OPN STUFF start
  496.         $dialect3 ($this->dialect==true false);
  497.         //OPN STUFF end
  498.         while (!$rs->EOF//print_r($rs->fields);
  499.             $fld new ADOFieldObject();
  500.             $fld->name trim($rs->fields[0]);
  501.             //OPN STUFF start
  502.             $this->_ConvertFieldType($fld$rs->fields[7]$rs->fields[3]$rs->fields[4]$rs->fields[5]$rs->fields[6]$dialect3);
  503.             if (isset($rs->fields[1]&& $rs->fields[1]{
  504.                 $fld->not_null true;
  505.             }                
  506.             if (isset($rs->fields[2])) {
  507.                 
  508.                 $fld->has_default true;
  509.                 $d substr($rs->fields[2],strlen('default '));
  510.                 switch ($fld->type)
  511.                 {
  512.                 case 'smallint':
  513.                 case 'integer'$fld->default_value = (int) $dbreak;
  514.                 case 'char'
  515.                 case 'blob':
  516.                 case 'text':
  517.                 case 'varchar'$fld->default_value = (string) substr($d,1,strlen($d)-2)break;
  518.                 case 'double':
  519.                 case 'float'$fld->default_value = (float) $dbreak;
  520.                 default$fld->default_value $dbreak;
  521.                 }
  522.         //    case 35:$tt = 'TIMESTAMP'; break;
  523.             }
  524.             if ((isset($rs->fields[5])) && ($fld->type == 'blob')) {
  525.                 $fld->sub_type $rs->fields[5];
  526.             else {
  527.                 $fld->sub_type null;
  528.             }
  529.             //OPN STUFF end
  530.             if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM$retarr[$fld;    
  531.             else $retarr[strtoupper($fld->name)$fld;
  532.             
  533.             $rs->MoveNext();
  534.         }
  535.         $rs->Close();
  536.         if empty($retarr)) return $false;
  537.         else return $retarr;    
  538.     }
  539.     
  540.     function BlobEncode$blob 
  541.     {
  542.         $blobid ibase_blob_create$this->_connectionID);
  543.         ibase_blob_add$blobid$blob );
  544.         return ibase_blob_close$blobid );
  545.     }
  546.     
  547.     // since we auto-decode all blob's since 2.42, 
  548.     // BlobDecode should not do any transforms
  549.     function BlobDecode($blob)
  550.     {
  551.         return $blob
  552.     }
  553.     
  554.     
  555.     
  556.     
  557.     // old blobdecode function
  558.     // still used to auto-decode all blob's
  559.     function _BlobDecode_old$blob 
  560.     {
  561.         $blobid ibase_blob_open($this->_connectionID$blob );
  562.         $realblob ibase_blob_get$blobid,$this->maxblobsize)// 2nd param is max size of blob -- Kevin Boillet <kevinboillet@yahoo.fr>
  563.         while($string ibase_blob_get($blobid8192))
  564.             $realblob .= $string
  565.         }
  566.         ibase_blob_close$blobid );
  567.  
  568.         return$realblob );
  569.     
  570.     
  571.     function _BlobDecode$blob 
  572.     {
  573.         if  (ADODB_PHPVER >= 0x5000{
  574.             $blob_data ibase_blob_info($this->_connectionID$blob );
  575.             $blobid ibase_blob_open($this->_connectionID$blob );
  576.         else {
  577.  
  578.             $blob_data ibase_blob_info$blob );
  579.             $blobid ibase_blob_open$blob );
  580.         }
  581.  
  582.         if$blob_data[0$this->maxblobsize {
  583.  
  584.             $realblob ibase_blob_get($blobid$this->maxblobsize);
  585.  
  586.             while($string ibase_blob_get($blobid8192)){
  587.                 $realblob .= $string
  588.             }
  589.         else {
  590.             $realblob ibase_blob_get($blobid$blob_data[0]);
  591.         }
  592.  
  593.         ibase_blob_close$blobid );
  594.         return$realblob );
  595.     }
  596.     
  597.     function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB'
  598.     
  599.         $fd fopen($path,'rb')
  600.         if ($fd === falsereturn false
  601.         $blob_id ibase_blob_create($this->_connectionID)
  602.         
  603.         /* fill with data */ 
  604.         
  605.         while ($val fread($fd,32768))
  606.             ibase_blob_add($blob_id$val)
  607.         
  608.         
  609.         /* close and get $blob_id_str for inserting into table */ 
  610.         $blob_id_str ibase_blob_close($blob_id)
  611.         
  612.         fclose($fd)
  613.         return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false
  614.     
  615.     
  616.     /*
  617.         Insert a null into the blob field of the table first.
  618.         Then use UpdateBlob to store the blob.
  619.         
  620.         Usage:
  621.          
  622.         $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
  623.         $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
  624.     */
  625.     function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB'
  626.     
  627.     $blob_id ibase_blob_create($this->_connectionID)
  628.     
  629.     // ibase_blob_add($blob_id, $val); 
  630.     
  631.     // replacement that solves the problem by which only the first modulus 64K / 
  632.     // of $val are stored at the blob field //////////////////////////////////// 
  633.     // Thx Abel Berenstein  aberenstein#afip.gov.ar
  634.     $len strlen($val)
  635.     $chunk_size 32768
  636.     $tail_size $len $chunk_size
  637.     $n_chunks ($len $tail_size$chunk_size
  638.     
  639.     for ($n 0$n $n_chunks$n++
  640.         $start $n $chunk_size
  641.         $data substr($val$start$chunk_size)
  642.         ibase_blob_add($blob_id$data)
  643.     
  644.     
  645.     if ($tail_size{
  646.         $start $n_chunks $chunk_size
  647.         $data substr($val$start$tail_size)
  648.         ibase_blob_add($blob_id$data)
  649.     }
  650.     // end replacement ///////////////////////////////////////////////////////// 
  651.     
  652.     $blob_id_str ibase_blob_close($blob_id)
  653.     
  654.     return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false
  655.     
  656.     
  657.     
  658.     
  659.     function OldUpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
  660.     {
  661.         $blob_id ibase_blob_create($this->_connectionID);
  662.         ibase_blob_add($blob_id$val);
  663.         $blob_id_str ibase_blob_close($blob_id);
  664.         return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
  665.     }
  666.     
  667.     // Format date column in sql string given an input format that understands Y M D
  668.     // Only since Interbase 6.0 - uses EXTRACT
  669.     // problem - does not zero-fill the day and month yet
  670.     function SQLDate($fmt$col=false)
  671.     {    
  672.         if (!$col$col $this->sysDate;
  673.         $s '';
  674.         
  675.         $len strlen($fmt);
  676.         for ($i=0$i $len$i++{
  677.             if ($s$s .= '||';
  678.             $ch $fmt[$i];
  679.             switch($ch{
  680.             case 'Y':
  681.             case 'y':
  682.                 $s .= "extract(year from $col)";
  683.                 break;
  684.             case 'M':
  685.             case 'm':
  686.                 $s .= "extract(month from $col)";
  687.                 break;
  688.             case 'Q':
  689.             case 'q':
  690.                 $s .= "cast(((extract(month from $col)+2) / 3) as integer)";
  691.                 break;
  692.             case 'D':
  693.             case 'd':
  694.                 $s .= "(extract(day from $col))";
  695.                 break;
  696.             case 'H':
  697.             case 'h':
  698.               $s .= "(extract(hour from $col))";
  699.               break;                        
  700.             case 'I':
  701.             case 'i':
  702.               $s .= "(extract(minute from $col))";
  703.               break;                
  704.             case 'S':
  705.             case 's':
  706.               $s .= "CAST((extract(second from $col)) AS INTEGER)";
  707.               break;        
  708.  
  709.             default:
  710.                 if ($ch == '\\'{
  711.                     $i++;
  712.                     $ch substr($fmt,$i,1);
  713.                 }
  714.                 $s .= $this->qstr($ch);
  715.                 break;
  716.             }
  717.         }
  718.         return $s;
  719.     }
  720. }
  721.  
  722. /*--------------------------------------------------------------------------------------
  723.          Class Name: Recordset
  724. --------------------------------------------------------------------------------------*/
  725.  
  726. {
  727.  
  728.     var $databaseType = "ibase";
  729.     var $bind=false;
  730.     var $_cacheType;
  731.     
  732.     function ADORecordset_ibase($id,$mode=false)
  733.     {
  734.     global $ADODB_FETCH_MODE;
  735.     
  736.             $this->fetchMode = ($mode === false$ADODB_FETCH_MODE $mode;
  737.             $this->ADORecordSet($id);
  738.     }
  739.  
  740.     /*        Returns: an object containing field information.
  741.             Get column information in the Recordset object. fetchField() can be used in order to obtain information about
  742.             fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
  743.             fetchField() is retrieved.        */
  744.  
  745.     function &FetchField($fieldOffset = -1)
  746.     {
  747.              $fld new ADOFieldObject;
  748.              $ibf ibase_field_info($this->_queryID,$fieldOffset);
  749.              switch (ADODB_ASSOC_CASE{
  750.              case 2// the default
  751.                  $fld->name ($ibf['alias']);
  752.                  if (empty($fld->name)) $fld->name ($ibf['name']);
  753.                  break;
  754.              case 0
  755.                  $fld->name strtoupper($ibf['alias']);
  756.                  if (empty($fld->name)) $fld->name strtoupper($ibf['name']);
  757.                  break;
  758.              case 1
  759.                  $fld->name strtolower($ibf['alias']);
  760.                  if (empty($fld->name)) $fld->name strtolower($ibf['name']);
  761.                  break;
  762.              }
  763.              
  764.              $fld->type $ibf['type'];
  765.              $fld->max_length $ibf['length'];
  766.              
  767.              /*       This needs to be populated from the metadata */ 
  768.              $fld->not_null false;
  769.              $fld->has_default false;
  770.              $fld->default_value 'null';
  771.              return $fld;
  772.     }
  773.  
  774.     function _initrs()
  775.     {
  776.         $this->_numOfRows = -1;
  777.         $this->_numOfFields = @ibase_num_fields($this->_queryID);
  778.  
  779.         // cache types for blob decode check
  780.         for ($i=0$max $this->_numOfFields$i $max$i++
  781.             $f1 $this->FetchField($i)
  782.             $this->_cacheType[$f1->type;
  783.         }                
  784.     }
  785.  
  786.     function _seek($row)
  787.     {
  788.         return false;
  789.     }
  790.     
  791.     function _fetch(
  792.     {
  793.         $f @ibase_fetch_row($this->_queryID)
  794.         if ($f === false{
  795.             $this->fields = false;
  796.             return false;
  797.         }
  798.         // OPN stuff start - optimized
  799.         // fix missing nulls and decode blobs automatically
  800.     
  801.         global $ADODB_ANSI_PADDING_OFF;
  802.         //$ADODB_ANSI_PADDING_OFF=1;
  803.         $rtrim !empty($ADODB_ANSI_PADDING_OFF);
  804.         
  805.         for ($i=0$max $this->_numOfFields$i $max$i++
  806.             if ($this->_cacheType[$i]=="BLOB"{
  807.                 if (isset($f[$i])) 
  808.                     $f[$i$this->connection->_BlobDecode($f[$i])
  809.                 else 
  810.                     $f[$inull
  811.                 
  812.             else 
  813.                 if (!isset($f[$i])) 
  814.                     $f[$inull
  815.                 else if ($rtrim && is_string($f[$i])) {
  816.                     $f[$irtrim($f[$i]);
  817.                 }
  818.             
  819.         
  820.         // OPN stuff end 
  821.         
  822.         $this->fields = $f;
  823.         if ($this->fetchMode == ADODB_FETCH_ASSOC{
  824.             $this->fields = &$this->GetRowAssoc(ADODB_ASSOC_CASE);
  825.         else if ($this->fetchMode == ADODB_FETCH_BOTH{
  826.             $this->fields =array_merge($this->fields,$this->GetRowAssoc(ADODB_ASSOC_CASE));
  827.         }
  828.         return true;
  829.     }
  830.  
  831.     /* Use associative array to get fields array */
  832.     function Fields($colname)
  833.     {
  834.         if ($this->fetchMode ADODB_FETCH_ASSOCreturn $this->fields[$colname];
  835.         if (!$this->bind{
  836.             $this->bind = array();
  837.             for ($i=0$i $this->_numOfFields$i++{
  838.                 $o $this->FetchField($i);
  839.                 $this->bind[strtoupper($o->name)$i;
  840.             }
  841.         }
  842.         
  843.         return $this->fields[$this->bind[strtoupper($colname)]];
  844.         
  845.     }
  846.     
  847.  
  848.     function _close(
  849.     {
  850.             return @ibase_free_result($this->_queryID);
  851.     }
  852.  
  853.     function MetaType($t,$len=-1,$fieldobj=false)
  854.     {
  855.         if (is_object($t)) {
  856.             $fieldobj $t;
  857.             $t $fieldobj->type;
  858.             $len $fieldobj->max_length;
  859.         }
  860.         switch (strtoupper($t)) {
  861.         case 'CHAR':
  862.             return 'C';
  863.             
  864.         case 'TEXT':
  865.         case 'VARCHAR':
  866.         case 'VARYING':
  867.         if ($len <= $this->blobSizereturn 'C';
  868.             return 'X';
  869.         case 'BLOB':
  870.             return 'B';
  871.                
  872.         case 'TIMESTAMP':
  873.         case 'DATE'return 'D';
  874.         case 'TIME'return 'T';
  875.                 //case 'T': return 'T';
  876.  
  877.                 //case 'L': return 'L';
  878.         case 'INT'
  879.         case 'SHORT':
  880.         case 'INTEGER'return 'I';
  881.         defaultreturn 'N';
  882.         }
  883.     }
  884.  
  885. }
  886. ?>

Documentation generated on Fri, 18 Jul 2008 21:39:38 +0200 by phpDocumentor 1.4.1