*
* @return the last inserted ID. All databases support this. But aware possible
* problems in multiuser environments. Heavy test this before deploying.
- */
- function PO_Insert_ID($table="", $id="")
+ */
+ function PO_Insert_ID($table="", $id="")
{
if ($this->hasInsertID){
return $this->Insert_ID();
} else {
return $this->GetOne("SELECT MAX($id) FROM $table");
}
- }
-
-
+ }
+
+
/**
* @return # rows affected by UPDATE/DELETE
- */
+ */
function Affected_Rows()
{
if ($this->hasAffectedRows) {
$val = $this->_affectedrows();
return ($val < 0) ? false : $val;
}
-
+
if ($this->debug) ADOConnection::outp( 'Affected_Rows error
',false);
return false;
}
-
-
+
+
/**
* @return the last error message
*/
function ErrorMsg()
{
return '!! '.strtoupper($this->dataProvider.' '.$this->databaseType).': '.$this->_errorMsg;
}
-
-
+
+
/**
* @return the last error number. Normally 0 means no error.
*/
- function ErrorNo()
+ function ErrorNo()
{
return ($this->_errorMsg) ? -1 : 0;
}
-
+
function MetaError($err=false)
{
include_once(ADODB_DIR."/adodb-error.inc.php");
if ($err === false) $err = $this->ErrorNo();
return adodb_error($this->dataProvider,$this->databaseType,$err);
}
-
+
function MetaErrorMsg($errno)
{
include_once(ADODB_DIR."/adodb-error.inc.php");
return adodb_errormsg($errno);
}
-
+
/**
* @returns an array with the primary key columns in it.
*/
@@ -960,24 +960,24 @@
if (sizeof($p)) return $p;
return false;
}
-
-
+
+
/**
* Choose a database to connect to. Many databases do not support this.
*
* @param dbName is the name of the database to select
* @return true or false
*/
- function SelectDB($dbName)
+ function SelectDB($dbName)
{return false;}
-
-
+
+
/**
- * Will select, getting rows from $offset (1-based), for $nrows.
+ * Will select, getting rows from $offset (1-based), for $nrows.
* This simulates the MySQL "select * from table limit $offset,$nrows" , and
* the PostgreSQL "select * from table limit $nrows offset $offset". Note that
* MySQL and PostgreSQL parameter ordering is the opposite of the other.
- * eg.
+ * eg.
* SelectLimit('select * from table',3); will return rows 1 to 3 (1-based)
* SelectLimit('select * from table',3,2); will return rows 3 to 5 (1-based)
*
@@ -995,14 +995,14 @@
function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$arg3=false,$secs2cache=0)
{
if ($this->hasTop && $nrows > 0) {
- // suggested by Reinhard Balling. Access requires top after distinct
+ // suggested by Reinhard Balling. Access requires top after distinct
// Informix requires first before distinct - F Riosa
$ismssql = (strpos($this->databaseType,'mssql') !== false);
if ($ismssql) $isaccess = false;
else $isaccess = (strpos($this->databaseType,'access') !== false);
-
+
if ($offset <= 0) {
-
+
// access includes ties in result
if ($isaccess) {
$sql = preg_replace(
@@ -1028,14 +1028,14 @@
}
}
}
-
+
// if $offset>0, we want to skip rows, and $ADODB_COUNTRECS is set, we buffer rows
// 0 to offset-1 which will be discarded anyway. So we disable $ADODB_COUNTRECS.
global $ADODB_COUNTRECS;
-
+
$savec = $ADODB_COUNTRECS;
$ADODB_COUNTRECS = false;
-
+
if ($offset>0){
if ($secs2cache>0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr,$arg3);
else $rs = &$this->Execute($sql,$inputarr,$arg3);
@@ -1050,8 +1050,8 @@
//print_r($rs);
return $rs;
}
-
-
+
+
/**
* Convert database recordset to an array recordset
* input recordset's cursor should be at beginning, and
@@ -1065,7 +1065,7 @@
function &_rs2rs(&$rs,$nrows=-1,$offset=-1,$close=true)
{
if (! $rs) return false;
-
+
$dbtype = $rs->databaseType;
if (!$dbtype) {
$rs = &$rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1 -- why ?
@@ -1083,23 +1083,23 @@
$arr =& $rs->GetArrayLimit($nrows,$offset);
//print_r($arr);
if ($close) $rs->Close();
-
+
$arrayClass = $this->arrayClass;
-
+
$rs2 = new $arrayClass();
$rs2->connection = &$this;
$rs2->sql = $rs->sql;
$rs2->dataProvider = $this->dataProvider;
$rs2->InitArrayFields($arr,$flds);
return $rs2;
}
-
-
+
+
function &GetArray($sql, $inputarr=false)
{
return $this->GetAll($sql,$inputarr);
}
-
+
/**
* Return first element of first row of sql statement. Recordset is disposed
* for you.
@@ -1112,31 +1112,31 @@
global $ADODB_COUNTRECS;
$crecs = $ADODB_COUNTRECS;
$ADODB_COUNTRECS = false;
-
+
$ret = false;
$rs = &$this->Execute($sql,$inputarr);
- if ($rs) {
+ if ($rs) {
if (!$rs->EOF) $ret = reset($rs->fields);
$rs->Close();
- }
+ }
$ADODB_COUNTRECS = $crecs;
return $ret;
}
-
+
function CacheGetOne($secs2cache,$sql=false,$inputarr=false)
{
$ret = false;
$rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
- if ($rs) {
+ if ($rs) {
if (!$rs->EOF) $ret = reset($rs->fields);
$rs->Close();
- }
-
+ }
+
return $ret;
}
-
+
function GetCol($sql, $inputarr = false, $trim = false)
- {
+ {
$rv = false;
$rs = &$this->Execute($sql, $inputarr);
@@ -1154,10 +1154,10 @@
}
$rs->Close();
}
-
+
return $rv;
}
-
+
function CacheGetCol($secs, $sql = false, $inputarr = false,$trim=false)
{
$rv = false;
@@ -1178,21 +1178,21 @@
}
return $rv;
}
-
+
/*
Calculate the offset of a date for a particular database and generate
appropriate SQL. Useful for calculating future/past dates and storing
in a database.
-
+
If dayFraction=1.5 means 1.5 days from now, 1.0/24 for 1 hour.
*/
function OffsetDate($dayFraction,$date=false)
- {
+ {
if (!$date) $date = $this->sysDate;
return '('.$date.'+'.$dayFraction.')';
}
-
-
+
+
/**
* Return all rows. Compat with PEAR DB
*
@@ -1202,40 +1202,40 @@
function &GetAll($sql,$inputarr=false)
{
global $ADODB_COUNTRECS;
-
+
$savec = $ADODB_COUNTRECS;
$ADODB_COUNTRECS = false;
$rs = $this->Execute($sql,$inputarr);
$ADODB_COUNTRECS = $savec;
-
- if (!$rs)
+
+ if (!$rs)
if (defined('ADODB_PEAR')) return ADODB_PEAR_Error();
else return false;
$arr =& $rs->GetArray();
$rs->Close();
return $arr;
}
-
+
function &CacheGetAll($secs2cache,$sql=false,$inputarr=false)
{
global $ADODB_COUNTRECS;
-
+
$savec = $ADODB_COUNTRECS;
$ADODB_COUNTRECS = false;
$rs = $this->CacheExecute($secs2cache,$sql,$inputarr);
$ADODB_COUNTRECS = $savec;
-
- if (!$rs)
+
+ if (!$rs)
if (defined('ADODB_PEAR')) return ADODB_PEAR_Error();
else return false;
-
+
$arr =& $rs->GetArray();
$rs->Close();
return $arr;
}
-
-
-
+
+
+
/**
* Return one row of sql statement. Recordset is disposed for you.
*
@@ -1247,20 +1247,20 @@
global $ADODB_COUNTRECS;
$crecs = $ADODB_COUNTRECS;
$ADODB_COUNTRECS = false;
-
+
$rs = $this->Execute($sql,$inputarr);
-
+
$ADODB_COUNTRECS = $crecs;
if ($rs) {
$arr = array();
if (!$rs->EOF) $arr = $rs->fields;
$rs->Close();
return $arr;
}
-
+
return false;
}
-
+
function &CacheGetRow($secs2cache,$sql=false,$inputarr=false)
{
$rs = $this->CacheExecute($secs2cache,$sql,$inputarr);
@@ -1272,9 +1272,9 @@
}
return false;
}
-
+
/**
- * Insert or replace a single record. Note: this is not the same as MySQL's replace.
+ * Insert or replace a single record. Note: this is not the same as MySQL's replace.
* ADOdb's Replace() uses update-insert semantics, not insert-delete-duplicates of MySQL.
* Also note that no table locking is done currently, so it is possible that the
* record be inserted twice by two programs...
@@ -1290,15 +1290,15 @@
*
* Currently blob replace not supported
*
- * returns 0 = fail, 1 = update, 2 = insert
+ * returns 0 = fail, 1 = update, 2 = insert
*/
-
+
function Replace($table, $fieldArray, $keyCol, $autoQuote=false, $has_autoinc=false)
{
if (count($fieldArray) == 0) return 0;
$first = true;
$uSet = '';
-
+
if (!is_array($keyCol)) {
$keyCol = array($keyCol);
}
@@ -1308,14 +1308,14 @@
$fieldArray[$k] = $v;
}
if (in_array($k,$keyCol)) continue; // skip UPDATE if is key
-
+
if ($first) {
- $first = false;
+ $first = false;
$uSet = "$k=$v";
} else
$uSet .= ",$k=$v";
}
-
+
$first = true;
foreach ($keyCol as $v) {
if ($first) {
@@ -1325,55 +1325,55 @@
$where .= " and $v=$fieldArray[$v]";
}
}
-
+
if ($uSet) {
$update = "UPDATE $table SET $uSet WHERE $where";
-
+
$rs = $this->Execute($update);
if ($rs) {
if ($this->poorAffectedRows) {
/*
- The Select count(*) wipes out any errors that the update would have returned.
+ The Select count(*) wipes out any errors that the update would have returned.
http://phplens.com/lens/lensforum/msgs.php?id=5696
*/
if ($this->ErrorNo()<>0) return 0;
-
+
# affected_rows == 0 if update field values identical to old values
- # for mysql - which is silly.
-
+ # for mysql - which is silly.
+
$cnt = $this->GetOne("select count(*) from $table where $where");
if ($cnt > 0) return 1; // record already exists
} else
if (($this->Affected_Rows()>0)) return 1;
}
-
+
}
// print "Error=".$this->ErrorNo().'
';
$first = true;
foreach($fieldArray as $k => $v) {
if ($has_autoinc && in_array($k,$keyCol)) continue; // skip autoinc col
-
+
if ($first) {
- $first = false;
+ $first = false;
$iCols = "$k";
$iVals = "$v";
} else {
$iCols .= ",$k";
$iVals .= ",$v";
- }
+ }
}
- $insert = "INSERT INTO $table ($iCols) VALUES ($iVals)";
+ $insert = "INSERT INTO $table ($iCols) VALUES ($iVals)";
$rs = $this->Execute($insert);
return ($rs) ? 2 : 0;
}
-
-
+
+
/**
- * Will select, getting rows from $offset (1-based), for $nrows.
+ * Will select, getting rows from $offset (1-based), for $nrows.
* This simulates the MySQL "select * from table limit $offset,$nrows" , and
* the PostgreSQL "select * from table limit $nrows offset $offset". Note that
* MySQL and PostgreSQL parameter ordering is the opposite of the other.
- * eg.
+ * eg.
* CacheSelectLimit(15,'select * from table',3); will return rows 1 to 3 (1-based)
* CacheSelectLimit(15,'select * from table',3,2); will return rows 3 to 5 (1-based)
*
@@ -1388,7 +1388,7 @@
* @return the recordset ($rs->databaseType == 'array')
*/
function &CacheSelectLimit($secs2cache,$sql,$nrows=-1,$offset=-1,$inputarr=false, $arg3=false)
- {
+ {
if (!is_numeric($secs2cache)) {
if ($sql === false) $sql = -1;
if ($offset == -1) $offset = false;
@@ -1399,20 +1399,20 @@
return $this->SelectLimit($sql,$nrows,$offset,$inputarr,$arg3,$secs2cache);
}
}
-
+
/**
- * Flush cached recordsets that match a particular $sql statement.
+ * Flush cached recordsets that match a particular $sql statement.
* If $sql == false, then we purge all files in the cache.
*/
function CacheFlush($sql=false,$inputarr=false)
{
global $ADODB_CACHE_DIR;
-
+
if (strlen($ADODB_CACHE_DIR) > 1 && !$sql) {
if (strpos(strtoupper(PHP_OS),'WIN') !== false) {
$cmd = 'del /s '.str_replace('/','\\',$ADODB_CACHE_DIR).'\adodb_*.cache';
} else {
- $cmd = 'rm -rf '.$ADODB_CACHE_DIR.'/??/adodb_*.cache';
+ $cmd = 'rm -rf '.$ADODB_CACHE_DIR.'/??/adodb_*.cache';
// old version 'rm -f `find '.$ADODB_CACHE_DIR.' -name adodb_*.cache`';
}
if ($this->debug) {
@@ -1421,12 +1421,12 @@
exec($cmd);
}
return;
- }
+ }
$f = $this->_gencachename($sql.serialize($inputarr),false);
adodb_write_file($f,''); // is adodb_write_file needed?
@unlink($f);
}
-
+
/**
* Private function to generate filename for caching.
* Filename is generated based on:
@@ -1436,30 +1436,30 @@
* - database name
* - userid
*
- * We create 256 sub-directories in the cache directory ($ADODB_CACHE_DIR).
- * Assuming that we can have 50,000 files per directory with good performance,
+ * We create 256 sub-directories in the cache directory ($ADODB_CACHE_DIR).
+ * Assuming that we can have 50,000 files per directory with good performance,
* then we can scale to 12.8 million unique cached recordsets. Wow!
*/
function _gencachename($sql,$createdir)
{
global $ADODB_CACHE_DIR;
-
+
$m = md5($sql.$this->databaseType.$this->database.$this->user);
$dir = $ADODB_CACHE_DIR.'/'.substr($m,0,2);
if ($createdir && !file_exists($dir)) {
$oldu = umask(0);
- if (!mkdir($dir,0771))
+ if (!mkdir($dir,0771))
if ($this->debug) ADOConnection::outp( "Unable to mkdir $dir for $sql");
umask($oldu);
}
return $dir.'/adodb_'.$m.'.cache';
}
-
-
+
+
/**
* Execute SQL, caching recordsets.
*
- * @param [secs2cache] seconds to cache data, set to 0 to force query.
+ * @param [secs2cache] seconds to cache data, set to 0 to force query.
* This is an optional parameter.
* @param sql SQL statement to execute
* @param [inputarr] holds the input data to bind to
@@ -1475,10 +1475,10 @@
$secs2cache = $this->cacheSecs;
}
include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
-
+
$md5file = $this->_gencachename($sql.serialize($inputarr),true);
$err = '';
-
+
if ($secs2cache > 0){
$rs = &csv2rs($md5file,$err,$secs2cache);
$this->numCacheHits += 1;
@@ -1500,7 +1500,7 @@
$eof = $rs->EOF;
$rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately
$txt = _rs2serialize($rs,false,$sql); // serialize
-
+
if (!adodb_write_file($md5file,$txt,$this->debug)) {
if ($fn = $this->raiseErrorFn) {
$fn($this->databaseType,'CacheExecute',-32000,"Cache write error",$md5file,$sql,$this);
@@ -1509,10 +1509,10 @@
}
if ($rs->EOF && !$eof) {
$rs->MoveFirst();
- //$rs = &csv2rs($md5file,$err);
+ //$rs = &csv2rs($md5file,$err);
$rs->connection = &$this; // Pablo suggestion
- }
-
+ }
+
} else
@unlink($md5file);
} else {
@@ -1522,28 +1522,28 @@
}
// ok, set cached object found
$rs->connection = &$this; // Pablo suggestion
- if ($this->debug){
+ if ($this->debug){
global $HTTP_SERVER_VARS;
-
+
$inBrowser = isset($HTTP_SERVER_VARS['HTTP_USER_AGENT']);
$ttl = $rs->timeCreated + $secs2cache - time();
$s = is_array($sql) ? $sql[0] : $sql;
if ($inBrowser) $s = ''.htmlspecialchars($s).'';
-
+
ADOConnection::outp( " $md5file reloaded, ttl=$ttl [ $s ]");
}
}
return $rs;
}
-
-
+
+
/**
* Generates an Update Query based on an existing recordset.
* $arrFields is an associative array of fields with the value
* that should be assigned.
*
* Note: This function should only be used on a recordset
- * that is run against a single table and sql should only
+ * that is run against a single table and sql should only
* be a simple select stmt with no groupby/orderby/limit
*
* "Jonathan Younger"
@@ -1564,21 +1564,21 @@
* that is run against a single table.
*/
function GetInsertSQL(&$rs, $arrFields,$magicq=false)
- {
+ {
include_once(ADODB_DIR.'/adodb-lib.inc.php');
return _adodb_getinsertsql($this,$rs,$arrFields,$magicq);
}
-
+
/**
* Update a blob column, given a where clause. There are more sophisticated
* blob handling functions that we could have implemented, but all require
* a very complex API. Instead we have chosen something that is extremely
- * simple to understand and use.
+ * simple to understand and use.
*
* Note: $blobtype supports 'BLOB' and 'CLOB', default is BLOB of course.
*
- * Usage to update a $blobvalue which has a primary key blob_id=1 into a
+ * Usage to update a $blobvalue which has a primary key blob_id=1 into a
* field blobtable.blobcolumn:
*
* UpdateBlob('blobtable', 'blobcolumn', $blobvalue, 'blob_id=1');
@@ -1588,7 +1588,7 @@
* $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;
@@ -1597,7 +1597,7 @@
/**
* Usage:
* UpdateBlob('TABLE', 'COLUMN', '/path/to/file', 'ID=1');
- *
+ *
* $blobtype supports 'BLOB' and 'CLOB'
*
* $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
@@ -1611,17 +1611,17 @@
fclose($fd);
return $this->UpdateBlob($table,$column,$val,$where,$blobtype);
}
-
+
function BlobDecode($blob)
{
return $blob;
}
-
+
function BlobEncode($blob)
{
return $blob;
}
-
+
/**
* Usage:
* UpdateClob('TABLE', 'COLUMN', $var, 'ID=1', 'CLOB');
@@ -1633,8 +1633,8 @@
{
return $this->UpdateBlob($table,$column,$val,$where,'CLOB');
}
-
-
+
+
/**
* $meta contains the desired type, which could be...
* C for character. You will have to define the precision yourself.
@@ -1648,8 +1648,8 @@
* I for integer
* R for autoincrement counter/integer
* and if you want to use double-byte, add a 2 to the end, like C2 or X2.
- *
*
+ *
* @return the actual type of the data or false if no such type available
*/
function ActualType($meta)
@@ -1659,13 +1659,13 @@
case 'X':
return 'VARCHAR';
case 'B':
-
+
case 'D':
case 'T':
case 'L':
-
+
case 'R':
-
+
case 'I':
case 'N':
return false;
@@ -1679,101 +1679,101 @@
{
return 255; // make it conservative if not defined
}
-
-
+
+
/*
* Maximum size of X field
*/
function TextMax()
{
return 4000; // make it conservative if not defined
}
-
+
/**
* Close Connection
*/
- function Close()
+ function Close()
{
return $this->_close();
-
- // "Simon Lee" reports that persistent connections need
+
+ // "Simon Lee" reports that persistent connections need
// to be closed too!
//if ($this->_isPersistentConnection != true) return $this->_close();
- //else return true;
+ //else return true;
}
-
+
/**
* Begin a Transaction. Must be followed by CommitTrans() or RollbackTrans().
*
* @return true if succeeded or false if database does not support transactions
*/
function BeginTrans() {return false;}
-
-
+
+
/**
* If database does not support transactions, always return true as data always commited
*
* @param $ok set to false to rollback transaction, true to commit
*
* @return true/false.
*/
- function CommitTrans($ok=true)
+ function CommitTrans($ok=true)
{ return true;}
-
-
+
+
/**
* If database does not support transactions, rollbacks always fail, so return false
*
* @return true/false.
*/
- function RollbackTrans()
+ function RollbackTrans()
{ return false;}
/**
- * return the databases that the driver can connect to.
+ * return the databases that the driver can connect to.
* Some databases will return an empty array.
*
* @return an array of database names.
*/
- function MetaDatabases()
+ function MetaDatabases()
{
global $ADODB_FETCH_MODE;
-
+
if ($this->metaDatabasesSQL) {
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
-
+ $save = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
-
+
$arr = $this->GetCol($this->metaDatabasesSQL);
if (isset($savem)) $this->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
-
+ $ADODB_FETCH_MODE = $save;
+
return $arr;
}
-
+
return false;
}
-
+
/**
* @return array of tables for current database.
- */
- function &MetaTables()
+ */
+ function &MetaTables()
{
global $ADODB_FETCH_MODE;
-
+
if ($this->metaTablesSQL) {
// complicated state saving by the need for backward compat
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
-
+ $save = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
-
+
$rs = $this->Execute($this->metaTablesSQL);
if (isset($savem)) $this->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
-
+ $ADODB_FETCH_MODE = $save;
+
if ($rs === false) return false;
$arr =& $rs->GetArray();
$arr2 = array();
@@ -1785,18 +1785,18 @@
}
return false;
}
-
-
+
+
/**
- * List columns in a database as an array of ADOFieldObjects.
+ * List columns in a database as an array of ADOFieldObjects.
* See top of file for definition of object.
*
* @param table table name to query
* @param upper uppercase table name (required by some databases)
*
* @return array of ADOFieldObjects for current table.
- */
- function &MetaColumns($table,$upper=true)
+ */
+ function &MetaColumns($table,$upper=true)
{
global $ADODB_FETCH_MODE;
@@ -1820,53 +1820,53 @@
if ($fld->scale>0) $fld->max_length += 1;
} else
$fld->max_length = $rs->fields[2];
-
- $retarr[strtoupper($fld->name)] = $fld;
+ $retarr[strtoupper($fld->name)] = $fld;
+
$rs->MoveNext();
}
$rs->Close();
- return $retarr;
+ return $retarr;
}
return false;
}
-
+
/**
- * List columns names in a table as an array.
+ * List columns names in a table as an array.
* @param table table name to query
*
* @return array of column names for current table.
- */
- function &MetaColumnNames($table)
+ */
+ function &MetaColumnNames($table)
{
$objarr =& $this->MetaColumns($table);
if (!is_array($objarr)) return false;
-
+
$arr = array();
foreach($objarr as $v) {
$arr[] = $v->name;
}
return $arr;
}
-
+
/**
* Different SQL databases used different methods to combine strings together.
- * This function provides a wrapper.
- *
+ * This function provides a wrapper.
+ *
* param s variable number of string parameters
*
* Usage: $db->Concat($str1,$str2);
- *
+ *
* @return concatenated string
- */
+ */
function Concat()
- {
+ {
$arr = func_get_args();
return implode($this->concat_operator, $arr);
}
-
-
+
+
/**
* Converts a date "d" to a string that the database can understand.
*
@@ -1876,19 +1876,19 @@
*/
function DBDate($d)
{
-
+
if (empty($d) && $d !== 0) return 'null';
if (is_string($d) && !is_numeric($d)) {
if ($d === 'null') return $d;
if ($this->isoDates) return "'$d'";
$d = ADOConnection::UnixDate($d);
}
-
+
return adodb_date($this->fmtDate,$d);
}
-
-
+
+
/**
* Converts a timestamp "ts" to a string that the database can understand.
*
@@ -1905,10 +1905,10 @@
if ($this->isoDates) return "'$ts'";
else $ts = ADOConnection::UnixTimeStamp($ts);
}
-
+
return adodb_date($this->fmtTimeStamp,$ts);
}
-
+
/**
* Also in ADORecordSet.
* @param $v is a date string in YYYY-MM-DD format
@@ -1917,15 +1917,15 @@
*/
function UnixDate($v)
{
- if (!preg_match( "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|",
+ if (!preg_match( "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|",
($v), $rr)) return false;
if ($rr[1] <= TIMESTAMP_FIRST_YEAR) return 0;
// h-m-s-MM-DD-YY
return @adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]);
}
-
+
/**
* Also in ADORecordSet.
* @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format
@@ -1934,16 +1934,16 @@
*/
function UnixTimeStamp($v)
{
- if (!preg_match(
- "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
+ if (!preg_match(
+ "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
($v), $rr)) return false;
if ($rr[1] <= TIMESTAMP_FIRST_YEAR && $rr[2]<= 1) return 0;
-
+
// h-m-s-MM-DD-YY
if (!isset($rr[5])) return adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]);
return @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1]);
}
-
+
/**
* Also in ADORecordSet.
*
@@ -1954,7 +1954,7 @@
*
* @return a date formated as user desires
*/
-
+
function UserDate($v,$fmt='Y-m-d')
{
$tt = $this->UnixDate($v);
@@ -1963,50 +1963,50 @@
else if ($tt == 0) return $this->emptyDate;
else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR
}
-
+
return adodb_date($fmt,$tt);
-
+
}
-
-
+
+
/**
* Correctly quotes a string so that all strings are escaped. We prefix and append
* to the string single-quotes.
* An example is $db->qstr("Don't bother",magic_quotes_runtime());
- *
+ *
* @param s the string to quote
* @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc().
* This undoes the stupidity of magic quotes for GPC.
*
* @return quoted string to be sent back to database
*/
function qstr($s,$magic_quotes=false)
- {
+ {
if (!$magic_quotes) {
-
+
if ($this->replaceQuote[0] == '\\'){
// only since php 4.0.5
$s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
//$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s));
}
return "'".str_replace("'",$this->replaceQuote,$s)."'";
}
-
+
// undo magic quotes for "
$s = str_replace('\\"','"',$s);
-
+
if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything
return "'$s'";
else {// change \' to '' for sybase/mssql
$s = str_replace('\\\\','\\',$s);
return "'".str_replace("\\'",$this->replaceQuote,$s)."'";
}
}
-
-
+
+
/**
- * Will select the supplied $page number from a recordset, given that it is paginated in pages of
- * $nrows rows per page. It also saves two boolean values saying if the given page is the first
+ * Will select the supplied $page number from a recordset, given that it is paginated in pages of
+ * $nrows rows per page. It also saves two boolean values saying if the given page is the first
* and/or last one of the recordset. Added by Iv�n Oliva to provide recordset pagination.
*
* See readme.htm#ex8 for an example of usage.
@@ -2022,18 +2022,18 @@
* NOTE: phpLens uses a different algorithm and does not use PageExecute().
*
*/
- function &PageExecute($sql, $nrows, $page, $inputarr=false, $arg3=false, $secs2cache=0)
+ function &PageExecute($sql, $nrows, $page, $inputarr=false, $arg3=false, $secs2cache=0)
{
include_once(ADODB_DIR.'/adodb-lib.inc.php');
if ($this->pageExecuteCountRows) return _adodb_pageexecute_all_rows($this, $sql, $nrows, $page, $inputarr, $arg3, $secs2cache);
return _adodb_pageexecute_no_last_page($this, $sql, $nrows, $page, $inputarr, $arg3, $secs2cache);
}
-
-
+
+
/**
- * Will select the supplied $page number from a recordset, given that it is paginated in pages of
- * $nrows rows per page. It also saves two boolean values saying if the given page is the first
+ * Will select the supplied $page number from a recordset, given that it is paginated in pages of
+ * $nrows rows per page. It also saves two boolean values saying if the given page is the first
* and/or last one of the recordset. Added by Iv�n Oliva to provide recordset pagination.
*
* @param secs2cache seconds to cache data, set to 0 to force query
@@ -2044,35 +2044,35 @@
* @param [arg3] is a private parameter only used by jlim
* @return the recordset ($rs->databaseType == 'array')
*/
- function &CachePageExecute($secs2cache, $sql, $nrows, $page,$inputarr=false, $arg3=false)
+ function &CachePageExecute($secs2cache, $sql, $nrows, $page,$inputarr=false, $arg3=false)
{
/*switch($this->dataProvider) {
case 'postgres':
- case 'mysql':
+ case 'mysql':
break;
default: $secs2cache = 0; break;
}*/
return $this->PageExecute($sql,$nrows,$page,$inputarr,$arg3,$secs2cache);
}
} // end class ADOConnection
-
-
-
- //==============================================================================================
+
+
+
+ //==============================================================================================
// CLASS ADOFetchObj
- //==============================================================================================
-
+ //==============================================================================================
+
/**
* Internal placeholder for record objects. Used by ADORecordSet->FetchObj().
*/
class ADOFetchObj {
};
-
- //==============================================================================================
+
+ //==============================================================================================
// CLASS ADORecordSet_empty
- //==============================================================================================
-
+ //==============================================================================================
+
/**
* Lightweight recordset when there are no records to be returned
*/
@@ -2091,17 +2091,17 @@
function FetchRow() {return false;}
function FieldCount(){ return 0;}
}
-
- //==============================================================================================
+
+ //==============================================================================================
// DATE AND TIME FUNCTIONS
- //==============================================================================================
+ //==============================================================================================
if( !function_exists('adodb_mktime') ) include_once(ADODB_DIR.'/adodb-time.inc.php');
-
- //==============================================================================================
+
+ //==============================================================================================
// CLASS ADORecordSet
- //==============================================================================================
-
-
+ //==============================================================================================
+
+
/**
* RecordSet class that represents the dataset returned by the database.
* To keep memory overhead low, this class holds only the current row in memory.
@@ -2110,16 +2110,16 @@
*/
class ADORecordSet {
/*
- * public variables
+ * public variables
*/
var $dataProvider = "native";
var $fields = false; /// holds the current row data
var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob
/// in other words, we use a text area for editting.
var $canSeek = false; /// indicates that seek is supported
var $sql; /// sql text
- var $EOF = false; /// Indicates that the current record position is after the last record in a Recordset object.
-
+ var $EOF = false; /// Indicates that the current record position is after the last record in a Recordset object.
+
var $emptyTimeStamp = ' '; /// what to display when $time==0
var $emptyDate = ' '; /// what to display when $time==0
var $debug = false;
@@ -2129,7 +2129,7 @@
var $fetchMode; /// default fetch mode
var $connection = false; /// the parent connection
/*
- * private variables
+ * private variables
*/
var $_numOfRows = -1; /** number of rows, or -1 */
var $_numOfFields = -1; /** number of fields in recordset */
@@ -2139,27 +2139,27 @@
var $_inited = false; /** Init() should only be called once */
var $_obj; /** Used by FetchObj */
var $_names; /** Used by FetchObj */
-
+
var $_currentPage = -1; /** Added by Iv�n Oliva to implement recordset pagination */
var $_atFirstPage = false; /** Added by Iv�n Oliva to implement recordset pagination */
var $_atLastPage = false; /** Added by Iv�n Oliva to implement recordset pagination */
- var $_lastPageNo = -1;
+ var $_lastPageNo = -1;
var $_maxRecordCount = 0;
var $dateHasTime = false;
-
+
/**
* Constructor
*
* @param queryID this is the queryID returned by ADOConnection->_query()
*
*/
- function ADORecordSet($queryID)
+ function ADORecordSet($queryID)
{
$this->_queryID = $queryID;
}
-
-
-
+
+
+
function Init()
{
if ($this->_inited) return;
@@ -2169,9 +2169,9 @@
$this->_numOfRows = 0;
$this->_numOfFields = 0;
}
-
+
if ($this->_numOfRows != 0 && $this->_numOfFields && $this->_currentRow == -1) {
-
+
$this->_currentRow = 0;
if ($this->EOF = ($this->_fetch() === false)) {
$this->_numOfRows = 0; // _numOfRows could be -1
@@ -2180,11 +2180,11 @@
$this->EOF = true;
}
}
-
-
+
+
/**
* Generate a SELECT tag string from a recordset, and return the string.
- * If the recordset has 2 cols, we treat the 1st col as the containing
+ * If the recordset has 2 cols, we treat the 1st col as the containing
* the text to display to the user, and 2nd col as the return value. Default
* strings are compared with the FIRST column.
*
@@ -2195,7 +2195,7 @@
* @param [size] #rows to show for listbox. not used by popup
* @param [selectAttr] additional attributes to defined for SELECT tag.
* useful for holding javascript onChange='...' handlers.
- & @param [compareFields0] when we have 2 cols in recordset, we compare the defstr with
+ & @param [compareFields0] when we have 2 cols in recordset, we compare the defstr with
* column 0 (1st col) if this is true. This is not documented.
*
* @return HTML
@@ -2209,15 +2209,15 @@
return _adodb_getmenu($this, $name,$defstr,$blank1stItem,$multiple,
$size, $selectAttr,$compareFields0);
}
-
+
/**
* Generate a SELECT tag string from a recordset, and return the string.
- * If the recordset has 2 cols, we treat the 1st col as the containing
+ * If the recordset has 2 cols, we treat the 1st col as the containing
* the text to display to the user, and 2nd col as the return value. Default
* strings are compared with the SECOND column.
*
*/
- function GetMenu2($name,$defstr='',$blank1stItem=true,$multiple=false,$size=0, $selectAttr='')
+ function GetMenu2($name,$defstr='',$blank1stItem=true,$multiple=false,$size=0, $selectAttr='')
{
include_once(ADODB_DIR.'/adodb-lib.inc.php');
return _adodb_getmenu($this,$name,$defstr,$blank1stItem,$multiple,
@@ -2232,10 +2232,10 @@
*
* @return an array indexed by the rows (0-based) from the recordset
*/
- function &GetArray($nRows = -1)
+ function &GetArray($nRows = -1)
{
global $ADODB_EXTENSION; if ($ADODB_EXTENSION) return adodb_getall($this,$nRows);
-
+
$results = array();
$cnt = 0;
while (!$this->EOF && $nRows != $cnt) {
@@ -2245,7 +2245,7 @@
}
return $results;
}
-
+
/*
* Some databases allow multiple recordsets to be returned. This function
* will return true if there is a next recordset, or false if no more.
@@ -2254,61 +2254,61 @@
{
return false;
}
-
+
/**
- * return recordset as a 2-dimensional array.
+ * return recordset as a 2-dimensional array.
* Helper function for ADOConnection->SelectLimit()
*
* @param offset is the row to start calculations from (1-based)
* @param [nrows] is the number of rows to return
*
* @return an array indexed by the rows (0-based) from the recordset
*/
- function &GetArrayLimit($nrows,$offset=-1)
- {
+ function &GetArrayLimit($nrows,$offset=-1)
+ {
if ($offset <= 0) {
return $this->GetArray($nrows);
- }
-
+ }
+
$this->Move($offset);
-
+
$results = array();
$cnt = 0;
while (!$this->EOF && $nrows != $cnt) {
$results[$cnt++] = $this->fields;
$this->MoveNext();
}
-
+
return $results;
}
-
-
+
+
/**
* Synonym for GetArray() for compatibility with ADO.
*
* @param [nRows] is the number of rows to return. -1 means every row.
*
* @return an array indexed by the rows (0-based) from the recordset
*/
- function &GetRows($nRows = -1)
+ function &GetRows($nRows = -1)
{
return $this->GetArray($nRows);
}
-
+
/**
- * return whole recordset as a 2-dimensional associative array if there are more than 2 columns.
- * The first column is treated as the key and is not included in the array.
+ * return whole recordset as a 2-dimensional associative array if there are more than 2 columns.
+ * The first column is treated as the key and is not included in the array.
* If there is only 2 columns, it will return a 1 dimensional array of key-value pairs unless
* $force_array == true.
*
* @param [force_array] has only meaning if we have 2 data columns. If false, a 1 dimensional
* array is returned, otherwise a 2 dimensional array is returned. If this sounds confusing,
* read the source.
*
- * @param [first2cols] means if there are more than 2 cols, ignore the remaining cols and
+ * @param [first2cols] means if there are more than 2 cols, ignore the remaining cols and
* instead of returning array[col0] => array(remaining cols), return array[col0] => col1
*
- * @return an associative array indexed by the first column of the array,
+ * @return an associative array indexed by the first column of the array,
* or false if the data has less than 2 cols.
*/
function &GetAssoc($force_array = false, $first2cols = false) {
@@ -2318,7 +2318,7 @@
}
$numIndex = isset($this->fields[0]);
$results = array();
-
+
if (!$first2cols && ($cols > 2 || $force_array)) {
if ($numIndex) {
while (!$this->EOF) {
@@ -2343,16 +2343,16 @@
while (!$this->EOF) {
// some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string
$v1 = trim(reset($this->fields));
- $v2 = ''.next($this->fields);
+ $v2 = ''.next($this->fields);
$results[$v1] = $v2;
$this->MoveNext();
}
}
}
- return $results;
+ return $results;
}
-
-
+
+
/**
*
* @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format
@@ -2368,8 +2368,8 @@
if ($tt == 0) return $this->emptyTimeStamp;
return adodb_date($fmt,$tt);
}
-
-
+
+
/**
* @param v is the character date in YYYY-MM-DD format, returned by database
* @param fmt is the format to apply to it, using date()
@@ -2385,74 +2385,74 @@
else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR
}
return adodb_date($fmt,$tt);
-
+
}
-
-
+
+
/**
* @param $v is a date string in YYYY-MM-DD format
*
* @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format
*/
function UnixDate($v)
{
-
- if (!preg_match( "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|",
+
+ if (!preg_match( "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|",
($v), $rr)) return false;
-
+
if ($rr[1] <= TIMESTAMP_FIRST_YEAR) return 0;
// h-m-s-MM-DD-YY
return @adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]);
}
-
+
/**
* @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format
*
* @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format
*/
function UnixTimeStamp($v)
{
-
- if (!preg_match(
- "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
+
+ if (!preg_match(
+ "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
($v), $rr)) return false;
if ($rr[1] <= TIMESTAMP_FIRST_YEAR && $rr[2]<= 1) return 0;
-
+
// h-m-s-MM-DD-YY
if (!isset($rr[5])) return adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]);
return @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1]);
}
-
-
+
+
/**
* PEAR DB Compat - do not use internally
*/
function Free()
{
return $this->Close();
}
-
-
+
+
/**
* PEAR DB compat, number of rows
*/
function NumRows()
{
return $this->_numOfRows;
}
-
-
+
+
/**
* PEAR DB compat, number of cols
*/
function NumCols()
{
return $this->_numOfFields;
}
-
+
/**
- * Fetch a row, returning false if no more rows.
+ * Fetch a row, returning false if no more rows.
* This is PEAR DB compat mode.
*
* @return false or array containing the current record
@@ -2465,10 +2465,10 @@
if (!$this->_fetch()) $this->EOF = true;
return $arr;
}
-
-
+
+
/**
- * Fetch a row, returning PEAR_Error if no more rows.
+ * Fetch a row, returning PEAR_Error if no more rows.
* This is PEAR DB compat mode.
*
* @return DB_OK or error object
@@ -2480,26 +2480,26 @@
$this->MoveNext();
return 1; // DB_OK
}
-
-
+
+
/**
* Move to the first row in the recordset. Many databases do NOT support this.
*
* @return true or false
*/
- function MoveFirst()
+ function MoveFirst()
{
if ($this->_currentRow == 0) return true;
- return $this->Move(0);
- }
+ return $this->Move(0);
+ }
-
+
/**
- * Move to the last row in the recordset.
+ * Move to the last row in the recordset.
*
* @return true or false
*/
- function MoveLast()
+ function MoveLast()
{
if ($this->_numOfRows >= 0) return $this->Move($this->_numOfRows-1);
if ($this->EOF) return false;
@@ -2511,14 +2511,14 @@
$this->EOF = false;
return true;
}
-
-
+
+
/**
* Move to next record in the recordset.
*
* @return true if there still rows available, or false if there are no more rows (EOF).
*/
- function MoveNext()
+ function MoveNext()
{
if (!$this->EOF) {
$this->_currentRow++;
@@ -2533,8 +2533,8 @@
}
*/
return false;
- }
-
+ }
+
/**
* Random access to a specific row in the recordset. Some databases do not support
* access to previous rows in the databases (no scrolling backwards).
@@ -2543,15 +2543,15 @@
*
* @return true if there still rows available, or false if there are no more rows (EOF).
*/
- function Move($rowNumber = 0)
+ function Move($rowNumber = 0)
{
$this->EOF = false;
if ($rowNumber == $this->_currentRow) return true;
if ($rowNumber >= $this->_numOfRows)
if ($this->_numOfRows != -1) $rowNumber = $this->_numOfRows-2;
-
- if ($this->canSeek) {
-
+
+ if ($this->canSeek) {
+
if ($this->_seek($rowNumber)) {
$this->_currentRow = $rowNumber;
if ($this->_fetch()) {
@@ -2569,26 +2569,26 @@
adodb_movenext($this);
}
} else {
-
+
while (! $this->EOF && $this->_currentRow < $rowNumber) {
$this->_currentRow++;
-
+
if (!$this->_fetch()) $this->EOF = true;
}
}
return !($this->EOF);
}
-
- $this->fields = false;
+
+ $this->fields = false;
$this->EOF = true;
return false;
}
-
-
+
+
/**
* Get the value of a field in the current row by column name.
* Will not work if ADODB_FETCH_MODE is set to ADODB_FETCH_NUM.
- *
+ *
* @param colname is the field to access
*
* @return the value of $colname column
@@ -2597,7 +2597,7 @@
{
return $this->fields[$colname];
}
-
+
function GetAssocKeys($upper=true)
{
$this->bind = array();
@@ -2607,7 +2607,7 @@
else $this->bind[($upper) ? strtoupper($o->name) : strtolower($o->name)] = $i;
}
}
-
+
/**
* Use associative array to get fields array for databases that do not support
* associative arrays. Submitted by Paolo S. Asioli paolo.asioli@libero.it
@@ -2619,45 +2619,45 @@
*/
function GetRowAssoc($upper=1)
{
-
+
if (!$this->bind) {
$this->GetAssocKeys($upper);
}
-
+
$record = array();
foreach($this->bind as $k => $v) {
$record[$k] = $this->fields[$v];
}
return $record;
}
-
-
+
+
/**
* Clean up recordset
*
* @return true or false
*/
- function Close()
+ function Close()
{
// free connection object - this seems to globally free the object
// and not merely the reference, so don't do this...
- // $this->connection = false;
+ // $this->connection = false;
if (!$this->_closed) {
$this->_closed = true;
- return $this->_close();
+ return $this->_close();
} else
return true;
}
-
+
/**
- * synonyms RecordCount and RowCount
+ * synonyms RecordCount and RowCount
*
* @return the number of rows or -1 if this is not supported
*/
function RecordCount() {return $this->_numOfRows;}
-
-
+
+
/*
* If we are using PageExecute(), this will return the maximum possible rows
* that can be returned when paging a recordset.
@@ -2666,54 +2666,54 @@
{
return ($this->_maxRecordCount) ? $this->_maxRecordCount : $this->RecordCount();
}
-
+
/**
- * synonyms RecordCount and RowCount
+ * synonyms RecordCount and RowCount
*
* @return the number of rows or -1 if this is not supported
*/
- function RowCount() {return $this->_numOfRows;}
-
+ function RowCount() {return $this->_numOfRows;}
+
/**
* Portable RecordCount. Pablo Roca
*
* @return the number of records from a previous SELECT. All databases support this.
*
* But aware possible problems in multiuser environments. For better speed the table
* must be indexed by the condition. Heavy test this before deploying.
- */
+ */
function PO_RecordCount($table="", $condition="") {
-
+
$lnumrows = $this->_numOfRows;
// the database doesn't support native recordcount, so we do a workaround
if ($lnumrows == -1 && $this->connection) {
IF ($table) {
- if ($condition) $condition = " WHERE " . $condition;
+ if ($condition) $condition = " WHERE " . $condition;
$resultrows = &$this->connection->Execute("SELECT COUNT(*) FROM $table $condition");
if ($resultrows) $lnumrows = reset($resultrows->fields);
}
}
return $lnumrows;
}
-
+
/**
* @return the current row in the recordset. If at EOF, will return the last row. 0-based.
*/
function CurrentRow() {return $this->_currentRow;}
-
+
/**
* synonym for CurrentRow -- for ADO compat
*
* @return the current row in the recordset. If at EOF, will return the last row. 0-based.
*/
function AbsolutePosition() {return $this->_currentRow;}
-
+
/**
* @return the number of columns in the recordset. Some databases will set this to 0
* if no records are returned, others will return the number of columns in the query.
*/
- function FieldCount() {return $this->_numOfFields;}
+ function FieldCount() {return $this->_numOfFields;}
/**
@@ -2723,23 +2723,23 @@
*
* @return the ADOFieldObject for that column, or false.
*/
- function &FetchField($fieldoffset)
+ function &FetchField($fieldoffset)
{
// must be defined by child class
- }
-
+ }
+
/**
* Get the ADOFieldObjects of all columns in an array.
*
*/
function FieldTypesArray()
{
$arr = array();
- for ($i=0, $max=$this->_numOfFields; $i < $max; $i++)
+ for ($i=0, $max=$this->_numOfFields; $i < $max; $i++)
$arr[] = $this->FetchField($i);
return $arr;
}
-
+
/**
* Return the fields array of the current row as an object for convenience.
* The default case is lowercase field names.
@@ -2750,11 +2750,11 @@
{
return FetchObject(false);
}
-
+
/**
* Return the fields array of the current row as an object for convenience.
* The default case is uppercase.
- *
+ *
* @param $isupper to set the object property names to uppercase
*
* @return the object with the properties set to the fields of the current row
@@ -2775,16 +2775,16 @@
$name = $this->_names[$i];
if ($isupper) $n = strtoupper($name);
else $n = $name;
-
+
$o->$n = $this->Fields($name);
}
return $o;
}
-
+
/**
* Return the fields array of the current row as an object for convenience.
* The default is lower-case field names.
- *
+ *
* @return the object with the properties set to the fields of the current row,
* or false if EOF
*
@@ -2794,12 +2794,12 @@
{
return $this->FetchNextObject(false);
}
-
-
+
+
/**
- * Return the fields array of the current row as an object for convenience.
+ * Return the fields array of the current row as an object for convenience.
* The default is upper case field names.
- *
+ *
* @param $isupper to set the object property names to uppercase
*
* @return the object with the properties set to the fields of the current row,
@@ -2811,14 +2811,14 @@
{
$o = false;
if ($this->_numOfRows != 0 && !$this->EOF) {
- $o = $this->FetchObject($isupper);
+ $o = $this->FetchObject($isupper);
$this->_currentRow++;
if ($this->_fetch()) return $o;
}
$this->EOF = true;
return $o;
}
-
+
/**
* Get the metatype of the column. This is used for formatting. This is because
* many databases use different names for the same type, so we transform the original
@@ -2829,8 +2829,8 @@
* fields bigger than a certain size as a 'B' (blob).
* @param fieldobj is the field object returned by the database driver. Can hold
* additional info (eg. primary_key for mysql).
- *
- * @return the general type of the data:
+ *
+ * @return the general type of the data:
* C for character < 200 chars
* X for teXt (>= 200 chars)
* B for Binary
@@ -2840,8 +2840,8 @@
* L for logical/Boolean
* I for integer
* R for autoincrement counter/integer
- *
*
+ *
*/
function MetaType($t,$len=-1,$fieldobj=false)
{
@@ -2890,7 +2890,7 @@
'TIMESTAMPTZ' => 'T',
'T' => 'T',
##
- 'BOOLEAN' => 'L',
+ 'BOOLEAN' => 'L',
'BIT' => 'L',
'L' => 'L',
##
@@ -2919,62 +2919,62 @@
'NUM' => 'N',
'NUMERIC' => 'N',
'MONEY' => 'N',
-
+
## informix 9.2
- 'SQLINT' => 'I',
- 'SQLSERIAL' => 'I',
- 'SQLSMINT' => 'I',
- 'SQLSMFLOAT' => 'N',
- 'SQLFLOAT' => 'N',
- 'SQLMONEY' => 'N',
- 'SQLDECIMAL' => 'N',
- 'SQLDATE' => 'D',
- 'SQLVCHAR' => 'C',
- 'SQLCHAR' => 'C',
- 'SQLDTIME' => 'T',
- 'SQLINTERVAL' => 'N',
- 'SQLBYTES' => 'B',
- 'SQLTEXT' => 'X'
+ 'SQLINT' => 'I',
+ 'SQLSERIAL' => 'I',
+ 'SQLSMINT' => 'I',
+ 'SQLSMFLOAT' => 'N',
+ 'SQLFLOAT' => 'N',
+ 'SQLMONEY' => 'N',
+ 'SQLDECIMAL' => 'N',
+ 'SQLDATE' => 'D',
+ 'SQLVCHAR' => 'C',
+ 'SQLCHAR' => 'C',
+ 'SQLDTIME' => 'T',
+ 'SQLINTERVAL' => 'N',
+ 'SQLBYTES' => 'B',
+ 'SQLTEXT' => 'X'
);
-
+
$tmap = false;
$t = strtoupper($t);
$tmap = @$typeMap[$t];
switch ($tmap) {
case 'C':
-
- // is the char field is too long, return as text field...
+
+ // is the char field is too long, return as text field...
if (!empty($this->blobSize)) {
if ($len > $this->blobSize) return 'X';
} else if ($len > 250) {
return 'X';
}
return 'C';
-
+
case 'I':
if (!empty($fieldobj->primary_key)) return 'R';
return 'I';
-
+
case false:
return 'N';
-
+
case 'B':
- if (isset($fieldobj->binary))
+ if (isset($fieldobj->binary))
return ($fieldobj->binary) ? 'B' : 'X';
return 'B';
-
+
case 'D':
if (!empty($this->dateHasTime)) return 'T';
return 'D';
-
- default:
+
+ default:
if ($t == 'LONG' && $this->dataProvider == 'oci8') return 'B';
return $tmap;
}
}
-
+
function _close() {}
-
+
/**
* set/returns the current recordset page when paginating
*/
@@ -2983,7 +2983,7 @@
if ($page != -1) $this->_currentPage = $page;
return $this->_currentPage;
}
-
+
/**
* set/returns the status of the atFirstPage flag when paginating
*/
@@ -2992,13 +2992,13 @@
if ($status != false) $this->_atFirstPage = $status;
return $this->_atFirstPage;
}
-
+
function LastPageNo($page = false)
{
if ($page != false) $this->_lastPageNo = $page;
return $this->_lastPageNo;
}
-
+
/**
* set/returns the status of the atLastPage flag when paginating
*/
@@ -3008,18 +3008,18 @@
return $this->_atLastPage;
}
} // end class ADORecordSet
-
- //==============================================================================================
+
+ //==============================================================================================
// CLASS ADORecordSet_array
- //==============================================================================================
-
+ //==============================================================================================
+
/**
* This class encapsulates the concept of a recordset created in memory
* as an array. This is useful for the creation of cached recordsets.
- *
+ *
* Note that the constructor is different from the standard ADORecordSet
*/
-
+
class ADORecordSet_array extends ADORecordSet
{
var $databaseType = 'array';
@@ -3041,41 +3041,41 @@
function ADORecordSet_array($fakeid=1)
{
global $ADODB_FETCH_MODE,$ADODB_COMPAT_FETCH;
-
+
// fetch() on EOF does not delete $this->fields
$this->compat = !empty($ADODB_COMPAT_FETCH);
- $this->ADORecordSet($fakeid); // fake queryID
+ $this->ADORecordSet($fakeid); // fake queryID
$this->fetchMode = $ADODB_FETCH_MODE;
}
-
-
+
+
/**
* Setup the Array. Later we will have XML-Data and CSV handlers
*
* @param array is a 2-dimensional array holding the data.
- * The first row should hold the column names
+ * The first row should hold the column names
* unless paramter $colnames is used.
- * @param typearr holds an array of types. These are the same types
+ * @param typearr holds an array of types. These are the same types
* used in MetaTypes (C,B,L,I,N).
* @param [colnames] array of column names. If set, then the first row of
* $array should not hold the column names.
*/
function InitArray($array,$typearr,$colnames=false)
{
$this->_array = $array;
- $this->_types = $typearr;
+ $this->_types = $typearr;
if ($colnames) {
$this->_skiprow1 = false;
$this->_colnames = $colnames;
} else $this->_colnames = $array[0];
-
+
$this->Init();
}
/**
* Setup the Array and datatype file objects
*
* @param array is a 2-dimensional array holding the data.
- * The first row should hold the column names
+ * The first row should hold the column names
* unless paramter $colnames is used.
* @param fieldarr holds an array of ADOFieldObject's.
*/
@@ -3085,10 +3085,10 @@
$this->_skiprow1= false;
if ($fieldarr) {
$this->_fieldobjects = $fieldarr;
- }
+ }
$this->Init();
}
-
+
function &GetArray($nRows=-1)
{
if ($nRows == -1 && $this->_currentRow <= 0 && !$this->_skiprow1) {
@@ -3097,21 +3097,21 @@
return ADORecordSet::GetArray($nRows);
}
}
-
+
function _initrs()
{
$this->_numOfRows = sizeof($this->_array);
if ($this->_skiprow1) $this->_numOfRows -= 1;
-
+
$this->_numOfFields =(isset($this->_fieldobjects)) ?
sizeof($this->_fieldobjects):sizeof($this->_types);
}
-
+
/* 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++) {
@@ -3121,8 +3121,8 @@
}
return $this->fields[$this->bind[strtoupper($colname)]];
}
-
- function &FetchField($fieldOffset = -1)
+
+ function &FetchField($fieldOffset = -1)
{
if (isset($this->_fieldobjects)) {
return $this->_fieldobjects[$fieldOffset];
@@ -3131,10 +3131,10 @@
$o->name = $this->_colnames[$fieldOffset];
$o->type = $this->_types[$fieldOffset];
$o->max_length = -1; // length not known
-
+
return $o;
}
-
+
function _seek($row)
{
if (sizeof($this->_array) && $row < $this->_numOfRows) {
@@ -3143,32 +3143,32 @@
}
return false;
}
-
- function MoveNext()
+
+ function MoveNext()
{
- if (!$this->EOF) {
+ if (!$this->EOF) {
$this->_currentRow++;
-
+
$pos = $this->_currentRow;
if ($this->_skiprow1) $pos += 1;
-
+
if ($this->_numOfRows <= $pos) {
if (!$this->compat) $this->fields = false;
} else {
$this->fields = $this->_array[$pos];
return true;
- }
+ }
$this->EOF = true;
}
-
+
return false;
- }
-
+ }
+
function _fetch()
{
$pos = $this->_currentRow;
if ($this->_skiprow1) $pos += 1;
-
+
if ($this->_numOfRows <= $pos) {
if (!$this->compat) $this->fields = false;
return false;
@@ -3177,44 +3177,44 @@
$this->fields = $this->_array[$pos];
return true;
}
-
- function _close()
+
+ function _close()
{
- return true;
+ return true;
}
-
+
} // ADORecordSet_array
- //==============================================================================================
+ //==============================================================================================
// HELPER FUNCTIONS
- //==============================================================================================
-
+ //==============================================================================================
+
/**
* Synonym for ADOLoadCode.
*
* @deprecated
*/
- function ADOLoadDB($dbType)
- {
+ function ADOLoadDB($dbType)
+ {
return ADOLoadCode($dbType);
}
-
+
/**
* Load the code for a specific database driver
*/
- function ADOLoadCode($dbType)
+ function ADOLoadCode($dbType)
{
GLOBAL $ADODB_Database;
-
+
if (!$dbType) return false;
$ADODB_Database = strtolower($dbType);
switch ($ADODB_Database) {
case 'maxsql': $ADODB_Database = 'mysqlt'; break;
case 'postgres':
case 'pgsql': $ADODB_Database = 'postgres7'; break;
}
- // Karsten Kraus
- return @include_once(ADODB_DIR."/drivers/adodb-".$ADODB_Database.".inc.php");
+ // Karsten Kraus
+ return @include_once(ADODB_DIR."/drivers/adodb-".$ADODB_Database.".inc.php");
}
/**
@@ -3224,7 +3224,7 @@
{
return ADONewConnection($db);
}
-
+
/**
* Instantiate a new Connection class for a specific database driver.
*
@@ -3236,18 +3236,18 @@
function &ADONewConnection($db='')
{
global $ADODB_Database;
-
+
$rez = true;
if ($db) {
if ($ADODB_Database != $db) ADOLoadCode($db);
- } else {
+ } else {
if (!empty($ADODB_Database)) {
ADOLoadCode($ADODB_Database);
} else {
$rez = false;
}
}
-
+
$errorfn = (defined('ADODB_ERROR_HANDLER')) ? ADODB_ERROR_HANDLER : false;
if (!$rez) {
if ($errorfn) {
@@ -3257,32 +3257,32 @@
$dbtype);
} else
ADOConnection::outp( "ADONewConnection: Unable to load database driver '$db'
",false);
-
+
return false;
}
-
+
$cls = 'ADODB_'.$ADODB_Database;
$obj = new $cls();
if ($errorfn) $obj->raiseErrorFn = $errorfn;
-
+
return $obj;
}
-
+
function &NewDataDictionary(&$conn)
{
$provider = $conn->dataProvider;
$drivername = $conn->databaseType;
- if ($provider !== 'native' && $provider != 'odbc' && $provider != 'ado')
+ if ($provider !== 'native' && $provider != 'odbc' && $provider != 'ado')
$drivername = $conn->dataProvider;
else {
if (substr($drivername,0,5) == 'odbc_') $drivername = substr($drivername,5);
else if (substr($drivername,0,4) == 'ado_') $drivername = substr($drivername,4);
- else
+ else
switch($drivername) {
case 'oracle': $drivername = 'oci8';break;
case 'sybase': $drivername = 'mssql';break;
case 'access':
- case 'db2':
+ case 'db2':
break;
default:
$drivername = 'generic';
@@ -3305,7 +3305,7 @@
$dict->upperName = strtoupper($drivername);
if (is_resource($conn->_connectionID))
$dict->serverInfo = $conn->ServerInfo();
-
+
return $dict;
}
@@ -3314,11 +3314,11 @@
* Save a file $filename and its $contents (normally for caching) with file locking
*/
function adodb_write_file($filename, $contents,$debug=false)
- {
+ {
# http://www.php.net/bugs.php?id=9203 Bug that flock fails on Windows
# So to simulate locking, we assume that rename is an atomic operation.
- # First we delete $filename, then we create a $tempfile write to it and
- # rename to the desired $filename. If the rename works, then we successfully
+ # First we delete $filename, then we create a $tempfile write to it and
+ # rename to the desired $filename. If the rename works, then we successfully
# modified the file exclusively.
# What a stupid need - having to simulate locking.
# Risks:
@@ -3328,13 +3328,13 @@
# 4. another process creates $filename between unlink() and rename() -- ok, rename() fails and cache updated
if (strpos(strtoupper(PHP_OS),'WIN') !== false) {
// skip the decimal place
- $mtime = substr(str_replace(' ','_',microtime()),2);
+ $mtime = substr(str_replace(' ','_',microtime()),2);
// unlink will let some latencies develop, so uniqid() is more random
@unlink($filename);
// getmypid() actually returns 0 on Win98 - never mind!
$tmpname = $filename.uniqid($mtime).getmypid();
if (!($fd = fopen($tmpname,'a'))) return false;
- $ok = ftruncate($fd,0);
+ $ok = ftruncate($fd,0);
if (!fwrite($fd,$contents)) $ok = false;
fclose($fd);
chmod($tmpname,0644);
@@ -3357,23 +3357,23 @@
if ($debug)ADOConnection::outp( " Failed acquiring lock for $filename
\n");
$ok = false;
}
-
+
return $ok;
}
-
+
function adodb_backtrace($print=true)
{
$s = '';
if (PHPVERSION() >= 4.3) {
-
+
$MAXSTRLEN = 64;
-
+
$s = '';
$traceArr = debug_backtrace();
array_shift($traceArr);
$tabs = sizeof($traceArr)-1;
-
+
foreach ($traceArr as $arr) {
$args = array();
for ($i=0; $i < $tabs; $i++) $s .= ' ';
@@ -3386,7 +3386,7 @@
else if (is_array($v)) $args[] = 'Array['.sizeof($v).']';
else if (is_object($v)) $args[] = 'Object:'.get_class($v);
else if (is_bool($v)) $args[] = $v ? 'true' : 'false';
- else {
+ else {
$v = (string) @$v;
$str = htmlspecialchars(substr($v,0,$MAXSTRLEN));
if (strlen($v) > $MAXSTRLEN) $str .= '...';
@@ -3397,12 +3397,12 @@
$s .= @sprintf(" # line %4d, file: %s",
$arr['line'],$arr['file'],$arr['file']);
$s .= "\n";
- }
+ }
$s .= '
';
if ($print) print $s;
}
return $s;
}
-
+
} // defined
?>
\ No newline at end of file