diff options
author | wei <> | 2006-05-19 03:05:18 +0000 |
---|---|---|
committer | wei <> | 2006-05-19 03:05:18 +0000 |
commit | e9044ac913b511f9f1b2aad12d18a79f40131b8b (patch) | |
tree | 718826f09c41ecb4e24b66fb298fdb4b6d2781bb | |
parent | da16a673911a0058e9a1cab16ad02116f85ddc06 (diff) |
Update TAdodb and removed a few drivers.
-rw-r--r-- | .gitattributes | 10 | ||||
-rw-r--r-- | framework/3rdParty/adodb/drivers/adodb-db2.inc.php | 687 | ||||
-rw-r--r-- | framework/3rdParty/adodb/drivers/adodb-firebird.inc.php | 77 | ||||
-rw-r--r-- | framework/3rdParty/adodb/drivers/adodb-odbc_db2.inc.php | 362 | ||||
-rw-r--r-- | framework/3rdParty/adodb/drivers/adodb-postgres.inc.php | 14 | ||||
-rw-r--r-- | framework/3rdParty/adodb/drivers/adodb-postgres8.inc.php | 12 | ||||
-rw-r--r-- | framework/3rdParty/adodb/drivers/adodb-sapdb.inc.php | 184 | ||||
-rw-r--r-- | framework/3rdParty/adodb/drivers/adodb-sqlanywhere.inc.php | 169 | ||||
-rw-r--r-- | framework/3rdParty/adodb/drivers/adodb-sqlitepo.inc.php | 62 | ||||
-rw-r--r-- | framework/3rdParty/adodb/drivers/adodb-sybase.inc.php | 418 | ||||
-rw-r--r-- | framework/3rdParty/adodb/drivers/adodb-sybase_ase.inc.php | 115 | ||||
-rw-r--r-- | framework/DataAccess/TAdodb.php | 256 | ||||
-rw-r--r-- | framework/DataAccess/TDatabaseProvider.php | 150 |
13 files changed, 336 insertions, 2180 deletions
diff --git a/.gitattributes b/.gitattributes index 51a4e35c..c40cf722 100644 --- a/.gitattributes +++ b/.gitattributes @@ -437,8 +437,6 @@ framework/3rdParty/adodb/docs/tips_portable_sql.htm -text framework/3rdParty/adodb/docs/tute.htm -text framework/3rdParty/adodb/drivers/adodb-ado5.inc.php -text framework/3rdParty/adodb/drivers/adodb-ado_mssql.inc.php -text -framework/3rdParty/adodb/drivers/adodb-db2.inc.php -text -framework/3rdParty/adodb/drivers/adodb-firebird.inc.php -text framework/3rdParty/adodb/drivers/adodb-ldap.inc.php -text framework/3rdParty/adodb/drivers/adodb-mssql.inc.php -text framework/3rdParty/adodb/drivers/adodb-mssqlpo.inc.php -text @@ -449,7 +447,6 @@ framework/3rdParty/adodb/drivers/adodb-oci8.inc.php -text framework/3rdParty/adodb/drivers/adodb-oci805.inc.php -text framework/3rdParty/adodb/drivers/adodb-oci8po.inc.php -text framework/3rdParty/adodb/drivers/adodb-odbc.inc.php -text -framework/3rdParty/adodb/drivers/adodb-odbc_db2.inc.php -text framework/3rdParty/adodb/drivers/adodb-odbc_mssql.inc.php -text framework/3rdParty/adodb/drivers/adodb-odbc_oracle.inc.php -text framework/3rdParty/adodb/drivers/adodb-oracle.inc.php -text @@ -458,16 +455,9 @@ framework/3rdParty/adodb/drivers/adodb-pdo_mssql.inc.php -text framework/3rdParty/adodb/drivers/adodb-pdo_mysql.inc.php -text framework/3rdParty/adodb/drivers/adodb-pdo_oci.inc.php -text framework/3rdParty/adodb/drivers/adodb-pdo_pgsql.inc.php -text -framework/3rdParty/adodb/drivers/adodb-postgres.inc.php -text framework/3rdParty/adodb/drivers/adodb-postgres64.inc.php -text framework/3rdParty/adodb/drivers/adodb-postgres7.inc.php -text -framework/3rdParty/adodb/drivers/adodb-postgres8.inc.php -text -framework/3rdParty/adodb/drivers/adodb-sapdb.inc.php -text -framework/3rdParty/adodb/drivers/adodb-sqlanywhere.inc.php -text framework/3rdParty/adodb/drivers/adodb-sqlite.inc.php -text -framework/3rdParty/adodb/drivers/adodb-sqlitepo.inc.php -text -framework/3rdParty/adodb/drivers/adodb-sybase.inc.php -text -framework/3rdParty/adodb/drivers/adodb-sybase_ase.inc.php -text framework/3rdParty/adodb/license.txt -text framework/3rdParty/adodb/readme.txt -text framework/3rdParty/geshi/docs/COPYING -text diff --git a/framework/3rdParty/adodb/drivers/adodb-db2.inc.php b/framework/3rdParty/adodb/drivers/adodb-db2.inc.php deleted file mode 100644 index a0f67e0a..00000000 --- a/framework/3rdParty/adodb/drivers/adodb-db2.inc.php +++ /dev/null @@ -1,687 +0,0 @@ -<?php -/* - V4.81 3 May 2006 (c) 2006 John Lim (jlim#natsoft.com.my). All rights reserved. - -This is a version of the ADODB driver for DB2. It uses the 'ibm_db2' PECL extension for PHP - (http://pecl.php.net/package/ibm_db2), which in turn requires DB2 V8.2.2. - - Tested with PHP 5.1.1 and Apache 2.0.55 on Windows XP SP2. - - This file was ported from "adodb-odbc.inc.php" by Larry Menard, "larry.menard@rogers.com". - I ripped out what I believed to be a lot of redundant or obsolete code, but there are - probably still some remnants of the ODBC support in this file; I'm relying on reviewers - of this code to point out any other things that can be removed. -*/ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - - define("_ADODB_DB2_LAYER", 2 ); - -/*-------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------*/ - - -class ADODB_db2 extends ADOConnection { - var $databaseType = "db2"; - var $fmtDate = "'Y-m-d'"; - var $fmtTimeStamp = "'Y-m-d, h:i:sA'"; - var $replaceQuote = "''"; // string to use to replace quotes - var $dataProvider = "db2"; - var $hasAffectedRows = true; - - var $binmode = DB2_BINARY; - - var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive - // breaking backward-compat - var $_bindInputArray = false; - var $_genSeqSQL = "create table %s (id integer)"; - var $_autocommit = true; - var $_haserrorfunctions = true; - var $_lastAffectedRows = 0; - var $uCaseTables = true; // for meta* functions, uppercase table names - - function ADODB_db2() - { - $this->_haserrorfunctions = ADODB_PHPVER >= 0x4050; - } - - // returns true or false - function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) - { - global $php_errormsg; - - if (!function_exists('db2_connect')) { - ADOConnection::outp("Warning: The old ODBC based DB2 driver has been renamed 'odbc_db2'. This ADOdb driver calls PHP's native db2 extension."); - return null; - } - // This needs to be set before the connect(). - // Replaces the odbc_binmode() call that was in Execute() - ini_set('ibm_db2.binmode', $this->binmode); - - if ($argDatabasename) { - $this->_connectionID = db2_connect($argDatabasename,$argUsername,$argPassword); - } else { - $this->_connectionID = db2_connect($argDSN,$argUsername,$argPassword); - } - if (isset($php_errormsg)) $php_errormsg = ''; - - // For db2_connect(), there is an optional 4th arg. If present, it must be - // an array of valid options. So far, we don't use them. - - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - if (isset($this->connectStmt)) $this->Execute($this->connectStmt); - - return $this->_connectionID != false; - } - - // returns true or false - function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) - { - global $php_errormsg; - - if (!function_exists('db2_connect')) return null; - - // This needs to be set before the connect(). - // Replaces the odbc_binmode() call that was in Execute() - ini_set('ibm_db2.binmode', $this->binmode); - - if (isset($php_errormsg)) $php_errormsg = ''; - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - - if ($argDatabasename) { - $this->_connectionID = db2_pconnect($argDatabasename,$argUsername,$argPassword); - } else { - $this->_connectionID = db2_pconnect($argDSN,$argUsername,$argPassword); - } - if (isset($php_errormsg)) $php_errormsg = ''; - - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - if ($this->_connectionID && $this->autoRollback) @db2_rollback($this->_connectionID); - if (isset($this->connectStmt)) $this->Execute($this->connectStmt); - - return $this->_connectionID != false; - } - - - function ServerInfo() - { - - if (!empty($this->host) && ADODB_PHPVER >= 0x4300) { - $dsn = strtoupper($this->host); - $first = true; - $found = false; - - if (!function_exists('db2_data_source')) return false; - - while(true) { - - $rez = @db2_data_source($this->_connectionID, - $first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT); - $first = false; - if (!is_array($rez)) break; - if (strtoupper($rez['server']) == $dsn) { - $found = true; - break; - } - } - if (!$found) return ADOConnection::ServerInfo(); - if (!isset($rez['version'])) $rez['version'] = ''; - return $rez; - } else { - return ADOConnection::ServerInfo(); - } - } - - - function CreateSequence($seqname='adodbseq',$start=1) - { - if (empty($this->_genSeqSQL)) return false; - $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname)); - if (!$ok) return false; - $start -= 1; - return $this->Execute("insert into $seqname values($start)"); - } - - var $_dropSeqSQL = 'drop table %s'; - function DropSequence($seqname) - { - if (empty($this->_dropSeqSQL)) return false; - return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); - } - - /* - This algorithm is not very efficient, but works even if table locking - is not available. - - Will return false if unable to generate an ID after $MAXLOOPS attempts. - */ - function GenID($seq='adodbseq',$start=1) - { - // if you have to modify the parameter below, your database is overloaded, - // or you need to implement generation of id's yourself! - $MAXLOOPS = 100; - while (--$MAXLOOPS>=0) { - $num = $this->GetOne("select id from $seq"); - if ($num === false) { - $this->Execute(sprintf($this->_genSeqSQL ,$seq)); - $start -= 1; - $num = '0'; - $ok = $this->Execute("insert into $seq values($start)"); - if (!$ok) return false; - } - $this->Execute("update $seq set id=id+1 where id=$num"); - - if ($this->affected_rows() > 0) { - $num += 1; - $this->genID = $num; - return $num; - } - } - if ($fn = $this->raiseErrorFn) { - $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); - } - return false; - } - - - function ErrorMsg() - { - if ($this->_haserrorfunctions) { - if ($this->_errorMsg !== false) return $this->_errorMsg; - if (empty($this->_connectionID)) return @db2_errormsg(); - return @db2_errormsg($this->_connectionID); - } else return ADOConnection::ErrorMsg(); - } - - function ErrorNo() - { - - if ($this->_haserrorfunctions) { - if ($this->_errorCode !== false) { - // bug in 4.0.6, error number can be corrupted string (should be 6 digits) - return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode; - } - - if (empty($this->_connectionID)) $e = @db2_error(); - else $e = @db2_error($this->_connectionID); - - // bug in 4.0.6, error number can be corrupted string (should be 6 digits) - // so we check and patch - if (strlen($e)<=2) return 0; - return $e; - } else return ADOConnection::ErrorNo(); - } - - - - function BeginTrans() - { - if (!$this->hasTransactions) return false; - if ($this->transOff) return true; - $this->transCnt += 1; - $this->_autocommit = false; - return db2_autocommit($this->_connectionID,false); - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - if ($this->transCnt) $this->transCnt -= 1; - $this->_autocommit = true; - $ret = db2_commit($this->_connectionID); - db2_autocommit($this->_connectionID,true); - return $ret; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $this->_autocommit = true; - $ret = db2_rollback($this->_connectionID); - db2_autocommit($this->_connectionID,true); - return $ret; - } - - function MetaPrimaryKeys($table) - { - global $ADODB_FETCH_MODE; - - if ($this->uCaseTables) $table = strtoupper($table); - $schema = ''; - $this->_findschema($table,$schema); - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $qid = @db2_primarykeys($this->_connectionID,'',$schema,$table); - - if (!$qid) { - $ADODB_FETCH_MODE = $savem; - return false; - } - $rs = new ADORecordSet_db2($qid); - $ADODB_FETCH_MODE = $savem; - - if (!$rs) return false; - - $arr =& $rs->GetArray(); - $rs->Close(); - $arr2 = array(); - for ($i=0; $i < sizeof($arr); $i++) { - if ($arr[$i][3]) $arr2[] = $arr[$i][3]; - } - return $arr2; - } - - - - function &MetaTables($ttype=false) - { - global $ADODB_FETCH_MODE; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $qid = db2_tables($this->_connectionID); - - $rs = new ADORecordSet_db2($qid); - - $ADODB_FETCH_MODE = $savem; - if (!$rs) { - $false = false; - return $false; - } - - $arr =& $rs->GetArray(); - - $rs->Close(); - $arr2 = array(); - - if ($ttype) { - $isview = strncmp($ttype,'V',1) === 0; - } - for ($i=0; $i < sizeof($arr); $i++) { - if (!$arr[$i][2]) continue; - $type = $arr[$i][3]; - if ($ttype) { - if ($isview) { - if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2]; - } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2]; - } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2]; - } - return $arr2; - } - -/* -See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2datetime_data_type_changes.asp -/ SQL data type codes / -#define SQL_UNKNOWN_TYPE 0 -#define SQL_CHAR 1 -#define SQL_NUMERIC 2 -#define SQL_DECIMAL 3 -#define SQL_INTEGER 4 -#define SQL_SMALLINT 5 -#define SQL_FLOAT 6 -#define SQL_REAL 7 -#define SQL_DOUBLE 8 -#if (DB2VER >= 0x0300) -#define SQL_DATETIME 9 -#endif -#define SQL_VARCHAR 12 - - -/ One-parameter shortcuts for date/time data types / -#if (DB2VER >= 0x0300) -#define SQL_TYPE_DATE 91 -#define SQL_TYPE_TIME 92 -#define SQL_TYPE_TIMESTAMP 93 - -#define SQL_UNICODE (-95) -#define SQL_UNICODE_VARCHAR (-96) -#define SQL_UNICODE_LONGVARCHAR (-97) -*/ - function DB2Types($t) - { - switch ((integer)$t) { - case 1: - case 12: - case 0: - case -95: - case -96: - return 'C'; - case -97: - case -1: //text - return 'X'; - case -4: //image - return 'B'; - - case 9: - case 91: - return 'D'; - - case 10: - case 11: - case 92: - case 93: - return 'T'; - - case 4: - case 5: - case -6: - return 'I'; - - case -11: // uniqidentifier - return 'R'; - case -7: //bit - return 'L'; - - default: - return 'N'; - } - } - - function &MetaColumns($table) - { - global $ADODB_FETCH_MODE; - - $false = false; - if ($this->uCaseTables) $table = strtoupper($table); - $schema = ''; - $this->_findschema($table,$schema); - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - - $colname = "%"; - $qid = db2_columns($this->_connectionID, "", $schema, $table, $colname); - if (empty($qid)) return $false; - - $rs =& new ADORecordSet_db2($qid); - $ADODB_FETCH_MODE = $savem; - - if (!$rs) return $false; - $rs->_fetch(); - - $retarr = array(); - - /* - $rs->fields indices - 0 TABLE_QUALIFIER - 1 TABLE_SCHEM - 2 TABLE_NAME - 3 COLUMN_NAME - 4 DATA_TYPE - 5 TYPE_NAME - 6 PRECISION - 7 LENGTH - 8 SCALE - 9 RADIX - 10 NULLABLE - 11 REMARKS - */ - while (!$rs->EOF) { - if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[3]; - $fld->type = $this->DB2Types($rs->fields[4]); - - // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp - // access uses precision to store length for char/varchar - if ($fld->type == 'C' or $fld->type == 'X') { - if ($rs->fields[4] <= -95) // UNICODE - $fld->max_length = $rs->fields[7]/2; - else - $fld->max_length = $rs->fields[7]; - } else - $fld->max_length = $rs->fields[7]; - $fld->not_null = !empty($rs->fields[10]); - $fld->scale = $rs->fields[8]; - $retarr[strtoupper($fld->name)] = $fld; - } else if (sizeof($retarr)>0) - break; - $rs->MoveNext(); - } - $rs->Close(); //-- crashes 4.03pl1 -- why? - - if (empty($retarr)) $retarr = false; - return $retarr; - } - - function Prepare($sql) - { - if (! $this->_bindInputArray) return $sql; // no binding - $stmt = db2_prepare($this->_connectionID,$sql); - if (!$stmt) { - // we don't know whether db2 driver is parsing prepared stmts, so just return sql - return $sql; - } - return array($sql,$stmt,false); - } - - /* returns queryID or false */ - function _query($sql,$inputarr=false) - { - GLOBAL $php_errormsg; - if (isset($php_errormsg)) $php_errormsg = ''; - $this->_error = ''; - - if ($inputarr) { - if (is_array($sql)) { - $stmtid = $sql[1]; - } else { - $stmtid = db2_prepare($this->_connectionID,$sql); - - if ($stmtid == false) { - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - return false; - } - } - - if (! db2_execute($stmtid,$inputarr)) { - if ($this->_haserrorfunctions) { - $this->_errorMsg = db2_errormsg(); - $this->_errorCode = db2_error(); - } - return false; - } - - } else if (is_array($sql)) { - $stmtid = $sql[1]; - if (!db2_execute($stmtid)) { - if ($this->_haserrorfunctions) { - $this->_errorMsg = db2_errormsg(); - $this->_errorCode = db2_error(); - } - return false; - } - } else - $stmtid = db2_exec($this->_connectionID,$sql); - - $this->_lastAffectedRows = 0; - if ($stmtid) { - if (@db2_num_fields($stmtid) == 0) { - $this->_lastAffectedRows = db2_num_rows($stmtid); - $stmtid = true; - } else { - $this->_lastAffectedRows = 0; - } - - if ($this->_haserrorfunctions) { - $this->_errorMsg = ''; - $this->_errorCode = 0; - } else - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - } else { - if ($this->_haserrorfunctions) { - $this->_errorMsg = db2_stmt_errormsg(); - $this->_errorCode = db2_stmt_error(); - } else - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - } - return $stmtid; - } - - /* - Insert a null into the blob field of the table first. - Then use UpdateBlob to store the blob. - - Usage: - - $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); - $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); - */ - function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false; - } - - // returns true or false - function _close() - { - $ret = @db2_close($this->_connectionID); - $this->_connectionID = false; - return $ret; - } - - function _affectedrows() - { - return $this->_lastAffectedRows; - } - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset ---------------------------------------------------------------------------------------*/ - -class ADORecordSet_db2 extends ADORecordSet { - - var $bind = false; - var $databaseType = "db2"; - var $dataProvider = "db2"; - var $useFetchArray; - - function ADORecordSet_db2($id,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - $this->fetchMode = $mode; - - $this->_queryID = $id; - } - - - // returns the field object - function &FetchField($fieldOffset = -1) - { - - $off=$fieldOffset+1; // offsets begin at 1 - - $o= new ADOFieldObject(); - $o->name = @db2_field_name($this->_queryID,$off); - $o->type = @db2_field_type($this->_queryID,$off); - $o->max_length = db2_field_width($this->_queryID,$off); - if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); - else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); - 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() - { - global $ADODB_COUNTRECS; - $this->_numOfRows = ($ADODB_COUNTRECS) ? @db2_num_rows($this->_queryID) : -1; - $this->_numOfFields = @db2_num_fields($this->_queryID); - // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0 - if ($this->_numOfRows == 0) $this->_numOfRows = -1; - } - - function _seek($row) - { - return false; - } - - // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated - function &GetArrayLimit($nrows,$offset=-1) - { - if ($offset <= 0) { - $rs =& $this->GetArray($nrows); - return $rs; - } - $savem = $this->fetchMode; - $this->fetchMode = ADODB_FETCH_NUM; - $this->Move($offset); - $this->fetchMode = $savem; - - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - - $results = array(); - $cnt = 0; - while (!$this->EOF && $nrows != $cnt) { - $results[$cnt++] = $this->fields; - $this->MoveNext(); - } - - return $results; - } - - - function MoveNext() - { - if ($this->_numOfRows != 0 && !$this->EOF) { - $this->_currentRow++; - - $this->fields = @db2_fetch_array($this->_queryID); - if ($this->fields) { - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - return true; - } - } - $this->fields = false; - $this->EOF = true; - return false; - } - - function _fetch() - { - - $this->fields = db2_fetch_array($this->_queryID); - if ($this->fields) { - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - return true; - } - $this->fields = false; - return false; - } - - function _close() - { - return @db2_free_result($this->_queryID); - } - -} -?>
\ No newline at end of file diff --git a/framework/3rdParty/adodb/drivers/adodb-firebird.inc.php b/framework/3rdParty/adodb/drivers/adodb-firebird.inc.php deleted file mode 100644 index 286ca179..00000000 --- a/framework/3rdParty/adodb/drivers/adodb-firebird.inc.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php -/* -V4.81 3 May 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). 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://adodb.sourceforge.net - -*/ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php"); - -class ADODB_firebird extends ADODB_ibase { - var $databaseType = "firebird"; - var $dialect = 3; - - var $sysTimeStamp = "cast('NOW' as timestamp)"; - - 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) - { - $nrows = (integer) $nrows; - $offset = (integer) $offset; - $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); - } -} -?>
\ No newline at end of file diff --git a/framework/3rdParty/adodb/drivers/adodb-odbc_db2.inc.php b/framework/3rdParty/adodb/drivers/adodb-odbc_db2.inc.php deleted file mode 100644 index 4e9fee2a..00000000 --- a/framework/3rdParty/adodb/drivers/adodb-odbc_db2.inc.php +++ /dev/null @@ -1,362 +0,0 @@ -<?php -/* -V4.81 3 May 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). 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://adodb.sourceforge.net - - 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. - - -*/ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -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 = true; - var $hasInsertID = true; - - 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,$flds='1 as ignore') - { - if ($this->_autocommit) $this->BeginTrans(); - return $this->GetOne("select $flds from $tables where $where for update"); - } - - function &MetaTables($ttype=false,$showSchema=false, $qtable="%", $qschema="%") - { - global $ADODB_FETCH_MODE; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $qid = odbc_tables($this->_connectionID, "", $qschema, $qtable, ""); - - $rs = new ADORecordSet_odbc($qid); - - $ADODB_FETCH_MODE = $savem; - if (!$rs) { - $false = false; - 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; - } - - 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); - } - $false = false; - // get index details - $table = strtoupper($table); - $SQL="SELECT NAME, UNIQUERULE, COLNAMES FROM SYSIBM.SYSINDEXES WHERE TBNAME='$table'"; - if ($primary) - $SQL.= " AND UNIQUERULE='P'"; - $rs = $this->Execute($SQL); - if (!is_object($rs)) { - if (isset($savem)) - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - return $false; - } - $indexes = array (); - // parse index data into array - while ($row = $rs->FetchRow()) { - $indexes[$row[0]] = array( - 'unique' => ($row[1] == 'U' || $row[1] == 'P'), - 'columns' => array() - ); - $cols = ltrim($row[2],'+'); - $indexes[$row[0]]['columns'] = explode('+', $cols); - } - if (isset($savem)) { - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - } - return $indexes; - } - - // 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) - { - $nrows = (integer) $nrows; - 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': - case 'C': - if ($len <= $this->blobSize) return 'C'; - - case 'LONGCHAR': - case 'TEXT': - case 'CLOB': - case 'DBCLOB': // double-byte - case 'X': - return 'X'; - - case 'BLOB': - case 'GRAPHIC': - case 'VARGRAPHIC': - return 'B'; - - case 'DATE': - case 'D': - return 'D'; - - case 'TIME': - case 'TIMESTAMP': - case 'T': - return 'T'; - - //case 'BOOLEAN': - //case 'BIT': - // return 'L'; - - //case 'COUNTER': - // return 'R'; - - case 'INT': - case 'INTEGER': - case 'BIGINT': - case 'SMALLINT': - case 'I': - return 'I'; - - default: return 'N'; - } - } -} - -} //define -?>
\ No newline at end of file diff --git a/framework/3rdParty/adodb/drivers/adodb-postgres.inc.php b/framework/3rdParty/adodb/drivers/adodb-postgres.inc.php deleted file mode 100644 index 63a057d4..00000000 --- a/framework/3rdParty/adodb/drivers/adodb-postgres.inc.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/* - V4.81 3 May 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). 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. - - NOTE: Since 3.31, this file is no longer used, and the "postgres" driver is - remapped to "postgres7". Maintaining multiple postgres drivers is no easy - job, so hopefully this will ensure greater consistency and fewer bugs. -*/ - -?>
\ No newline at end of file diff --git a/framework/3rdParty/adodb/drivers/adodb-postgres8.inc.php b/framework/3rdParty/adodb/drivers/adodb-postgres8.inc.php deleted file mode 100644 index 80d6e186..00000000 --- a/framework/3rdParty/adodb/drivers/adodb-postgres8.inc.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php -/* - V4.81 3 May 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). 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. - - NOTE: The "postgres8" driver is remapped to "postgres7". -*/ - -?>
\ No newline at end of file diff --git a/framework/3rdParty/adodb/drivers/adodb-sapdb.inc.php b/framework/3rdParty/adodb/drivers/adodb-sapdb.inc.php deleted file mode 100644 index df9fb45e..00000000 --- a/framework/3rdParty/adodb/drivers/adodb-sapdb.inc.php +++ /dev/null @@ -1,184 +0,0 @@ -<?php -/* -V4.81 3 May 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). 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://adodb.sourceforge.net - - SAPDB data driver. Requires ODBC. - -*/ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -if (!defined('_ADODB_ODBC_LAYER')) { - include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); -} -if (!defined('ADODB_SAPDB')){ -define('ADODB_SAPDB',1); - -class ADODB_SAPDB extends ADODB_odbc { - var $databaseType = "sapdb"; - var $concat_operator = '||'; - var $sysDate = 'DATE'; - var $sysTimeStamp = 'TIMESTAMP'; - var $fmtDate = "'Y-m-d'"; /// used by DBDate() as the default date format used by the database - var $fmtTimeStamp = "'Y-m-d H:i:s'"; /// used by DBTimeStamp as the default timestamp fmt. - var $hasInsertId = true; - var $_bindInputArray = true; - - function ADODB_SAPDB() - { - //if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC; - $this->ADODB_odbc(); - } - - function ServerInfo() - { - $info = ADODB_odbc::ServerInfo(); - if (!$info['version'] && preg_match('/([0-9.]+)/',$info['description'],$matches)) { - $info['version'] = $matches[1]; - } - return $info; - } - - function MetaPrimaryKeys($table) - { - $table = $this->Quote(strtoupper($table)); - - return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos"); - } - - function &MetaIndexes ($table, $primary = FALSE) - { - $table = $this->Quote(strtoupper($table)); - - $sql = "SELECT INDEXNAME,TYPE,COLUMNNAME FROM INDEXCOLUMNS ". - " WHERE TABLENAME=$table". - " ORDER BY INDEXNAME,COLUMNNO"; - - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - - $rs = $this->Execute($sql); - if (isset($savem)) { - $this->SetFetchMode($savem); - } - $ADODB_FETCH_MODE = $save; - - if (!is_object($rs)) { - return FALSE; - } - - $indexes = array(); - while ($row = $rs->FetchRow()) { - $indexes[$row[0]]['unique'] = $row[1] == 'UNIQUE'; - $indexes[$row[0]]['columns'][] = $row[2]; - } - if ($primary) { - $indexes['SYSPRIMARYKEYINDEX'] = array( - 'unique' => True, // by definition - 'columns' => $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos"), - ); - } - return $indexes; - } - - function &MetaColumns ($table) - { - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - $table = $this->Quote(strtoupper($table)); - - $retarr = array(); - foreach($this->GetAll("SELECT COLUMNNAME,DATATYPE,LEN,DEC,NULLABLE,MODE,\"DEFAULT\",CASE WHEN \"DEFAULT\" IS NULL THEN 0 ELSE 1 END AS HAS_DEFAULT FROM COLUMNS WHERE tablename=$table ORDER BY pos") as $column) - { - $fld = new ADOFieldObject(); - $fld->name = $column[0]; - $fld->type = $column[1]; - $fld->max_length = $fld->type == 'LONG' ? 2147483647 : $column[2]; - $fld->scale = $column[3]; - $fld->not_null = $column[4] == 'NO'; - $fld->primary_key = $column[5] == 'KEY'; - if ($fld->has_default = $column[7]) { - if ($fld->primary_key && $column[6] == 'DEFAULT SERIAL (1)') { - $fld->auto_increment = true; - $fld->has_default = false; - } else { - $fld->default_value = $column[6]; - switch($fld->type) { - case 'VARCHAR': - case 'CHARACTER': - case 'LONG': - $fld->default_value = $column[6]; - break; - default: - $fld->default_value = trim($column[6]); - break; - } - } - } - $retarr[$fld->name] = $fld; - } - if (isset($savem)) { - $this->SetFetchMode($savem); - } - $ADODB_FETCH_MODE = $save; - - return $retarr; - } - - function MetaColumnNames($table) - { - $table = $this->Quote(strtoupper($table)); - - return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table ORDER BY pos"); - } - - // unlike it seems, this depends on the db-session and works in a multiuser environment - function _insertid($table,$column) - { - return empty($table) ? False : $this->GetOne("SELECT $table.CURRVAL FROM DUAL"); - } - - /* - SelectLimit implementation problems: - - The following will return random 10 rows as order by performed after "WHERE rowno<10" - which is not ideal... - - select * from table where rowno < 10 order by 1 - - This means that we have to use the adoconnection base class SelectLimit when - there is an "order by". - - See http://listserv.sap.com/pipermail/sapdb.general/2002-January/010405.html - */ - -}; - - -class ADORecordSet_sapdb extends ADORecordSet_odbc { - - var $databaseType = "sapdb"; - - function ADORecordSet_sapdb($id,$mode=false) - { - $this->ADORecordSet_odbc($id,$mode); - } -} - -} //define -?>
\ No newline at end of file diff --git a/framework/3rdParty/adodb/drivers/adodb-sqlanywhere.inc.php b/framework/3rdParty/adodb/drivers/adodb-sqlanywhere.inc.php deleted file mode 100644 index cd023cc9..00000000 --- a/framework/3rdParty/adodb/drivers/adodb-sqlanywhere.inc.php +++ /dev/null @@ -1,169 +0,0 @@ -<?php -/* -version V4.81 3 May 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). 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://adodb.sourceforge.net - - 21.02.2002 - Wade Johnson wade@wadejohnson.de - Extended ODBC class for Sybase SQLAnywhere. - 1) Added support to retrieve the last row insert ID on tables with - primary key column using autoincrement function. - - 2) Added blob support. Usage: - a) create blob variable on db server: - - $dbconn->create_blobvar($blobVarName); - - b) load blob var from file. $filename must be complete path - - $dbcon->load_blobvar_from_file($blobVarName, $filename); - - c) Use the $blobVarName in SQL insert or update statement in the values - clause: - - $recordSet = $dbconn->Execute('INSERT INTO tabname (idcol, blobcol) ' - . - 'VALUES (\'test\', ' . $blobVarName . ')'); - - instead of loading blob from a file, you can also load from - an unformatted (raw) blob variable: - $dbcon->load_blobvar_from_var($blobVarName, $varName); - - d) drop blob variable on db server to free up resources: - $dbconn->drop_blobvar($blobVarName); - - Sybase_SQLAnywhere data driver. Requires ODBC. - -*/ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -if (!defined('_ADODB_ODBC_LAYER')) { - include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); -} - -if (!defined('ADODB_SYBASE_SQLANYWHERE')){ - - define('ADODB_SYBASE_SQLANYWHERE',1); - - class ADODB_sqlanywhere extends ADODB_odbc { - var $databaseType = "sqlanywhere"; - var $hasInsertID = true; - - function ADODB_sqlanywhere() - { - $this->ADODB_odbc(); - } - - function _insertid() { - return $this->GetOne('select @@identity'); - } - - function create_blobvar($blobVarName) { - $this->Execute("create variable $blobVarName long binary"); - return; - } - - function drop_blobvar($blobVarName) { - $this->Execute("drop variable $blobVarName"); - return; - } - - function load_blobvar_from_file($blobVarName, $filename) { - $chunk_size = 1000; - - $fd = fopen ($filename, "rb"); - - $integer_chunks = (integer)filesize($filename) / $chunk_size; - $modulus = filesize($filename) % $chunk_size; - if ($modulus != 0){ - $integer_chunks += 1; - } - - for($loop=1;$loop<=$integer_chunks;$loop++){ - $contents = fread ($fd, $chunk_size); - $contents = bin2hex($contents); - - $hexstring = ''; - - for($loop2=0;$loop2<strlen($contents);$loop2+=2){ - $hexstring .= '\x' . substr($contents,$loop2,2); - } - - $hexstring = $this->qstr($hexstring); - - $this->Execute("set $blobVarName = $blobVarName || " . $hexstring); - } - - fclose ($fd); - return; - } - - function load_blobvar_from_var($blobVarName, &$varName) { - $chunk_size = 1000; - - $integer_chunks = (integer)strlen($varName) / $chunk_size; - $modulus = strlen($varName) % $chunk_size; - if ($modulus != 0){ - $integer_chunks += 1; - } - - for($loop=1;$loop<=$integer_chunks;$loop++){ - $contents = substr ($varName, (($loop - 1) * $chunk_size), $chunk_size); - $contents = bin2hex($contents); - - $hexstring = ''; - - for($loop2=0;$loop2<strlen($contents);$loop2+=2){ - $hexstring .= '\x' . substr($contents,$loop2,2); - } - - $hexstring = $this->qstr($hexstring); - - $this->Execute("set $blobVarName = $blobVarName || " . $hexstring); - } - - return; - } - - /* - Insert a null into the blob field of the table first. - Then use UpdateBlob to store the blob. - - Usage: - - $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); - $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); - */ - function UpdateBlob($table,$column,&$val,$where,$blobtype='BLOB') - { - $blobVarName = 'hold_blob'; - $this->create_blobvar($blobVarName); - $this->load_blobvar_from_var($blobVarName, $val); - $this->Execute("UPDATE $table SET $column=$blobVarName WHERE $where"); - $this->drop_blobvar($blobVarName); - return true; - } - }; //class - - class ADORecordSet_sqlanywhere extends ADORecordSet_odbc { - - var $databaseType = "sqlanywhere"; - - function ADORecordSet_sqlanywhere($id,$mode=false) - { - $this->ADORecordSet_odbc($id,$mode); - } - - - }; //class - - -} //define -?> diff --git a/framework/3rdParty/adodb/drivers/adodb-sqlitepo.inc.php b/framework/3rdParty/adodb/drivers/adodb-sqlitepo.inc.php deleted file mode 100644 index b8489e97..00000000 --- a/framework/3rdParty/adodb/drivers/adodb-sqlitepo.inc.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php -/* -V4.81 3 May 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). 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. - - Portable version of sqlite driver, to make it more similar to other database drivers. - The main differences are - - 1. When selecting (joining) multiple tables, in assoc mode the table - names are included in the assoc keys in the "sqlite" driver. - - In "sqlitepo" driver, the table names are stripped from the returned column names. - When this results in a conflict, the first field get preference. - - Contributed by Herman Kuiper herman#ozuzo.net -*/ - -if (!defined('ADODB_DIR')) die(); - -include_once(ADODB_DIR.'/drivers/adodb-sqlite.inc.php'); - -class ADODB_sqlitepo extends ADODB_sqlite { - var $databaseType = 'sqlitepo'; - - function ADODB_sqlitepo() - { - $this->ADODB_sqlite(); - } -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset ---------------------------------------------------------------------------------------*/ - -class ADORecordset_sqlitepo extends ADORecordset_sqlite { - - var $databaseType = 'sqlitepo'; - - function ADORecordset_sqlitepo($queryID,$mode=false) - { - $this->ADORecordset_sqlite($queryID,$mode); - } - - // Modified to strip table names from returned fields - function _fetch($ignore_fields=false) - { - $this->fields = array(); - $fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode); - if(is_array($fields)) - foreach($fields as $n => $v) - { - if(($p = strpos($n, ".")) !== false) - $n = substr($n, $p+1); - $this->fields[$n] = $v; - } - - return !empty($this->fields); - } -} -?>
\ No newline at end of file diff --git a/framework/3rdParty/adodb/drivers/adodb-sybase.inc.php b/framework/3rdParty/adodb/drivers/adodb-sybase.inc.php deleted file mode 100644 index 26492608..00000000 --- a/framework/3rdParty/adodb/drivers/adodb-sybase.inc.php +++ /dev/null @@ -1,418 +0,0 @@ -<?php -/* -V4.81 3 May 2006 (c) 2000-2006 John Lim. 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://adodb.sourceforge.net - - Sybase driver contributed by Toni (toni.tunkkari@finebyte.com) - - - MSSQL date patch applied. - - Date patch by Toni 15 Feb 2002 -*/ - - // security - hide paths -if (!defined('ADODB_DIR')) die(); - -class ADODB_sybase extends ADOConnection { - var $databaseType = "sybase"; - var $dataProvider = 'sybase'; - 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 $metaTablesSQL="select name from sysobjects where type='U' or type='V'"; - // see http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8 - var $metaColumnsSQL = "SELECT c.column_name, c.column_type, c.width FROM syscolumn c, systable t WHERE t.table_name='%s' AND c.table_id=t.table_id AND t.table_type='BASE'"; - /* - "select c.name,t.name,c.length from - syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id - where o.name='%s'"; - */ - var $concat_operator = '+'; - var $arrayClass = 'ADORecordSet_array_sybase'; - var $sysDate = 'GetDate()'; - var $leftOuter = '*='; - var $rightOuter = '=*'; - - function ADODB_sybase() - { - } - - // might require begintrans -- committrans - function _insertid() - { - return $this->GetOne('select @@identity'); - } - // might require begintrans -- committrans - function _affectedrows() - { - return $this->GetOne('select @@rowcount'); - } - - - function BeginTrans() - { - - if ($this->transOff) return true; - $this->transCnt += 1; - - $this->Execute('BEGIN TRAN'); - return true; - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - - if (!$ok) return $this->RollbackTrans(); - - $this->transCnt -= 1; - $this->Execute('COMMIT TRAN'); - return true; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - $this->transCnt -= 1; - $this->Execute('ROLLBACK TRAN'); - return true; - } - - // http://www.isug.com/Sybase_FAQ/ASE/section6.1.html#6.1.4 - function RowLock($tables,$where,$flds='top 1 null as ignore') - { - if (!$this->_hastrans) $this->BeginTrans(); - $tables = str_replace(',',' HOLDLOCK,',$tables); - return $this->GetOne("select $flds from $tables HOLDLOCK where $where"); - - } - - function SelectDB($dbName) - { - $this->database = $dbName; - $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions - if ($this->_connectionID) { - return @sybase_select_db($dbName); - } - else return false; - } - - /* Returns: the last error message from previous database operation - Note: This function is NOT available for Microsoft SQL Server. */ - - - function ErrorMsg() - { - if ($this->_logsql) return $this->_errorMsg; - if (function_exists('sybase_get_last_message')) - $this->_errorMsg = sybase_get_last_message(); - else - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : 'SYBASE error messages not supported on this platform'; - return $this->_errorMsg; - } - - // returns true or false - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - if (!function_exists('sybase_connect')) return null; - - $this->_connectionID = sybase_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) - { - if (!function_exists('sybase_connect')) return null; - - $this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword); - if ($this->_connectionID === false) return false; - if ($argDatabasename) return $this->SelectDB($argDatabasename); - return true; - } - - // returns query ID if successful, otherwise false - function _query($sql,$inputarr) - { - global $ADODB_COUNTRECS; - - if ($ADODB_COUNTRECS == false && ADODB_PHPVER >= 0x4300) - return sybase_unbuffered_query($sql,$this->_connectionID); - else - return sybase_query($sql,$this->_connectionID); - } - - // See http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12 - function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) - { - if ($secs2cache > 0) {// we do not cache rowcount, so we have to load entire recordset - $rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - return $rs; - } - - $nrows = (integer) $nrows; - $offset = (integer) $offset; - - $cnt = ($nrows >= 0) ? $nrows : 999999999; - if ($offset > 0 && $cnt) $cnt += $offset; - - $this->Execute("set rowcount $cnt"); - $rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0); - $this->Execute("set rowcount 0"); - - return $rs; - } - - // returns true or false - function _close() - { - return @sybase_close($this->_connectionID); - } - - function UnixDate($v) - { - return ADORecordSet_array_sybase::UnixDate($v); - } - - function UnixTimeStamp($v) - { - return ADORecordSet_array_sybase::UnixTimeStamp($v); - } - - - - # Added 2003-10-05 by Chris Phillipson - # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=16756?target=%25N%15_12018_START_RESTART_N%25 - # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version - // Format date column in sql string given an input format that understands Y M D - function SQLDate($fmt, $col=false) - { - if (!$col) $col = $this->sysTimeStamp; - $s = ''; - - $len = strlen($fmt); - for ($i=0; $i < $len; $i++) { - if ($s) $s .= '+'; - $ch = $fmt[$i]; - switch($ch) { - case 'Y': - case 'y': - $s .= "datename(yy,$col)"; - break; - case 'M': - $s .= "convert(char(3),$col,0)"; - break; - case 'm': - $s .= "replace(str(month($col),2),' ','0')"; - break; - case 'Q': - case 'q': - $s .= "datename(qq,$col)"; - break; - case 'D': - case 'd': - $s .= "replace(str(datepart(dd,$col),2),' ','0')"; - break; - case 'h': - $s .= "substring(convert(char(14),$col,0),13,2)"; - break; - - case 'H': - $s .= "replace(str(datepart(hh,$col),2),' ','0')"; - break; - - case 'i': - $s .= "replace(str(datepart(mi,$col),2),' ','0')"; - break; - case 's': - $s .= "replace(str(datepart(ss,$col),2),' ','0')"; - break; - case 'a': - case 'A': - $s .= "substring(convert(char(19),$col,0),18,2)"; - break; - - default: - if ($ch == '\\') { - $i++; - $ch = substr($fmt,$i,1); - } - $s .= $this->qstr($ch); - break; - } - } - return $s; - } - - # Added 2003-10-07 by Chris Phillipson - # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8 - # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version - function MetaPrimaryKeys($table) - { - $sql = "SELECT c.column_name " . - "FROM syscolumn c, systable t " . - "WHERE t.table_name='$table' AND c.table_id=t.table_id " . - "AND t.table_type='BASE' " . - "AND c.pkey = 'Y' " . - "ORDER BY c.column_id"; - - $a = $this->GetCol($sql); - if ($a && sizeof($a)>0) return $a; - return false; - } -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset ---------------------------------------------------------------------------------------*/ -global $ADODB_sybase_mths; -$ADODB_sybase_mths = array( - 'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6, - 'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); - -class ADORecordset_sybase extends ADORecordSet { - - var $databaseType = "sybase"; - var $canSeek = true; - // _mths works only in non-localised system - var $_mths = array('JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); - - function ADORecordset_sybase($id,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - if (!$mode) $this->fetchMode = ADODB_FETCH_ASSOC; - else $this->fetchMode = $mode; - $this->ADORecordSet($id,$mode); - } - - /* 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 ($fieldOffset != -1) { - $o = @sybase_fetch_field($this->_queryID, $fieldOffset); - } - else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ - $o = @sybase_fetch_field($this->_queryID); - } - // older versions of PHP did not support type, only numeric - if ($o && !isset($o->type)) $o->type = ($o->numeric) ? 'float' : 'varchar'; - return $o; - } - - function _initrs() - { - global $ADODB_COUNTRECS; - $this->_numOfRows = ($ADODB_COUNTRECS)? @sybase_num_rows($this->_queryID):-1; - $this->_numOfFields = @sybase_num_fields($this->_queryID); - } - - function _seek($row) - { - return @sybase_data_seek($this->_queryID, $row); - } - - function _fetch($ignore_fields=false) - { - if ($this->fetchMode == ADODB_FETCH_NUM) { - $this->fields = @sybase_fetch_row($this->_queryID); - } else if ($this->fetchMode == ADODB_FETCH_ASSOC) { - $this->fields = @sybase_fetch_row($this->_queryID); - if (is_array($this->fields)) { - $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); - return true; - } - return false; - } else { - $this->fields = @sybase_fetch_array($this->_queryID); - } - if ( is_array($this->fields)) { - return true; - } - - return false; - } - - /* 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 @sybase_free_result($this->_queryID); - } - - // sybase/mssql uses a default date like Dec 30 2000 12:00AM - function UnixDate($v) - { - return ADORecordSet_array_sybase::UnixDate($v); - } - - function UnixTimeStamp($v) - { - return ADORecordSet_array_sybase::UnixTimeStamp($v); - } -} - -class ADORecordSet_array_sybase extends ADORecordSet_array { - function ADORecordSet_array_sybase($id=-1) - { - $this->ADORecordSet_array($id); - } - - // sybase/mssql uses a default date like Dec 30 2000 12:00AM - function UnixDate($v) - { - global $ADODB_sybase_mths; - - //Dec 30 2000 12:00AM - if (!ereg( "([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})" - ,$v, $rr)) return parent::UnixDate($v); - - if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; - - $themth = substr(strtoupper($rr[1]),0,3); - $themth = $ADODB_sybase_mths[$themth]; - if ($themth <= 0) return false; - // h-m-s-MM-DD-YY - return mktime(0,0,0,$themth,$rr[2],$rr[3]); - } - - function UnixTimeStamp($v) - { - global $ADODB_sybase_mths; - //11.02.2001 Toni Tunkkari toni.tunkkari@finebyte.com - //Changed [0-9] to [0-9 ] in day conversion - if (!ereg( "([A-Za-z]{3})[-/\. ]([0-9 ]{1,2})[-/\. ]([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})" - ,$v, $rr)) return parent::UnixTimeStamp($v); - if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; - - $themth = substr(strtoupper($rr[1]),0,3); - $themth = $ADODB_sybase_mths[$themth]; - if ($themth <= 0) return false; - - switch (strtoupper($rr[6])) { - case 'P': - if ($rr[4]<12) $rr[4] += 12; - break; - case 'A': - if ($rr[4]==12) $rr[4] = 0; - break; - default: - break; - } - // h-m-s-MM-DD-YY - return mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]); - } -} -?> diff --git a/framework/3rdParty/adodb/drivers/adodb-sybase_ase.inc.php b/framework/3rdParty/adodb/drivers/adodb-sybase_ase.inc.php deleted file mode 100644 index c0c783f8..00000000 --- a/framework/3rdParty/adodb/drivers/adodb-sybase_ase.inc.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php -/* - V4.81 3 May 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). 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. - - Contributed by Interakt Online. Thx Cristian MARIN cristic#interaktonline.com -*/ -class ADODB_sybase_ase extends ADODB_sybase { - var $databaseType = "sybase_ase"; - - var $metaTablesSQL="SELECT sysobjects.name FROM sysobjects, sysusers WHERE sysobjects.type='U' AND sysobjects.uid = sysusers.uid"; - var $metaColumnsSQL = "SELECT syscolumns.name AS field_name, systypes.name AS type, systypes.length AS width FROM sysobjects, syscolumns, systypes WHERE sysobjects.name='%s' AND syscolumns.id = sysobjects.id AND systypes.type=syscolumns.type"; - var $metaDatabasesSQL ="SELECT a.name FROM master.dbo.sysdatabases a, master.dbo.syslogins b WHERE a.suid = b.suid and a.name like '%' and a.name != 'tempdb' and a.status3 != 256 order by 1"; - - function ADODB_sybase_ase() - { - } - - // split the Views, Tables and procedures. - function &MetaTables($ttype=false,$showSchema=false,$mask=false) - { - $false = false; - if ($this->metaTablesSQL) { - // complicated state saving by the need for backward compat - - if ($ttype == 'VIEWS'){ - $sql = str_replace('U', 'V', $this->metaTablesSQL); - }elseif (false === $ttype){ - $sql = str_replace('U',"U' OR type='V", $this->metaTablesSQL); - }else{ // TABLES OR ANY OTHER - $sql = $this->metaTablesSQL; - } - $rs = $this->Execute($sql); - - if ($rs === false || !method_exists($rs, 'GetArray')){ - return $false; - } - $arr =& $rs->GetArray(); - - $arr2 = array(); - foreach($arr as $key=>$value){ - $arr2[] = trim($value['name']); - } - return $arr2; - } - return $false; - } - - function MetaDatabases() - { - $arr = array(); - if ($this->metaDatabasesSQL!='') { - $rs = $this->Execute($this->metaDatabasesSQL); - if ($rs && !$rs->EOF){ - while (!$rs->EOF){ - $arr[] = $rs->Fields('name'); - $rs->MoveNext(); - } - return $arr; - } - } - return false; - } - - // fix a bug which prevent the metaColumns query to be executed for Sybase ASE - function &MetaColumns($table,$upper=false) - { - $false = false; - if (!empty($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('field_name'); - $fld->type = $rs->Fields('type'); - $fld->max_length = $rs->Fields('width'); - $retarr[strtoupper($fld->name)] = $fld; - $rs->MoveNext(); - } - $rs->Close(); - return $retarr; - } - return $false; - } - - function getProcedureList($schema) - { - return false; - } - - function ErrorMsg() - { - if (!function_exists('sybase_connect')){ - return 'Your PHP doesn\'t contain the Sybase connection module!'; - } - return parent::ErrorMsg(); - } -} - -class adorecordset_sybase_ase extends ADORecordset_sybase { -var $databaseType = "sybase_ase"; -function ADORecordset_sybase_ase($id,$mode=false) - { - $this->ADORecordSet_sybase($id,$mode); - } - -} -?>
\ No newline at end of file diff --git a/framework/DataAccess/TAdodb.php b/framework/DataAccess/TAdodb.php index f6b486e4..c7005c76 100644 --- a/framework/DataAccess/TAdodb.php +++ b/framework/DataAccess/TAdodb.php @@ -1,17 +1,100 @@ <?php
+/**
+ * TAdodb and TAdodbConnection class file.
+ *
+ * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright © 2005 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Revision: $ $Date: $
+ * @package System.DataAccess
+ */
+/**
+ * Include the database provider base class.
+ */
Prado::using('System.DataAccess.TDatabaseProvider');
/**
- * Adbodb data access module.
+ * TAdodb database connection module.
+ *
+ * The TAdodb module class allows the database connection details to be
+ * specified in the application.xml or config.xml, the later are directory level
+ * configurations.
+ * <code>
+ * ...
+ * <modules>
+ * ...
+ * <module id="my_db1"
+ * class="TAdodb"
+ * ConnectionString="mysql://username:password@localhost/mydatabase" />
+ * ...
+ * </modules>
+ * ...
+ * </code>
+ * Where <tt>mysql</tt> is the driver name, <tt>username</tt> and
+ * <tt>password</tt> are the required credentials to connection to the database,
+ * <tt>localhost</tt> is the database resource and <tt>mydatabase</tt> is the
+ * name of database to connect to.
+ *
+ * The Adodb library supports many database drivers. The drivers included are
+ * # <tt>mysql</tt> MySQL without transactions.
+ * # <tt>mysqlt</tt> MySQL 3.23 or later with transaction support.
+ * # <tt>mysqli</tt> MySQLi extension, does not support transactions.
+ * # <tt>pdo_mysql</tt> PDO driver for MysSQL.
+ *
+ * # <tt>oracle</tt> Oracle 7.
+ * # <tt>oci8po</tt> Portable version of oci8 driver.
+ * # <tt>oci8</tt> Oracle (oci8).
+ * # <tt>oci805</tt> Oracle 8.0.5 driver.
+ * # <tt>pdo_oci</tt> PDO driver for Oracle.
+ * # <tt>odbc_oracle</tt> Oracle support via ODBC.
*
- * Usage:
+ * # <tt>postgres7</tt> Postgres 7, 8.
+ * # <tt>pdo_pgsql</tt> PDO driver for postgres.
+ * # <tt>postgres64</tt> Postgress 6.4.
+ *
+ * # <tt>pdo_mssql</tt> PDO driver for MSSQL.
+ * # <tt>odbc_mssql</tt> MSSQL support via ODBC.
+ * # <tt>mssqlpo</tt> Portable MSSQL Driver that supports || instead of +.
+ * # <tt>ado_mssql</tt> Microsoft SQL Server ADO data driver.
+ * # <tt>mssql</tt> Native mssql driver.
+ *
+ * # <tt>ldap</tt> LDAP.
+ * # <tt>sqlite</tt> SQLite database.
+ *
+ * For other database drivers and detail documentation regarding indiviual
+ * drivers visit {@link http://adodb.sourceforge. net/}
+ *
+ * When using an sqlite database it is easier to specify the {@link setDriver
+ * Driver} as "sqlite" and {@link setHost Host} as the path to the sqlite
+ * database file. For example:
* <code>
- * $provider = new TAdodb;
- * $provider->setConnectionString($dsn); $
- * connection = $provider->getConnection();
- * $resultSet = $connection->execute('....');
+ * <module id="my_db1"
+ * class="TAdodb"
+ * Driver="sqlite"
+ * Host="Application.pages.my_db" />
+ * </code>
+ * Note that the database file should not contain <b>no dots</b>. The path can
+ * be use namespace or a fullpath (but no dots).
+ *
+ * To access the database from a TPage or other TApplicationComponent classes
+ * use the {@link TApplication::getModule getModule} method of TApplication.
+ * <code>
+ * $db = $this->getApplication()->getModule('my_db1');
+ * //similarly
+ * $db = $this->Application->Modules['my_db1'];
* </code>
+ *
+ * For classes that are not instance of TApplicationComponent (such as
+ * TUserManager) use the static {@link PradoBase::getApplication getApplication}
+ * method first.
+ * <code>
+ * $db = Prado::getApplication()->getModule('my_db1');
+ * </code>
+ *
+ * If you wish to use a Adodb connections without module configuration, see the
+ * TAdodbConnection class.
*
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
* @version $Revision: $ $Date: $
@@ -20,44 +103,113 @@ Prado::using('System.DataAccess.TDatabaseProvider'); */
class TAdodb extends TDatabaseProvider
{
+ /**
+ * @var string Adodb associative fetch mode.
+ */
const FETCH_ASSOCIATIVE='associative';
+ /**
+ * @var string Adodb numeric fetch mode.
+ */
const FETCH_NUMERIC='numeric';
+ /**
+ * @var string Adodb fetch mode using both associative and numeric.
+ */
const FETCH_BOTH='both';
+ /**
+ * @var string Adodb default fetch mode.
+ */
const FETCH_DEFAULT='default';
+ /**
+ * @var TAdodbConnection database connection.
+ */
private $_connection = null;
+ /**
+ * @var string Adodb record set cache directory.
+ */
private $_cachedir='';
+ /**
+ * @var string current fetch mode.
+ */
private $_fetchMode = 'associative';
+ /**
+ * @var boolean whether to enable the active recors.
+ */
+ private $_enableActiveRecords = false;
+ /**
+ * @return TAdodbConnection connects to the database and returns the
+ * connection resource.
+ */
public function getConnection()
{
- $this->initialize();
return $this->_connection;
}
-
- public function initialize()
+
+ /**
+ * Initialize the module configurations.
+ */
+ public function init($config)
{
+ parent::init($config);
if(!class_exists('ADOConnection', false))
$this->importAdodbLibrary();
if(is_null($this->_connection))
- $this->_connection = new TAdodbConnection($this);
+ {
+ if($config instanceof TAdodbConnection)
+ $this->_connection = $config;
+ else
+ $this->_connection = new TAdodbConnection($this);
+ if($this->getEnableActiveRecords())
+ $this->initializeActiveRecords();
+ }
}
- public function enableActiveRecords()
+ /**
+ * Enabling Adodb to retrieve results as active records, and active record
+ * object to save changes. Once set to true and the connection is
+ * initialized, setting <tt>EnableActiveRecords</tt> to false has no effect.
+ * @param boolean true to allow active records.
+ */
+ public function setEnableActiveRecords($value)
+ {
+ $this->_enableActiveRecords = TPropertyValue::ensureBoolean($value);
+ }
+
+ /**
+ * @param boolean whether to enable active records.
+ */
+ public function getEnableActiveRecords()
{
- $conn = $this->getConnection();
- if(is_null($conn->getInternalConnection()) && $conn->open())
+ return $this->_enableActiveRecords;
+ }
+
+ /**
+ * Initialize the active records by setting the active records database
+ * adpater to the current database connection.
+ */
+ public function initializeActiveRecords()
+ {
+ $conn = $this->_connection;
+ if(!is_null($conn->getInternalConnection()) || $conn->open())
{
Prado::using('System.DataAccess.TActiveRecord');
TActiveRecord::setDatabaseAdapter($conn->getInternalConnection());
+ $this->_enableActiveRecords = true;
}
}
+ /**
+ * @return string the adodb library path.
+ */
protected function getAdodbLibrary()
{
return Prado::getPathOfNamespace('System.3rdParty.adodb');
}
+ /**
+ * Import the necessary adodb library files.
+ */
protected function importAdodbLibrary()
{
$path = $this->getAdodbLibrary();
@@ -66,7 +218,7 @@ class TAdodb extends TDatabaseProvider }
/**
- * @return string the cache directory for adodb module
+ * @return string the cache directory for Adodb to save cached queries.
*/
public function getCacheDir()
{
@@ -74,17 +226,17 @@ class TAdodb extends TDatabaseProvider }
/**
- * Sets the cache directory for ADODB (in adodb it is
- * called to $ADODB_CACHE_DIR)
+ * The cache directory for Adodb to save cached queries. The path can be
+ * specified using a namespace or the fullpath.
* @param string the cache directory for adodb module
*/
public function setCacheDir($value)
{
- $this->_cachedir=$value;
+ $this->_cachedir=Prado::getPathOfNamespace($value);
}
/**
- * @return string fetch mode of query data
+ * @return string fetch mode of queried data
*/
public function getFetchMode()
{
@@ -92,7 +244,9 @@ class TAdodb extends TDatabaseProvider }
/**
- * Sets the fetch mode of query data: Associative, Numeric, Both, Default (default)
+ * Sets the fetch mode of query data, valid modes are <tt>Associative</tt>,
+ * <tt>Numeric</tt>, <tt>Both</tt> or <tt>Default</tt>. The mode names are
+ * case insensitive.
* @param string the fetch mode of query data
*/
public function setFetchMode($value)
@@ -104,16 +258,23 @@ class TAdodb extends TDatabaseProvider else
$this->_fetchMode=self::FETCH_DEFAULT;
}
-
}
/**
- * TAdodbConnection is a wrapper class of the ADODB ADOConnection class.
- * For more information about the ADODB library, see {@link http://adodb.sourceforge.net/}.
+ * TAdodbConnection provides access to the ADODB ADOConnection class. For detail
+ * documentation regarding indiviual drivers visit {@link http://adodb.sourceforge.net/}
*
* You can call any method implemented in ADOConnection class via TAdodbConnection,
* such as TAdodbConnection::FetchRow(), and so on. The method calls
- * will be passed to ADOConnection class.
+ * will be passed an ADOConnection instance.
+ *
+ * To use TAdodbConnection without the TAdodb database connection provider pass
+ * a DSN style connection string to the TAdodbConnection constructor.
+ * <code>
+ * $dsn = "mysql://username:password@localhost/mydb";
+ * $db = new TAdodbConnection($dsn);
+ * $resultSet = $db->execute('...');
+ * </code>
*
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
* @version $Revision: $ $Date: $
@@ -122,10 +283,14 @@ class TAdodb extends TDatabaseProvider */
class TAdodbConnection extends TDbConnection
{
+ /**
+ * @var ADOConnection database connection.
+ */
private $_connection;
/**
- * Gets the internal connection.
+ * Gets the internal connection. Should only be used by framework
+ * developers.
*/
public function getInternalConnection()
{
@@ -190,16 +355,38 @@ class TAdodbConnection extends TDbConnection return call_user_func_array(array($this->_connection,$method),$params);
}
+ /**
+ * @return boolean true if the database is connected.
+ */
public function getIsClosed()
{
return is_null($this->_connection) || !$this->_connection->IsConnected();
}
+ /**
+ * Prepares (compiles) an SQL query for repeated execution. Bind parameters
+ * are denoted by ?, except for the oci8 driver, which uses the traditional
+ * Oracle :varname convention. If there is an error, or we are emulating
+ * Prepare( ), we return the original $sql string.
+ *
+ * Prepare( ) cannot be used with functions that use SQL query rewriting
+ * techniques, e.g. PageExecute( ) and SelectLimit( ).
+ *
+ * @param string sql statement.
+ * @return array an array containing the original sql statement in the first
+ * array element;
+ */
public function prepare($statement)
{
return $this->_connection->prepare($statement);
}
+ /**
+ * Execute SQL statement $sql and return derived class of ADORecordSet if
+ * successful. Note that a record set is always returned on success, even if
+ * we are executing an insert or update statement. You can also pass in $sql
+ * a statement prepared in {@link prepare}.
+ */
public function execute($sql, $parameters=array())
{
return $this->_connection->execute($sql, $parameters);
@@ -221,13 +408,21 @@ class TAdodbConnection extends TDbConnection return $this->connection->CompleteTrans();
}
-
+ /**
+ * End a transaction successfully.
+ * @return true if successful. If the database does not support
+ * transactions, will return true also as data is always committed.
+ */
public function commit()
{
return $this->connection->CommitTrans();
}
-
+ /**
+ * End a transaction, rollback all changes.
+ * @return true if successful. If the database does not support
+ * transactions, will return false as data is never rollbacked.
+ */
public function rollback()
{
return $this->connection->RollbackTrans();
@@ -242,7 +437,7 @@ class TAdodbConnection extends TDbConnection if($this->getIsClosed())
{
$provider = $this->getProvider();
- $provider->initialize();
+ $provider->init($this);
if(strlen($provider->getConnectionString()) < 1)
{
if(strlen($provider->getDriver()) < 1)
@@ -259,13 +454,13 @@ class TAdodbConnection extends TDbConnection }
/**
- * Complete the database connection.
+ * Creates the database connection using host, username, password and
+ * database name properties.
*/
protected function initConnection()
{
$provider = $this->getProvider();
-
- if($provider->getUsePersistentConnection())
+ if(is_int(strpos($provider->getConnectionOptions(), 'persist')))
{
$this->_connection->PConnect($provider->getHost(),
$provider->getUsername(),$provider->getPassword(),
@@ -328,7 +523,6 @@ class TAdodbConnection extends TDbConnection {
return $this->_connection->qstr($string, $magic_quotes);
}
-
}
?>
\ No newline at end of file diff --git a/framework/DataAccess/TDatabaseProvider.php b/framework/DataAccess/TDatabaseProvider.php index 2a62c03a..a39213f1 100644 --- a/framework/DataAccess/TDatabaseProvider.php +++ b/framework/DataAccess/TDatabaseProvider.php @@ -1,25 +1,77 @@ <?php
-
/**
- * Database access module.
+ * TDatabaseProvider and TDbConnection class and IDbConnection interface file.
*
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright © 2005 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Revision: $ $Date: $
+ * @package System.DataAccess
+ */
+
+/**
+ * Database provider or adapter base class.
+ *
+ * All database providers should extend this base class to provide a uniform
+ * configuration to the database. Database providers should allow the database
+ * connection to be set via the {@link setConnectionString ConnectionString}
+ * property using a DSN string. The DSN format is
+ * <code>
+ * $driver://$username:$password@host/$database?options[=value]
+ * </code>
+ * Alternatively the database connections details can be set via the {@link
+ * setDriver Driver}, {@link setUsername Username}, {@link setPassword
+ * Password}, {@link setHost Host} and {@link setDatabase Database} properties.
+ * Additional options for individual database driver may be added via the {@link
+ * setConnectionOptions ConnectionOptions} property.
+ *
+ * Database provider implementation must implement the {@link getConnection
+ * Connection} property that returns a database connection or client. A
+ * DSN connection string the represents the available connection properties can
+ * be obtained from the protected method {@link buildConnectionString} method.
+ *
+ * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
* @version $Revision: $ $Date: $
* @package System.DataAccess
* @since 3.0
*/
abstract class TDatabaseProvider extends TModule
{
+ /**
+ * @var string DSN connection string.
+ */
private $_connectionString = '';
+ /**
+ * @var string database name.
+ */
private $_database='';
+ /**
+ * @var string database driver name.
+ */
private $_driver='';
+ /**
+ * @var string database host name.
+ */
private $_host='';
+ /**
+ * @var string database connection username credentail.
+ */
private $_username='';
+ /**
+ * @var string database connection password credential.
+ */
private $_password='';
- private $_persistent=true;
+ /**
+ * @var string additional connection options.
+ */
+ private $_options='';
+
/**
- * @param string used to open the connection
+ * DSN connection string of the form
+ * <tt>$driver://$username:$password@host/$database?options[=value]</tt>
+ * @param string DSN style connection string.
*/
public function setConnectionString($value)
{
@@ -27,7 +79,7 @@ abstract class TDatabaseProvider extends TModule }
/**
- * @return string used to open the connection
+ * @return string DSN connection string
*/
public function getConnectionString()
{
@@ -35,7 +87,7 @@ abstract class TDatabaseProvider extends TModule }
/**
- * @return string the DB driver (mysql, sqlite, etc.)
+ * @return string database driver name (mysql, sqlite, etc.)
*/
public function getDriver()
{
@@ -43,8 +95,7 @@ abstract class TDatabaseProvider extends TModule }
/**
- * Sets the DB driver (mysql, sqlite, etc.)
- * @param string the DB driver
+ * @param string database driver name.
*/
public function setDriver($value)
{
@@ -53,8 +104,10 @@ abstract class TDatabaseProvider extends TModule /**
* If the driver is <tt>sqlite</tt>, the host must be dot path to the sqlite
- * file.
- * @return string the DB host name/IP (and port number) in the format "host[:port]"
+ * file. E.g. "<tt>Application.pages.my_db</tt>". The database filename
+ * should not contain any dots.
+ * @return string database host name/IP (and port number) in the format
+ * "host[:port]"
*/
public function getHost()
{
@@ -65,7 +118,8 @@ abstract class TDatabaseProvider extends TModule }
/**
- * Sets the DB host name/IP (and port number) in the format "host[:port]"
+ * Sets the database host name/IP or resource (and port number) in the
+ * format "host [: port]"
* @param string the DB host
*/
public function setHost($value)
@@ -74,7 +128,7 @@ abstract class TDatabaseProvider extends TModule }
/**
- * @return string the DB username
+ * @return string database connection username credential.
*/
public function getUsername()
{
@@ -82,8 +136,7 @@ abstract class TDatabaseProvider extends TModule }
/**
- * Sets the DB username
- * @param string the DB username
+ * @param string database connection username credential.
*/
public function setUsername($value)
{
@@ -91,7 +144,7 @@ abstract class TDatabaseProvider extends TModule }
/**
- * @return string the DB password
+ * @return string database connection password
*/
public function getPassword()
{
@@ -99,8 +152,7 @@ abstract class TDatabaseProvider extends TModule }
/**
- * Sets the DB password
- * @param string the DB password
+ * @param string database connection password.
*/
public function setPassword($value)
{
@@ -108,7 +160,7 @@ abstract class TDatabaseProvider extends TModule }
/**
- * @return string the database name
+ * @return string default database name to connect.
*/
public function getDatabase()
{
@@ -116,8 +168,7 @@ abstract class TDatabaseProvider extends TModule }
/**
- * Sets the database name
- * @param string the database name
+ * @param string default database name to connect to.
*/
public function setDatabase($value)
{
@@ -125,23 +176,27 @@ abstract class TDatabaseProvider extends TModule }
/**
- * @return boolean whether the DB connection is persistent
+ * @return string additional connection options.
*/
- public function getUsePersistentConnection()
+ public function getConnectionOptions()
{
- return $this->_persistent;
+ return $this->_options;
}
/**
- * Sets whether the DB connection should be persistent
- * @param boolean whether the DB connection should be persistent
+ * @param string additional connection options for each individual database
+ * driver.
*/
- public function setUsePersistentConnection($value)
+ public function setConnectionOptions($value)
{
- $this->_persistent=$value;
+ $this->_options=$value;
}
- protected function buildDsn()
+ /**
+ * @return string the DSN connection string build from individual connection
+ * properties.
+ */
+ protected function buildConnectionString()
{
$driver = $this->getDriver().'://';
$user = $this->getUsername();
@@ -154,9 +209,9 @@ abstract class TDatabaseProvider extends TModule $host = '@'.$host;
$db = $this->getDatabase();
$db = strlen($db) > 0 ? '/'.$db : $db;
- $persist = $this->getUsePersistentConnection() ? '': '?persit';
+ $options = $this->getConnectionOptions();
- return $driver.$user.$pass.$host.$persist;
+ return $driver.$user.$pass.$host.$options;
}
/**
@@ -187,7 +242,7 @@ interface IDbConnection public function getIsClosed();
/**
- * Opens a database connection with settings provided in the ConnectionString.
+ * Opens a database connection using settings of a TDatabaseProvider.
*/
public function open();
@@ -207,24 +262,26 @@ interface IDbConnection public function execute($sql, $parameters=array());
/**
- * Start a transaction on this connection.
+ * Start a transaction on this connection. Not all database will support
+ * transactions.
*/
public function beginTransaction();
/**
- * Finish and cleanup transactions.
+ * Finish and cleanup transactions. Not all database will support
+ * transactions.
*/
public function completeTransaction();
/**
* Makes all changes made since the previous commit/rollback permanent and
- * releases any database locks.
+ * releases any database locks. Not all database will support transactions.
*/
public function commit();
/**
* Undoes all changes made in the current transaction and releases any
- * database locks
+ * database locks. Not all database will support transactions.
*/
public function rollback();
@@ -240,7 +297,7 @@ interface IDbConnection /**
* Performs the connection to the database using a TDatabaseProvider,
- * executes SQL statements.
+ * and provides an interface for executing SQL statements and transactions.
*
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
* @version $Revision: $ $Date: $
@@ -249,24 +306,39 @@ interface IDbConnection */
abstract class TDbConnection extends TComponent implements IDbConnection
{
+ /**
+ * @string TDatabaseProvider database provider containing connection
+ * details.
+ */
private $_provider;
- public function __construct($provider)
+ /**
+ * Creates a new database connection context.
+ */
+ public function __construct(TDatabaseProvider $provider)
{
- if($provider instanceof TDatabaseProvider)
- $this->setProvider($provider);
+ $this->setProvider($provider);
}
+ /**
+ * @param TDatabaseProvider sets the connection details.
+ */
public function setProvider($provider)
{
$this->_provider = $provider;
}
+ /**
+ * @param TDatabaseProvider gets the database connection details.
+ */
public function getProvider()
{
return $this->_provider;
}
+ /**
+ * Automatically closes the database connection.
+ */
public function __destruct()
{
$this->close();
|