2003-10-19 21:05:23 +02:00
< ? php
/*
2005-09-26 12:12:10 +02:00
V4 . 65 22 July 2005 ( c ) 2000 - 2005 John Lim . All rights reserved .
2003-10-19 21:05:23 +02:00
Released under both BSD license and Lesser GPL library license .
Whenever there is any discrepancy between the two licenses ,
the BSD license will take precedence .
Set tabs to 4 for best viewing .
2004-07-10 09:19:40 +02:00
Latest version is available at http :// adodb . sourceforge . net
2003-10-19 21:05:23 +02:00
Informix port by Mitchell T . Young ( mitch @ youngfamily . org )
Further mods by " Samuel CARRIERE " < samuel_carriere @ hotmail . com >
*/
2004-07-10 09:19:40 +02:00
// security - hide paths
if ( ! defined ( 'ADODB_DIR' )) die ();
2004-03-15 23:17:52 +01:00
if ( ! defined ( 'IFX_SCROLL' )) define ( 'IFX_SCROLL' , 1 );
2003-10-19 21:05:23 +02:00
class ADODB_informix72 extends ADOConnection {
var $databaseType = " informix72 " ;
var $dataProvider = " informix " ;
var $replaceQuote = " '' " ; // string to use to replace quotes
var $fmtDate = " 'Y-m-d' " ;
var $fmtTimeStamp = " 'Y-m-d H:i:s' " ;
var $hasInsertID = true ;
var $hasAffectedRows = true ;
var $substr = 'substr' ;
2005-09-26 12:12:10 +02:00
var $metaTablesSQL = " select tabname,tabtype from systables where tabtype in ('T','V') and owner!='informix' " ; //Don't get informix tables and pseudo-tables
2004-07-10 09:19:40 +02:00
2003-10-19 21:05:23 +02:00
var $metaColumnsSQL =
2004-07-10 09:19:40 +02:00
" select c.colname, c.coltype, c.collength, d.default,c.colno
from syscolumns c , systables t , outer sysdefaults d
where c . tabid = t . tabid and d . tabid = t . tabid and d . colno = c . colno
and tabname = '%s' order by c . colno " ;
var $metaPrimaryKeySQL =
" select part1,part2,part3,part4,part5,part6,part7,part8 from
systables t , sysconstraints s , sysindexes i where t . tabname = '%s'
and s . tabid = t . tabid and s . constrtype = 'P'
and i . idxname = s . idxname " ;
2003-10-19 21:05:23 +02:00
var $concat_operator = '||' ;
var $lastQuery = false ;
var $has_insertid = true ;
var $_autocommit = true ;
var $_bindInputArray = true ; // set to true if ADOConnection.Execute() permits binding of array parameters.
var $sysDate = 'TODAY' ;
var $sysTimeStamp = 'CURRENT' ;
2004-03-15 23:17:52 +01:00
var $cursorType = IFX_SCROLL ; // IFX_SCROLL or IFX_HOLD or 0
2003-10-19 21:05:23 +02:00
function ADODB_informix72 ()
{
// alternatively, use older method:
//putenv("DBDATE=Y4MD-");
// force ISO date format
putenv ( 'GL_DATE=%Y-%m-%d' );
if ( function_exists ( 'ifx_byteasvarchar' )) {
ifx_byteasvarchar ( 1 ); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content.
ifx_textasvarchar ( 1 ); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content.
ifx_blobinfile_mode ( 0 ); // Mode "0" means save Byte-Blobs in memory, and mode "1" means save Byte-Blobs in a file.
}
}
2004-03-15 23:17:52 +01:00
function ServerInfo ()
{
if ( isset ( $this -> version )) return $this -> version ;
$arr [ 'description' ] = $this -> GetOne ( " select DBINFO('version','full') from systables where tabid = 1 " );
2005-09-26 12:12:10 +02:00
$arr [ 'version' ] = $this -> GetOne ( " select DBINFO('version','major') || DBINFO('version','minor') from systables where tabid = 1 " );
2004-03-15 23:17:52 +01:00
$this -> version = $arr ;
return $arr ;
}
2003-10-19 21:05:23 +02:00
function _insertid ()
{
$sqlca = ifx_getsqlca ( $this -> lastQuery );
return @ $sqlca [ " sqlerrd1 " ];
}
function _affectedrows ()
{
if ( $this -> lastQuery ) {
return @ ifx_affected_rows ( $this -> lastQuery );
}
return 0 ;
}
function BeginTrans ()
{
if ( $this -> transOff ) return true ;
$this -> transCnt += 1 ;
$this -> Execute ( 'BEGIN' );
$this -> _autocommit = false ;
return true ;
}
function CommitTrans ( $ok = true )
{
if ( ! $ok ) return $this -> RollbackTrans ();
if ( $this -> transOff ) return true ;
if ( $this -> transCnt ) $this -> transCnt -= 1 ;
$this -> Execute ( 'COMMIT' );
$this -> _autocommit = true ;
return true ;
}
function RollbackTrans ()
{
if ( $this -> transOff ) return true ;
if ( $this -> transCnt ) $this -> transCnt -= 1 ;
$this -> Execute ( 'ROLLBACK' );
$this -> _autocommit = true ;
return true ;
}
2005-09-26 12:12:10 +02:00
function RowLock ( $tables , $where , $flds = '1 as ignore' )
2003-10-19 21:05:23 +02:00
{
if ( $this -> _autocommit ) $this -> BeginTrans ();
2005-09-26 12:12:10 +02:00
return $this -> GetOne ( " select $flds from $tables where $where for update " );
2003-10-19 21:05:23 +02:00
}
/* Returns : the last error message from previous database operation
Note : This function is NOT available for Microsoft SQL Server . */
function ErrorMsg ()
{
if ( ! empty ( $this -> _logsql )) return $this -> _errorMsg ;
$this -> _errorMsg = ifx_errormsg ();
return $this -> _errorMsg ;
}
2004-03-15 23:17:52 +01:00
function ErrorNo ()
{
2005-09-26 12:12:10 +02:00
preg_match ( " /.*SQLCODE=([^ \ ]]*)/ " , ifx_error (), $parse );
2004-03-15 23:17:52 +01:00
if ( is_array ( $parse ) && isset ( $parse [ 1 ])) return ( int ) $parse [ 1 ];
return 0 ;
}
2003-10-19 21:05:23 +02:00
function & MetaColumns ( $table )
{
global $ADODB_FETCH_MODE ;
2005-09-26 12:12:10 +02:00
$false = false ;
2003-10-19 21:05:23 +02:00
if ( ! empty ( $this -> metaColumnsSQL )) {
$save = $ADODB_FETCH_MODE ;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM ;
if ( $this -> fetchMode !== false ) $savem = $this -> SetFetchMode ( false );
$rs = $this -> Execute ( sprintf ( $this -> metaColumnsSQL , $table ));
if ( isset ( $savem )) $this -> SetFetchMode ( $savem );
$ADODB_FETCH_MODE = $save ;
2005-09-26 12:12:10 +02:00
if ( $rs === false ) return $false ;
2004-07-10 09:19:40 +02:00
$rspkey = $this -> Execute ( sprintf ( $this -> metaPrimaryKeySQL , $table )); //Added to get primary key colno items
2003-10-19 21:05:23 +02:00
$retarr = array ();
while ( ! $rs -> EOF ) { //print_r($rs->fields);
$fld = new ADOFieldObject ();
$fld -> name = $rs -> fields [ 0 ];
2005-09-26 12:12:10 +02:00
/* //!eos.
$rs -> fields [ 1 ] is not the correct adodb type
$rs -> fields [ 2 ] is not correct max_length , because can include not - null bit
2003-10-19 21:05:23 +02:00
$fld -> type = $rs -> fields [ 1 ];
2004-07-10 09:19:40 +02:00
$fld -> primary_key = $rspkey -> fields && array_search ( $rs -> fields [ 4 ], $rspkey -> fields ); //Added to set primary key flag
2005-09-26 12:12:10 +02:00
$fld -> max_length = $rs -> fields [ 2 ]; */
$pr = ifx_props ( $rs -> fields [ 1 ], $rs -> fields [ 2 ]); //!eos
$fld -> type = $pr [ 0 ] ; //!eos
$fld -> primary_key = $rspkey -> fields && array_search ( $rs -> fields [ 4 ], $rspkey -> fields );
$fld -> max_length = $pr [ 1 ]; //!eos
$fld -> precision = $pr [ 2 ] ; //!eos
$fld -> not_null = $pr [ 3 ] == " N " ; //!eos
2003-10-19 21:05:23 +02:00
if ( trim ( $rs -> fields [ 3 ]) != " AAAAAA 0 " ) {
$fld -> has_default = 1 ;
$fld -> default_value = $rs -> fields [ 3 ];
} else {
$fld -> has_default = 0 ;
}
$retarr [ strtolower ( $fld -> name )] = $fld ;
$rs -> MoveNext ();
}
$rs -> Close ();
2005-09-26 12:12:10 +02:00
$rspKey -> Close (); //!eos
2003-10-19 21:05:23 +02:00
return $retarr ;
}
2005-09-26 12:12:10 +02:00
return $false ;
2003-10-19 21:05:23 +02:00
}
function & xMetaColumns ( $table )
{
return ADOConnection :: MetaColumns ( $table , false );
}
2005-09-26 12:12:10 +02:00
function MetaForeignKeys ( $table , $owner = false , $upper = false ) //!Eos
{
$sql = "
select tr . tabname , updrule , delrule ,
i . part1 o1 , i2 . part1 d1 , i . part2 o2 , i2 . part2 d2 , i . part3 o3 , i2 . part3 d3 , i . part4 o4 , i2 . part4 d4 ,
i . part5 o5 , i2 . part5 d5 , i . part6 o6 , i2 . part6 d6 , i . part7 o7 , i2 . part7 d7 , i . part8 o8 , i2 . part8 d8
from systables t , sysconstraints s , sysindexes i ,
sysreferences r , systables tr , sysconstraints s2 , sysindexes i2
where t . tabname = '$table'
and s . tabid = t . tabid and s . constrtype = 'R' and r . constrid = s . constrid
and i . idxname = s . idxname and tr . tabid = r . ptabid
and s2 . constrid = r . primary and i2 . idxname = s2 . idxname " ;
$rs = $this -> Execute ( $sql );
if ( ! $rs || $rs -> EOF ) return false ;
$arr =& $rs -> GetArray ();
$a = array ();
foreach ( $arr as $v ) {
$coldest = $this -> metaColumnNames ( $v [ " tabname " ]);
$colorig = $this -> metaColumnNames ( $table );
$colnames = array ();
for ( $i = 1 ; $i <= 8 && $v [ " o $i " ] ; $i ++ ) {
$colnames [] = $coldest [ $v [ " d $i " ] - 1 ] . " = " . $colorig [ $v [ " o $i " ] - 1 ];
}
if ( $upper )
$a [ strtoupper ( $v [ " tabname " ])] = $colnames ;
else
$a [ $v [ " tabname " ]] = $colnames ;
}
return $a ;
}
2003-10-19 21:05:23 +02:00
function UpdateBlob ( $table , $column , $val , $where , $blobtype = 'BLOB' )
{
$type = ( $blobtype == 'TEXT' ) ? 1 : 0 ;
$blobid = ifx_create_blob ( $type , 0 , $val );
return $this -> Execute ( " UPDATE $table SET $column =(?) WHERE $where " , array ( $blobid ));
}
function BlobDecode ( $blobid )
{
return function_exists ( 'ifx_byteasvarchar' ) ? $blobid : @ ifx_get_blob ( $blobid );
}
// returns true or false
function _connect ( $argHostname , $argUsername , $argPassword , $argDatabasename )
{
2004-07-10 09:19:40 +02:00
if ( ! function_exists ( 'ifx_connect' )) return null ;
2004-03-15 23:17:52 +01:00
2003-10-19 21:05:23 +02:00
$dbs = $argDatabasename . " @ " . $argHostname ;
2004-03-15 23:17:52 +01:00
if ( $argHostname ) putenv ( " INFORMIXSERVER= $argHostname " );
putenv ( " INFORMIXSERVER= " . trim ( $argHostname ));
2003-10-19 21:05:23 +02:00
$this -> _connectionID = ifx_connect ( $dbs , $argUsername , $argPassword );
if ( $this -> _connectionID === false ) return false ;
#if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true ;
}
// returns true or false
function _pconnect ( $argHostname , $argUsername , $argPassword , $argDatabasename )
{
2004-07-10 09:19:40 +02:00
if ( ! function_exists ( 'ifx_connect' )) return null ;
2004-03-15 23:17:52 +01:00
2003-10-19 21:05:23 +02:00
$dbs = $argDatabasename . " @ " . $argHostname ;
2004-03-15 23:17:52 +01:00
putenv ( " INFORMIXSERVER= " . trim ( $argHostname ));
2003-10-19 21:05:23 +02:00
$this -> _connectionID = ifx_pconnect ( $dbs , $argUsername , $argPassword );
if ( $this -> _connectionID === false ) return false ;
#if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true ;
}
/*
2004-03-15 23:17:52 +01:00
// ifx_do does not accept bind parameters - weird ???
2003-10-19 21:05:23 +02:00
function Prepare ( $sql )
{
$stmt = ifx_prepare ( $sql );
if ( ! $stmt ) return $sql ;
else return array ( $sql , $stmt );
}
*/
// returns query ID if successful, otherwise false
function _query ( $sql , $inputarr )
{
global $ADODB_COUNTRECS ;
// String parameters have to be converted using ifx_create_char
if ( $inputarr ) {
foreach ( $inputarr as $v ) {
if ( gettype ( $v ) == 'string' ) {
$tab [] = ifx_create_char ( $v );
}
else {
$tab [] = $v ;
}
}
}
// In case of select statement, we use a scroll cursor in order
// to be able to call "move", or "movefirst" statements
if ( ! $ADODB_COUNTRECS && preg_match ( " /^ \ s*select/is " , $sql )) {
if ( $inputarr ) {
2004-03-15 23:17:52 +01:00
$this -> lastQuery = ifx_query ( $sql , $this -> _connectionID , $this -> cursorType , $tab );
2003-10-19 21:05:23 +02:00
}
else {
2004-03-15 23:17:52 +01:00
$this -> lastQuery = ifx_query ( $sql , $this -> _connectionID , $this -> cursorType );
2003-10-19 21:05:23 +02:00
}
}
else {
if ( $inputarr ) {
$this -> lastQuery = ifx_query ( $sql , $this -> _connectionID , $tab );
}
else {
$this -> lastQuery = ifx_query ( $sql , $this -> _connectionID );
}
}
// Following line have been commented because autocommit mode is
// not supported by informix SE 7.2
//if ($this->_autocommit) ifx_query('COMMIT',$this->_connectionID);
return $this -> lastQuery ;
}
// returns true or false
function _close ()
{
$this -> lastQuery = false ;
return ifx_close ( $this -> _connectionID );
}
}
/*--------------------------------------------------------------------------------------
Class Name : Recordset
--------------------------------------------------------------------------------------*/
class ADORecordset_informix72 extends ADORecordSet {
var $databaseType = " informix72 " ;
var $canSeek = true ;
var $_fieldprops = false ;
function ADORecordset_informix72 ( $id , $mode = false )
{
if ( $mode === false ) {
global $ADODB_FETCH_MODE ;
$mode = $ADODB_FETCH_MODE ;
}
$this -> fetchMode = $mode ;
return $this -> ADORecordSet ( $id );
}
/* Returns : an object containing field information .
Get column information in the Recordset object . fetchField () can be used in order to obtain information about
fields in a certain query result . If the field offset isn 't specified, the next field that wasn' t yet retrieved by
fetchField () is retrieved . */
function & FetchField ( $fieldOffset = - 1 )
{
if ( empty ( $this -> _fieldprops )) {
$fp = ifx_fieldproperties ( $this -> _queryID );
foreach ( $fp as $k => $v ) {
$o = new ADOFieldObject ;
$o -> name = $k ;
2009-11-16 10:01:01 +01:00
$arr = explode ( ';' , $v ); //"SQLTYPE;length;precision;scale;ISNULLABLE"
2003-10-19 21:05:23 +02:00
$o -> type = $arr [ 0 ];
$o -> max_length = $arr [ 1 ];
$this -> _fieldprops [] = $o ;
$o -> not_null = $arr [ 4 ] == " N " ;
}
}
2005-09-26 12:12:10 +02:00
$ret = $this -> _fieldprops [ $fieldOffset ];
return $ret ;
2003-10-19 21:05:23 +02:00
}
function _initrs ()
{
$this -> _numOfRows = - 1 ; // ifx_affected_rows not reliable, only returns estimate -- ($ADODB_COUNTRECS)? ifx_affected_rows($this->_queryID):-1;
$this -> _numOfFields = ifx_num_fields ( $this -> _queryID );
}
function _seek ( $row )
{
2005-09-26 12:12:10 +02:00
return @ ifx_fetch_row ( $this -> _queryID , ( int ) $row );
2003-10-19 21:05:23 +02:00
}
function MoveLast ()
{
$this -> fields = @ ifx_fetch_row ( $this -> _queryID , " LAST " );
if ( $this -> fields ) $this -> EOF = false ;
$this -> _currentRow = - 1 ;
if ( $this -> fetchMode == ADODB_FETCH_NUM ) {
foreach ( $this -> fields as $v ) {
$arr [] = $v ;
}
$this -> fields = $arr ;
}
return true ;
}
function MoveFirst ()
{
$this -> fields = @ ifx_fetch_row ( $this -> _queryID , " FIRST " );
if ( $this -> fields ) $this -> EOF = false ;
$this -> _currentRow = 0 ;
if ( $this -> fetchMode == ADODB_FETCH_NUM ) {
foreach ( $this -> fields as $v ) {
$arr [] = $v ;
}
$this -> fields = $arr ;
}
return true ;
}
function _fetch ( $ignore_fields = false )
{
$this -> fields = @ ifx_fetch_row ( $this -> _queryID );
if ( ! is_array ( $this -> fields )) return false ;
if ( $this -> fetchMode == ADODB_FETCH_NUM ) {
foreach ( $this -> fields as $v ) {
$arr [] = $v ;
}
$this -> fields = $arr ;
}
return true ;
}
/* close () only needs to be called if you are worried about using too much memory while your script
is running . All associated result memory for the specified result identifier will automatically be freed . */
function _close ()
{
return ifx_free_result ( $this -> _queryID );
}
}
2005-09-26 12:12:10 +02:00
/** ! Eos
* Auxiliar function to Parse coltype , collength . Used by Metacolumns
* return : array ( $mtype , $length , $precision , $nullable ) ( similar to ifx_fieldpropierties )
*/
function ifx_props ( $coltype , $collength ){
$itype = fmod ( $coltype + 1 , 256 );
$nullable = floor (( $coltype + 1 ) / 256 ) ? " N " : " Y " ;
$mtype = substr ( " CIIFFNNDN TBXCC " , $itype , 1 );
switch ( $itype ){
case 2 :
$length = 4 ;
case 6 :
case 9 :
case 14 :
$length = floor ( $collength / 256 );
$precision = fmod ( $collength , 256 );
break ;
default :
$precision = 0 ;
$length = $collength ;
}
return array ( $mtype , $length , $precision , $nullable );
}
2003-10-19 21:05:23 +02:00
?>