Update of /cvsroot/phpwiki/phpwiki/lib/WikiDB/adodb/drivers In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8896/adodb/drivers Added Files: adodb-access.inc.php adodb-ado.inc.php adodb-ado_access.inc.php adodb-ado_mssql.inc.php adodb-borland_ibase.inc.php adodb-csv.inc.php adodb-db2.inc.php adodb-fbsql.inc.php adodb-firebird.inc.php adodb-ibase.inc.php adodb-informix.inc.php adodb-informix72.inc.php adodb-ldap.inc.php adodb-mssql.inc.php adodb-mssqlpo.inc.php adodb-mysql.inc.php adodb-mysqli.inc.php adodb-mysqlt.inc.php adodb-netezza.inc.php adodb-oci8.inc.php adodb-oci805.inc.php adodb-oci8po.inc.php adodb-odbc.inc.php adodb-odbc_mssql.inc.php adodb-odbc_oracle.inc.php adodb-odbtp.inc.php adodb-odbtp_unicode.inc.php adodb-oracle.inc.php adodb-postgres.inc.php adodb-postgres64.inc.php adodb-postgres7.inc.php adodb-proxy.inc.php adodb-sapdb.inc.php adodb-sqlanywhere.inc.php adodb-sqlite.inc.php adodb-sybase.inc.php adodb-vfp.inc.php Log Message: new ADODB library 4.22 with multiple drivers (not only mysql as before), major change from FETCH_ASSOC to FETCH_ORDERED --- NEW FILE: adodb-access.inc.php --- <?php /* V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jl...@na...). All rights reserved. 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. See License.txt. Set tabs to 4 for best viewing. Latest version is available at http://php.weblogs.com/ Microsoft Access data driver. Requires ODBC. Works only on MS Windows. */ if (!defined('_ADODB_ODBC_LAYER')) { include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); } if (!defined('_ADODB_ACCESS')) { define('_ADODB_ACCESS',1); class ADODB_access extends ADODB_odbc { var $databaseType = 'access'; var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE var $fmtDate = "#Y-m-d#"; var $fmtTimeStamp = "#Y-m-d h:i:sA#"; // note not comma var $_bindInputArray = false; // strangely enough, setting to true does not work reliably var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')"; var $sysTimeStamp = 'NOW'; var $hasTransactions = false; function ADODB_access() { global $ADODB_EXTENSION; $ADODB_EXTENSION = false; $this->ADODB_odbc(); } function Time() { return time(); } function BeginTrans() { return false;} function IfNull( $field, $ifNull ) { return " IIF(IsNull($field), $ifNull, $field) "; // if Access } /* function &MetaTables() { global $ADODB_FETCH_MODE; $savem = $ADODB_FETCH_MODE; $ADODB_FETCH_MODE = ADODB_FETCH_NUM; $qid = odbc_tables($this->_connectionID); $rs = new ADORecordSet_odbc($qid); $ADODB_FETCH_MODE = $savem; if (!$rs) return false; $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; $arr = &$rs->GetArray(); //print_pre($arr); $arr2 = array(); for ($i=0; $i < sizeof($arr); $i++) { if ($arr[$i][2] && $arr[$i][3] != 'SYSTEM TABLE') $arr2[] = $arr[$i][2]; } return $arr2; }*/ } class ADORecordSet_access extends ADORecordSet_odbc { var $databaseType = "access"; function ADORecordSet_access($id,$mode=false) { return $this->ADORecordSet_odbc($id,$mode); } }// class } ?> --- NEW FILE: adodb-ado.inc.php --- <?php /* V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jl...@na...). All rights reserved. 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. Latest version is available at http://php.weblogs.com/ Microsoft ADO data driver. Requires ADO. Works only on MS Windows. */ define("_ADODB_ADO_LAYER", 1 ); /*-------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------*/ class ADODB_ado extends ADOConnection { var $databaseType = "ado"; var $_bindInputArray = false; var $fmtDate = "'Y-m-d'"; var $fmtTimeStamp = "'Y-m-d, h:i:sA'"; var $replaceQuote = "''"; // string to use to replace quotes var $dataProvider = "ado"; var $hasAffectedRows = true; var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary var $_affectedRows = false; var $_thisTransactions; var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient; var $_lock_type = -1; var $_execute_option = -1; var $poorAffectedRows = true; var $charPage; function ADODB_ado() { $this->_affectedRows = new VARIANT; } function ServerInfo() { if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider; return array('description' => $desc, 'version' => ''); } function _affectedrows() { if (PHP_VERSION >= 5) return $this->_affectedRows; return $this->_affectedRows->value; } // you can also pass a connection string like this: // // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB'); function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL') { $u = 'UID'; $p = 'PWD'; if (!empty($this->charPage)) $dbc = new COM('ADODB.Connection',null,$this->charPage); else $dbc = new COM('ADODB.Connection'); if (! $dbc) return false; /* special support if provider is mssql or access */ if ($argProvider=='mssql') { $u = 'User Id'; //User parameter name for OLEDB $p = 'Password'; $argProvider = "SQLOLEDB"; // SQL Server Provider // not yet //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename"; //use trusted conection for SQL if username not specified if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes"; } else if ($argProvider=='access') $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider if ($argProvider) $dbc->Provider = $argProvider; if ($argUsername) $argHostname .= ";$u=$argUsername"; if ($argPassword)$argHostname .= ";$p=$argPassword"; if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version"); // @ added below for php 4.0.1 and earlier @$dbc->Open((string) $argHostname); $this->_connectionID = $dbc; $dbc->CursorLocation = $this->_cursor_location; return $dbc->State > 0; } // returns true or false function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL') { return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider); } /* adSchemaCatalogs = 1, adSchemaCharacterSets = 2, adSchemaCollations = 3, adSchemaColumns = 4, adSchemaCheckConstraints = 5, adSchemaConstraintColumnUsage = 6, adSchemaConstraintTableUsage = 7, adSchemaKeyColumnUsage = 8, adSchemaReferentialContraints = 9, adSchemaTableConstraints = 10, adSchemaColumnsDomainUsage = 11, adSchemaIndexes = 12, adSchemaColumnPrivileges = 13, adSchemaTablePrivileges = 14, adSchemaUsagePrivileges = 15, adSchemaProcedures = 16, adSchemaSchemata = 17, adSchemaSQLLanguages = 18, adSchemaStatistics = 19, adSchemaTables = 20, adSchemaTranslations = 21, adSchemaProviderTypes = 22, adSchemaViews = 23, adSchemaViewColumnUsage = 24, adSchemaViewTableUsage = 25, adSchemaProcedureParameters = 26, adSchemaForeignKeys = 27, adSchemaPrimaryKeys = 28, adSchemaProcedureColumns = 29, adSchemaDBInfoKeywords = 30, adSchemaDBInfoLiterals = 31, adSchemaCubes = 32, adSchemaDimensions = 33, adSchemaHierarchies = 34, adSchemaLevels = 35, adSchemaMeasures = 36, adSchemaProperties = 37, adSchemaMembers = 38 */ function &MetaTables() { $arr= array(); $dbc = $this->_connectionID; $adors=@$dbc->OpenSchema(20);//tables if ($adors){ $f = $adors->Fields(2);//table/view name $t = $adors->Fields(3);//table type while (!$adors->EOF){ $tt=substr($t->value,0,6); if ($tt!='SYSTEM' && $tt !='ACCESS') $arr[]=$f->value; //print $f->value . ' ' . $t->value.'<br>'; $adors->MoveNext(); } $adors->Close(); } return $arr; } function &MetaColumns($table) { $table = strtoupper($table); $arr= array(); $dbc = $this->_connectionID; $adors=@$dbc->OpenSchema(4);//tables if ($adors){ $t = $adors->Fields(2);//table/view name while (!$adors->EOF){ if (strtoupper($t->Value) == $table) { $fld = new ADOFieldObject(); $c = $adors->Fields(3); $fld->name = $c->Value; $fld->type = 'CHAR'; // cannot discover type in ADO! $fld->max_length = -1; $arr[strtoupper($fld->name)]=$fld; } $adors->MoveNext(); } $adors->Close(); } return $arr; } /* returns queryID or false */ function &_query($sql,$inputarr=false) { $dbc = $this->_connectionID; // return rs if ($inputarr) { if (!empty($this->charPage)) $oCmd = new COM('ADODB.Command',null,$this->charPage); else $oCmd = new COM('ADODB.Command'); $oCmd->ActiveConnection = $dbc; $oCmd->CommandText = $sql; $oCmd->CommandType = 1; foreach($inputarr as $val) { // name, type, direction 1 = input, len, $this->adoParameterType = 130; $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val); //print $p->Type.' '.$p->value; $oCmd->Parameters->Append($p); } $p = false; $rs = $oCmd->Execute(); $e = $dbc->Errors; if ($dbc->Errors->Count > 0) return false; return $rs; } $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option); /* $rs = new COM('ADODB.Recordset'); if ($rs) { $rs->Open ($sql, $dbc, $this->_cursor_type,$this->_lock_type, $this->_execute_option); } */ if ($dbc->Errors->Count > 0) return false; if (! $rs) return false; if ($rs->State == 0) return true; // 0 = adStateClosed means no records returned return $rs; } function BeginTrans() { if ($this->transOff) return true; if (isset($this->_thisTransactions)) if (!$this->_thisTransactions) return false; else { $o = $this->_connectionID->Properties("Transaction DDL"); $this->_thisTransactions = $o ? true : false; if (!$o) return false; } @$this->_connectionID->BeginTrans(); $this->transCnt += 1; return true; } function CommitTrans($ok=true) { if (!$ok) return $this->RollbackTrans(); if ($this->transOff) return true; @$this->_connectionID->CommitTrans(); if ($this->transCnt) @$this->transCnt -= 1; return true; } function RollbackTrans() { if ($this->transOff) return true; @$this->_connectionID->RollbackTrans(); if ($this->transCnt) @$this->transCnt -= 1; return true; } /* Returns: the last error message from previous database operation */ function ErrorMsg() { $errc = $this->_connectionID->Errors; if ($errc->Count == 0) return ''; $err = $errc->Item($errc->Count-1); return $err->Description; } function ErrorNo() { $errc = $this->_connectionID->Errors; if ($errc->Count == 0) return 0; $err = $errc->Item($errc->Count-1); return $err->NativeError; } // returns true or false function _close() { if ($this->_connectionID) $this->_connectionID->Close(); $this->_connectionID = false; return true; } } /*-------------------------------------------------------------------------------------- Class Name: Recordset --------------------------------------------------------------------------------------*/ class ADORecordSet_ado extends ADORecordSet { var $bind = false; var $databaseType = "ado"; var $dataProvider = "ado"; var $_tarr = false; // caches the types var $_flds; // and field objects var $canSeek = true; var $hideErrors = true; function ADORecordSet_ado($id,$mode=false) { if ($mode === false) { global $ADODB_FETCH_MODE; $mode = $ADODB_FETCH_MODE; } $this->fetchMode = $mode; return $this->ADORecordSet($id,$mode); } // returns the field object function FetchField($fieldOffset = -1) { $off=$fieldOffset+1; // offsets begin at 1 $o= new ADOFieldObject(); $rs = $this->_queryID; $f = $rs->Fields($fieldOffset); $o->name = $f->Name; $t = $f->Type; $o->type = $this->MetaType($t); $o->max_length = $f->DefinedSize; $o->ado_type = $t; //print "off=$off name=$o->name type=$o->type len=$o->max_length<br>"; return $o; } /* Use associative array to get fields array */ function Fields($colname) { if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; if (!$this->bind) { $this->bind = array(); for ($i=0; $i < $this->_numOfFields; $i++) { $o = $this->FetchField($i); $this->bind[strtoupper($o->name)] = $i; } } return $this->fields[$this->bind[strtoupper($colname)]]; } function _initrs() { $rs = $this->_queryID; $this->_numOfRows = $rs->RecordCount; $f = $rs->Fields; $this->_numOfFields = $f->Count; } // should only be used to move forward as we normally use forward-only cursors function _seek($row) { $rs = $this->_queryID; // absoluteposition doesn't work -- my maths is wrong ? // $rs->AbsolutePosition->$row-2; // return true; if ($this->_currentRow > $row) return false; @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst return true; } /* OLEDB types enum DBTYPEENUM { DBTYPE_EMPTY = 0, DBTYPE_NULL = 1, DBTYPE_I2 = 2, DBTYPE_I4 = 3, DBTYPE_R4 = 4, DBTYPE_R8 = 5, DBTYPE_CY = 6, DBTYPE_DATE = 7, DBTYPE_BSTR = 8, DBTYPE_IDISPATCH = 9, DBTYPE_ERROR = 10, DBTYPE_BOOL = 11, DBTYPE_VARIANT = 12, DBTYPE_IUNKNOWN = 13, DBTYPE_DECIMAL = 14, DBTYPE_UI1 = 17, DBTYPE_ARRAY = 0x2000, DBTYPE_BYREF = 0x4000, DBTYPE_I1 = 16, DBTYPE_UI2 = 18, DBTYPE_UI4 = 19, DBTYPE_I8 = 20, DBTYPE_UI8 = 21, DBTYPE_GUID = 72, DBTYPE_VECTOR = 0x1000, DBTYPE_RESERVED = 0x8000, DBTYPE_BYTES = 128, DBTYPE_STR = 129, DBTYPE_WSTR = 130, DBTYPE_NUMERIC = 131, DBTYPE_UDT = 132, DBTYPE_DBDATE = 133, DBTYPE_DBTIME = 134, DBTYPE_DBTIMESTAMP = 135 ADO Types adEmpty = 0, adTinyInt = 16, adSmallInt = 2, adInteger = 3, adBigInt = 20, adUnsignedTinyInt = 17, adUnsignedSmallInt = 18, adUnsignedInt = 19, adUnsignedBigInt = 21, adSingle = 4, adDouble = 5, adCurrency = 6, adDecimal = 14, adNumeric = 131, adBoolean = 11, adError = 10, adUserDefined = 132, adVariant = 12, adIDispatch = 9, adIUnknown = 13, adGUID = 72, adDate = 7, adDBDate = 133, adDBTime = 134, adDBTimeStamp = 135, adBSTR = 8, adChar = 129, adVarChar = 200, adLongVarChar = 201, adWChar = 130, adVarWChar = 202, adLongVarWChar = 203, adBinary = 128, adVarBinary = 204, adLongVarBinary = 205, adChapter = 136, adFileTime = 64, adDBFileTime = 137, adPropVariant = 138, adVarNumeric = 139 */ function MetaType($t,$len=-1,$fieldobj=false) { if (is_object($t)) { $fieldobj = $t; $t = $fieldobj->type; $len = $fieldobj->max_length; } if (!is_numeric($t)) return $t; switch ($t) { case 0: case 12: // variant case 8: // bstr case 129: //char case 130: //wc case 200: // varc case 202:// varWC case 128: // bin case 204: // varBin case 72: // guid if ($len <= $this->blobSize) return 'C'; case 201: case 203: return 'X'; case 128: case 204: case 205: return 'B'; case 7: case 133: return 'D'; case 134: case 135: return 'T'; case 11: return 'L'; case 16:// adTinyInt = 16, case 2://adSmallInt = 2, case 3://adInteger = 3, case 4://adBigInt = 20, case 17://adUnsignedTinyInt = 17, case 18://adUnsignedSmallInt = 18, case 19://adUnsignedInt = 19, case 20://adUnsignedBigInt = 21, return 'I'; default: return 'N'; } } // time stamp not supported yet function _fetch() { $rs = $this->_queryID; if (!$rs or $rs->EOF) { $this->fields = false; return false; } $this->fields = array(); if (!$this->_tarr) { $tarr = array(); $flds = array(); for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { $f = $rs->Fields($i); $flds[] = $f; $tarr[] = $f->Type; } // bind types and flds only once $this->_tarr = $tarr; $this->_flds = $flds; } $t = reset($this->_tarr); $f = reset($this->_flds); if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { switch($t) { case 135: // timestamp if (!strlen((string)$f->value)) $this->fields[] = false; else $this->fields[] = adodb_date('Y-m-d H:i:s',(float)$f->value); break; case 133:// A date value (yyyymmdd) if ($val = $f->value) { $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2); } else $this->fields[] = false; break; case 7: // adDate if (!strlen((string)$f->value)) $this->fields[] = false; else $this->fields[] = adodb_date('Y-m-d',(float)$f->value); break; case 1: // null $this->fields[] = false; break; case 6: // currency is not supported properly; ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>'); $this->fields[] = (float) $f->value; break; default: $this->fields[] = $f->value; break; } //print " $f->value $t, "; $f = next($this->_flds); $t = next($this->_tarr); } // for if ($this->hideErrors) error_reporting($olde); @$rs->MoveNext(); // @ needed for some versions of PHP! if ($this->fetchMode & ADODB_FETCH_ASSOC) { $this->fields = &$this->GetRowAssoc(ADODB_ASSOC_CASE); } return true; } function NextRecordSet() { $rs = $this->_queryID; $this->_queryID = $rs->NextRecordSet(); //$this->_queryID = $this->_QueryId->NextRecordSet(); if ($this->_queryID == null) return false; $this->_currentRow = -1; $this->_currentPage = -1; $this->bind = false; $this->fields = false; $this->_flds = false; $this->_tarr = false; $this->_inited = false; $this->Init(); return true; } function _close() { $this->_flds = false; @$this->_queryID->Close();// by Pete Dishman (pe...@te...) $this->_queryID = false; } } ?> --- NEW FILE: adodb-ado_access.inc.php --- <?php /* V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jl...@na...). All rights reserved. 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. See License.txt. Set tabs to 4 for best viewing. Latest version is available at http://php.weblogs.com/ Microsoft Access ADO data driver. Requires ADO and ODBC. Works only on MS Windows. */ if (!defined('_ADODB_ADO_LAYER')) { include(ADODB_DIR."/drivers/adodb-ado.inc.php"); } class ADODB_ado_access extends ADODB_ado { var $databaseType = 'ado_access'; var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE var $fmtDate = "#Y-m-d#"; var $fmtTimeStamp = "#Y-m-d h:i:sA#";// note no comma var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')"; var $sysTimeStamp = 'NOW'; var $hasTransactions = false; function ADODB_ado_access() { $this->ADODB_ado(); } function BeginTrans() { return false;} } class ADORecordSet_ado_access extends ADORecordSet_ado { var $databaseType = "ado_access"; function ADORecordSet_ado_access($id,$mode=false) { return $this->ADORecordSet_ado($id,$mode); } } ?> --- NEW FILE: adodb-ado_mssql.inc.php --- <?php /* V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jl...@na...). All rights reserved. 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. Latest version is available at http://php.weblogs.com/ Microsoft SQL Server ADO data driver. Requires ADO and MSSQL client. Works only on MS Windows. It is normally better to use the mssql driver directly because it is much faster. This file is only a technology demonstration and for test purposes. */ if (!defined('_ADODB_ADO_LAYER')) { include(ADODB_DIR."/drivers/adodb-ado.inc.php"); } class ADODB_ado_mssql extends ADODB_ado { var $databaseType = 'ado_mssql'; var $hasTop = 'top'; var $sysDate = 'GetDate()'; var $sysTimeStamp = 'GetDate()'; var $leftOuter = '*='; var $rightOuter = '=*'; var $ansiOuter = true; // for mssql7 or later var $substr = "substring"; var $length = 'len'; var $upperCase = 'upper'; //var $_inTransaction = 1; // always open recordsets, so no transaction problems. function ADODB_ado_mssql() { $this->ADODB_ado(); } function _insertid() { return $this->GetOne('select @@identity'); } function _affectedrows() { return $this->GetOne('select @@rowcount'); } } class ADORecordSet_ado_mssql extends ADORecordSet_ado { var $databaseType = 'ado_mssql'; function ADORecordSet_ado_mssql($id,$mode=false) { return $this->ADORecordSet_ado($id,$mode); } } ?> --- NEW FILE: adodb-borland_ibase.inc.php --- <?php /* V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jl...@na...). All rights reserved. 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. Latest version is available at http://php.weblogs.com/ Support Borland Interbase 6.5 and later */ include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php"); class ADODB_borland_ibase extends ADODB_ibase { var $databaseType = "borland_ibase"; function ADODB_borland_ibase() { $this->ADODB_ibase(); } function ServerInfo() { $arr['dialect'] = $this->dialect; switch($arr['dialect']) { case '': case '1': $s = 'Interbase 6.5, Dialect 1'; break; case '2': $s = 'Interbase 6.5, Dialect 2'; break; default: case '3': $s = 'Interbase 6.5, Dialect 3'; break; } $arr['version'] = '6.5'; $arr['description'] = $s; return $arr; } // Note that Interbase 6.5 uses ROWS instead - don't you love forking wars! // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2 // Firebird uses // SELECT FIRST 5 SKIP 2 col1, col2 FROM TABLE function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) { if ($nrows > 0) { if ($offset <= 0) $str = " ROWS $nrows "; else { $a = $offset+1; $b = $offset+$nrows; $str = " ROWS $a TO $b"; } } else { // ok, skip $a = $offset + 1; $str = " ROWS $a TO 999999999"; // 999 million } $sql .= $str; return ($secs2cache) ? $this->CacheExecute($secs2cache,$sql,$inputarr) : $this->Execute($sql,$inputarr); } }; class ADORecordSet_borland_ibase extends ADORecordSet_ibase { var $databaseType = "borland_ibase"; function ADORecordSet_borland_ibase($id,$mode=false) { $this->ADORecordSet_ibase($id,$mode); } } ?> --- NEW FILE: adodb-csv.inc.php --- <?php /* V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jl...@na...). All rights reserved. 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. Currently unsupported: MetaDatabases, MetaTables and MetaColumns, and also inputarr in Execute. Native types have been converted to MetaTypes. Transactions not supported yet. */ if (! defined("_ADODB_CSV_LAYER")) { define("_ADODB_CSV_LAYER", 1 ); include_once(ADODB_DIR.'/adodb-csvlib.inc.php'); class ADODB_csv extends ADOConnection { var $databaseType = 'csv'; var $databaseProvider = 'csv'; var $hasInsertID = true; var $hasAffectedRows = true; var $fmtTimeStamp = "'Y-m-d H:i:s'"; var $_affectedrows=0; var $_insertid=0; var $_url; var $replaceQuote = "''"; // string to use to replace quotes var $hasTransactions = false; var $_errorNo = false; function ADODB_csv() { } function _insertid() { return $this->_insertid; } function _affectedrows() { return $this->_affectedrows; } function &MetaDatabases() { return false; } // returns true or false function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) { if (strtolower(substr($argHostname,0,7)) !== 'http://') return false; $this->_url = $argHostname; return true; } // returns true or false function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) { if (strtolower(substr($argHostname,0,7)) !== 'http://') return false; $this->_url = $argHostname; return true; } function &MetaColumns($table) { return false; } // parameters use PostgreSQL convention, not MySQL function &SelectLimit($sql,$nrows=-1,$offset=-1) { global $ADODB_FETCH_MODE; $url = $this->_url.'?sql='.urlencode($sql)."&nrows=$nrows&fetch=". (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE). "&offset=$offset"; $err = false; $rs = csv2rs($url,$err,false); if ($this->debug) print "$url<br><i>$err</i><br>"; $at = strpos($err,'::::'); if ($at === false) { $this->_errorMsg = $err; $this->_errorNo = (integer)$err; } else { $this->_errorMsg = substr($err,$at+4,1024); $this->_errorNo = -9999; } if ($this->_errorNo) if ($fn = $this->raiseErrorFn) { $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,''); } if (is_object($rs)) { $rs->databaseType='csv'; $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE; $rs->connection = &$this; } return $rs; } // returns queryID or false function &_Execute($sql,$inputarr=false) { global $ADODB_FETCH_MODE; if (!$this->_bindInputArray && $inputarr) { $sqlarr = explode('?',$sql); $sql = ''; $i = 0; foreach($inputarr as $v) { $sql .= $sqlarr[$i]; if (gettype($v) == 'string') $sql .= $this->qstr($v); else if ($v === null) $sql .= 'NULL'; else $sql .= $v; $i += 1; } $sql .= $sqlarr[$i]; if ($i+1 != sizeof($sqlarr)) print "Input Array does not match ?: ".htmlspecialchars($sql); $inputarr = false; } $url = $this->_url.'?sql='.urlencode($sql)."&fetch=". (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE); $err = false; $rs = csv2rs($url,$err,false); if ($this->debug) print urldecode($url)."<br><i>$err</i><br>"; $at = strpos($err,'::::'); if ($at === false) { $this->_errorMsg = $err; $this->_errorNo = (integer)$err; } else { $this->_errorMsg = substr($err,$at+4,1024); $this->_errorNo = -9999; } if ($this->_errorNo) if ($fn = $this->raiseErrorFn) { $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr); } if (is_object($rs)) { $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE; $this->_affectedrows = $rs->affectedrows; $this->_insertid = $rs->insertid; $rs->databaseType='csv'; $rs->connection = &$this; } return $rs; } /* Returns: the last error message from previous database operation */ function ErrorMsg() { return $this->_errorMsg; } /* Returns: the last error number from previous database operation */ function ErrorNo() { return $this->_errorNo; } // returns true or false function _close() { return true; } } // class class ADORecordset_csv extends ADORecordset { function ADORecordset_csv($id,$mode=false) { $this->ADORecordset($id,$mode); } function _close() { return true; } } } // define ?> --- NEW FILE: adodb-db2.inc.php --- <?php /* V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jl...@na...). All rights reserved. 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. Latest version is available at http://php.weblogs.com/ DB2 data driver. Requires ODBC. From phpdb list: Hi Andrew, thanks a lot for your help. Today we discovered what our real problem was: After "playing" a little bit with the php-scripts that try to connect to the IBM DB2, we set the optional parameter Cursortype when calling odbc_pconnect(....). And the exciting thing: When we set the cursor type to SQL_CUR_USE_ODBC Cursor Type, then the whole query speed up from 1 till 10 seconds to 0.2 till 0.3 seconds for 100 records. Amazing!!! Therfore, PHP is just almost fast as calling the DB2 from Servlets using JDBC (don't take too much care about the speed at whole: the database was on a completely other location, so the whole connection was made over a slow network connection). I hope this helps when other encounter the same problem when trying to connect to DB2 from PHP. Kind regards, Christian Szardenings 2 Oct 2001 Mark Newnham has discovered that the SQL_CUR_USE_ODBC is not supported by IBM's DB2 ODBC driver, so this must be a 3rd party ODBC driver. From the IBM CLI Reference: SQL_ATTR_ODBC_CURSORS (DB2 CLI v5) This connection attribute is defined by ODBC, but is not supported by DB2 CLI. Any attempt to set or get this attribute will result in an SQLSTATE of HYC00 (Driver not capable). A 32-bit option specifying how the Driver Manager uses the ODBC cursor library. So I guess this means the message [above] was related to using a 3rd party odbc driver. Setting SQL_CUR_USE_ODBC ======================== To set SQL_CUR_USE_ODBC for drivers that require it, do this: $db = NewADOConnection('db2'); $db->curMode = SQL_CUR_USE_ODBC; $db->Connect($dsn, $userid, $pwd); USING CLI INTERFACE =================== I have had reports that the $host and $database params have to be reversed in Connect() when using the CLI interface. From Halmai Csongor csongor.halmai#nexum.hu: > The symptom is that if I change the database engine from postgres or any other to DB2 then the following > connection command becomes wrong despite being described this version to be correct in the docs. > > $connection_object->Connect( $DATABASE_HOST, $DATABASE_AUTH_USER_NAME, $DATABASE_AUTH_PASSWORD, $DATABASE_NAME ) > > In case of DB2 I had to swap the first and last arguments in order to connect properly. */ if (!defined('_ADODB_ODBC_LAYER')) { include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); } if (!defined('ADODB_DB2')){ define('ADODB_DB2',1); class ADODB_DB2 extends ADODB_odbc { var $databaseType = "db2"; var $concat_operator = '||'; var $sysDate = 'CURRENT_DATE'; var $sysTimeStamp = 'CURRENT TIMESTAMP'; // The complete string representation of a timestamp has the form // yyyy-mm-dd-hh.mm.ss.nnnnnn. var $fmtTimeStamp = "'Y-m-d-H.i.s'"; var $ansiOuter = true; var $identitySQL = 'values IDENTITY_VAL_LOCAL()'; var $_bindInputArray = false; var $upperCase = 'upper'; function ADODB_DB2() { if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC; $this->ADODB_odbc(); } function IfNull( $field, $ifNull ) { return " COALESCE($field, $ifNull) "; // if DB2 UDB } function ServerInfo() { //odbc_setoption($this->_connectionID,1,101 /*SQL_ATTR_ACCESS_MODE*/, 1 /*SQL_MODE_READ_ONLY*/); $vers = $this->GetOne('select versionnumber from sysibm.sysversions'); //odbc_setoption($this->_connectionID,1,101, 0 /*SQL_MODE_READ_WRITE*/); return array('description'=>'DB2 ODBC driver', 'version'=>$vers); } function _insertid() { return $this->GetOne($this->identitySQL); } function RowLock($tables,$where) { if ($this->_autocommit) $this->BeginTrans(); return $this->GetOne("select 1 as ignore from $tables where $where for update"); } function &MetaTables($ttype=false,$showSchema=false) { global $ADODB_FETCH_MODE; $savem = $ADODB_FETCH_MODE; $ADODB_FETCH_MODE = ADODB_FETCH_NUM; $qid = odbc_tables($this->_connectionID); $rs = new ADORecordSet_odbc($qid); $ADODB_FETCH_MODE = $savem; if (!$rs) return false; $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; $arr =& $rs->GetArray(); //print_r($arr); $rs->Close(); $arr2 = array(); if ($ttype) { $isview = strncmp($ttype,'V',1) === 0; } for ($i=0; $i < sizeof($arr); $i++) { if (!$arr[$i][2]) continue; if (strncmp($arr[$i][1],'SYS',3) === 0) continue; $type = $arr[$i][3]; if ($showSchema) $arr[$i][2] = $arr[$i][1].'.'.$arr[$i][2]; if ($ttype) { if ($isview) { if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2]; } else if (strncmp($type,'T',1) === 0) $arr2[] = $arr[$i][2]; } else if (strncmp($type,'S',1) !== 0) $arr2[] = $arr[$i][2]; } return $arr2; } // Format date column in sql string given an input format that understands Y M D function SQLDate($fmt, $col=false) { // use right() and replace() ? if (!$col) $col = $this->sysDate; $s = ''; $len = strlen($fmt); for ($i=0; $i < $len; $i++) { if ($s) $s .= '||'; $ch = $fmt[$i]; switch($ch) { case 'Y': case 'y': $s .= "char(year($col))"; break; case 'M': $s .= "substr(monthname($col),1,3)"; break; case 'm': $s .= "right(digits(month($col)),2)"; break; case 'D': case 'd': $s .= "right(digits(day($col)),2)"; break; case 'H': case 'h': if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)"; else $s .= "''"; break; case 'i': case 'I': if ($col != $this->sysDate) $s .= "right(digits(minute($col)),2)"; else $s .= "''"; break; case 'S': case 's': if ($col != $this->sysDate) $s .= "right(digits(second($col)),2)"; else $s .= "''"; break; default: if ($ch == '\\') { $i++; $ch = substr($fmt,$i,1); } $s .= $this->qstr($ch); } } return $s; } function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false) { if ($offset <= 0) { // could also use " OPTIMIZE FOR $nrows ROWS " if ($nrows >= 0) $sql .= " FETCH FIRST $nrows ROWS ONLY "; $rs =& $this->Execute($sql,$inputArr); } else { if ($offset > 0 && $nrows < 0); else { $nrows += $offset; $sql .= " FETCH FIRST $nrows ROWS ONLY "; } $rs =& ADOConnection::SelectLimit($sql,-1,$offset,$inputArr); } return $rs; } }; class ADORecordSet_db2 extends ADORecordSet_odbc { var $databaseType = "db2"; function ADORecordSet_db2($id,$mode=false) { $this->ADORecordSet_odbc($id,$mode); } function MetaType($t,$len=-1,$fieldobj=false) { if (is_object($t)) { $fieldobj = $t; $t = $fieldobj->type; $len = $fieldobj->max_length; } switch (strtoupper($t)) { case 'VARCHAR': case 'CHAR': case 'CHARACTER': if ($len <= $this->blobSize) return 'C'; case 'LONGCHAR': case 'TEXT': case 'CLOB': case 'DBCLOB': // double-byte return 'X'; case 'BLOB': case 'GRAPHIC': case 'VARGRAPHIC': return 'B'; case 'DATE': return 'D'; case 'TIME': case 'TIMESTAMP': return 'T'; //case 'BOOLEAN': //case 'BIT': // return 'L'; //case 'COUNTER': // return 'R'; case 'INT': case 'INTEGER': case 'BIGINT': case 'SMALLINT': return 'I'; default: return 'N'; } } } } //define ?> --- NEW FILE: adodb-fbsql.inc.php --- <?php /* @version V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jl...@na...). All rights reserved. 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. Contribution by Frank M. Kromann <fr...@fr...>. Set tabs to 8. */ if (! defined("_ADODB_FBSQL_LAYER")) { define("_ADODB_FBSQL_LAYER", 1 ); class ADODB_fbsql extends ADOConnection { var $databaseType = 'fbsql'; var $hasInsertID = true; var $hasAffectedRows = true; var $metaTablesSQL = "SHOW TABLES"; var $metaColumnsSQL = "SHOW COLUMNS FROM %s"; var $fmtTimeStamp = "'Y-m-d H:i:s'"; var $hasLimit = false; function ADODB_fbsql() { } function _insertid() { return fbsql_insert_id($this->_connectionID); } function _affectedrows() { return fbsql_affected_rows($this->_connectionID); } function &MetaDatabases() { $qid = fbsql_list_dbs($this->_connectionID); $arr = array(); $i = 0; $max = fbsql_num_rows($qid); while ($i < $max) { $arr[] = fbsql_tablename($qid,$i); $i += 1; } return $arr; } // returns concatenated string function Concat() { $s = ""; $arr = func_get_args(); $first = true; $s = implode(',',$arr); if (sizeof($arr) > 0) return "CONCAT($s)"; else return ''; } // returns true or false function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) { $this->_connectionID = fbsql_connect($argHostname,$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) { $this->_connectionID = fbsql_pconnect($argHostname,$argUsername,$argPassword); if ($this->_connectionID === false) return false; if ($argDatabasename) return $this->SelectDB($argDatabasename); return true; } function &MetaColumns($table) { if ($this->metaColumnsSQL) { $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); if ($rs === false) return false; $retarr = array(); while (!$rs->EOF){ $fld = new ADOFieldObject(); $fld->name = $rs->fields[0]; $fld->type = $rs->fields[1]; // split type into type(length): if (preg_match("/^(.+)\((\d+)\)$/", $fld->type, $query_array)) { $fld->type = $query_array[1]; $fld->max_length = $query_array[2]; } else { $fld->max_length = -1; } $fld->not_null = ($rs->fields[2] != 'YES'); $fld->primary_key = ($rs->fields[3] == 'PRI'); $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false); $fld->binary = (strpos($fld->type,'blob') !== false); $retarr[strtoupper($fld->name)] = $fld; $rs->MoveNext(); } $rs->Close(); return $retarr; } return false; } // returns true or false function SelectDB($dbName) { $this->databaseName = $dbName; if ($this->_connectionID) { return @fbsql_select_db($dbName,$this->_connectionID); } else return false; } // returns queryID or false function _query($sql,$inputarr) { return fbsql_query("$sql;",$this->_connectionID); } /* Returns: the last error message from previous database operation */ function ErrorMsg() { $this->_errorMsg = @fbsql_error($this->_connectionID); return $this->_errorMsg; } /* Returns: the last error number from previous database operation */ function ErrorNo() { return @fbsql_errno($this->_connectionID); } // returns true or false function _close() { return @fbsql_close($this->_connectionID); } } /*-------------------------------------------------------------------------------------- Class Name: Recordset --------------------------------------------------------------------------------------*/ class ADORecordSet_fbsql extends ADORecordSet{ var $databaseType = "fbsql"; var $canSeek = true; function ADORecordSet_fbsql($queryID,$mode=false) { if (!$mode) { global $ADODB_FETCH_MODE; $mode = $ADODB_FETCH_MODE; } switch ($mode) { case ADODB_FETCH_NUM: $this->fetchMode = FBSQL_NUM; break; default: case ADODB_FETCH_BOTH: $this->fetchMode = FBSQL_BOTH; break; case ADODB_FETCH_ASSOC: $this->fetchMode = FBSQL_ASSOC; break; } return $this->ADORecordSet($queryID); } function _initrs() { GLOBAL $ADODB_COUNTRECS; $this->_numOfRows = ($ADODB_COUNTRECS) ? @fbsql_num_rows($this->_queryID):-1; $this->_numOfFields = @fbsql_num_fields($this->_queryID); } function &FetchField($fieldOffset = -1) { if ($fieldOffset != -1) { $o = @fbsql_fetch_field($this->_queryID, $fieldOffset); //$o->max_length = -1; // fbsql returns the max length less spaces -- so it is unrealiable $f = @fbsql_field_flags($this->_queryID,$fieldOffset); $o->binary = (strpos($f,'binary')!== false); } else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ $o = @fbsql_fetch_field($this->_queryID);// fbsql returns the max length less spaces -- so it is unrealiable //$o->max_length = -1; } return $o; } function _seek($row) { return @fbsql_data_seek($this->_queryID,$row); } function _fetch($ignore_fields=false) { $this->fields = @fbsql_fetch_array($this->_queryID,$this->fetchMode); return ($this->fields == true); } function _close() { return @fbsql_free_result($this->_queryID); } function MetaType($t,$len=-1,$fieldobj=false) { if (is_object($t)) { $fieldobj = $t; $t = $fieldobj->type; $len = $fieldobj->max_length; } $len = -1; // fbsql max_length is not accurate switch (strtoupper($t)) { case 'CHARACTER': case 'CHARACTER VARYING': case 'BLOB': case 'CLOB': case 'BIT': case 'BIT VARYING': if ($len <= $this->blobSize) return 'C'; // so we have to check whether binary... case 'IMAGE': case 'LONGBLOB': case 'BLOB': case 'MEDIUMBLOB': return !empty($fieldobj->binary) ? 'B' : 'X'; case 'DATE': return 'D'; case 'TIME': case 'TIME WITH TIME ZONE': case 'TIMESTAMP': case 'TIMESTAMP WITH TIME ZONE': return 'T'; case 'PRIMARY_KEY': return 'R'; case 'INTEGER': case 'SMALLINT': case 'BOOLEAN': if (!empty($fieldobj->primary_key)) return 'R'; else return 'I'; default: return 'N'; } } } //class } // defined ?> --- NEW FILE: adodb-firebird.inc.php --- <?php /* V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jl...@na...). All rights reserved. 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. Latest version is available at http://php.weblogs.com/ */ include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php"); class ADODB_firebird extends ADODB_ibase { var $databaseType = "firebird"; function ADODB_firebird() { $this->ADODB_ibase(); } function ServerInfo() { $arr['dialect'] = $this->dialect; switch($arr['dialect']) { case '': case '1': $s = 'Firebird Dialect 1'; break; case '2': $s = 'Firebird Dialect 2'; break; default: case '3': $s = 'Firebird Dialect 3'; break; } $arr['version'] = ADOConnection::_findvers($s); $arr['description'] = $s; return $arr; } // Note that Interbase 6.5 uses this ROWS instead - don't you love forking wars! // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2 function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false, $secs=0) { $str = 'SELECT '; if ($nrows >= 0) $str .= "FIRST $nrows "; $str .=($offset>=0) ? "SKIP $offset " : ''; $sql = preg_replace('/^[ \t]*select/i',$str,$sql); if ($secs) $rs =& $this->CacheExecute($secs,$sql,$inputarr); else $rs =& $this->Execute($sql,$inputarr); return $rs; } }; class ADORecordSet_firebird extends ADORecordSet_ibase { var $databaseType = "firebird"; function ADORecordSet_firebird($id,$mode=false) { $this->ADORecordSet_ibase($id,$mode); } } ?> --- NEW FILE: adodb-ibase.inc.php --- <?php /* V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jl...@na...). All rights reserved. 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. Latest version is available at http://php.weblogs.com/ Interbase data driver. Requires interbase client. Works on Windows and Unix. 3 Jan 2002 -- suggestions by Hans-Peter Oeri <kam...@oe...> changed transaction handling and added experimental blob stuff Docs to interbase at the website http://www.synectics.co.za/php3/tutorial/IB_PHP3_API.html To use gen_id(), see http://www.volny.cz/iprenosil/interbase/ip_ib_code.htm#_code_creategen $rs = $conn->Execute('select gen_id(adodb,1) from rdb$database'); $id = $rs->fields[0]; $conn->Execute("insert into table (id, col1,...) values ($id, $val1,...)"); */ class ADODB_ibase extends ADOConnection { var $databaseType = "ibase"; var $dataProvider = "ibase"; var $replaceQuote = "''"; // string to use to replace quotes var $ibase_timefmt = '%Y-%m-%d'; // For hours,mins,secs change to '%Y-%m-%d %H:%M:%S'; var $fmtDate = "'Y-m-d'"; var $fmtTimeStamp = "'Y-m-d, H:i:s'"; var $concat_operator='||'; var $_transactionID; var $metaTablesSQL = "select rdb\$relation_name from rdb\$relations where rdb\$relation_name not like 'RDB\$%'"; //OPN STUFF start 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"; //OPN STUFF end var $ibasetrans; var $hasGenID = true; var $_bindInputArray = true; var $buffers = 0; var $dialect = 1; var $sysDate = "cast('TODAY' as date)"; var $sysTimeStamp = "cast('NOW' as timestamp)"; var $ansiOuter = true; var $hasAffectedRows = false; var $poorAffectedRows = true; var $blobEncodeType = 'C'; function ADODB_ibase() { if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT; } function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false) { if ($internalKey) return array('RDB$DB_KEY'); $table = strtoupper($table); $sql = 'SELECT S.RDB$FIELD_NAME AFIELDNAME FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON I.RDB$INDEX_NAME=S.RDB$INDEX_NAME WHERE I.RDB$RELATION_NAME=\''.$table.'\' and I.RDB$INDEX_NAME like \'RDB$PRIMARY%\' ORDER BY I.RDB$INDEX_NAME,S.RDB$FIELD_POSITION'; $a = $this->GetCol($sql,false,true); if ($a && sizeof($a)>0) return $a; return false; } function ServerInfo() { $arr['dialect'] = $this->dialect; switch($arr['dialect']) { case '': case '1': $s = 'Interbase 5.5 or earlier'; break; case '2': $s = 'Interbase 5.6'; break; default: case '3': $s = 'Interbase 6.0'; break; } $arr['version'] = ADOConnection::_findvers($s); $arr['description'] = $s; return $arr; } function BeginTrans() { if ($this->transOff) return true; $this->transCnt += 1; $this->autoCommit = false; $this->_transactionID = $this->_connectionID;//ibase_trans($this->ibasetrans, $this->_connectionID); return $this->_transactionID; } function CommitTrans($ok=true) { if (!$ok) return $this->RollbackTrans(); if ($this->transOff) return true; if ($this->transCnt) $this->transCnt -= 1; $ret = false; $this->autoCommit = true; if ($this->_transactionID) { //print ' commit '; $ret = ibase_commit($this->_transactionID); } $this->_transactionID = false; return $ret; } function RollbackTrans() { if ($this->transOff) return true; if ($this->transCnt) $this->transCnt -= 1; $ret = false; $this->autoCommit = true; if ($this->_transactionID) $ret = ibase_rollback($this->_transactionID); $this->_transactionID = false; return $ret; } function &MetaIndexes ($table, $primary = FALSE, $owner=false) { // save old fetch mode global $ADODB_FETCH_MODE; $save = $ADODB_FETCH_MODE; $ADODB_FETCH_MODE = ADODB_FETCH_NUM; if ($this->fetchMode !== FALSE) { $savem = $this->SetFetchMode(FALSE); } $table = strtoupper($table); $sql = "SELECT * FROM RDB\$INDICES WHERE RDB\$RELATION_NAME = '".$table."'"; if (!$primary) { $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$%'"; } else { $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$FOREIGN%'"; } // get index details $rs = $this->Execute($sql); if (!is_object($rs)) { // restore fetchmode if (isset($savem)) { $this->SetFetchMode($savem); } $ADODB_FETCH_MODE = $save; return FALSE; } $indexes = array (); while ($row = $rs->FetchRow()) { $index = $row[0]; if (!isset($indexes[$index])) { if (is_null($row[3])) {$row[3] = 0;} $indexes[$index] = array( 'unique' => ($row[3] == 1), 'columns' => array() ); } $sql = "SELECT * FROM RDB\$INDEX_SEGMENTS WHERE RDB\$INDEX_NAME = '".$name."' ORDER BY RDB\$FIELD_POSITION ASC"; $rs1 = $this->Execute($sql); while ($row1 = $rs1->FetchRow()) { $indexes[$index]['columns'][$row1[2]] = $row1[1]; } } // restore fetchmode if (isset($savem)) { $this->SetFetchMode($savem); } $ADODB_FETCH_MODE = $save; return $indexes; } // See http://community.borland.com/article/0,1410,25844,00.html function RowLock($tables,$where,$col) { if ($this->autoCommit) $this->BeginTrans(); $this->Execute("UPDATE $table SET $col=$col WHERE $where "); // is this correct - jlim? return 1; } function CreateSequence($seqname,$startID=1) { $ok = $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" )); if (!$ok) return false; return $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';'); } function DropSequence($seqname) { $seqname = strtoupper($seqname); $this->Execute("delete from RDB\$GENERATORS where RDB\$GENERATOR_NAME='$seqname'"); } function GenID($seqname='adodbseq',$startID=1) { $getnext = ("SELECT Gen_ID($seqname,1) FROM RDB\$DATABASE"); $rs = @$this->Execute($getnext); if (!$rs) { $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" )); $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';'); $rs = $this->Execute($getnext); } if ($rs && !$rs->EOF) $this->genID = (integer) reset($rs->fields); else $this->genID = 0; // false if ($rs) $rs->Close(); return $this->genID; } function SelectDB($dbName) { return false; } function _handleerror() { $this->_errorMsg = ibase_errmsg(); } function ErrorNo() { if (preg_match('/error code = ([\-0-9]*)/i', $this->_errorMsg,$arr)) return (integer) $arr[1]; else return 0; } function ErrorMsg() { return $this->_errorMsg; } // returns true or false function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) { if (!function_exists('ibase_pconnect')) return false; if ($argDatabasename) $argHostname .= ':'.$argDatabasename; $this->_connectionID = ibase_connect($argHostname,$argUsername,$argPassword,$this->charSet,$this->buffers,$this->dialect); if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html $this->replaceQuote = "''"; } if ($this->_connectionID === false) { $this->_handleerror(); return false; } ibase_timefmt($this->ibase_timefmt); return true; } // returns true or false function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) { if (!function_exists('ibase_pconnect')) return false; if ($argDatabasename) $argHostname .= ':'.$argDatabasename; $this->_connectionID = ibase_pconnect($argHostname,$argUsername,$argPassword,$this->charSet,$this->buffers,$this->dialect); if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html $this->replaceQuote = "''"; } if ($this->_connectionID === false) { $this->_handleerror(); return false; } ibase_timefmt($this->ibase_timefmt); return true; } function Prepare($sql) { $stmt = ibase_prepare($this->_connectionID,$sql); if (!$stmt) return false; return array($sql,$stmt); } // returns query ID if successful, otherwise false // there have been reports of problems with nested queries - the code is probably not re-entrant? function _query($sql,$iarr=false) { if (!$this->autoCommit && $this->_transactionID) { $conn = $this->_transactionID; $docommit = false; } else { $conn = $this->_connectionID; $docommit = true; } if (is_array($sql)) { $fn = 'ibase_execute'; $sql = $sql[1]; if (is_array($iarr)) { if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4 if ( !isset($iarr[0]) ) $iarr[0] = ''; // PHP5 compat hack $fnarr =& array_merge( array($sql) , $iarr); $ret = call_user_func_array($fn,$fnarr); } else { switch(sizeof($iarr)) { case 1: $ret = $fn($sql,$iarr[0]); break; case 2: $ret = $fn($sql,$iarr[0],$iarr[1]); break; case 3: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2]); break; case 4: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break; case 5: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break; case 6: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break; case 7: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break; default: ADOConnection::outp( "Too many parameters to ibase query $sql"); case 8: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break; } } } else $ret = $fn($sql); } else { $fn = 'ibase_query'; if (is_array($iarr)) { if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4 if ( !isset($iarr[0]) ) $iarr[0] = ''; // PHP5 compat hack $fnarr =& array_merge( array($conn,$sql) , $iarr); $ret = call_user_func_array($fn,$fnarr); } else { switch(sizeof($iarr)) { case 1: $ret = $fn($conn,$sql,$iarr[0]); break; case 2: $ret = $fn($conn,$sql,$iarr[0],$iarr[1]); break; case 3: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2]); break; case 4: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break; case 5: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break; case 6: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break; case 7: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break; default: ADOConnection::outp( "Too many parameters to ibase query $sql"); case 8: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break; } } } else $ret = $fn($conn,$sql); } if ($docommit && $ret === true) ibase_commit($this->_connectionID); $this->_handleerror(); return $ret; } // returns true or false function _close() { if (!$this->autoCommit) @ibase_rollback($this->_connectionID); return @ibase_close($this->_connectionID); } //OPN STUFF start function _ConvertFieldType(&$fld, $ftype, $flen, $fscale, $fsubtype, $fprecision, $isInterbase6) { $fscale = abs($fscale); $fld->max_length = $flen; $fld->scale = null; switch($ftype){ case 7: case 8: if ($isInterbase6) { switch($fsubtype){ case 0: $fld->type = ($ftype == 7 ? 'smallint' : 'integer'); break; case 1: $fld->type = 'numeric'; $fld->max_length = $fprecision; $fld->scale = $fscale; break; case 2: $fld->type = 'decimal'; $fld->max_length = $fprecision; $fld->scale = $fscale; break; } // switch } else { if ($fscale !=0) { $fld->type = 'decimal'; $fld->scale = $fscale; $fld->max_length = ($ftype == 7 ? 4 : 9); } else { $fld->type = ($ftype == 7 ? 'smallint' : 'integer'); } } break; case 16: if ($isInterbase6) { switch($fsubtype){ case 0: $fld->type = 'decimal'; $fld->max_length = 18; $fld->scale = 0; break; case 1: $fld->type = 'numeric'; $fld->max_length = $fprecision; $fld->scale = $fscale; break; case 2: $fld->type = 'decimal'; $fld->max_length = $fprecision; $fld->scale = $fscale; break; } // switch } break; case 10: $fld->type = 'float'; break; case 14: $fld->type = 'char'; break; case 27: if ($fscale !=0) { $fld->type = 'decimal'; $fld->max_length = 15; $fld->scale = 5; } else { $fld->type = 'double'; } break; case 35: if ($isInterbase6) { $fld->type = 'timestamp'; } else { $fld->type = 'date'; } break; case 12: case 13: $fld->type = 'date'; break; case 37: $fld->type = 'varchar'; break; case 40: $fld->type = 'cstring'; break; case 261: $fld->type = 'blob'; $fld->max_length = -1; break; } // switch } //OPN STUFF end // returns array of ADOFieldObjects for current table function &MetaColumns($table) { global $ADODB_FETCH_MODE; if ($this->metaColumnsSQL) { $save = $ADODB_FETCH_MODE; $ADODB_FETCH_MODE = ADODB_FETCH_NUM; $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); $ADODB_FETCH_MODE = $save; if ($rs === false) return false; $retarr = array(); //OPN STUFF start $isInterbase6 = ($this->dialect==3 ? true : false); //OPN STUFF end while (!$rs->EOF) { //print_r($rs->fields); $fld = new ADOFieldObject(); $fld->name = trim($rs->fields[0]); //OPN STUFF start $this->_ConvertFieldType($fld, $rs->fields[7], $rs->fields[3], $rs->fields[4], $rs->fields[5], $rs->fields[6], $isInterbase6); if (isset($rs->fields[1]) && $rs->fields[1]) { $fld->not_null = true; } if (isset($rs->fields[2])) { $fld->has_default = true; $d = substr($rs->fields[2],strlen('default ')); switch ($fld->type) { case 'smallint': case 'integer': $fld->default_value = (int) $d; ... [truncated message content] |